unordered_multiset_test.cpp

来自「Boost provides free peer-reviewed portab」· C++ 代码 · 共 774 行 · 第 1/3 页

CPP
774
字号
///////////////////////////////////////////////////////////////////////////////// (C) Copyright Olaf Krzikalla 2004-2006.// (C) Copyright Ion Gaztanaga  2006-2007.//// 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 <boost/intrusive/detail/config_begin.hpp>#include <boost/intrusive/unordered_set.hpp>#include <boost/intrusive/detail/pointer_to_other.hpp>#include "itestvalue.hpp"#include "smart_ptr.hpp"#include "common_functors.hpp"#include <vector>#include <algorithm> //std::sort std::find#include <set>#include <boost/detail/lightweight_test.hpp>#include "test_macros.hpp"#include "test_container.hpp"using namespace boost::intrusive;static const std::size_t BucketSize = 8;template<class ValueTraits, bool CacheBegin, bool CompareHash, bool Incremental>struct test_unordered_multiset{   typedef typename ValueTraits::value_type value_type;   static void test_all (std::vector<value_type>& values);   static void test_sort(std::vector<value_type>& values);   static void test_insert(std::vector<value_type>& values);   static void test_swap(std::vector<value_type>& values);   static void test_rehash(std::vector<value_type>& values, detail::true_);   static void test_rehash(std::vector<value_type>& values, detail::false_);   static void test_find(std::vector<value_type>& values);   static void test_impl();   static void test_clone(std::vector<value_type>& values);};template<class ValueTraits, bool CacheBegin, bool CompareHash, bool Incremental>void test_unordered_multiset<ValueTraits, CacheBegin, CompareHash, Incremental>::   test_all (std::vector<typename ValueTraits::value_type>& values){   typedef typename ValueTraits::value_type value_type;   typedef unordered_multiset      < value_type      , value_traits<ValueTraits>      , constant_time_size<value_type::constant_time_size>      , cache_begin<CacheBegin>      , compare_hash<CompareHash>      , incremental<Incremental>      > unordered_multiset_type;   {      typedef typename unordered_multiset_type::bucket_traits bucket_traits;      typename unordered_multiset_type::bucket_type buckets [BucketSize];      unordered_multiset_type testset(bucket_traits(buckets, BucketSize));      testset.insert(values.begin(), values.end());      test::test_container(testset);      testset.clear();      testset.insert(values.begin(), values.end());      test::test_common_unordered_and_associative_container(testset, values);      testset.clear();      testset.insert(values.begin(), values.end());      test::test_unordered_associative_container(testset, values);      testset.clear();      testset.insert(values.begin(), values.end());      test::test_non_unique_container(testset, values);   }   test_sort(values);   test_insert(values);   test_swap(values);   test_rehash(values, detail::bool_<Incremental>());   test_find(values);   test_impl();   test_clone(values);}//test case due to an error in tree implementation:template<class ValueTraits, bool CacheBegin, bool CompareHash, bool Incremental>void test_unordered_multiset<ValueTraits, CacheBegin, CompareHash, Incremental>   ::test_impl(){   typedef typename ValueTraits::value_type value_type;   typedef unordered_multiset      <value_type      , value_traits<ValueTraits>      , constant_time_size<value_type::constant_time_size>      , cache_begin<CacheBegin>      , compare_hash<CompareHash>      , incremental<Incremental>      > unordered_multiset_type;   typedef typename unordered_multiset_type::bucket_traits bucket_traits;   std::vector<value_type> values (5);   for (int i = 0; i < 5; ++i)      values[i].value_ = i;    typename unordered_multiset_type::bucket_type buckets [BucketSize];   unordered_multiset_type testset(bucket_traits(buckets, BucketSize));   for (int i = 0; i < 5; ++i)      testset.insert (values[i]);   testset.erase (testset.iterator_to (values[0]));   testset.erase (testset.iterator_to (values[1]));   testset.insert (values[1]);        testset.erase (testset.iterator_to (values[2]));   testset.erase (testset.iterator_to (values[3]));}//test: constructor, iterator, clear, reverse_iterator, front, back, size:template<class ValueTraits, bool CacheBegin, bool CompareHash, bool Incremental>void test_unordered_multiset<ValueTraits, CacheBegin, CompareHash, Incremental>   ::test_sort(std::vector<typename ValueTraits::value_type>& values){   typedef typename ValueTraits::value_type value_type;   typedef unordered_multiset      <value_type      , value_traits<ValueTraits>      , constant_time_size<value_type::constant_time_size>      , cache_begin<CacheBegin>      , compare_hash<CompareHash>      , incremental<Incremental>      > unordered_multiset_type;   typedef typename unordered_multiset_type::bucket_traits bucket_traits;   typename unordered_multiset_type::bucket_type buckets [BucketSize];   unordered_multiset_type testset1(values.begin(), values.end(), bucket_traits(buckets, BucketSize));   if(Incremental){      {  int init_values [] = { 4, 5, 1, 2, 2, 3 };         TEST_INTRUSIVE_SEQUENCE( init_values, testset1.begin() );  }   }   else{      {  int init_values [] = { 1, 2, 2, 3, 4, 5 };         TEST_INTRUSIVE_SEQUENCE( init_values, testset1.begin() );  }   }   testset1.clear();   BOOST_TEST (testset1.empty());}  //test: insert, const_iterator, const_reverse_iterator, erase, iterator_to:template<class ValueTraits, bool CacheBegin, bool CompareHash, bool Incremental>void test_unordered_multiset<ValueTraits, CacheBegin, CompareHash, Incremental>   ::test_insert(std::vector<typename ValueTraits::value_type>& values){   typedef typename ValueTraits::value_type value_type;   typedef unordered_multiset      <value_type      , value_traits<ValueTraits>      , constant_time_size<value_type::constant_time_size>      , cache_begin<CacheBegin>      , compare_hash<CompareHash>      , incremental<Incremental>      > unordered_multiset_type;   typedef typename unordered_multiset_type::bucket_traits bucket_traits;   typedef typename unordered_multiset_type::iterator iterator;   typename unordered_multiset_type::bucket_type buckets [BucketSize];   unordered_multiset_type testset(bucket_traits(buckets, BucketSize));   testset.insert(&values[0] + 2, &values[0] + 5);   const unordered_multiset_type& const_testset = testset;   if(Incremental){      {         {  int init_values [] = { 4, 5, 1 };            TEST_INTRUSIVE_SEQUENCE( init_values, const_testset.begin() );  }         typename unordered_multiset_type::iterator i = testset.begin();         BOOST_TEST (i->value_ == 4);         i = testset.insert (values[0]);         BOOST_TEST (&*i == &values[0]);                     i = testset.iterator_to (values[2]);         BOOST_TEST (&*i == &values[2]);         testset.erase(i);         {  int init_values [] = { 5, 1, 3 };            TEST_INTRUSIVE_SEQUENCE( init_values, const_testset.begin() );  }         testset.clear();         testset.insert(&values[0], &values[0] + values.size());         {  int init_values [] = { 4, 5, 1, 2, 2, 3 };            TEST_INTRUSIVE_SEQUENCE( init_values, const_testset.begin() );  }         BOOST_TEST (testset.erase(1) == 1);         BOOST_TEST (testset.erase(2) == 2);         BOOST_TEST (testset.erase(3) == 1);         BOOST_TEST (testset.erase(4) == 1);         BOOST_TEST (testset.erase(5) == 1);         BOOST_TEST (testset.empty() == true);         //Now with a single bucket         typename unordered_multiset_type::bucket_type single_bucket[1];         unordered_multiset_type testset2(bucket_traits(single_bucket, 1));         testset2.insert(&values[0], &values[0] + values.size());         BOOST_TEST (testset2.erase(5) == 1);         BOOST_TEST (testset2.erase(2) == 2);         BOOST_TEST (testset2.erase(1) == 1);         BOOST_TEST (testset2.erase(4) == 1);         BOOST_TEST (testset2.erase(3) == 1);         BOOST_TEST (testset2.empty() == true);      }   }   else{      {         {  int init_values [] = { 1, 4, 5 };            TEST_INTRUSIVE_SEQUENCE( init_values, const_testset.begin() );  }         typename unordered_multiset_type::iterator i = testset.begin();         BOOST_TEST (i->value_ == 1);         i = testset.insert (values[0]);         BOOST_TEST (&*i == &values[0]);                     i = testset.iterator_to (values[2]);         BOOST_TEST (&*i == &values[2]);         testset.erase(i);         {  int init_values [] = { 1, 3, 5 };            TEST_INTRUSIVE_SEQUENCE( init_values, const_testset.begin() );  }         testset.clear();         testset.insert(&values[0], &values[0] + values.size());         {  int init_values [] = { 1, 2, 2, 3, 4, 5 };            TEST_INTRUSIVE_SEQUENCE( init_values, const_testset.begin() );  }         BOOST_TEST (testset.erase(1) == 1);         BOOST_TEST (testset.erase(2) == 2);         BOOST_TEST (testset.erase(3) == 1);         BOOST_TEST (testset.erase(4) == 1);         BOOST_TEST (testset.erase(5) == 1);         BOOST_TEST (testset.empty() == true);         //Now with a single bucket         typename unordered_multiset_type::bucket_type single_bucket[1];         unordered_multiset_type testset2(bucket_traits(single_bucket, 1));         testset2.insert(&values[0], &values[0] + values.size());         BOOST_TEST (testset2.erase(5) == 1);         BOOST_TEST (testset2.erase(2) == 2);         BOOST_TEST (testset2.erase(1) == 1);         BOOST_TEST (testset2.erase(4) == 1);         BOOST_TEST (testset2.erase(3) == 1);         BOOST_TEST (testset2.empty() == true);      }   }   {      //Now erase just one per loop      const int random_init[] = { 3, 2, 4, 1, 5, 2, 2 };      const unsigned int random_size = sizeof(random_init)/sizeof(random_init[0]);

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?