Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-01-18 09:38:36

0001 /////////////////////////////////////////////////////////////////////////////
0002 //
0003 // (C) Copyright Ion Gaztanaga  2006-2014
0004 //
0005 // Distributed under the Boost Software License, Version 1.0.
0006 //    (See accompanying file LICENSE_1_0.txt or copy at
0007 //          http://www.boost.org/LICENSE_1_0.txt)
0008 //
0009 // See http://www.boost.org/libs/intrusive for documentation.
0010 //
0011 /////////////////////////////////////////////////////////////////////////////
0012 
0013 #ifndef BOOST_INTRUSIVE_ANY_NODE_HPP
0014 #define BOOST_INTRUSIVE_ANY_NODE_HPP
0015 
0016 #ifndef BOOST_CONFIG_HPP
0017 #  include <boost/config.hpp>
0018 #endif
0019 
0020 #if defined(BOOST_HAS_PRAGMA_ONCE)
0021 #  pragma once
0022 #endif
0023 
0024 #include <boost/intrusive/detail/workaround.hpp>
0025 #include <boost/intrusive/pointer_rebind.hpp>
0026 #include <boost/intrusive/detail/mpl.hpp>
0027 #include <boost/intrusive/detail/algo_type.hpp>
0028 #include <cstddef>
0029 
0030 namespace boost {
0031 namespace intrusive {
0032 
0033 template<class VoidPointer>
0034 struct any_node
0035 {
0036    typedef any_node                                               node;
0037    typedef typename pointer_rebind<VoidPointer, node>::type       node_ptr;
0038    typedef typename pointer_rebind<VoidPointer, const node>::type const_node_ptr;
0039    node_ptr    node_ptr_1;
0040    node_ptr    node_ptr_2;
0041    node_ptr    node_ptr_3;
0042    std::size_t size_t_1;
0043 };
0044 
0045 template<class VoidPointer>
0046 struct any_list_node_traits
0047 {
0048    typedef any_node<VoidPointer>          node;
0049    typedef typename node::node_ptr        node_ptr;
0050    typedef typename node::const_node_ptr  const_node_ptr;
0051 
0052    BOOST_INTRUSIVE_FORCEINLINE static node_ptr get_next(const_node_ptr n)
0053    {  return n->node_ptr_1;  }
0054 
0055    BOOST_INTRUSIVE_FORCEINLINE static void set_next(node_ptr n, node_ptr next)
0056    {  n->node_ptr_1 = next;  }
0057 
0058    BOOST_INTRUSIVE_FORCEINLINE static node_ptr get_previous(const_node_ptr n)
0059    {  return n->node_ptr_2;  }
0060 
0061    BOOST_INTRUSIVE_FORCEINLINE static void set_previous(node_ptr n, node_ptr prev)
0062    {  n->node_ptr_2 = prev;  }
0063 };
0064 
0065 
0066 template<class VoidPointer>
0067 struct any_slist_node_traits
0068 {
0069    typedef any_node<VoidPointer>          node;
0070    typedef typename node::node_ptr        node_ptr;
0071    typedef typename node::const_node_ptr  const_node_ptr;
0072 
0073    BOOST_INTRUSIVE_FORCEINLINE static node_ptr get_next(const_node_ptr n)
0074    {  return n->node_ptr_1;  }
0075 
0076    BOOST_INTRUSIVE_FORCEINLINE static void set_next(node_ptr n, node_ptr next)
0077    {  n->node_ptr_1 = next;  }
0078 };
0079 
0080 
0081 template<class VoidPointer>
0082 struct any_unordered_node_traits
0083    :  public any_slist_node_traits<VoidPointer>
0084 {
0085    typedef any_slist_node_traits<VoidPointer>                  reduced_slist_node_traits;
0086    typedef typename reduced_slist_node_traits::node            node;
0087    typedef typename reduced_slist_node_traits::node_ptr        node_ptr;
0088    typedef typename reduced_slist_node_traits::const_node_ptr  const_node_ptr;
0089 
0090    static const bool store_hash        = true;
0091    static const bool optimize_multikey = true;
0092 
0093    BOOST_INTRUSIVE_FORCEINLINE static node_ptr get_next(const_node_ptr n)
0094    {  return n->node_ptr_1;   }
0095 
0096    BOOST_INTRUSIVE_FORCEINLINE static void set_next(node_ptr n, node_ptr next)
0097    {  n->node_ptr_1 = next;  }
0098 
0099    BOOST_INTRUSIVE_FORCEINLINE static node_ptr get_prev_in_group(const_node_ptr n)
0100    {  return n->node_ptr_2;  }
0101 
0102    BOOST_INTRUSIVE_FORCEINLINE static void set_prev_in_group(node_ptr n, node_ptr prev)
0103    {  n->node_ptr_2 = prev;  }
0104 
0105    BOOST_INTRUSIVE_FORCEINLINE static std::size_t get_hash(const_node_ptr n)
0106    {  return n->size_t_1;  }
0107 
0108    BOOST_INTRUSIVE_FORCEINLINE static void set_hash(node_ptr n, std::size_t h)
0109    {  n->size_t_1 = h;  }
0110 };
0111 
0112 
0113 template<class VoidPointer>
0114 struct any_rbtree_node_traits
0115 {
0116    typedef any_node<VoidPointer>          node;
0117    typedef typename node::node_ptr        node_ptr;
0118    typedef typename node::const_node_ptr  const_node_ptr;
0119 
0120    typedef std::size_t color;
0121 
0122    BOOST_INTRUSIVE_FORCEINLINE static node_ptr get_parent(const_node_ptr n)
0123    {  return n->node_ptr_1;  }
0124 
0125    BOOST_INTRUSIVE_FORCEINLINE static void set_parent(node_ptr n, node_ptr p)
0126    {  n->node_ptr_1 = p;  }
0127 
0128    BOOST_INTRUSIVE_FORCEINLINE static node_ptr get_left(const_node_ptr n)
0129    {  return n->node_ptr_2;  }
0130 
0131    BOOST_INTRUSIVE_FORCEINLINE static void set_left(node_ptr n, node_ptr l)
0132    {  n->node_ptr_2 = l;  }
0133 
0134    BOOST_INTRUSIVE_FORCEINLINE static node_ptr get_right(const_node_ptr n)
0135    {  return n->node_ptr_3;  }
0136 
0137    BOOST_INTRUSIVE_FORCEINLINE static void set_right(node_ptr n, node_ptr r)
0138    {  n->node_ptr_3 = r;  }
0139 
0140    BOOST_INTRUSIVE_FORCEINLINE static color get_color(const_node_ptr n)
0141    {  return n->size_t_1;  }
0142 
0143    BOOST_INTRUSIVE_FORCEINLINE static void set_color(node_ptr n, color c)
0144    {  n->size_t_1 = c;  }
0145 
0146    BOOST_INTRUSIVE_FORCEINLINE static color black()
0147    {  return 0u;  }
0148 
0149    BOOST_INTRUSIVE_FORCEINLINE static color red()
0150    {  return 1u;  }
0151 };
0152 
0153 
0154 template<class VoidPointer>
0155 struct any_avltree_node_traits
0156 {
0157    typedef any_node<VoidPointer>          node;
0158    typedef typename node::node_ptr        node_ptr;
0159    typedef typename node::const_node_ptr  const_node_ptr;
0160 
0161    typedef std::size_t balance;
0162 
0163    BOOST_INTRUSIVE_FORCEINLINE static node_ptr get_parent(const_node_ptr n)
0164    {  return n->node_ptr_1;  }
0165 
0166    BOOST_INTRUSIVE_FORCEINLINE static void set_parent(node_ptr n, node_ptr p)
0167    {  n->node_ptr_1 = p;  }
0168 
0169    BOOST_INTRUSIVE_FORCEINLINE static node_ptr get_left(const_node_ptr n)
0170    {  return n->node_ptr_2;  }
0171 
0172    BOOST_INTRUSIVE_FORCEINLINE static void set_left(node_ptr n, node_ptr l)
0173    {  n->node_ptr_2 = l;  }
0174 
0175    BOOST_INTRUSIVE_FORCEINLINE static node_ptr get_right(const_node_ptr n)
0176    {  return n->node_ptr_3;  }
0177 
0178    BOOST_INTRUSIVE_FORCEINLINE static void set_right(node_ptr n, node_ptr r)
0179    {  n->node_ptr_3 = r;  }
0180 
0181    BOOST_INTRUSIVE_FORCEINLINE static balance get_balance(const_node_ptr n)
0182    {  return n->size_t_1;  }
0183 
0184    BOOST_INTRUSIVE_FORCEINLINE static void set_balance(node_ptr n, balance b)
0185    {  n->size_t_1 = b;  }
0186 
0187    BOOST_INTRUSIVE_FORCEINLINE static balance negative()
0188    {  return 0u;  }
0189 
0190    BOOST_INTRUSIVE_FORCEINLINE static balance zero()
0191    {  return 1u;  }
0192 
0193    BOOST_INTRUSIVE_FORCEINLINE static balance positive()
0194    {  return 2u;  }
0195 };
0196 
0197 
0198 template<class VoidPointer>
0199 struct any_tree_node_traits
0200 {
0201    typedef any_node<VoidPointer>          node;
0202    typedef typename node::node_ptr        node_ptr;
0203    typedef typename node::const_node_ptr  const_node_ptr;
0204 
0205    BOOST_INTRUSIVE_FORCEINLINE static node_ptr get_parent(const_node_ptr n)
0206    {  return n->node_ptr_1;  }
0207 
0208    BOOST_INTRUSIVE_FORCEINLINE static void set_parent(node_ptr n, node_ptr p)
0209    {  n->node_ptr_1 = p;  }
0210 
0211    BOOST_INTRUSIVE_FORCEINLINE static node_ptr get_left(const_node_ptr n)
0212    {  return n->node_ptr_2;  }
0213 
0214    BOOST_INTRUSIVE_FORCEINLINE static void set_left(node_ptr n, node_ptr l)
0215    {  n->node_ptr_2 = l;  }
0216 
0217    BOOST_INTRUSIVE_FORCEINLINE static node_ptr get_right(const_node_ptr n)
0218    {  return n->node_ptr_3;  }
0219 
0220    BOOST_INTRUSIVE_FORCEINLINE static void set_right(node_ptr n, node_ptr r)
0221    {  n->node_ptr_3 = r;  }
0222 };
0223 
0224 template<class VoidPointer>
0225 class any_node_traits
0226 {
0227    public:
0228    typedef any_node<VoidPointer>          node;
0229    typedef typename node::node_ptr        node_ptr;
0230    typedef typename node::const_node_ptr  const_node_ptr;
0231 };
0232 
0233 template<class VoidPointer>
0234 class any_algorithms
0235 {
0236    template <class T>
0237    static void function_not_available_for_any_hooks(typename detail::enable_if<detail::is_same<T, bool> >::type)
0238    {}
0239 
0240    public:
0241    typedef any_node<VoidPointer>          node;
0242    typedef typename node::node_ptr        node_ptr;
0243    typedef typename node::const_node_ptr  const_node_ptr;
0244    typedef any_node_traits<VoidPointer>   node_traits;
0245 
0246    //! <b>Requires</b>: 'n' must not be part of any tree.
0247    //!
0248    //! <b>Effects</b>: After the function unique(node) == true.
0249    //!
0250    //! <b>Complexity</b>: Constant.
0251    //!
0252    //! <b>Throws</b>: Nothing.
0253    //!
0254    //! <b>Nodes</b>: If node is inserted in a tree, this function corrupts the tree.
0255    BOOST_INTRUSIVE_FORCEINLINE static void init(node_ptr n) BOOST_NOEXCEPT
0256    {  n->node_ptr_1 = node_ptr();   };
0257 
0258    //! <b>Effects</b>: Returns true if 'n' is in the same state as if called init(node)
0259    //!
0260    //! <b>Complexity</b>: Constant.
0261    //!
0262    //! <b>Throws</b>: Nothing.
0263    BOOST_INTRUSIVE_FORCEINLINE static bool inited(const_node_ptr n)
0264    {  return !n->node_ptr_1;  };
0265 
0266    BOOST_INTRUSIVE_FORCEINLINE static bool unique(const_node_ptr n) BOOST_NOEXCEPT
0267    {  return !n->node_ptr_1; }
0268 
0269    static void unlink(node_ptr)
0270    {
0271       //Auto-unlink hooks and unlink() are not available for any hooks
0272       any_algorithms<VoidPointer>::template function_not_available_for_any_hooks<node_ptr>();
0273    }
0274 
0275    static void swap_nodes(node_ptr, node_ptr)
0276    {
0277       //Any nodes have no swap_nodes capability because they don't know
0278       //what algorithm they must use to unlink the node from the container
0279       any_algorithms<VoidPointer>::template function_not_available_for_any_hooks<node_ptr>();
0280    }
0281 };
0282 
0283 ///@cond
0284 
0285 template<class NodeTraits>
0286 struct get_algo<AnyAlgorithm, NodeTraits>
0287 {
0288    typedef typename pointer_rebind<typename NodeTraits::node_ptr, void>::type void_pointer;
0289    typedef any_algorithms<void_pointer> type;
0290 };
0291 
0292 ///@endcond
0293 
0294 } //namespace intrusive
0295 } //namespace boost
0296 
0297 #endif //BOOST_INTRUSIVE_ANY_NODE_HPP