bwidgets/inc/basic_widgets/core/type/opaque_struct.hpp

50 lines
1 KiB
C++

#ifndef BWIDGETS_OPAQUE_STRUCT_HPP
#define BWIDGETS_OPAQUE_STRUCT_HPP
#include <functional>
namespace bwidgets
{
template<typename T>
class OpaqueStruct
{
using Deleter = std::function<void(T*)>;
const Deleter _deleter;
T* _c_pod;
public:
OpaqueStruct(T* ptr, Deleter d) : _deleter {std::move(d)}, _c_pod {ptr} {}
OpaqueStruct(const OpaqueStruct&) = delete;
OpaqueStruct(OpaqueStruct&&) = delete;
virtual ~OpaqueStruct() noexcept
{
try {
_deleter(_c_pod);
} catch (...) {
}
};
[[nodiscard]] auto* operator()() const
{
return _c_pod;
}
auto operator=(const OpaqueStruct&) = delete;
auto operator=(OpaqueStruct&&) = delete;
class Wrapper
{
protected:
OpaqueStruct _data;
public:
Wrapper(T* ptr, Deleter d) : _data(ptr, std::move(d)) {}
};
};
}
#endif