- Implemented map and multimap-like interfaces.

-  Refactored hashtable containers to reduce template instantiations.
This commit is contained in:
Ion Gaztañaga
2015-06-04 11:16:21 +02:00
parent 9ddcfa8e7d
commit 51de75799b
57 changed files with 5962 additions and 8937 deletions
+68 -73
View File
@@ -25,15 +25,13 @@
using namespace boost::intrusive;
struct my_tag;
template<class VoidPointer>
struct hooks
{
typedef slist_base_hook<void_pointer<VoidPointer> > base_hook_type;
typedef slist_base_hook< link_mode<auto_unlink>
, void_pointer<VoidPointer>, tag<my_tag> > auto_base_hook_type;
typedef slist_member_hook<void_pointer<VoidPointer>, tag<my_tag> > member_hook_type;
, void_pointer<VoidPointer>, tag<void> > auto_base_hook_type;
typedef slist_member_hook<void_pointer<VoidPointer>, tag<void> > member_hook_type;
typedef slist_member_hook< link_mode<auto_unlink>
, void_pointer<VoidPointer> > auto_member_hook_type;
typedef nonhook_node_member< slist_node_traits< VoidPointer >,
@@ -41,33 +39,33 @@ struct hooks
> nonhook_node_member_type;
};
template < typename List_Type, typename Value_Container >
template < typename ListType, typename ValueContainer >
struct test_slist
{
typedef List_Type list_type;
typedef ListType list_type;
typedef typename list_type::value_traits value_traits;
typedef typename value_traits::value_type value_type;
typedef typename list_type::node_algorithms node_algorithms;
static void test_all(Value_Container&);
static void test_front(Value_Container&);
static void test_back(Value_Container&, detail::true_type);
static void test_back(Value_Container&, detail::false_type) {}
static void test_sort(Value_Container&);
static void test_merge(Value_Container&);
static void test_remove_unique(Value_Container&);
static void test_insert(Value_Container&);
static void test_shift(Value_Container&);
static void test_swap(Value_Container&);
static void test_slow_insert(Value_Container&);
static void test_clone(Value_Container&);
static void test_container_from_end(Value_Container&, detail::true_type);
static void test_container_from_end(Value_Container&, detail::false_type) {}
static void test_all(ValueContainer&);
static void test_front(ValueContainer&);
static void test_back(ValueContainer&, detail::true_type);
static void test_back(ValueContainer&, detail::false_type) {}
static void test_sort(ValueContainer&);
static void test_merge(ValueContainer&);
static void test_remove_unique(ValueContainer&);
static void test_insert(ValueContainer&);
static void test_shift(ValueContainer&);
static void test_swap(ValueContainer&);
static void test_slow_insert(ValueContainer&);
static void test_clone(ValueContainer&);
static void test_container_from_end(ValueContainer&, detail::true_type);
static void test_container_from_end(ValueContainer&, detail::false_type) {}
};
template < typename List_Type, typename Value_Container >
void test_slist< List_Type, Value_Container >
::test_all (Value_Container& values)
template < typename ListType, typename ValueContainer >
void test_slist< ListType, ValueContainer >
::test_all (ValueContainer& values)
{
{
list_type list(values.begin(), values.end());
@@ -94,9 +92,9 @@ void test_slist< List_Type, Value_Container >
}
//test: push_front, pop_front, front, size, empty:
template < typename List_Type, typename Value_Container >
void test_slist< List_Type, Value_Container >
::test_front(Value_Container& values)
template < typename ListType, typename ValueContainer >
void test_slist< ListType, ValueContainer >
::test_front(ValueContainer& values)
{
list_type testlist;
BOOST_TEST (testlist.empty());
@@ -118,9 +116,9 @@ void test_slist< List_Type, Value_Container >
}
//test: push_front, pop_front, front, size, empty:
template < typename List_Type, typename Value_Container >
void test_slist< List_Type, Value_Container >
::test_back(Value_Container& values, detail::true_type)
template < typename ListType, typename ValueContainer >
void test_slist< ListType, ValueContainer >
::test_back(ValueContainer& values, detail::true_type)
{
list_type testlist;
BOOST_TEST (testlist.empty());
@@ -136,9 +134,9 @@ void test_slist< List_Type, Value_Container >
}
//test: merge due to error in merge implementation:
template < typename List_Type, typename Value_Container >
void test_slist< List_Type, Value_Container >
::test_merge (Value_Container& values)
template < typename ListType, typename ValueContainer >
void test_slist< ListType, ValueContainer >
::test_merge (ValueContainer& values)
{
list_type testlist1, testlist2;
testlist1.push_front (values[0]);
@@ -152,9 +150,9 @@ void test_slist< List_Type, Value_Container >
}
//test: merge due to error in merge implementation:
template < typename List_Type, typename Value_Container >
void test_slist< List_Type, Value_Container >
::test_remove_unique (Value_Container& values)
template < typename ListType, typename ValueContainer >
void test_slist< ListType, ValueContainer >
::test_remove_unique (ValueContainer& values)
{
{
list_type list(values.begin(), values.end());
@@ -181,7 +179,7 @@ void test_slist< List_Type, Value_Container >
TEST_INTRUSIVE_SEQUENCE( init_values, list.begin() );
}
{
Value_Container values2(values);
ValueContainer values2(values);
list_type list(values.begin(), values.end());
list.insert_after(list.before_begin(), values2.begin(), values2.end());
list.sort();
@@ -194,9 +192,9 @@ void test_slist< List_Type, Value_Container >
}
//test: constructor, iterator, sort, reverse:
template < typename List_Type, typename Value_Container >
void test_slist< List_Type, Value_Container >
::test_sort(Value_Container& values)
template < typename ListType, typename ValueContainer >
void test_slist< ListType, ValueContainer >
::test_sort(ValueContainer& values)
{
list_type testlist (values.begin(), values.end());
@@ -213,9 +211,9 @@ void test_slist< List_Type, Value_Container >
}
//test: assign, insert_after, const_iterator, erase_after, s_iterator_to, previous:
template < typename List_Type, typename Value_Container >
void test_slist< List_Type, Value_Container >
::test_insert(Value_Container& values)
template < typename ListType, typename ValueContainer >
void test_slist< ListType, ValueContainer >
::test_insert(ValueContainer& values)
{
list_type testlist;
testlist.assign (values.begin() + 2, values.begin() + 5);
@@ -252,9 +250,9 @@ void test_slist< List_Type, Value_Container >
}
//test: insert, const_iterator, erase, siterator_to:
template < typename List_Type, typename Value_Container >
void test_slist< List_Type, Value_Container >
::test_slow_insert (Value_Container& values)
template < typename ListType, typename ValueContainer >
void test_slist< ListType, ValueContainer >
::test_slow_insert (ValueContainer& values)
{
list_type testlist;
testlist.push_front (values[4]);
@@ -288,9 +286,9 @@ void test_slist< List_Type, Value_Container >
BOOST_TEST (testlist.begin()->value_ == 3);
}
template < typename List_Type, typename Value_Container >
void test_slist< List_Type, Value_Container >
::test_shift(Value_Container& values)
template < typename ListType, typename ValueContainer >
void test_slist< ListType, ValueContainer >
::test_shift(ValueContainer& values)
{
list_type testlist;
const int num_values = (int)values.size();
@@ -325,9 +323,9 @@ void test_slist< List_Type, Value_Container >
}
//test: insert_after (seq-version), swap, splice_after:
template < typename List_Type, typename Value_Container >
void test_slist< List_Type, Value_Container >
::test_swap(Value_Container& values)
template < typename ListType, typename ValueContainer >
void test_slist< ListType, ValueContainer >
::test_swap(ValueContainer& values)
{
{
list_type testlist1 (values.begin(), values.begin() + 2);
@@ -426,9 +424,9 @@ void test_slist< List_Type, Value_Container >
}
}
template < typename List_Type, typename Value_Container >
void test_slist< List_Type, Value_Container >
::test_clone(Value_Container& values)
template < typename ListType, typename ValueContainer >
void test_slist< ListType, ValueContainer >
::test_clone(ValueContainer& values)
{
list_type testlist1 (values.begin(), values.begin() + values.size());
list_type testlist2;
@@ -439,39 +437,39 @@ void test_slist< List_Type, Value_Container >
BOOST_TEST (testlist2.empty());
}
template < typename List_Type, typename Value_Container >
void test_slist< List_Type, Value_Container >
::test_container_from_end(Value_Container& values, detail::true_type)
template < typename ListType, typename ValueContainer >
void test_slist< ListType, ValueContainer >
::test_container_from_end(ValueContainer& values, detail::true_type)
{
list_type testlist1 (values.begin(), values.begin() + values.size());
BOOST_TEST (testlist1 == list_type::container_from_end_iterator(testlist1.end()));
BOOST_TEST (testlist1 == list_type::container_from_end_iterator(testlist1.cend()));
}
template < typename Value_Traits, bool ConstantTimeSize, bool Linear, bool CacheLast, bool Default_Holder, typename Value_Container >
template < typename ValueTraits, bool ConstantTimeSize, bool Linear, bool CacheLast, bool Default_Holder, typename ValueContainer >
struct make_and_test_slist
: test_slist< slist< typename Value_Traits::value_type,
value_traits< Value_Traits >,
: test_slist< slist< typename ValueTraits::value_type,
value_traits< ValueTraits >,
size_type< std::size_t >,
constant_time_size< ConstantTimeSize >,
linear<Linear>,
cache_last<CacheLast>
>,
Value_Container
ValueContainer
>
{};
template < typename Value_Traits, bool ConstantTimeSize, bool Linear, bool CacheLast, typename Value_Container >
struct make_and_test_slist< Value_Traits, ConstantTimeSize, Linear, CacheLast, false, Value_Container >
: test_slist< slist< typename Value_Traits::value_type,
value_traits< Value_Traits >,
template < typename ValueTraits, bool ConstantTimeSize, bool Linear, bool CacheLast, typename ValueContainer >
struct make_and_test_slist< ValueTraits, ConstantTimeSize, Linear, CacheLast, false, ValueContainer >
: test_slist< slist< typename ValueTraits::value_type,
value_traits< ValueTraits >,
size_type< std::size_t >,
constant_time_size< ConstantTimeSize >,
linear<Linear>,
cache_last<CacheLast>,
header_holder_type< pointer_holder< typename Value_Traits::node_traits::node > >
header_holder_type< heap_node_holder< typename ValueTraits::pointer > >
>,
Value_Container
ValueContainer
>
{};
@@ -481,7 +479,7 @@ class test_main_template
public:
int operator()()
{
typedef testvalue<hooks<VoidPointer> , constant_time_size> value_type;
typedef testvalue< hooks<VoidPointer> > value_type;
std::vector< value_type > data (5);
for (int i = 0; i < 5; ++i)
data[i].value_ = i + 1;
@@ -603,7 +601,7 @@ class test_main_template<VoidPointer, false, Default_Holder>
public:
int operator()()
{
typedef testvalue<hooks<VoidPointer> , false> value_type;
typedef testvalue< hooks<VoidPointer> > value_type;
std::vector< value_type > data (5);
for (int i = 0; i < 5; ++i)
data[i].value_ = i + 1;
@@ -742,7 +740,7 @@ struct test_main_template_bptr
typedef typename list_value_traits::node_ptr node_ptr;
typedef bounded_allocator< value_type > allocator_type;
allocator_type::init();
bounded_allocator_scope<allocator_type> bounded_scope; (void)bounded_scope;
allocator_type allocator;
{
@@ -763,9 +761,6 @@ struct test_main_template_bptr
bounded_reference_cont< value_type >
>::test_all(ref_cont);
}
assert(allocator_type::is_clear());
allocator_type::destroy();
return 0;
}
};