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

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