Removes randomness in sequential map test case
[libcds.git] / cds / opt / value_cleaner.h
index c4a952f78d3933cc99f6a3dcd8367c0a1864f310..81e79b16037696caf6df90254fd3ec4e8b23e6dd 100644 (file)
@@ -1,11 +1,11 @@
 /*
     This file is a part of libcds - Concurrent Data Structures library
 
-    (C) Copyright Maxim Khizhinsky (libcds.dev@gmail.com) 2006-2016
+    (C) Copyright Maxim Khizhinsky (libcds.dev@gmail.com) 2006-2017
 
     Source code repo: http://github.com/khizmax/libcds/
     Download: http://sourceforge.net/projects/libcds/files/
-    
+
     Redistribution and use in source and binary forms, with or without
     modification, are permitted provided that the following conditions are met:
 
@@ -25,7 +25,7 @@
     SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
     CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
     OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.     
+    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
 #ifndef CDSLIB_OPT_ITEM_DISPOSER_H
@@ -48,13 +48,15 @@ namespace cds { namespace opt {
             void operator ()( value_type& val )
             {
                 ...
-                // code to cleanup \p val
+                // code to cleanup val
             }
         }
         \endcode
 
         Predefined option types:
             \li opt::v::empty_cleaner
+            \li opt::v::destruct_cleaner
+            \li opt::v::auto_cleaner
     */
     template <typename Type>
     struct value_cleaner {
@@ -92,7 +94,32 @@ namespace cds { namespace opt {
             template <typename T>
             void operator()( T& val )
             {
-                (&val)->T::~T();
+                ( &val )->~T();
+            }
+            //@endcond
+        };
+
+        /// Cleaner that calls \p T destructor if it is not trivial
+        /**
+            If \p T has non-trivial destructor (<tt> std::is_trivially_destructible<T>::value </tt> is \p false),
+            the cleaner calls \p T destructor.
+
+            If <tt> std::is_trivially_destructible<T>::value </tt> is \p true, the cleaner is empty - no
+            destructor of \p T is called.
+        */
+        struct auto_cleaner
+        {
+            //@cond
+            template <typename T>
+            typename std::enable_if< std::is_trivially_destructible<T>::value >::type
+            operator()( T& /*val*/ )
+            {}
+
+            template <typename T>
+            typename std::enable_if< !std::is_trivially_destructible<T>::value >::type
+            operator()( T& val )
+            {
+                ( &val )->~T();
             }
             //@endcond
         };