list_inserter.cpp 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. // Boost.Assign library
  2. //
  3. // Copyright Thorsten Ottosen 2003-2004. Use, modification and
  4. // distribution is subject to the Boost Software License, Version
  5. // 1.0. (See accompanying file LICENSE_1_0.txt or copy at
  6. // http://www.boost.org/LICENSE_1_0.txt)
  7. //
  8. // For more information, see http://www.boost.org/libs/assign/
  9. //
  10. #include <boost/detail/workaround.hpp>
  11. #if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
  12. # pragma warn -8091 // suppress warning in Boost.Test
  13. # pragma warn -8057 // unused argument argc/argv in Boost.Test
  14. #endif
  15. #include <boost/assign/list_inserter.hpp>
  16. #include <boost/assign/list_of.hpp>
  17. #include <boost/test/test_tools.hpp>
  18. #include <boost/array.hpp>
  19. #include <boost/function.hpp>
  20. #include <boost/bind.hpp>
  21. #include <boost/functional.hpp>
  22. #include <iostream>
  23. #include <vector>
  24. #include <map>
  25. #include <string>
  26. #include <utility>
  27. #include <stdexcept>
  28. #include <cstdlib>
  29. namespace ba = boost::assign;
  30. void function_ptr( int )
  31. {
  32. // do nothing
  33. }
  34. struct functor
  35. {
  36. template< class T >
  37. void operator()( T ) const
  38. {
  39. // do nothing
  40. }
  41. };
  42. void check_list_inserter()
  43. {
  44. using namespace std;
  45. using namespace boost;
  46. using namespace boost::assign;
  47. vector<int> v;
  48. //
  49. // @note: cast only necessary on CodeWarrior
  50. //
  51. make_list_inserter( (void (*)(int))&function_ptr )( 5 ),3;
  52. make_list_inserter( functor() )( 4 ),2;
  53. typedef void (vector<int>::* push_back_t)(const int&);
  54. push_back_t push_back_func = &vector<int>::push_back;
  55. make_list_inserter( boost::bind( push_back_func, &v, _1 ) )( 6 ),4;
  56. BOOST_CHECK_EQUAL( v.size(), 2u );
  57. BOOST_CHECK_EQUAL( v[0], 6 );
  58. BOOST_CHECK_EQUAL( v[1], 4 );
  59. push_back( v ) = 1,2,3,4,5;
  60. BOOST_CHECK_EQUAL( v.size(), 7u );
  61. BOOST_CHECK_EQUAL( v[6], 5 );
  62. push_back( v )(6).repeat( 10, 7 )(8);
  63. BOOST_CHECK_EQUAL( v.size(), 19u );
  64. BOOST_CHECK_EQUAL( v[18], 8 );
  65. BOOST_CHECK_EQUAL( v[8], 7 );
  66. BOOST_CHECK_EQUAL( v[16], 7 );
  67. #if !BOOST_WORKAROUND(BOOST_MSVC, <= 1200)
  68. push_back( v ) = repeat_fun( 10, &rand );
  69. #else
  70. push_back( v ).repeat_fun( 10, &rand );
  71. #endif
  72. BOOST_CHECK_EQUAL( v.size(), 29u );
  73. #if BOOST_WORKAROUND(BOOST_MSVC, <= 1200) || BOOST_WORKAROUND(__SUNPRO_CC, <= 0x580 )
  74. push_back( v )(1).repeat( 10, 2 )(3);
  75. #else
  76. push_back( v ) = 1,repeat( 10, 2 ),3;
  77. #endif
  78. BOOST_CHECK_EQUAL( v.size(), 41u );
  79. #if BOOST_WORKAROUND(BOOST_MSVC, <= 1200) || BOOST_WORKAROUND(__SUNPRO_CC, <= 0x580 )
  80. push_back( v )(1).repeat_fun( 10, &rand )(2);
  81. #else
  82. push_back( v ) = 1,repeat_fun( 10, &rand ),2;
  83. #endif
  84. BOOST_CHECK_EQUAL( v.size(), 53u );
  85. typedef map<string,int> map_t;
  86. typedef map_t::value_type V;
  87. map_t m;
  88. make_list_inserter( assign_detail::call_insert< map_t >( m ) )
  89. ( V("bar",3) )( V("foo", 2) );
  90. BOOST_CHECK_EQUAL( m.size(), 2u );
  91. BOOST_CHECK_EQUAL( m["foo"], 2 );
  92. #if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) \
  93. || BOOST_WORKAROUND(BOOST_MSVC, <=1300) \
  94. || BOOST_WORKAROUND(BOOST_MSVC, ==1700) \
  95. || !defined( BOOST_NO_CXX11_HDR_INITIALIZER_LIST )
  96. #else
  97. typedef vector<int> score_type;
  98. typedef map<string,score_type> team_score_map;
  99. typedef std::pair<string,score_type> score_pair;
  100. team_score_map team_score;
  101. insert( team_score )( "Team Foo", list_of(1)(1)(0) )
  102. ( "Team Bar", list_of(0)(0)(0) )
  103. ( "Team FooBar", list_of(0)(0)(1) );
  104. BOOST_CHECK_EQUAL( team_score.size(), 3u );
  105. BOOST_CHECK_EQUAL( team_score[ "Team Foo" ][1], 1 );
  106. BOOST_CHECK_EQUAL( team_score[ "Team Bar" ][0], 0 );
  107. team_score = list_of< score_pair >
  108. ( "Team Foo", list_of(1)(1)(0) )
  109. ( "Team Bar", list_of(0)(0)(0) )
  110. ( "Team FooBar", list_of(0)(0)(1) );
  111. BOOST_CHECK_EQUAL( team_score.size(), 3u );
  112. BOOST_CHECK_EQUAL( team_score[ "Team Foo" ][1], 1 );
  113. BOOST_CHECK_EQUAL( team_score[ "Team Bar" ][0], 0 );
  114. #endif
  115. }
  116. #include <boost/test/unit_test.hpp>
  117. using boost::unit_test::test_suite;
  118. test_suite* init_unit_test_suite( int argc, char* argv[] )
  119. {
  120. test_suite* test = BOOST_TEST_SUITE( "List Test Suite" );
  121. test->add( BOOST_TEST_CASE( &check_list_inserter ) );
  122. return test;
  123. }