// switch_test.cpp -- The Boost Lambda Library -------------------------- // // Copyright (C) 2000-2003 Jaakko Jarvi (jaakko.jarvi@cs.utu.fi) // Copyright (C) 2000-2003 Gary Powell (powellg@amazon.com) // // 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) // // For more information, see www.boost.org // ----------------------------------------------------------------------- #include // see "Header Implementation Option" #include "boost/lambda/lambda.hpp" #include "boost/lambda/if.hpp" #include "boost/lambda/switch.hpp" #include #include #include #include // Check that elements 0 -- index are 1, and the rest are 0 bool check(const std::vector& v, int index) { using namespace boost::lambda; int counter = 0; std::vector::const_iterator result = std::find_if(v.begin(), v.end(), ! if_then_else_return( var(counter)++ <= index, _1 == 1, _1 == 0) ); return result == v.end(); } void do_switch_no_defaults_tests() { using namespace boost::lambda; int i = 0; std::vector v,w; // elements from 0 to 9 std::generate_n(std::back_inserter(v), 10, var(i)++); std::fill_n(std::back_inserter(w), 10, 0); // --- std::for_each(v.begin(), v.end(), switch_statement( _1, case_statement<0>(++var(w[0])) ) ); BOOST_CHECK(check(w, 0)); std::fill_n(w.begin(), 10, 0); // --- std::for_each(v.begin(), v.end(), switch_statement( _1, case_statement<0>(++var(w[0])), case_statement<1>(++var(w[1])) ) ); BOOST_CHECK(check(w, 1)); std::fill_n(w.begin(), 10, 0); // --- std::for_each(v.begin(), v.end(), switch_statement( _1, case_statement<0>(++var(w[0])), case_statement<1>(++var(w[1])), case_statement<2>(++var(w[2])) ) ); BOOST_CHECK(check(w, 2)); std::fill_n(w.begin(), 10, 0); // --- std::for_each(v.begin(), v.end(), switch_statement( _1, case_statement<0>(++var(w[0])), case_statement<1>(++var(w[1])), case_statement<2>(++var(w[2])), case_statement<3>(++var(w[3])) ) ); BOOST_CHECK(check(w, 3)); std::fill_n(w.begin(), 10, 0); // --- std::for_each(v.begin(), v.end(), switch_statement( _1, case_statement<0>(++var(w[0])), case_statement<1>(++var(w[1])), case_statement<2>(++var(w[2])), case_statement<3>(++var(w[3])), case_statement<4>(++var(w[4])) ) ); BOOST_CHECK(check(w, 4)); std::fill_n(w.begin(), 10, 0); // --- std::for_each(v.begin(), v.end(), switch_statement( _1, case_statement<0>(++var(w[0])), case_statement<1>(++var(w[1])), case_statement<2>(++var(w[2])), case_statement<3>(++var(w[3])), case_statement<4>(++var(w[4])), case_statement<5>(++var(w[5])) ) ); BOOST_CHECK(check(w, 5)); std::fill_n(w.begin(), 10, 0); // --- std::for_each(v.begin(), v.end(), switch_statement( _1, case_statement<0>(++var(w[0])), case_statement<1>(++var(w[1])), case_statement<2>(++var(w[2])), case_statement<3>(++var(w[3])), case_statement<4>(++var(w[4])), case_statement<5>(++var(w[5])), case_statement<6>(++var(w[6])) ) ); BOOST_CHECK(check(w, 6)); std::fill_n(w.begin(), 10, 0); // --- std::for_each(v.begin(), v.end(), switch_statement( _1, case_statement<0>(++var(w[0])), case_statement<1>(++var(w[1])), case_statement<2>(++var(w[2])), case_statement<3>(++var(w[3])), case_statement<4>(++var(w[4])), case_statement<5>(++var(w[5])), case_statement<6>(++var(w[6])), case_statement<7>(++var(w[7])) ) ); BOOST_CHECK(check(w, 7)); std::fill_n(w.begin(), 10, 0); // --- std::for_each(v.begin(), v.end(), switch_statement( _1, case_statement<0>(++var(w[0])), case_statement<1>(++var(w[1])), case_statement<2>(++var(w[2])), case_statement<3>(++var(w[3])), case_statement<4>(++var(w[4])), case_statement<5>(++var(w[5])), case_statement<6>(++var(w[6])), case_statement<7>(++var(w[7])), case_statement<8>(++var(w[8])) ) ); BOOST_CHECK(check(w, 8)); std::fill_n(w.begin(), 10, 0); } void do_switch_yes_defaults_tests() { using namespace boost::lambda; int i = 0; std::vector v,w; // elements from 0 to 9 std::generate_n(std::back_inserter(v), 10, var(i)++); std::fill_n(std::back_inserter(w), 10, 0); int default_count; // --- default_count = 0; std::for_each(v.begin(), v.end(), switch_statement( _1, default_statement(++var(default_count)) ) ); BOOST_CHECK(check(w, -1)); BOOST_CHECK(default_count == 10); std::fill_n(w.begin(), 10, 0); // --- default_count = 0; std::for_each(v.begin(), v.end(), switch_statement( _1, case_statement<0>(++var(w[0])), default_statement(++var(default_count)) ) ); BOOST_CHECK(check(w, 0)); BOOST_CHECK(default_count == 9); std::fill_n(w.begin(), 10, 0); // --- default_count = 0; std::for_each(v.begin(), v.end(), switch_statement( _1, case_statement<0>(++var(w[0])), case_statement<1>(++var(w[1])), default_statement(++var(default_count)) ) ); BOOST_CHECK(check(w, 1)); BOOST_CHECK(default_count == 8); std::fill_n(w.begin(), 10, 0); // --- default_count = 0; std::for_each(v.begin(), v.end(), switch_statement( _1, case_statement<0>(++var(w[0])), case_statement<1>(++var(w[1])), case_statement<2>(++var(w[2])), default_statement(++var(default_count)) ) ); BOOST_CHECK(check(w, 2)); BOOST_CHECK(default_count == 7); std::fill_n(w.begin(), 10, 0); // --- default_count = 0; std::for_each(v.begin(), v.end(), switch_statement( _1, case_statement<0>(++var(w[0])), case_statement<1>(++var(w[1])), case_statement<2>(++var(w[2])), case_statement<3>(++var(w[3])), default_statement(++var(default_count)) ) ); BOOST_CHECK(check(w, 3)); BOOST_CHECK(default_count == 6); std::fill_n(w.begin(), 10, 0); // --- default_count = 0; std::for_each(v.begin(), v.end(), switch_statement( _1, case_statement<0>(++var(w[0])), case_statement<1>(++var(w[1])), case_statement<2>(++var(w[2])), case_statement<3>(++var(w[3])), case_statement<4>(++var(w[4])), default_statement(++var(default_count)) ) ); BOOST_CHECK(check(w, 4)); BOOST_CHECK(default_count == 5); std::fill_n(w.begin(), 10, 0); // --- default_count = 0; std::for_each(v.begin(), v.end(), switch_statement( _1, case_statement<0>(++var(w[0])), case_statement<1>(++var(w[1])), case_statement<2>(++var(w[2])), case_statement<3>(++var(w[3])), case_statement<4>(++var(w[4])), case_statement<5>(++var(w[5])), default_statement(++var(default_count)) ) ); BOOST_CHECK(check(w, 5)); BOOST_CHECK(default_count == 4); std::fill_n(w.begin(), 10, 0); // --- default_count = 0; std::for_each(v.begin(), v.end(), switch_statement( _1, case_statement<0>(++var(w[0])), case_statement<1>(++var(w[1])), case_statement<2>(++var(w[2])), case_statement<3>(++var(w[3])), case_statement<4>(++var(w[4])), case_statement<5>(++var(w[5])), case_statement<6>(++var(w[6])), default_statement(++var(default_count)) ) ); BOOST_CHECK(check(w, 6)); BOOST_CHECK(default_count == 3); std::fill_n(w.begin(), 10, 0); // --- default_count = 0; std::for_each(v.begin(), v.end(), switch_statement( _1, case_statement<0>(++var(w[0])), case_statement<1>(++var(w[1])), case_statement<2>(++var(w[2])), case_statement<3>(++var(w[3])), case_statement<4>(++var(w[4])), case_statement<5>(++var(w[5])), case_statement<6>(++var(w[6])), case_statement<7>(++var(w[7])), default_statement(++var(default_count)) ) ); BOOST_CHECK(check(w, 7)); BOOST_CHECK(default_count == 2); std::fill_n(w.begin(), 10, 0); } void test_empty_cases() { using namespace boost::lambda; // --- switch_statement( _1, default_statement() )(make_const(1)); switch_statement( _1, case_statement<1>() )(make_const(1)); } int test_main(int, char* []) { do_switch_no_defaults_tests(); do_switch_yes_defaults_tests(); test_empty_cases(); return EXIT_SUCCESS; }