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

49 lines
1,023 B
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, const Deleter& d) : _deleter(d), _c_pod(ptr) {}
OpaqueStruct(const OpaqueStruct&) = delete;
OpaqueStruct(OpaqueStruct&&) = delete;
virtual ~OpaqueStruct() noexcept
{
try {
_deleter(_c_pod);
} catch (...) {
}
};
[[nodiscard]] inline auto* operator()() const
{
return _c_pod;
}
auto operator=(const OpaqueStruct&) -> OpaqueStruct& = delete;
auto operator=(OpaqueStruct&&) -> OpaqueStruct& = delete;
struct Wrapper
{
OpaqueStruct _data;
Wrapper(T* ptr, const Deleter& d) : _data(ptr, d) {}
};
};
}
#endif