slist_test.cpp

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

CPP
698
字号
      }      //Shift backwards all possible positions      for(int i = 0; i < s*3; ++i){         testlist.insert_after(testlist.before_begin(), &values[0], &values[0] + s);         testlist.shift_backwards(i);         for(int j = 0; j < s; ++j){            expected_values[(j + i) % s] = (j + 1);         }         TEST_INTRUSIVE_SEQUENCE_EXPECTED(expected_values, testlist.begin())         testlist.clear();      }   }}  //test: insert_after (seq-version), swap, splice_after:template<class ValueTraits, bool Linear, bool CacheLast>void test_slist<ValueTraits, Linear, CacheLast>   ::test_swap(std::vector<typename ValueTraits::value_type>& values){   typedef typename ValueTraits::value_type value_type;   typedef slist      < value_type      , value_traits<ValueTraits>      , size_type<std::size_t>      , constant_time_size<value_type::constant_time_size>      , linear<Linear>      , cache_last<CacheLast>      > list_type;   {      list_type testlist1 (&values[0], &values[0] + 2);      list_type testlist2;      testlist2.insert_after (testlist2.before_begin(), &values[0] + 2, &values[0] + 5);      testlist1.swap(testlist2);      {  int init_values [] = { 3, 4, 5 };         TEST_INTRUSIVE_SEQUENCE( init_values, testlist1.begin() );  }      {  int init_values [] = { 1, 2 };         TEST_INTRUSIVE_SEQUENCE( init_values, testlist2.begin() );  }         testlist2.splice_after (testlist2.begin(), testlist1);      {  int init_values [] = { 1, 3, 4, 5, 2 };         TEST_INTRUSIVE_SEQUENCE( init_values, testlist2.begin() );  }      BOOST_TEST (testlist1.empty());      testlist1.splice_after (testlist1.before_begin(), testlist2, ++testlist2.begin());      {  int init_values [] = { 4 };         TEST_INTRUSIVE_SEQUENCE( init_values, testlist1.begin() );  }      {  int init_values [] = { 1, 3, 5, 2 };         TEST_INTRUSIVE_SEQUENCE( init_values, testlist2.begin() );  }      testlist1.splice_after (testlist1.begin(), testlist2,                               testlist2.before_begin(), ++++testlist2.begin());      {  int init_values [] = { 4, 1, 3, 5 };         TEST_INTRUSIVE_SEQUENCE( init_values, testlist1.begin() );  }      {  int init_values [] = { 2 };         TEST_INTRUSIVE_SEQUENCE( init_values, testlist2.begin() );  }   }   if(!list_type::linear)   {      list_type testlist1 (&values[0], &values[0] + 2);      list_type testlist2 (&values[0] + 3, &values[0] + 5);      values[0].swap_nodes(values[2]);      {  int init_values [] = { 3, 2 };         TEST_INTRUSIVE_SEQUENCE( init_values, testlist1.begin() );  }      values[2].swap_nodes(values[4]);      {  int init_values [] = { 5, 2 };         TEST_INTRUSIVE_SEQUENCE( init_values, testlist1.begin() );  }      {  int init_values [] = { 4, 3 };         TEST_INTRUSIVE_SEQUENCE( init_values, testlist2.begin() );  }   }   if(!list_type::linear)   {      list_type testlist1 (&values[0], &values[1]);      {  int init_values [] = { 1 };         TEST_INTRUSIVE_SEQUENCE( init_values, testlist1.begin() );  }      values[1].swap_nodes(values[2]);      {  int init_values [] = { 1 };         TEST_INTRUSIVE_SEQUENCE( init_values, testlist1.begin() );  }      values[0].swap_nodes(values[2]);      {  int init_values [] = { 3 };         TEST_INTRUSIVE_SEQUENCE( init_values, testlist1.begin() );  }      values[0].swap_nodes(values[2]);      {  int init_values [] = { 1 };         TEST_INTRUSIVE_SEQUENCE( init_values, testlist1.begin() );  }   }}  template<class ValueTraits, bool Linear, bool CacheLast>void test_slist<ValueTraits, Linear, CacheLast>   ::test_clone(std::vector<typename ValueTraits::value_type>& values){   typedef typename ValueTraits::value_type value_type;   typedef slist      < value_type      , value_traits<ValueTraits>      , size_type<std::size_t>      , constant_time_size<value_type::constant_time_size>      , linear<Linear>      , cache_last<CacheLast>      > list_type;      list_type testlist1 (&values[0], &values[0] + values.size());      list_type testlist2;      testlist2.clone_from(testlist1, test::new_cloner<value_type>(), test::delete_disposer<value_type>());      BOOST_TEST (testlist2 == testlist1);      testlist2.clear_and_dispose(test::delete_disposer<value_type>());      BOOST_TEST (testlist2.empty());}template<class ValueTraits, bool Linear, bool CacheLast>void test_slist<ValueTraits, Linear, CacheLast>   ::test_container_from_end(std::vector<typename ValueTraits::value_type>& values                            ,detail::bool_<false>){   typedef typename ValueTraits::value_type value_type;   typedef slist      < value_type      , value_traits<ValueTraits>      , size_type<std::size_t>      , constant_time_size<value_type::constant_time_size>      , linear<Linear>      , cache_last<CacheLast>      > list_type;   list_type testlist1 (&values[0], &values[0] + 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<class VoidPointer, bool constant_time_size>class test_main_template{   public:   int operator()()   {      typedef testvalue<VoidPointer, constant_time_size> value_type;      std::vector<value_type> data (5);      for (int i = 0; i < 5; ++i)         data[i].value_ = i + 1;       test_slist < typename detail::get_base_value_traits                  < value_type                  , typename value_type::slist_base_hook_t                  >::type                 , false                 , false                >::test_all(data);      test_slist < typename detail::get_member_value_traits                  < value_type                  , member_hook< value_type                               , typename value_type::slist_member_hook_t                               , &value_type::slist_node_                               >                  >::type                 , false                 , false                >::test_all(data);      //Now linear slists      test_slist < typename detail::get_base_value_traits                  < value_type                  , typename value_type::slist_base_hook_t                  >::type                 , true                 , false                >::test_all(data);      test_slist < typename detail::get_member_value_traits                  < value_type                  , member_hook< value_type                               , typename value_type::slist_member_hook_t                               , &value_type::slist_node_                               >                  >::type                 , true                 , false                >::test_all(data);      //Now the same but caching the last node      test_slist < typename detail::get_base_value_traits                  < value_type                  , typename value_type::slist_base_hook_t                  >::type                 , false                 , true                >::test_all(data);      test_slist < typename detail::get_member_value_traits                  < value_type                  , member_hook< value_type                               , typename value_type::slist_member_hook_t                               , &value_type::slist_node_                               >                  >::type                 , false                 , true                >::test_all(data);      //Now linear slists      test_slist < typename detail::get_base_value_traits                  < value_type                  , typename value_type::slist_base_hook_t                  >::type                 , true                 , true                >::test_all(data);      test_slist < typename detail::get_member_value_traits                  < value_type                  , member_hook< value_type                               , typename value_type::slist_member_hook_t                               , &value_type::slist_node_                               >                  >::type                 , true                 , true                >::test_all(data);      return 0;   }};template<class VoidPointer>class test_main_template<VoidPointer, false>{   public:   int operator()()   {      typedef testvalue<VoidPointer, false> value_type;      std::vector<value_type> data (5);      for (int i = 0; i < 5; ++i)         data[i].value_ = i + 1;       test_slist < typename detail::get_base_value_traits                  < value_type                  , typename value_type::slist_base_hook_t                  >::type                 , false                 , false                >::test_all(data);      test_slist < typename detail::get_member_value_traits                  < value_type                  , member_hook< value_type                               , typename value_type::slist_member_hook_t                               , &value_type::slist_node_                               >                  >::type                 , false                 , false                >::test_all(data);      test_slist < typename detail::get_base_value_traits                  < value_type                  , typename value_type::slist_auto_base_hook_t                  >::type                 , false                 , false                >::test_all(data);      test_slist < typename detail::get_member_value_traits                  < value_type                  , member_hook< value_type                               , typename value_type::slist_auto_member_hook_t                               , &value_type::slist_auto_node_                               >                  >::type                 , false                 , false                >::test_all(data);      test_slist < typename detail::get_base_value_traits                  < value_type                  , typename value_type::slist_base_hook_t                  >::type                 , true                 , false                >::test_all(data);      test_slist < typename detail::get_member_value_traits                  < value_type                  , member_hook< value_type                               , typename value_type::slist_member_hook_t                               , &value_type::slist_node_                               >                  >::type                 , true                 , false                >::test_all(data);      //Now cache last      test_slist < typename detail::get_base_value_traits                  < value_type                  , typename value_type::slist_base_hook_t                  >::type                 , false                 , true                >::test_all(data);      test_slist < typename detail::get_member_value_traits                  < value_type                  , member_hook< value_type                               , typename value_type::slist_member_hook_t                               , &value_type::slist_node_                               >                  >::type                 , false                 , true                >::test_all(data);      test_slist < typename detail::get_base_value_traits                  < value_type                  , typename value_type::slist_base_hook_t                  >::type                 , true                 , true                >::test_all(data);      test_slist < typename detail::get_member_value_traits                  < value_type                  , member_hook< value_type                               , typename value_type::slist_member_hook_t                               , &value_type::slist_node_                               >                  >::type                 , true                 , true                >::test_all(data);      return 0;   }};int main(int, char* []) {   test_main_template<void*, false>()();   test_main_template<smart_ptr<void>, false>()();   test_main_template<void*, true>()();   test_main_template<smart_ptr<void>, true>()();   return boost::report_errors();}#include <boost/intrusive/detail/config_end.hpp>

⌨️ 快捷键说明

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