Move ellen_bintree_base.h from cds/container to cds/container/details
authorkhizmax <libcds.dev@gmail.com>
Sat, 27 Sep 2014 16:01:38 +0000 (20:01 +0400)
committerkhizmax <libcds.dev@gmail.com>
Sat, 27 Sep 2014 16:01:38 +0000 (20:01 +0400)
cds/container/details/ellen_bintree_base.h [new file with mode: 0644]
cds/container/ellen_bintree_base.h [deleted file]
cds/container/ellen_bintree_map_impl.h
cds/container/ellen_bintree_map_rcu.h
cds/container/ellen_bintree_set_impl.h
cds/container/ellen_bintree_set_rcu.h
projects/Win/vc12/cds.vcxproj
projects/Win/vc12/cds.vcxproj.filters
tests/unit/ellen_bintree_update_desc_pool.h

diff --git a/cds/container/details/ellen_bintree_base.h b/cds/container/details/ellen_bintree_base.h
new file mode 100644 (file)
index 0000000..ca6d790
--- /dev/null
@@ -0,0 +1,370 @@
+//$$CDS-header$$
+
+#ifndef __CDS_CONTAINER_DETAILS_ELLEN_BINTREE_BASE_H
+#define __CDS_CONTAINER_DETAILS_ELLEN_BINTREE_BASE_H
+
+#include <cds/intrusive/details/ellen_bintree_base.h>
+#include <cds/container/details/base.h>
+#include <cds/opt/compare.h>
+#include <cds/details/binary_functor_wrapper.h>
+
+
+namespace cds { namespace container {
+    /// EllenBinTree related definitions
+    /** @ingroup cds_nonintrusive_helper
+    */
+    namespace ellen_bintree {
+
+#ifdef CDS_DOXYGEN_INVOKED
+        /// Typedef for cds::intrusive::ellen_bintree::update_desc
+        typedef cds::intrusive::ellen_bintree::update_desc update_desc;
+
+        /// Typedef for cds::intrusive::ellen_bintree::internal_node
+        typedef cds::intrusive::ellen_bintree::internal_node internal_node;
+
+        /// Typedef for cds::intrusive::ellen_bintree::key_extractor
+        typedef cds::intrusive::ellen_bintree::key_extractor key_extractor;
+
+        /// Typedef for cds::intrusive::ellen_bintree::update_desc_allocator
+        typedef cds::intrusive::ellen_bintree::update_desc_allocator update_desc_allocator;
+
+        /// Typedef for cds::intrusive::ellen_bintree::stat
+        typedef cds::intrusive::ellen_bintree::stat stat;
+
+        /// Typedef for cds::intrusive::ellen_bintree::empty_stat
+        typedef cds::intrusive::ellen_bintree::empty_stat empty_stat;
+#else
+        using cds::intrusive::ellen_bintree::update_desc;
+        using cds::intrusive::ellen_bintree::internal_node;
+        using cds::intrusive::ellen_bintree::key_extractor;
+        using cds::intrusive::ellen_bintree::update_desc_allocator;
+        using cds::intrusive::ellen_bintree::stat;
+        using cds::intrusive::ellen_bintree::empty_stat;
+        using cds::intrusive::ellen_bintree::node_types;
+#endif
+
+        /// EllenBinTree leaf node
+        template <typename GC, typename T>
+        struct node: public cds::intrusive::ellen_bintree::node<GC>
+        {
+            typedef T   value_type  ;   ///< Value type
+
+            T   m_Value ;   ///< Value
+
+            /// Default ctor
+            node()
+            {}
+
+            /// Initializing ctor
+            template <typename Q>
+            node(Q const& v)
+                : m_Value(v)
+            {}
+
+            /// Copy constructor
+            template <typename... Args>
+            node( Args const&... args)
+                : m_Value( args... )
+            {}
+
+            /// Move constructor
+            template <typename... Args>
+            node( Args&&... args)
+                : m_Value( std::forward<Args>(args)... )
+            {}
+        };
+
+        /// EllenBinTreeMap leaf node
+        template <typename GC, typename Key, typename T>
+        struct map_node: public cds::intrusive::ellen_bintree::node< GC >
+        {
+            typedef Key     key_type    ;   ///< key type
+            typedef T       mapped_type ;   ///< value type
+            typedef std::pair<key_type const, mapped_type> value_type  ;   ///< key-value pair stored in the map
+
+            value_type  m_Value     ;   ///< Key-value pair stored in map leaf node
+
+            /// Initializes key field, value if default-constructed
+            template <typename K>
+            map_node( K const& key )
+                : m_Value( std::make_pair( key_type(key), mapped_type() ))
+            {}
+
+            /// Initializes key and value fields
+            template <typename K, typename Q>
+            map_node( K const& key, Q const& v )
+                : m_Value( std::make_pair(key_type(key), mapped_type(v) ))
+            {}
+        };
+
+        /// Type traits for EllenBinTreeSet, EllenBinTreeMap and EllenBinTreePriorityQueue
+        struct type_traits
+        {
+            /// Key extracting functor (only for EllenBinTreeSet)
+            /**
+                You should explicit define a valid functor.
+                The functor has the following prototype:
+                \code
+                struct key_extractor {
+                    void operator ()( Key& dest, T const& src );
+                };
+                \endcode
+                It should initialize \p dest key from \p src data.
+                The functor is used to initialize internal nodes.
+            */
+            typedef opt::none           key_extractor;
+
+            /// Key comparison functor
+            /**
+                No default functor is provided. If the option is not specified, the \p less is used.
+
+                See cds::opt::compare option description for functor interface.
+
+                You should provide \p compare or \p less functor.
+                See \ref cds_container_EllenBinTreeSet_rcu_less "predicate requirements".
+            */
+            typedef opt::none                       compare;
+
+            /// Specifies binary predicate used for key compare.
+            /**
+                See cds::opt::less option description for predicate interface.
+
+                You should provide \p compare or \p less functor.
+                See \ref cds_container_EllenBinTreeSet_rcu_less "predicate requirements".
+            */
+            typedef opt::none                       less;
+
+            /// Item counter
+            /**
+                The type for item counting feature (see cds::opt::item_counter).
+                Default is no item counter (\ref atomicity::empty_item_counter)
+            */
+            typedef atomicity::empty_item_counter     item_counter;
+
+            /// C++ memory ordering model
+            /**
+                List of available memory ordering see opt::memory_model
+            */
+            typedef opt::v::relaxed_ordering        memory_model;
+
+            /// Allocator for update descriptors
+            /**
+                The allocator type is used for \ref update_desc.
+
+                Update descriptor is helping data structure with short lifetime and it is good candidate
+                for pooling. The number of simultaneously existing descriptors is a small number
+                limited the number of threads working with the tree.
+                Therefore, a bounded lock-free container like \p cds::container::VyukovMPMCCycleQueue
+                is good choice for the free-list of update descriptors,
+                see cds::memory::vyukov_queue_pool free-list implementation.
+
+                Also notice that size of update descriptor is not dependent on the type of data
+                stored in the tree so single free-list object can be used for several \p EllenBinTree object.
+            */
+            typedef CDS_DEFAULT_ALLOCATOR           update_desc_allocator;
+
+            /// Allocator for internal nodes
+            /**
+                The allocator type is used for \ref internal_node.
+            */
+            typedef CDS_DEFAULT_ALLOCATOR           node_allocator;
+
+            /// Allocator for leaf nodes
+            /**
+                Each leaf node contains data stored in the container.
+            */
+            typedef CDS_DEFAULT_ALLOCATOR           allocator;
+
+            /// Internal statistics
+            /**
+                Possible types: ellen_bintree::empty_stat (the default), ellen_bintree::stat or any
+                other with interface like \p %stat.
+            */
+            typedef empty_stat                      stat;
+
+            /// RCU deadlock checking policy (only for RCU-based EllenBinTree<i>XXX</i> classes)
+            /**
+                List of available options see opt::rcu_check_deadlock
+            */
+            typedef cds::opt::v::rcu_throw_deadlock      rcu_check_deadlock;
+
+            /// Key copy policy (for EllenBinTreeMap)
+            /**
+                The key copy policy defines a functor to copy leaf node's key to internal node.
+                This policy is used only in EllenBinTreeMap. By default, assignment operator is used.
+
+                The copy functor interface is:
+                \code
+                struct copy_functor {
+                    void operator()( Key& dest, Key const& src );
+                };
+                \endcode
+            */
+            typedef opt::none                           copy_policy;
+        };
+
+
+        /// Metafunction converting option list to EllenBinTreeSet traits
+        /**
+            This is a wrapper for <tt> cds::opt::make_options< type_traits, Options...> </tt>
+            \p Options list see \ref cds_container_EllenBinTreeSet "EllenBinTreeSet".
+        */
+        template <typename... Options>
+        struct make_set_traits {
+#   ifdef CDS_DOXYGEN_INVOKED
+            typedef implementation_defined type ;   ///< Metafunction result
+#   else
+            typedef typename cds::opt::make_options<
+                typename cds::opt::find_type_traits< type_traits, Options... >::type
+                ,Options...
+            >::type   type;
+#   endif
+        };
+
+        /// Metafunction converting option list to EllenBinTreeMap traits
+        /**
+            This is a wrapper for <tt> cds::opt::make_options< type_traits, Options...> </tt>
+            \p Options list see \ref cds_container_EllenBinTreeMap "EllenBinTreeMap".
+        */
+        template <typename... Options>
+        struct make_map_traits {
+#   ifdef CDS_DOXYGEN_INVOKED
+            typedef implementation_defined type ;   ///< Metafunction result
+#   else
+            typedef typename cds::opt::make_options<
+                typename cds::opt::find_type_traits< type_traits, Options... >::type
+                ,Options...
+            >::type   type;
+#   endif
+        };
+
+        //@cond
+        namespace details {
+
+            template < class GC, typename Key, typename T, class Traits>
+            struct make_ellen_bintree_set
+            {
+                typedef GC      gc;
+                typedef Key     key_type;
+                typedef T       value_type;
+                typedef Traits  original_type_traits;
+
+                typedef node< gc, value_type >  leaf_node;
+
+                struct intrusive_key_extractor
+                {
+                    void operator()( key_type& dest, leaf_node const& src ) const
+                    {
+                        typename original_type_traits::key_extractor()( dest, src.m_Value );
+                    }
+                };
+
+                struct value_accessor
+                {
+                    value_type const& operator()( leaf_node const& node ) const
+                    {
+                        return node.m_Value;
+                    }
+                };
+
+                typedef typename cds::opt::details::make_comparator< value_type, original_type_traits, false >::type key_comparator;
+
+                typedef cds::details::Allocator< leaf_node, typename original_type_traits::allocator>    cxx_leaf_node_allocator;
+                struct leaf_deallocator
+                {
+                    void operator()( leaf_node * p ) const
+                    {
+                        cxx_leaf_node_allocator().Delete( p );
+                    }
+                };
+
+                struct intrusive_type_traits: public original_type_traits
+                {
+                    typedef cds::intrusive::ellen_bintree::base_hook< cds::opt::gc< gc > >  hook;
+                    typedef intrusive_key_extractor key_extractor;
+                    typedef leaf_deallocator        disposer;
+                    typedef cds::details::compare_wrapper< leaf_node, key_comparator, value_accessor > compare;
+                };
+
+                // Metafunction result
+                typedef cds::intrusive::EllenBinTree< gc, key_type, leaf_node, intrusive_type_traits >    type;
+            };
+
+            template < class GC, typename Key, typename T, class Traits>
+            struct make_ellen_bintree_map
+            {
+                typedef GC      gc;
+                typedef Key     key_type;
+                typedef T       mapped_type;
+                typedef map_node< gc, key_type, mapped_type >   leaf_node;
+                typedef typename leaf_node::value_type          value_type;
+
+                typedef Traits  original_type_traits;
+
+                struct assignment_copy_policy {
+                    void operator()( key_type& dest, key_type const& src )
+                    {
+                        dest = src;
+                    }
+                };
+                typedef typename std::conditional<
+                    std::is_same< typename original_type_traits::copy_policy, opt::none >::value,
+                    assignment_copy_policy,
+                    typename original_type_traits::copy_policy
+                >::type copy_policy;
+
+                struct intrusive_key_extractor
+                {
+                    void operator()( key_type& dest, leaf_node const& src ) const
+                    {
+                        copy_policy()( dest, src.m_Value.first );
+                    }
+                };
+
+                struct key_accessor
+                {
+                    key_type const& operator()( leaf_node const& node ) const
+                    {
+                        return node.m_Value.first;
+                    }
+                };
+
+                typedef typename cds::opt::details::make_comparator< key_type, original_type_traits, false >::type key_comparator;
+
+                typedef cds::details::Allocator< leaf_node, typename original_type_traits::allocator>    cxx_leaf_node_allocator;
+                struct leaf_deallocator
+                {
+                    void operator()( leaf_node * p ) const
+                    {
+                        cxx_leaf_node_allocator().Delete( p );
+                    }
+                };
+
+                struct intrusive_type_traits: public original_type_traits
+                {
+                    typedef cds::intrusive::ellen_bintree::base_hook< cds::opt::gc< gc > >  hook;
+                    typedef intrusive_key_extractor key_extractor;
+                    typedef leaf_deallocator        disposer;
+                    typedef cds::details::compare_wrapper< leaf_node, key_comparator, key_accessor >    compare;
+                };
+
+                // Metafunction result
+                typedef cds::intrusive::EllenBinTree< gc, key_type, leaf_node, intrusive_type_traits >    type;
+            };
+
+        } // namespace details
+        //@endcond
+    } // namespace ellen_bintree
+
+    // Forward declarations
+    //@cond
+    template < class GC, typename Key, typename T, class Traits = ellen_bintree::type_traits >
+    class EllenBinTreeSet;
+
+    template < class GC, typename Key, typename T, class Traits = ellen_bintree::type_traits >
+    class EllenBinTreeMap;
+    //@endcond
+
+}} // namespace cds::container
+
+#endif // #ifndef __CDS_CONTAINER_DETAILS_ELLEN_BINTREE_BASE_H
diff --git a/cds/container/ellen_bintree_base.h b/cds/container/ellen_bintree_base.h
deleted file mode 100644 (file)
index c772ffb..0000000
+++ /dev/null
@@ -1,370 +0,0 @@
-//$$CDS-header$$
-
-#ifndef __CDS_CONTAINER_ELLEN_BINTREE_BASE_H
-#define __CDS_CONTAINER_ELLEN_BINTREE_BASE_H
-
-#include <cds/intrusive/details/ellen_bintree_base.h>
-#include <cds/container/details/base.h>
-#include <cds/opt/compare.h>
-#include <cds/details/binary_functor_wrapper.h>
-
-
-namespace cds { namespace container {
-    /// EllenBinTree related definitions
-    /** @ingroup cds_nonintrusive_helper
-    */
-    namespace ellen_bintree {
-
-#ifdef CDS_DOXYGEN_INVOKED
-        /// Typedef for cds::intrusive::ellen_bintree::update_desc
-        typedef cds::intrusive::ellen_bintree::update_desc update_desc;
-
-        /// Typedef for cds::intrusive::ellen_bintree::internal_node
-        typedef cds::intrusive::ellen_bintree::internal_node internal_node;
-
-        /// Typedef for cds::intrusive::ellen_bintree::key_extractor
-        typedef cds::intrusive::ellen_bintree::key_extractor key_extractor;
-
-        /// Typedef for cds::intrusive::ellen_bintree::update_desc_allocator
-        typedef cds::intrusive::ellen_bintree::update_desc_allocator update_desc_allocator;
-
-        /// Typedef for cds::intrusive::ellen_bintree::stat
-        typedef cds::intrusive::ellen_bintree::stat stat;
-
-        /// Typedef for cds::intrusive::ellen_bintree::empty_stat
-        typedef cds::intrusive::ellen_bintree::empty_stat empty_stat;
-#else
-        using cds::intrusive::ellen_bintree::update_desc;
-        using cds::intrusive::ellen_bintree::internal_node;
-        using cds::intrusive::ellen_bintree::key_extractor;
-        using cds::intrusive::ellen_bintree::update_desc_allocator;
-        using cds::intrusive::ellen_bintree::stat;
-        using cds::intrusive::ellen_bintree::empty_stat;
-        using cds::intrusive::ellen_bintree::node_types;
-#endif
-
-        /// EllenBinTree leaf node
-        template <typename GC, typename T>
-        struct node: public cds::intrusive::ellen_bintree::node<GC>
-        {
-            typedef T   value_type  ;   ///< Value type
-
-            T   m_Value ;   ///< Value
-
-            /// Default ctor
-            node()
-            {}
-
-            /// Initializing ctor
-            template <typename Q>
-            node(Q const& v)
-                : m_Value(v)
-            {}
-
-            /// Copy constructor
-            template <typename... Args>
-            node( Args const&... args)
-                : m_Value( args... )
-            {}
-
-            /// Move constructor
-            template <typename... Args>
-            node( Args&&... args)
-                : m_Value( std::forward<Args>(args)... )
-            {}
-        };
-
-        /// EllenBinTreeMap leaf node
-        template <typename GC, typename Key, typename T>
-        struct map_node: public cds::intrusive::ellen_bintree::node< GC >
-        {
-            typedef Key     key_type    ;   ///< key type
-            typedef T       mapped_type ;   ///< value type
-            typedef std::pair<key_type const, mapped_type> value_type  ;   ///< key-value pair stored in the map
-
-            value_type  m_Value     ;   ///< Key-value pair stored in map leaf node
-
-            /// Initializes key field, value if default-constructed
-            template <typename K>
-            map_node( K const& key )
-                : m_Value( std::make_pair( key_type(key), mapped_type() ))
-            {}
-
-            /// Initializes key and value fields
-            template <typename K, typename Q>
-            map_node( K const& key, Q const& v )
-                : m_Value( std::make_pair(key_type(key), mapped_type(v) ))
-            {}
-        };
-
-        /// Type traits for EllenBinTreeSet, EllenBinTreeMap and EllenBinTreePriorityQueue
-        struct type_traits
-        {
-            /// Key extracting functor (only for EllenBinTreeSet)
-            /**
-                You should explicit define a valid functor.
-                The functor has the following prototype:
-                \code
-                struct key_extractor {
-                    void operator ()( Key& dest, T const& src );
-                };
-                \endcode
-                It should initialize \p dest key from \p src data.
-                The functor is used to initialize internal nodes.
-            */
-            typedef opt::none           key_extractor;
-
-            /// Key comparison functor
-            /**
-                No default functor is provided. If the option is not specified, the \p less is used.
-
-                See cds::opt::compare option description for functor interface.
-
-                You should provide \p compare or \p less functor.
-                See \ref cds_container_EllenBinTreeSet_rcu_less "predicate requirements".
-            */
-            typedef opt::none                       compare;
-
-            /// Specifies binary predicate used for key compare.
-            /**
-                See cds::opt::less option description for predicate interface.
-
-                You should provide \p compare or \p less functor.
-                See \ref cds_container_EllenBinTreeSet_rcu_less "predicate requirements".
-            */
-            typedef opt::none                       less;
-
-            /// Item counter
-            /**
-                The type for item counting feature (see cds::opt::item_counter).
-                Default is no item counter (\ref atomicity::empty_item_counter)
-            */
-            typedef atomicity::empty_item_counter     item_counter;
-
-            /// C++ memory ordering model
-            /**
-                List of available memory ordering see opt::memory_model
-            */
-            typedef opt::v::relaxed_ordering        memory_model;
-
-            /// Allocator for update descriptors
-            /**
-                The allocator type is used for \ref update_desc.
-
-                Update descriptor is helping data structure with short lifetime and it is good candidate
-                for pooling. The number of simultaneously existing descriptors is a small number
-                limited the number of threads working with the tree.
-                Therefore, a bounded lock-free container like \p cds::container::VyukovMPMCCycleQueue
-                is good choice for the free-list of update descriptors,
-                see cds::memory::vyukov_queue_pool free-list implementation.
-
-                Also notice that size of update descriptor is not dependent on the type of data
-                stored in the tree so single free-list object can be used for several \p EllenBinTree object.
-            */
-            typedef CDS_DEFAULT_ALLOCATOR           update_desc_allocator;
-
-            /// Allocator for internal nodes
-            /**
-                The allocator type is used for \ref internal_node.
-            */
-            typedef CDS_DEFAULT_ALLOCATOR           node_allocator;
-
-            /// Allocator for leaf nodes
-            /**
-                Each leaf node contains data stored in the container.
-            */
-            typedef CDS_DEFAULT_ALLOCATOR           allocator;
-
-            /// Internal statistics
-            /**
-                Possible types: ellen_bintree::empty_stat (the default), ellen_bintree::stat or any
-                other with interface like \p %stat.
-            */
-            typedef empty_stat                      stat;
-
-            /// RCU deadlock checking policy (only for RCU-based EllenBinTree<i>XXX</i> classes)
-            /**
-                List of available options see opt::rcu_check_deadlock
-            */
-            typedef cds::opt::v::rcu_throw_deadlock      rcu_check_deadlock;
-
-            /// Key copy policy (for EllenBinTreeMap)
-            /**
-                The key copy policy defines a functor to copy leaf node's key to internal node.
-                This policy is used only in EllenBinTreeMap. By default, assignment operator is used.
-
-                The copy functor interface is:
-                \code
-                struct copy_functor {
-                    void operator()( Key& dest, Key const& src );
-                };
-                \endcode
-            */
-            typedef opt::none                           copy_policy;
-        };
-
-
-        /// Metafunction converting option list to EllenBinTreeSet traits
-        /**
-            This is a wrapper for <tt> cds::opt::make_options< type_traits, Options...> </tt>
-            \p Options list see \ref cds_container_EllenBinTreeSet "EllenBinTreeSet".
-        */
-        template <typename... Options>
-        struct make_set_traits {
-#   ifdef CDS_DOXYGEN_INVOKED
-            typedef implementation_defined type ;   ///< Metafunction result
-#   else
-            typedef typename cds::opt::make_options<
-                typename cds::opt::find_type_traits< type_traits, Options... >::type
-                ,Options...
-            >::type   type;
-#   endif
-        };
-
-        /// Metafunction converting option list to EllenBinTreeMap traits
-        /**
-            This is a wrapper for <tt> cds::opt::make_options< type_traits, Options...> </tt>
-            \p Options list see \ref cds_container_EllenBinTreeMap "EllenBinTreeMap".
-        */
-        template <typename... Options>
-        struct make_map_traits {
-#   ifdef CDS_DOXYGEN_INVOKED
-            typedef implementation_defined type ;   ///< Metafunction result
-#   else
-            typedef typename cds::opt::make_options<
-                typename cds::opt::find_type_traits< type_traits, Options... >::type
-                ,Options...
-            >::type   type;
-#   endif
-        };
-
-        //@cond
-        namespace details {
-
-            template < class GC, typename Key, typename T, class Traits>
-            struct make_ellen_bintree_set
-            {
-                typedef GC      gc;
-                typedef Key     key_type;
-                typedef T       value_type;
-                typedef Traits  original_type_traits;
-
-                typedef node< gc, value_type >  leaf_node;
-
-                struct intrusive_key_extractor
-                {
-                    void operator()( key_type& dest, leaf_node const& src ) const
-                    {
-                        typename original_type_traits::key_extractor()( dest, src.m_Value );
-                    }
-                };
-
-                struct value_accessor
-                {
-                    value_type const& operator()( leaf_node const& node ) const
-                    {
-                        return node.m_Value;
-                    }
-                };
-
-                typedef typename cds::opt::details::make_comparator< value_type, original_type_traits, false >::type key_comparator;
-
-                typedef cds::details::Allocator< leaf_node, typename original_type_traits::allocator>    cxx_leaf_node_allocator;
-                struct leaf_deallocator
-                {
-                    void operator()( leaf_node * p ) const
-                    {
-                        cxx_leaf_node_allocator().Delete( p );
-                    }
-                };
-
-                struct intrusive_type_traits: public original_type_traits
-                {
-                    typedef cds::intrusive::ellen_bintree::base_hook< cds::opt::gc< gc > >  hook;
-                    typedef intrusive_key_extractor key_extractor;
-                    typedef leaf_deallocator        disposer;
-                    typedef cds::details::compare_wrapper< leaf_node, key_comparator, value_accessor > compare;
-                };
-
-                // Metafunction result
-                typedef cds::intrusive::EllenBinTree< gc, key_type, leaf_node, intrusive_type_traits >    type;
-            };
-
-            template < class GC, typename Key, typename T, class Traits>
-            struct make_ellen_bintree_map
-            {
-                typedef GC      gc;
-                typedef Key     key_type;
-                typedef T       mapped_type;
-                typedef map_node< gc, key_type, mapped_type >   leaf_node;
-                typedef typename leaf_node::value_type          value_type;
-
-                typedef Traits  original_type_traits;
-
-                struct assignment_copy_policy {
-                    void operator()( key_type& dest, key_type const& src )
-                    {
-                        dest = src;
-                    }
-                };
-                typedef typename std::conditional<
-                    std::is_same< typename original_type_traits::copy_policy, opt::none >::value,
-                    assignment_copy_policy,
-                    typename original_type_traits::copy_policy
-                >::type copy_policy;
-
-                struct intrusive_key_extractor
-                {
-                    void operator()( key_type& dest, leaf_node const& src ) const
-                    {
-                        copy_policy()( dest, src.m_Value.first );
-                    }
-                };
-
-                struct key_accessor
-                {
-                    key_type const& operator()( leaf_node const& node ) const
-                    {
-                        return node.m_Value.first;
-                    }
-                };
-
-                typedef typename cds::opt::details::make_comparator< key_type, original_type_traits, false >::type key_comparator;
-
-                typedef cds::details::Allocator< leaf_node, typename original_type_traits::allocator>    cxx_leaf_node_allocator;
-                struct leaf_deallocator
-                {
-                    void operator()( leaf_node * p ) const
-                    {
-                        cxx_leaf_node_allocator().Delete( p );
-                    }
-                };
-
-                struct intrusive_type_traits: public original_type_traits
-                {
-                    typedef cds::intrusive::ellen_bintree::base_hook< cds::opt::gc< gc > >  hook;
-                    typedef intrusive_key_extractor key_extractor;
-                    typedef leaf_deallocator        disposer;
-                    typedef cds::details::compare_wrapper< leaf_node, key_comparator, key_accessor >    compare;
-                };
-
-                // Metafunction result
-                typedef cds::intrusive::EllenBinTree< gc, key_type, leaf_node, intrusive_type_traits >    type;
-            };
-
-        } // namespace details
-        //@endcond
-    } // namespace ellen_bintree
-
-    // Forward declarations
-    //@cond
-    template < class GC, typename Key, typename T, class Traits = ellen_bintree::type_traits >
-    class EllenBinTreeSet;
-
-    template < class GC, typename Key, typename T, class Traits = ellen_bintree::type_traits >
-    class EllenBinTreeMap;
-    //@endcond
-
-}} // namespace cds::container
-
-#endif // #ifndef __CDS_CONTAINER_ELLEN_BINTREE_BASE_H
index 7f34946a789f9b452e0e9d16618fdabb715865f0..4da5814714a9d9d1f471fb22f7007993d274cf14 100644 (file)
@@ -4,7 +4,7 @@
 #define __CDS_CONTAINER_ELLEN_BINTREE_MAP_IMPL_H
 
 #include <type_traits>
-#include <cds/container/ellen_bintree_base.h>
+#include <cds/container/details/ellen_bintree_base.h>
 #include <cds/intrusive/impl/ellen_bintree.h>
 #include <cds/details/functor_wrapper.h>
 #include <cds/container/details/guarded_ptr_cast.h>
index c61a01cb6ef13de8dcd83017ca256c3a1cdbe16f..3da5594285604aa7640004b321bdefea2d32273b 100644 (file)
@@ -3,7 +3,7 @@
 #ifndef __CDS_CONTAINER_ELLEN_BINTREE_MAP_RCU_H
 #define __CDS_CONTAINER_ELLEN_BINTREE_MAP_RCU_H
 
-#include <cds/container/ellen_bintree_base.h>
+#include <cds/container/details/ellen_bintree_base.h>
 #include <cds/intrusive/ellen_bintree_rcu.h>
 #include <cds/details/functor_wrapper.h>
 
index 43e5ae6103a236c1a75300f16ce7126dd7fc1945..b51dd9270b6fc28fc6d10d55049e4d5bc523700e 100644 (file)
@@ -4,7 +4,7 @@
 #define __CDS_CONTAINER_ELLEN_BINTREE_SET_IMPL_H
 
 #include <type_traits>
-#include <cds/container/ellen_bintree_base.h>
+#include <cds/container/details/ellen_bintree_base.h>
 #include <cds/intrusive/impl/ellen_bintree.h>
 #include <cds/container/details/guarded_ptr_cast.h>
 
index 949f5c09ab8efeb95f01448b1e4848a797448dc7..96788e52c09df3eacd862d2c2058bd4e7c01fb9e 100644 (file)
@@ -3,7 +3,7 @@
 #ifndef __CDS_CONTAINER_ELLEN_BINTREE_SET_RCU_H
 #define __CDS_CONTAINER_ELLEN_BINTREE_SET_RCU_H
 
-#include <cds/container/ellen_bintree_base.h>
+#include <cds/container/details/ellen_bintree_base.h>
 #include <cds/intrusive/ellen_bintree_rcu.h>
 
 namespace cds { namespace container {
index ce60f7434f4fb603ed4db5a1843cfb385597f61b..8ff0c9cacf2f030cb01a43164d4548a2c1730c04 100644 (file)
     <ClInclude Include="..\..\..\cds\container\cuckoo_set.h" />\r
     <ClInclude Include="..\..\..\cds\container\details\base.h" />\r
     <ClInclude Include="..\..\..\cds\container\details\cuckoo_base.h" />\r
+    <ClInclude Include="..\..\..\cds\container\details\ellen_bintree_base.h" />\r
     <ClInclude Include="..\..\..\cds\container\details\guarded_ptr_cast.h" />\r
     <ClInclude Include="..\..\..\cds\container\details\make_skip_list_map.h" />\r
     <ClInclude Include="..\..\..\cds\container\details\make_skip_list_set.h" />\r
     <ClInclude Include="..\..\..\cds\container\details\make_split_list_set.h" />\r
-    <ClInclude Include="..\..\..\cds\container\ellen_bintree_base.h" />\r
     <ClInclude Include="..\..\..\cds\container\ellen_bintree_map_hp.h" />\r
     <ClInclude Include="..\..\..\cds\container\ellen_bintree_map_impl.h" />\r
     <ClInclude Include="..\..\..\cds\container\ellen_bintree_map_ptb.h" />\r
index be401fc21b6eb822671519d1dfd4482b8f706313..54443a7fe11f86ba1843ee79b269bd1a2543caa1 100644 (file)
     <ClInclude Include="..\..\..\cds\intrusive\ellen_bintree_rcu.h">\r
       <Filter>Header Files\cds\intrusive</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="..\..\..\cds\container\ellen_bintree_base.h">\r
-      <Filter>Header Files\cds\container</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="..\..\..\cds\container\ellen_bintree_set_rcu.h">\r
       <Filter>Header Files\cds\container</Filter>\r
     </ClInclude>\r
     <ClInclude Include="..\..\..\cds\container\details\cuckoo_base.h">\r
       <Filter>Header Files\cds\container\details</Filter>\r
     </ClInclude>\r
+    <ClInclude Include="..\..\..\cds\container\details\ellen_bintree_base.h">\r
+      <Filter>Header Files\cds\container\details</Filter>\r
+    </ClInclude>\r
   </ItemGroup>\r
 </Project>
\ No newline at end of file
index ccb37f23835d5f406087eafdb8ba7e76a742e527..0887b2f915fe490e33638f461d7cef992a749f8e 100644 (file)
@@ -4,7 +4,7 @@
 #define __CDS_UNIT_ELLEN_BINTREE_UPDATE_DESC_POOL_H
 
 #include <cds/urcu/general_instant.h>
-#include <cds/container/ellen_bintree_base.h>
+#include <cds/container/details/ellen_bintree_base.h>
 #include <cds/memory/vyukov_queue_pool.h>
 #include <cds/memory/pool_allocator.h>