1 /////////////////////////////////////////////////////////////////////////////
3 // (C) Copyright Ion Gaztanaga 2006-2015.
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/unordered_set.hpp>
13 #include <boost/intrusive/pointer_traits.hpp>
14 #include <boost/intrusive/detail/iterator.hpp>
15 #include "itestvalue.hpp"
16 #include "smart_ptr.hpp"
17 #include "common_functors.hpp"
20 #include <boost/detail/lightweight_test.hpp>
21 #include "test_macros.hpp"
22 #include "test_container.hpp"
23 #include "unordered_test_common.hpp"
24 #include "unordered_test.hpp"
26 using namespace boost::intrusive
;
28 template < class ValueTraits
, bool ConstantTimeSize
, bool CacheBegin
, bool CompareHash
, bool Incremental
, bool Map
, bool DefaultHolder
>
31 typedef unordered_rebinder_common
<ValueTraits
, DefaultHolder
, Map
> common_t
;
32 typedef typename ValueContainer
< typename
ValueTraits::value_type
>::type value_cont_type
;
34 template < class Option1
=void
40 < typename
common_t::value_type
41 , value_traits
<ValueTraits
>
42 , constant_time_size
<ConstantTimeSize
>
43 , cache_begin
<CacheBegin
>
44 , compare_hash
<CompareHash
>
45 , incremental
<Incremental
>
46 , typename
common_t::holder_opt
47 , typename
common_t::key_of_value_opt
51 BOOST_STATIC_ASSERT((key_type_tester
<typename
common_t::key_of_value_opt
, type
>::value
));
52 BOOST_STATIC_ASSERT((!boost::intrusive::test::is_multikey_true
<type
>::value
));
63 template<class VoidPointer
, bool ConstantTimeSize
, bool DefaultHolder
, bool Map
, HookType Type
>
64 class test_main_template
;
66 template<class VoidPointer
, bool ConstantTimeSize
, bool DefaultHolder
, bool Map
>
67 class test_main_template
<VoidPointer
, ConstantTimeSize
, DefaultHolder
, Map
, Base
>
72 typedef testvalue
<unordered_hooks
<VoidPointer
> > value_type
;
73 static const int random_init
[6] = { 3, 2, 4, 1, 5, 2 };
74 typedef typename ValueContainer
< value_type
>::type value_cont_type
;
75 value_cont_type
data (6);
76 for (int i
= 0; i
< 6; ++i
)
77 data
[i
].value_
= random_init
[i
];
79 typedef testvalue_traits
< unordered_hooks
<VoidPointer
> > testval_traits_t
;
81 typedef typename
detail::if_c
83 , typename
testval_traits_t::base_value_traits
84 , typename
testval_traits_t::auto_base_value_traits
//store_hash<true>
87 < //cache_begin, compare_hash, incremental
88 rebinder
<base_hook_t
, ConstantTimeSize
, ConstantTimeSize
, !ConstantTimeSize
, !!ConstantTimeSize
, Map
, DefaultHolder
>
93 template<class VoidPointer
, bool ConstantTimeSize
, bool DefaultHolder
, bool Map
>
94 class test_main_template
<VoidPointer
, ConstantTimeSize
, DefaultHolder
, Map
, Member
>
99 typedef testvalue
<unordered_hooks
<VoidPointer
> > value_type
;
100 static const int random_init
[6] = { 3, 2, 4, 1, 5, 2 };
101 typedef typename ValueContainer
< value_type
>::type value_cont_type
;
102 value_cont_type
data (6);
103 for (int i
= 0; i
< 6; ++i
)
104 data
[i
].value_
= random_init
[i
];
106 typedef testvalue_traits
< unordered_hooks
<VoidPointer
> > testval_traits_t
;
108 typedef typename
detail::if_c
110 , typename
testval_traits_t::member_value_traits
//optimize_multikey<true>
111 , typename
testval_traits_t::auto_member_value_traits
//store_hash<true>, optimize_multikey<true>
112 >::type member_hook_t
;
114 < //cache_begin, compare_hash, incremental
115 rebinder
<member_hook_t
, ConstantTimeSize
, false, !ConstantTimeSize
, false, !ConstantTimeSize
, DefaultHolder
>
120 template<class VoidPointer
, bool ConstantTimeSize
, bool DefaultHolder
, bool Map
>
121 class test_main_template
<VoidPointer
, ConstantTimeSize
, DefaultHolder
, Map
, NonMember
>
125 static void execute()
127 typedef testvalue
<unordered_hooks
<VoidPointer
> > value_type
;
128 static const int random_init
[6] = { 3, 2, 4, 1, 5, 2 };
129 typedef typename ValueContainer
< value_type
>::type value_cont_type
;
130 value_cont_type
data (6);
131 for (int i
= 0; i
< 6; ++i
)
132 data
[i
].value_
= random_init
[i
];
134 typedef testvalue_traits
< unordered_hooks
<VoidPointer
> > testval_traits_t
;
137 < //cache_begin, compare_hash, incremental
138 rebinder
<typename
testval_traits_t::nonhook_value_traits
, ConstantTimeSize
, false, false, false, Map
, DefaultHolder
>
145 //VoidPointer x ConstantTimeSize x Map x DefaultHolder
148 test_main_template
<void*, false, false, false, Base
>::execute();
149 test_main_template
<void*, false, true, false, Member
>::execute();
150 test_main_template
<void*, true, false, false, NonMember
>::execute();
151 test_main_template
<void*, true, true, false, Base
>::execute();
154 test_main_template
<smart_ptr
<void>, false, false, false, Member
>::execute();
155 test_main_template
<smart_ptr
<void>, false, true, false, NonMember
>::execute();
156 test_main_template
<smart_ptr
<void>, true, false, false, Base
>::execute();
157 test_main_template
<smart_ptr
<void>, true, true, false, Member
>::execute();
159 ////bounded_ptr (bool ConstantTimeSize, bool Map)
160 //test_main_template_bptr< false, false >::execute();
161 //test_main_template_bptr< false, true >::execute();
162 //test_main_template_bptr< true, false >::execute();
163 //test_main_template_bptr< true, true >::execute();
165 return boost::report_errors();