// Boost string_algo library iterator_test.cpp file ---------------------------// // Copyright Pavol Droba 2002-2003. Use, modification and // distribution is subject to 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 for updates, documentation, and revision history. #include #include #include // equals predicate is used for result comparison #include // Include unit test framework #define BOOST_TEST_MAIN #include #include #include #include #include #include using namespace std; using namespace boost; template< typename T1, typename T2 > void deep_compare( const T1& X, const T2& Y ) { BOOST_REQUIRE( X.size() == Y.size() ); for( unsigned int nIndex=0; nIndex tokens; vector< vector > vtokens; // find_all tests find_all( tokens, pch1, "xx" ); BOOST_REQUIRE( tokens.size()==2 ); BOOST_CHECK( tokens[0]==string("xx") ); BOOST_CHECK( tokens[1]==string("xx") ); ifind_all( tokens, str2, "xx" ); BOOST_REQUIRE( tokens.size()==3 ); BOOST_CHECK( tokens[0]==string("Xx") ); BOOST_CHECK( tokens[1]==string("xX") ); BOOST_CHECK( tokens[2]==string("xx") ); find_all( tokens, str1, "xx" ); BOOST_REQUIRE( tokens.size()==2 ); BOOST_CHECK( tokens[0]==string("xx") ); BOOST_CHECK( tokens[1]==string("xx") ); find_all( vtokens, str1, string("xx") ); deep_compare( tokens, vtokens ); #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) // If using a compiler that supports forwarding references, we should be able to use rvalues, too find_all( tokens, string("xx-abc--xx-abb"), "xx" ); BOOST_REQUIRE( tokens.size()==2 ); BOOST_CHECK( tokens[0]==string("xx") ); BOOST_CHECK( tokens[1]==string("xx") ); ifind_all( tokens, string("Xx-abc--xX-abb-xx"), "xx" ); BOOST_REQUIRE( tokens.size()==3 ); BOOST_CHECK( tokens[0]==string("Xx") ); BOOST_CHECK( tokens[1]==string("xX") ); BOOST_CHECK( tokens[2]==string("xx") ); #endif // split tests split( tokens, str2, is_any_of("xX"), token_compress_on ); BOOST_REQUIRE( tokens.size()==4 ); BOOST_CHECK( tokens[0]==string("") ); BOOST_CHECK( tokens[1]==string("-abc--") ); BOOST_CHECK( tokens[2]==string("-abb-") ); BOOST_CHECK( tokens[3]==string("") ); split( tokens, pch1, is_any_of("x"), token_compress_on ); BOOST_REQUIRE( tokens.size()==3 ); BOOST_CHECK( tokens[0]==string("") ); BOOST_CHECK( tokens[1]==string("-abc--") ); BOOST_CHECK( tokens[2]==string("-abb") ); split( vtokens, str1, is_any_of("x"), token_compress_on ); deep_compare( tokens, vtokens ); split( tokens, str1, is_punct(), token_compress_off ); BOOST_REQUIRE( tokens.size()==5 ); BOOST_CHECK( tokens[0]==string("xx") ); BOOST_CHECK( tokens[1]==string("abc") ); BOOST_CHECK( tokens[2]==string("") ); BOOST_CHECK( tokens[3]==string("xx") ); BOOST_CHECK( tokens[4]==string("abb") ); split( tokens, str3, is_any_of(","), token_compress_off); BOOST_REQUIRE( tokens.size()==1 ); BOOST_CHECK( tokens[0]==string("xx") ); split( tokens, strempty, is_punct(), token_compress_off); BOOST_REQUIRE( tokens.size()==1 ); BOOST_CHECK( tokens[0]==string("") ); #if !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) // If using a compiler that supports forwarding references, we should be able to use rvalues, too split( tokens, string("Xx-abc--xX-abb-xx"), is_any_of("xX"), token_compress_on ); BOOST_REQUIRE( tokens.size()==4 ); BOOST_CHECK( tokens[0]==string("") ); BOOST_CHECK( tokens[1]==string("-abc--") ); BOOST_CHECK( tokens[2]==string("-abb-") ); BOOST_CHECK( tokens[3]==string("") ); #endif find_iterator fiter=make_find_iterator(str1, first_finder("xx")); find_iterator fiter2; BOOST_CHECK(equals(*fiter, "xx")); ++fiter; fiter2 = fiter; BOOST_CHECK(equals(*fiter, "xx")); BOOST_CHECK(equals(*fiter2, "xx")); ++fiter; BOOST_CHECK(fiter==find_iterator()); BOOST_CHECK(equals(*fiter2, "xx")); ++fiter2; BOOST_CHECK(fiter2==find_iterator()); split_iterator siter=make_split_iterator(str1, token_finder(is_any_of("-"), token_compress_on)); split_iterator siter2; BOOST_CHECK(equals(*siter, "xx")); ++siter; siter2 = siter; BOOST_CHECK(equals(*siter, "abc")); BOOST_CHECK(equals(*siter2, "abc")); ++siter; BOOST_CHECK(equals(*siter, "xx")); BOOST_CHECK(equals(*siter2, "abc")); ++siter; BOOST_CHECK(equals(*siter, "abb")); ++siter; BOOST_CHECK(siter==split_iterator(siter)); BOOST_CHECK(siter==split_iterator()); // Make sure we work with forward iterators // See bug #7989 list l1; find_iterator::iterator> liter=make_find_iterator(l1, first_finder("xx")); } BOOST_AUTO_TEST_CASE( test_main ) { iterator_test(); }