50 lines
1 KiB
C++
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
|