File indexing completed on 2025-01-18 09:38:36
0001
0002
0003
0004
0005
0006
0007
0008
0009
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
0247
0248
0249
0250
0251
0252
0253
0254
0255 BOOST_INTRUSIVE_FORCEINLINE static void init(node_ptr n) BOOST_NOEXCEPT
0256 { n->node_ptr_1 = node_ptr(); };
0257
0258
0259
0260
0261
0262
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
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
0278
0279 any_algorithms<VoidPointer>::template function_not_available_for_any_hooks<node_ptr>();
0280 }
0281 };
0282
0283
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
0293
0294 }
0295 }
0296
0297 #endif