45template<
class HandleType,
class Destroyer>
class AutoResource
48 AutoResource() =
default;
51 AutoResource(
const AutoResource& other) =
delete;
54 AutoResource& operator=(
const AutoResource& other) =
delete;
57 AutoResource(AutoResource&& other) =
delete;
60 AutoResource& operator=(AutoResource&& other) =
delete;
63 virtual ~AutoResource()
noexcept
69 catch (
const std::exception&)
75 AutoResource(HandleType handle) :
81 HandleType Get()
const
87 void Attach(HandleType handle)
89 this->handle = handle;
95 HandleType handle = Get();
96 Attach(InvalidHandleValue<HandleType>());
101 void Reset(HandleType handle)
103 if (Get() != InvalidHandleValue<HandleType>())
105 Destroyer() (Detach());
113 Reset(InvalidHandleValue<HandleType>());
117 HandleType* operator&()
123 HandleType handle = InvalidHandleValue<HandleType>();
126template<
class HandleType1,
class HandleType2,
class Destroyer>
class AutoResource2
129 AutoResource2() =
default;
132 AutoResource2(
const AutoResource2& other) =
delete;
135 AutoResource2& operator=(
const AutoResource2& other) =
delete;
138 AutoResource2(AutoResource2&& other) =
delete;
141 AutoResource2& operator=(AutoResource2&& other) =
delete;
144 virtual ~AutoResource2()
150 catch (
const std::exception&)
156 AutoResource2(HandleType1 handle1, HandleType2 handle2 = InvalidHandleValue<HandleType2>()) :
163 HandleType2 Get()
const
169 void Attach(HandleType1 handle1, HandleType2 handle2)
171 this->handle1 = handle1;
172 this->handle2 = handle2;
178 HandleType2 handle2 = Get();
179 Attach(InvalidHandleValue<HandleType1>(), InvalidHandleValue<HandleType2>());
186 if (Get() != InvalidHandleValue<HandleType2>())
188 HandleType1 handle1 = this->handle1;
189 HandleType2 handle2 = this->handle2;
190 this->handle1 = InvalidHandleValue<HandleType1>();
191 this->handle2 = InvalidHandleValue<HandleType2>();
192 Destroyer() (handle1, handle2);
197 HandleType2* operator&()
const
203 HandleType1 handle1 = InvalidHandleValue<HandleType1>();
206 HandleType2 handle2 = InvalidHandleValue<HandleType2>();