Skip to content

Commit d074d69

Browse files
committed
HandleDeleter → GenericDeleter and HandleDeleter
1 parent cff8c8c commit d074d69

1 file changed

Lines changed: 19 additions & 15 deletions

File tree

utils.hpp

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -204,37 +204,41 @@ class SRWLock : public SRWLockBase<SRWLock>
204204
void on_unlock(bool is_exclusive) {}
205205
};
206206

207-
struct HandleDeleter
207+
template <class T, class Deleter, size_t defval = 0>
208+
struct GenericDeleter
208209
{
209-
void operator()(HANDLE h) noexcept
210+
void operator()(T x) noexcept
210211
{
211-
CloseHandle(h);
212+
Deleter()(x);
212213
}
213-
};
214214

215-
struct FileHandleDeleter : HandleDeleter
216-
{
217215
struct pointer
218216
{
219-
pointer(HANDLE h) : value(h) {}
217+
pointer(T x) : value(x) {}
220218

221-
operator HANDLE() const { return value; }
219+
operator T() const { return value; }
222220

223-
pointer(std::nullptr_t = nullptr) : value(INVALID_HANDLE_VALUE) {}
221+
pointer(std::nullptr_t = nullptr) : value(recast<T>(defval)) {}
224222

225-
explicit operator bool() const { return value != INVALID_HANDLE_VALUE; }
223+
explicit operator bool() const { return value != recast<T>(defval); }
226224

227225
friend bool operator==(pointer lhs, pointer rhs) { return lhs.value == rhs.value; }
228226

229-
HANDLE value;
227+
T value;
230228
};
231229
};
232230

233-
// reset to nullptr
234-
using GenericHandle = std::unique_ptr<void, HandleDeleter>;
231+
struct HandleDeleter
232+
{
233+
void operator()(HANDLE h) noexcept
234+
{
235+
CloseHandle(h);
236+
}
237+
};
238+
239+
using GenericHandle = std::unique_ptr<void, GenericDeleter<HANDLE, HandleDeleter>>;
235240

236-
// reset to INVALID_HANDLE_VALUE
237-
using FileHandle = std::unique_ptr<void, FileHandleDeleter>;
241+
using FileHandle = std::unique_ptr<void, GenericDeleter<HANDLE, HandleDeleter, size_t(-1)>>;
238242

239243
struct PagesDeleter
240244
{

0 commit comments

Comments
 (0)