49 lines
984 B
C++
49 lines
984 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]] auto* operator()() const
|
|
{
|
|
return _c_pod;
|
|
}
|
|
|
|
auto operator=(const OpaqueStruct&) = delete;
|
|
auto operator=(OpaqueStruct&&) = delete;
|
|
|
|
struct Wrapper
|
|
{
|
|
OpaqueStruct _data;
|
|
|
|
Wrapper(T* ptr, const Deleter& d) : _data(ptr, d) {}
|
|
};
|
|
};
|
|
}
|
|
|
|
#endif
|