54 lines
1.3 KiB
C++
54 lines
1.3 KiB
C++
#ifndef BWIDGETS_OPAQUE_STRUCT_HPP
|
|
#define BWIDGETS_OPAQUE_STRUCT_HPP
|
|
|
|
#include <functional>
|
|
|
|
namespace bwidgets
|
|
{
|
|
// Wrap opaque structures to be able to use a destructor to free them.
|
|
template<typename T>
|
|
class OpaqueStruct
|
|
{
|
|
using Deleter = std::function<void(T*)>;
|
|
|
|
const Deleter _deleter;
|
|
|
|
T* const _c_pod;
|
|
|
|
public:
|
|
// Construct an instance managing resource pointed by ptr using Deleter d to free
|
|
// it on wrapper destruction.
|
|
OpaqueStruct(T* ptr, Deleter d) : _deleter {std::move(d)}, _c_pod {ptr} {}
|
|
|
|
OpaqueStruct(const OpaqueStruct&) = delete;
|
|
OpaqueStruct(OpaqueStruct&&) = delete;
|
|
|
|
virtual ~OpaqueStruct() noexcept
|
|
{
|
|
_deleter(_c_pod);
|
|
};
|
|
|
|
// Get the pointer to the wrapped opaque struct.
|
|
[[nodiscard]] auto* operator()() const
|
|
{
|
|
return _c_pod;
|
|
}
|
|
|
|
auto operator=(const OpaqueStruct&) = delete;
|
|
auto operator=(OpaqueStruct&&) = delete;
|
|
|
|
// Base class for defining custom wrappers.
|
|
class Wrapper
|
|
{
|
|
public:
|
|
// Forward args to OpaqueStruct ctor.
|
|
Wrapper(T* ptr, Deleter d) : _data(ptr, std::move(d)) {}
|
|
|
|
protected:
|
|
OpaqueStruct _data;
|
|
};
|
|
};
|
|
}
|
|
|
|
#endif
|