///////////////////////////////////////////////////////////////////////////// // // (C) Copyright Ion Gaztanaga 2014-2014 // // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // // See http://www.boost.org/libs/intrusive for documentation. // ///////////////////////////////////////////////////////////////////////////// #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace boost::intrusive; template struct boolean { static const bool value = Value; }; template struct pow2_and_equal_sizes { static const std::size_t a_size = sizeof(A); static const std::size_t b_size = sizeof(B); static const bool a_b_sizes_equal = a_size == b_size; static const bool value = !(a_size & (a_size - 1u)); }; template struct node : Hook {}; //Avoid testing for uncommon architectures void test_sizes(boolean, std::size_t) {} template void test_iterator_sizes(C &, std::size_t size) { typedef typename C::iterator iterator; typedef typename C::const_iterator const_iterator; BOOST_TEST_EQ(sizeof(iterator), size); BOOST_TEST_EQ(sizeof(const_iterator), size); } //Test sizes for common 32 and 64 bit architectures void test_sizes(boolean, std::size_t wordsize) { { //list list > > > c; BOOST_TEST_EQ(sizeof(c), wordsize*3); test_iterator_sizes(c, wordsize); } { list > >, constant_time_size > c; BOOST_TEST_EQ(sizeof(c), wordsize*2); test_iterator_sizes(c, wordsize); } { //slist slist > > > c; BOOST_TEST_EQ(sizeof(c), wordsize*2); test_iterator_sizes(c, wordsize); } { slist > > , constant_time_size > c; BOOST_TEST_EQ(sizeof(c), wordsize*1); test_iterator_sizes(c, wordsize); } { slist > > , cache_last > c; BOOST_TEST_EQ(sizeof(c), wordsize*3); test_iterator_sizes(c, wordsize); } { //set set > > > c; BOOST_TEST_EQ(sizeof(c), wordsize*5); test_iterator_sizes(c, wordsize); } { set > > , constant_time_size > c; BOOST_TEST_EQ(sizeof(c), wordsize*4); test_iterator_sizes(c, wordsize); } { set > > > , constant_time_size > c; BOOST_TEST_EQ(sizeof(c), wordsize*3); test_iterator_sizes(c, wordsize); } { //avl avl_set > > > c; BOOST_TEST_EQ(sizeof(c), wordsize*5); test_iterator_sizes(c, wordsize); } { avl_set > > , constant_time_size > c; BOOST_TEST_EQ(sizeof(c), wordsize*4); test_iterator_sizes(c, wordsize); } { avl_set > > > , constant_time_size > c; BOOST_TEST_EQ(sizeof(c), wordsize*3); test_iterator_sizes(c, wordsize); } { //splay splay_set > > > c; BOOST_TEST_EQ(sizeof(c), wordsize*4); test_iterator_sizes(c, wordsize); } { splay_set > > , constant_time_size > c; BOOST_TEST_EQ(sizeof(c), wordsize*3); test_iterator_sizes(c, wordsize); } { //scapegoat sg_set > > c; BOOST_TEST_EQ(sizeof(c), (wordsize*5+sizeof(float)*2)); test_iterator_sizes(c, wordsize); } { //treap treap_set > > c; BOOST_TEST_EQ(sizeof(c), wordsize*4); test_iterator_sizes(c, wordsize); } { treap_set > , constant_time_size > c; BOOST_TEST_EQ(sizeof(c), wordsize*3); test_iterator_sizes(c, wordsize); } { //unordered typedef unordered_set > > cont_type; cont_type::bucket_type buckets[1]; cont_type c(cont_type::bucket_traits(buckets, 1)); BOOST_TEST_EQ(sizeof(c), wordsize*3); test_iterator_sizes(c, wordsize*2); } { typedef unordered_set > , power_2_buckets > cont_type; cont_type::bucket_type buckets[1]; cont_type c(cont_type::bucket_traits(buckets, 1)); BOOST_TEST_EQ(sizeof(c), wordsize*3); test_iterator_sizes(c, wordsize*2); } { typedef unordered_set >, constant_time_size > cont_type; cont_type::bucket_type buckets[1]; cont_type c(cont_type::bucket_traits(buckets, 1)); BOOST_TEST_EQ(sizeof(c), wordsize*2); test_iterator_sizes(c, wordsize*2); } { typedef unordered_set > >, constant_time_size > cont_type; cont_type::bucket_type buckets[1]; cont_type c(cont_type::bucket_traits(buckets, 1)); BOOST_TEST_EQ(sizeof(c), wordsize*2); test_iterator_sizes(c, wordsize*2); } { typedef unordered_set > >, incremental > cont_type; cont_type::bucket_type buckets[1]; cont_type c(cont_type::bucket_traits(buckets, 1)); BOOST_TEST_EQ(sizeof(c), wordsize*4); test_iterator_sizes(c, wordsize*2); } } int main() { test_sizes(boolean< pow2_and_equal_sizes::value >(), sizeof(std::size_t)); return ::boost::report_errors(); } #include