Utility library
#include "crow/resource.hpp"
namespace Crow;
template <typename T, typename U>
concept ResourceDeleter =
std::is_default_constructible_v<T> && std::invocable<T, U>;
Concept representing a type that can be used as a deleter to free a resource.
template <std::regular T, ResourceDeleter<T> Del, T Null = T()>
class Resource;
This is a wrapper class for resource handles (e.g. file handles). The destructor will release the resource by calling the deleter function. The null value represents a null resource handle; this defaults to zero or a null pointer, but a different value can be supplied (e.g. -1 for a null Unix file descriptor).
Behaviour is undefined if the deleter throws an exception.
using Resource::value_type = T;
using Resource::deleter_type = Del;
Member types.
static constexpr T Resource::null = Null;
Member constants.
constexpr Resource::Resource() noexcept;
constexpr explicit Resource::Resource(T t) noexcept;
Resource::~Resource() noexcept;
constexpr Resource::Resource(Resource&& r) noexcept;
Resource& Resource::operator=(Resource&& r) noexcept;
Resource& Resource::operator=(T t) noexcept;
Life cycle functions. Resource
is movable but not copyable. The internal
handle in a moved-from Resource
is reset to Null
. The destructor will
call the deleter to release the resource if the internal handle is not equal
to Null
. The LHS of the move assignment operator will also be released.
The assignment operator from a T
is a synonym for reset(t)
.
constexpr explicit Resource::operator T() const noexcept;
constexpr T Resource::get() const noexcept;
Return the internal handle.
constexpr explicit Resource::operator bool() const noexcept;
True if the handle is not equal to Null
.
constexpr std::remove_pointer_t<T>& Resource::operator*() const noexcept;
constexpr std::remove_pointer_t<T>* Resource::operator->() const noexcept;
Dereference the internal handle. These are only defined if T
is a pointer
type.
constexpr T Resource::release() noexcept;
Returns the resource handle and sets the object’s internal handle to Null
.
void Resource::reset() noexcept;
If the internal handle is not Null
, this will call the deleter and then set
the handle to Null
.
void Resource::reset(T t) noexcept;
Replaces the current internal handle. The deleter will be called on the
original handle if it is not Null
.
constexpr void Resource::swap(Resource& r) noexcept;
constexpr void swap(Resource& a, Resource& b) noexcept;
Swap two resource handles.