1 /////////////////////////////////////////////////////////////////////////////
3 // (C) Copyright Olaf Krzikalla 2004-2006.
4 // (C) Copyright Ion Gaztanaga 2006-2012
6 // Distributed under the Boost Software License, Version 1.0.
7 // (See accompanying file LICENSE_1_0.txt or copy at
8 // http://www.boost.org/LICENSE_1_0.txt)
10 // See http://www.boost.org/libs/intrusive for documentation.
12 /////////////////////////////////////////////////////////////////////////////
13 #ifndef BOOST_INTRUSIVE_SPLAY_SET_HOOK_HPP
14 #define BOOST_INTRUSIVE_SPLAY_SET_HOOK_HPP
16 #include <boost/intrusive/detail/config_begin.hpp>
17 #include <boost/intrusive/intrusive_fwd.hpp>
18 #include <boost/intrusive/detail/utilities.hpp>
19 #include <boost/intrusive/detail/tree_node.hpp>
20 #include <boost/intrusive/splaytree_algorithms.hpp>
21 #include <boost/intrusive/options.hpp>
22 #include <boost/intrusive/detail/generic_hook.hpp>
28 template<class VoidPointer>
29 struct get_splay_set_node_algo
31 typedef splaytree_algorithms<tree_node_traits<VoidPointer> > type;
35 //! Helper metafunction to define a \c splay_set_base_hook that yields to the same
36 //! type when the same options (either explicitly or implicitly) are used.
37 #if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) || defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES)
38 template<class ...Options>
40 template<class O1 = none, class O2 = none, class O3 = none>
42 struct make_splay_set_base_hook
45 typedef typename pack_options
47 #if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES)
52 >::type packed_options;
54 typedef detail::generic_hook
55 < get_splay_set_node_algo<typename packed_options::void_pointer>
56 , typename packed_options::tag
57 , packed_options::link_mode
58 , detail::SplaySetBaseHook
59 > implementation_defined;
61 typedef implementation_defined type;
64 //! Derive a class from splay_set_base_hook in order to store objects in
65 //! in a splay_set/splay_multiset. splay_set_base_hook holds the data necessary to maintain
66 //! the splay_set/splay_multiset and provides an appropriate value_traits class for splay_set/splay_multiset.
68 //! The hook admits the following options: \c tag<>, \c void_pointer<>,
69 //! \c link_mode<> and \c optimize_size<>.
71 //! \c tag<> defines a tag to identify the node.
72 //! The same tag value can be used in different classes, but if a class is
73 //! derived from more than one \c list_base_hook, then each \c list_base_hook needs its
76 //! \c void_pointer<> is the pointer type that will be used internally in the hook
77 //! and the the container configured to use this hook.
79 //! \c link_mode<> will specify the linking mode of the hook (\c normal_link,
80 //! \c auto_unlink or \c safe_link).
81 #if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) || defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES)
82 template<class ...Options>
84 template<class O1, class O2, class O3>
86 class splay_set_base_hook
87 : public make_splay_set_base_hook<
88 #if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES)
95 #if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
97 //! <b>Effects</b>: If link_mode is \c auto_unlink or \c safe_link
98 //! initializes the node to an unlinked state.
100 //! <b>Throws</b>: Nothing.
101 splay_set_base_hook();
103 //! <b>Effects</b>: If link_mode is \c auto_unlink or \c safe_link
104 //! initializes the node to an unlinked state. The argument is ignored.
106 //! <b>Throws</b>: Nothing.
108 //! <b>Rationale</b>: Providing a copy-constructor
109 //! makes classes using the hook STL-compliant without forcing the
110 //! user to do some additional work. \c swap can be used to emulate
112 splay_set_base_hook(const splay_set_base_hook& );
114 //! <b>Effects</b>: Empty function. The argument is ignored.
116 //! <b>Throws</b>: Nothing.
118 //! <b>Rationale</b>: Providing an assignment operator
119 //! makes classes using the hook STL-compliant without forcing the
120 //! user to do some additional work. \c swap can be used to emulate
122 splay_set_base_hook& operator=(const splay_set_base_hook& );
124 //! <b>Effects</b>: If link_mode is \c normal_link, the destructor does
125 //! nothing (ie. no code is generated). If link_mode is \c safe_link and the
126 //! object is stored in a set an assertion is raised. If link_mode is
127 //! \c auto_unlink and \c is_linked() is true, the node is unlinked.
129 //! <b>Throws</b>: Nothing.
130 ~splay_set_base_hook();
132 //! <b>Effects</b>: Swapping two nodes swaps the position of the elements
133 //! related to those nodes in one or two containers. That is, if the node
134 //! this is part of the element e1, the node x is part of the element e2
135 //! and both elements are included in the containers s1 and s2, then after
136 //! the swap-operation e1 is in s2 at the position of e2 and e2 is in s1
137 //! at the position of e1. If one element is not in a container, then
138 //! after the swap-operation the other element is not in a container.
139 //! Iterators to e1 and e2 related to those nodes are invalidated.
141 //! <b>Complexity</b>: Constant
143 //! <b>Throws</b>: Nothing.
144 void swap_nodes(splay_set_base_hook &other);
146 //! <b>Precondition</b>: link_mode must be \c safe_link or \c auto_unlink.
148 //! <b>Returns</b>: true, if the node belongs to a container, false
149 //! otherwise. This function can be used to test whether \c set::iterator_to
150 //! will return a valid iterator.
152 //! <b>Complexity</b>: Constant
153 bool is_linked() const;
155 //! <b>Effects</b>: Removes the node if it's inserted in a container.
156 //! This function is only allowed if link_mode is \c auto_unlink.
158 //! <b>Throws</b>: Nothing.
163 //! Helper metafunction to define a \c splay_set_member_hook that yields to the same
164 //! type when the same options (either explicitly or implicitly) are used.
165 #if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) || defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES)
166 template<class ...Options>
168 template<class O1 = none, class O2 = none, class O3 = none>
170 struct make_splay_set_member_hook
173 typedef typename pack_options
175 #if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES)
180 >::type packed_options;
182 typedef detail::generic_hook
183 < get_splay_set_node_algo<typename packed_options::void_pointer>
185 , packed_options::link_mode
187 > implementation_defined;
189 typedef implementation_defined type;
192 //! Put a public data member splay_set_member_hook in order to store objects of this
193 //! class in a splay_set/splay_multiset. splay_set_member_hook holds the data
194 //! necessary for maintaining the splay_set/splay_multiset and provides an appropriate
195 //! value_traits class for splay_set/splay_multiset.
197 //! The hook admits the following options: \c void_pointer<>,
198 //! \c link_mode<> and \c optimize_size<>.
200 //! \c void_pointer<> is the pointer type that will be used internally in the hook
201 //! and the the container configured to use this hook.
203 //! \c link_mode<> will specify the linking mode of the hook (\c normal_link,
204 //! \c auto_unlink or \c safe_link).
205 #if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED) || defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES)
206 template<class ...Options>
208 template<class O1, class O2, class O3>
210 class splay_set_member_hook
211 : public make_splay_set_member_hook<
212 #if !defined(BOOST_INTRUSIVE_VARIADIC_TEMPLATES)
219 #if defined(BOOST_INTRUSIVE_DOXYGEN_INVOKED)
221 //! <b>Effects</b>: If link_mode is \c auto_unlink or \c safe_link
222 //! initializes the node to an unlinked state.
224 //! <b>Throws</b>: Nothing.
225 splay_set_member_hook();
227 //! <b>Effects</b>: If link_mode is \c auto_unlink or \c safe_link
228 //! initializes the node to an unlinked state. The argument is ignored.
230 //! <b>Throws</b>: Nothing.
232 //! <b>Rationale</b>: Providing a copy-constructor
233 //! makes classes using the hook STL-compliant without forcing the
234 //! user to do some additional work. \c swap can be used to emulate
236 splay_set_member_hook(const splay_set_member_hook& );
238 //! <b>Effects</b>: Empty function. The argument is ignored.
240 //! <b>Throws</b>: Nothing.
242 //! <b>Rationale</b>: Providing an assignment operator
243 //! makes classes using the hook STL-compliant without forcing the
244 //! user to do some additional work. \c swap can be used to emulate
246 splay_set_member_hook& operator=(const splay_set_member_hook& );
248 //! <b>Effects</b>: If link_mode is \c normal_link, the destructor does
249 //! nothing (ie. no code is generated). If link_mode is \c safe_link and the
250 //! object is stored in a set an assertion is raised. If link_mode is
251 //! \c auto_unlink and \c is_linked() is true, the node is unlinked.
253 //! <b>Throws</b>: Nothing.
254 ~splay_set_member_hook();
256 //! <b>Effects</b>: Swapping two nodes swaps the position of the elements
257 //! related to those nodes in one or two containers. That is, if the node
258 //! this is part of the element e1, the node x is part of the element e2
259 //! and both elements are included in the containers s1 and s2, then after
260 //! the swap-operation e1 is in s2 at the position of e2 and e2 is in s1
261 //! at the position of e1. If one element is not in a container, then
262 //! after the swap-operation the other element is not in a container.
263 //! Iterators to e1 and e2 related to those nodes are invalidated.
265 //! <b>Complexity</b>: Constant
267 //! <b>Throws</b>: Nothing.
268 void swap_nodes(splay_set_member_hook &other);
270 //! <b>Precondition</b>: link_mode must be \c safe_link or \c auto_unlink.
272 //! <b>Returns</b>: true, if the node belongs to a container, false
273 //! otherwise. This function can be used to test whether \c set::iterator_to
274 //! will return a valid iterator.
276 //! <b>Complexity</b>: Constant
277 bool is_linked() const;
279 //! <b>Effects</b>: Removes the node if it's inserted in a container.
280 //! This function is only allowed if link_mode is \c auto_unlink.
282 //! <b>Throws</b>: Nothing.
287 } //namespace intrusive
290 #include <boost/intrusive/detail/config_end.hpp>
292 #endif //BOOST_INTRUSIVE_SPLAY_SET_HOOK_HPP