Index: installer/src/installer-lib/handle.h |
=================================================================== |
--- a/installer/src/installer-lib/handle.h |
+++ b/installer/src/installer-lib/handle.h |
@@ -69,7 +69,7 @@ |
} ; |
/** |
- * Policy class that does not close a file handle when it goes out of scope |
+ * Policy class that does not close a handle at all. |
*/ |
template< class T > |
class No_Destruction |
@@ -79,7 +79,7 @@ |
} ; |
/** |
- * Policy class that does not close a file handle when it goes out of scope |
+ * Policy class that closes an MSI handle when it goes out of scope. |
*/ |
template< class T > |
class MSI_Generic_Destruction |
@@ -91,6 +91,19 @@ |
} ; |
} ; |
+/** |
+ * Policy class that closes a Windows handle when it goes out of scope. |
+ */ |
+template< class T > |
+class Windows_Generic_Destruction |
+{ |
+public: |
+ inline static void close( T handle ) |
+ { |
+ CloseHandle( handle ) ; |
+ } ; |
+} ; |
+ |
//------------------------------------------------------- |
// Handle |
@@ -148,6 +161,41 @@ |
class handle |
: public handle_raw< T > |
{ |
+ /** |
+ * Copy constructor prohibited. |
+ * |
+ * This class represents an external resource and is responsible for its lifecycle. |
+ * As such, the semantics here require a one-to-one match between instances and resource. |
+ * Copy construction violates these semantics. |
+ * |
+ * \par Implementation |
+ * Currently, declared private and not defined. |
+ * Add "= delete" for C++11. |
+ */ |
+ handle( handle & ) ; |
+ |
+ /** |
+ * Copy assignment not implemented. |
+ * |
+ * It's not used anywhere yet. |
+ * |
+ * \par Implementation |
+ * Currently, declared private and not defined. |
+ */ |
+ handle operator=( const handle & ) ; |
+ |
+ /** |
+ * Validate initial handle values, both for construction and reinitialization assignment. |
+ */ |
+ T validate_handle( T handle ) |
+ { |
+ if ( Null_Policy< T >::prohibited_from_outside() && handle == 0 ) |
+ { |
+ throw null_handle_error() ; |
+ } |
+ return handle ; |
+ } |
+ |
protected: |
/** |
* Tag class for null record constructor |
@@ -176,13 +224,21 @@ |
* |
* A check for a non-zero handle compiles in conditionally based on the Null_Policy. |
*/ |
- handle( T _handle ) |
- : handle_raw( _handle ) |
+ handle( T handle ) |
+ : handle_raw( validate_handle( handle ) ) |
+ {} |
+ |
+ /** |
+ * Reinitialization Assignment. |
+ * |
+ * If we had C++11 move constructors, we wouldn't need this, since this acts exactly as construct-plus-move would. |
+ */ |
+ handle & operator=( T handle ) |
{ |
- if ( Null_Policy< T >::prohibited_from_outside() && _handle == 0 ) |
- { |
- throw null_handle_error() ; |
- } |
+ validate_handle( handle ) ; |
+ this -> ~handle() ; |
+ _handle = handle ; |
+ return * this ; |
} |
/** |
@@ -200,4 +256,9 @@ |
} ; |
+//------------------------------------------------------- |
+// Common instantiations of handle |
+//------------------------------------------------------- |
+typedef handle< HANDLE, Disallow_Null, Windows_Generic_Destruction > Windows_Handle ; |
+ |
#endif |