@@ -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
239243struct PagesDeleter
240244{
0 commit comments