#pragma once

#include "sdkexport.h"
#include <memory>

class TopoDS_Edge;

namespace mpl {

namespace sdk {
class SdkFactory;
}

class MPL_API DecoratedEdgeHandle {
public:
    ~DecoratedEdgeHandle();

    DecoratedEdgeHandle(const DecoratedEdgeHandle&) = delete;
    DecoratedEdgeHandle& operator=(const DecoratedEdgeHandle&) = delete;

    DecoratedEdgeHandle(DecoratedEdgeHandle&& other) noexcept;
    DecoratedEdgeHandle& operator=(DecoratedEdgeHandle&& other) noexcept;

private:
    friend class sdk::SdkFactory;

    struct Impl;
    std::unique_ptr<Impl> impl_;

    explicit DecoratedEdgeHandle(unsigned bodyId, const TopoDS_Edge& edge);
};

class MPL_API DecoratedFaceHandle {
public:
    ~DecoratedFaceHandle();

    DecoratedFaceHandle(const DecoratedFaceHandle&) = delete;
    DecoratedFaceHandle& operator=(const DecoratedFaceHandle&) = delete;

    DecoratedFaceHandle(DecoratedFaceHandle&& other) noexcept;
    DecoratedFaceHandle& operator=(DecoratedFaceHandle&& other) noexcept;

private:
    friend class sdk::SdkFactory;

    struct Impl;
    std::unique_ptr<Impl> impl_;

    explicit DecoratedFaceHandle(unsigned bodyId, unsigned faceIndex);
};

}
