// Copyright (c) 2006-2018 Maxim Khizhinsky // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE or copy at http://www.boost.org/LICENSE_1_0.txt) #ifndef CDSLIB_OPT_ITEM_DISPOSER_H #define CDSLIB_OPT_ITEM_DISPOSER_H #include namespace cds { namespace opt { /// [type-option] value cleaning /** The cleaner is a functor called when an item is removed from a container. Note, the cleaner should not delete (deallocate) the value \p val passed in. However, if the \p value_type type is a structure that contains dynamically allocated field(s), the cleaning functor may deallocate it and initialize to default value (usually, \p nullptr). The interface for type \p value_type is: \code struct myCleaner { void operator ()( value_type& 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 struct value_cleaner { //@cond template struct pack: public BASE { typedef Type value_cleaner; }; //@endcond }; namespace v { /// Empty cleaner /** One of available type for \p opt::value_cleaner option. This cleaner is empty, i.e. it does not do any cleaning. */ struct empty_cleaner { //@cond template void operator()( T& /*val*/ ) {} //@endcond }; /// Cleaner that calls destructor of type \p T /** One of available type for \p opt::value_cleaner option. */ struct destruct_cleaner { //@cond template void operator()( T& val ) { ( &val )->~T(); } //@endcond }; /// Cleaner that calls \p T destructor if it is not trivial /** If \p T has non-trivial destructor ( std::is_trivially_destructible::value is \p false), the cleaner calls \p T destructor. If std::is_trivially_destructible::value is \p true, the cleaner is empty - no destructor of \p T is called. */ struct auto_cleaner { //@cond template typename std::enable_if< std::is_trivially_destructible::value >::type operator()( T& /*val*/ ) {} template typename std::enable_if< !std::is_trivially_destructible::value >::type operator()( T& val ) { ( &val )->~T(); } //@endcond }; } // namespace v }} // namespace cds::opt #endif // #ifndef CDSLIB_OPT_ITEM_DISPOSER_H