1 // Boost.Assign library
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)
8 // For more information, see http://www.boost.org/libs/assign/
11 #include <boost/detail/workaround.hpp>
13 #if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
14 # pragma warn -8091 // suppress warning in Boost.Test
15 # pragma warn -8057 // unused argument argc/argv in Boost.Test
19 #include <boost/assign/list_inserter.hpp>
20 #include <boost/assign/list_of.hpp>
21 #include <boost/test/test_tools.hpp>
22 #include <boost/array.hpp>
23 #include <boost/function.hpp>
24 #include <boost/bind.hpp>
25 #include <boost/functional.hpp>
35 namespace ba
= boost::assign
;
37 void function_ptr( int )
45 void operator()( T
) const
53 void check_list_inserter()
56 using namespace boost
;
57 using namespace boost::assign
;
61 // @note: cast only necessary on CodeWarrior
63 make_list_inserter( (void (*)(int))&function_ptr
)( 5 ),3;
64 make_list_inserter( functor() )( 4 ),2;
66 typedef void (vector
<int>::* push_back_t
)(const int&);
67 push_back_t push_back_func
= &vector
<int>::push_back
;
68 make_list_inserter( boost::bind( push_back_func
, &v
, _1
) )( 6 ),4;
70 BOOST_CHECK_EQUAL( v
.size(), 2u );
71 BOOST_CHECK_EQUAL( v
[0], 6 );
72 BOOST_CHECK_EQUAL( v
[1], 4 );
74 push_back( v
) = 1,2,3,4,5;
75 BOOST_CHECK_EQUAL( v
.size(), 7u );
76 BOOST_CHECK_EQUAL( v
[6], 5 );
78 push_back( v
)(6).repeat( 10, 7 )(8);
79 BOOST_CHECK_EQUAL( v
.size(), 19u );
80 BOOST_CHECK_EQUAL( v
[18], 8 );
81 BOOST_CHECK_EQUAL( v
[8], 7 );
82 BOOST_CHECK_EQUAL( v
[16], 7 );
84 #if !BOOST_WORKAROUND(BOOST_MSVC, <= 1200)
85 push_back( v
) = repeat_fun( 10, &rand
);
87 push_back( v
).repeat_fun( 10, &rand
);
90 BOOST_CHECK_EQUAL( v
.size(), 29u );
92 #if BOOST_WORKAROUND(BOOST_MSVC, <= 1200) || BOOST_WORKAROUND(__SUNPRO_CC, <= 0x580 )
93 push_back( v
)(1).repeat( 10, 2 )(3);
95 push_back( v
) = 1,repeat( 10, 2 ),3;
97 BOOST_CHECK_EQUAL( v
.size(), 41u );
99 #if BOOST_WORKAROUND(BOOST_MSVC, <= 1200) || BOOST_WORKAROUND(__SUNPRO_CC, <= 0x580 )
100 push_back( v
)(1).repeat_fun( 10, &rand
)(2);
102 push_back( v
) = 1,repeat_fun( 10, &rand
),2;
105 BOOST_CHECK_EQUAL( v
.size(), 53u );
107 typedef map
<string
,int> map_t
;
108 typedef map_t::value_type V
;
111 make_list_inserter( assign_detail::call_insert
< map_t
>( m
) )
112 ( V("bar",3) )( V("foo", 2) );
113 BOOST_CHECK_EQUAL( m
.size(), 2u );
114 BOOST_CHECK_EQUAL( m
["foo"], 2 );
117 #if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) || BOOST_WORKAROUND(BOOST_MSVC, <=1300)
120 typedef vector
<int> score_type
;
121 typedef map
<string
,score_type
> team_score_map
;
122 typedef std::pair
<string
,score_type
> score_pair
;
123 team_score_map team_score
;
124 insert( team_score
)( "Team Foo", list_of(1)(1)(0) )
125 ( "Team Bar", list_of(0)(0)(0) )
126 ( "Team FooBar", list_of(0)(0)(1) );
127 BOOST_CHECK_EQUAL( team_score
.size(), 3u );
128 BOOST_CHECK_EQUAL( team_score
[ "Team Foo" ][1], 1 );
129 BOOST_CHECK_EQUAL( team_score
[ "Team Bar" ][0], 0 );
131 team_score
= list_of
< score_pair
>
132 ( "Team Foo", list_of(1)(1)(0) )
133 ( "Team Bar", list_of(0)(0)(0) )
134 ( "Team FooBar", list_of(0)(0)(1) );
135 BOOST_CHECK_EQUAL( team_score
.size(), 3u );
136 BOOST_CHECK_EQUAL( team_score
[ "Team Foo" ][1], 1 );
137 BOOST_CHECK_EQUAL( team_score
[ "Team Bar" ][0], 0 );
145 #include <boost/test/unit_test.hpp>
146 using boost::unit_test::test_suite
;
148 test_suite
* init_unit_test_suite( int argc
, char* argv
[] )
150 test_suite
* test
= BOOST_TEST_SUITE( "List Test Suite" );
152 test
->add( BOOST_TEST_CASE( &check_list_inserter
) );