1 /////////////////////////////////////////////////////////////////////////////
3 // (C) Copyright Ion Gaztanaga 2006-2013.
5 // Distributed under the Boost Software License, Version 1.0.
6 // (See accompanying file LICENSE_1_0.txt or copy at
7 // http://www.boost.org/LICENSE_1_0.txt)
9 // See http://www.boost.org/libs/intrusive for documentation.
11 /////////////////////////////////////////////////////////////////////////////
12 #include <boost/intrusive/treap_set.hpp>
13 #include "itestvalue.hpp"
14 #include "bptr_value.hpp"
15 #include "smart_ptr.hpp"
16 #include "generic_set_test.hpp"
18 namespace boost { namespace intrusive { namespace test {
20 #if !defined (BOOST_INTRUSIVE_VARIADIC_TEMPLATES)
21 template<class T, class O1, class O2, class O3, class O4, class O5>
23 template<class T, class ...Options>
25 struct has_insert_before<boost::intrusive::treap_set<T,
26 #if !defined (BOOST_INTRUSIVE_VARIADIC_TEMPLATES)
33 static const bool value = true;
36 #if !defined (BOOST_INTRUSIVE_VARIADIC_TEMPLATES)
37 template<class T, class O1, class O2, class O3, class O4, class O5>
39 template<class T, class ...Options>
41 struct is_treap<boost::intrusive::treap_set<T,
42 #if !defined (BOOST_INTRUSIVE_VARIADIC_TEMPLATES)
49 static const bool value = true;
55 using namespace boost::intrusive;
59 template<class VoidPointer>
62 typedef bs_set_base_hook<void_pointer<VoidPointer> > base_hook_type;
63 typedef bs_set_base_hook
64 < void_pointer<VoidPointer>
65 , tag<my_tag> > auto_base_hook_type;
66 typedef bs_set_member_hook
67 < void_pointer<VoidPointer> > member_hook_type;
68 typedef bs_set_member_hook
69 < void_pointer<VoidPointer> > auto_member_hook_type;
70 typedef nonhook_node_member< tree_node_traits< VoidPointer >,
72 > nonhook_node_member_type;
75 // container generator with void node allocator
76 template < bool Default_Holder >
77 struct GetContainer_With_Holder
79 template< class ValueType
86 typedef boost::intrusive::treap_set
95 // container generator with standard (non-void) node allocator
97 struct GetContainer_With_Holder< false >
99 template< class ValueType
100 , class Option1 =void
101 , class Option2 =void
102 , class Option3 =void
106 // extract node type through options->value_traits->node_traits->node
107 typedef typename pack_options< treap_defaults, Option1, Option2, Option3 >::type packed_options;
108 typedef typename detail::get_value_traits< ValueType, typename packed_options::proto_value_traits>::type value_traits;
109 typedef typename value_traits::node_traits::node node;
111 typedef boost::intrusive::treap_set
116 , header_holder_type< pointer_holder< node > >
121 template<class VoidPointer, bool constant_time_size, bool Default_Holder>
122 class test_main_template
127 using namespace boost::intrusive;
128 typedef testvalue<hooks<VoidPointer> , constant_time_size> value_type;
130 test::test_generic_set < typename detail::get_base_value_traits
132 , typename hooks<VoidPointer>::base_hook_type
134 , GetContainer_With_Holder< Default_Holder >::template GetContainer
136 test::test_generic_set < typename detail::get_member_value_traits
137 < member_hook< value_type
138 , typename hooks<VoidPointer>::member_hook_type
142 , GetContainer_With_Holder< Default_Holder >::template GetContainer
144 test::test_generic_set < nonhook_node_member_value_traits< value_type,
145 typename hooks<VoidPointer>::nonhook_node_member_type,
146 &value_type::nhn_member_,
149 GetContainer_With_Holder< Default_Holder >::template GetContainer
155 template<class VoidPointer, bool Default_Holder>
156 class test_main_template<VoidPointer, false, Default_Holder>
161 using namespace boost::intrusive;
162 typedef testvalue<hooks<VoidPointer> , false> value_type;
164 test::test_generic_set < typename detail::get_base_value_traits
166 , typename hooks<VoidPointer>::base_hook_type
168 , GetContainer_With_Holder< Default_Holder >::template GetContainer
171 test::test_generic_set < typename detail::get_member_value_traits
172 < member_hook< value_type
173 , typename hooks<VoidPointer>::member_hook_type
177 , GetContainer_With_Holder< Default_Holder >::template GetContainer
180 test::test_generic_set < typename detail::get_base_value_traits
182 , typename hooks<VoidPointer>::auto_base_hook_type
184 , GetContainer_With_Holder< Default_Holder >::template GetContainer
187 test::test_generic_set < typename detail::get_member_value_traits
188 < member_hook< value_type
189 , typename hooks<VoidPointer>::auto_member_hook_type
190 , &value_type::auto_node_
193 , GetContainer_With_Holder< Default_Holder >::template GetContainer
200 // container generator which ignores further parametrization, except for compare option
201 template < typename Value_Traits, bool ConstantTimeSize, typename HeaderHolder >
202 struct Get_Preset_Container
205 , class Option1 = void
206 , class Option2 = void
207 , class Option3 = void
211 // ignore further paramatrization except for the compare option
212 // notably ignore the size option (use preset)
213 typedef typename pack_options< treap_defaults, Option1, Option2, Option3 >::type packed_options;
214 typedef typename packed_options::compare compare_option;
216 typedef boost::intrusive::treap_set< typename Value_Traits::value_type,
217 value_traits< Value_Traits >,
218 constant_time_size< ConstantTimeSize >,
219 compare< compare_option >,
220 header_holder_type< HeaderHolder >
225 template < bool ConstantTimeSize >
226 struct test_main_template_bptr
230 typedef BPtr_Value value_type;
231 typedef BPtr_Value_Traits< Tree_BPtr_Node_Traits > value_traits;
232 typedef bounded_allocator< value_type > allocator_type;
234 allocator_type::init();
235 test::test_generic_set< value_traits,
236 Get_Preset_Container< value_traits, ConstantTimeSize,
237 bounded_pointer_holder< value_type > >::template GetContainer
239 assert(allocator_type::is_clear());
240 allocator_type::destroy();
246 // test (plain/smart pointers) x (nonconst/const size) x (void node allocator)
247 test_main_template<void*, false, true>()();
248 test_main_template<boost::intrusive::smart_ptr<void>, false, true>()();
249 test_main_template<void*, true, true>()();
250 test_main_template<boost::intrusive::smart_ptr<void>, true, true>()();
251 // test (bounded pointers) x (nonconst/const size) x (special node allocator)
252 test_main_template_bptr< true >()();
253 test_main_template_bptr< false >()();
255 return boost::report_errors();