123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392 |
- // 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 <boost/test/minimal.hpp> // see "Header Implementation Option"
- #include "boost/lambda/lambda.hpp"
- #include "boost/lambda/if.hpp"
- #include "boost/lambda/switch.hpp"
- #include <iostream>
- #include <algorithm>
- #include <vector>
- #include <string>
- // Check that elements 0 -- index are 1, and the rest are 0
- bool check(const std::vector<int>& v, int index) {
- using namespace boost::lambda;
- int counter = 0;
- std::vector<int>::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<int> 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<int> 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;
- }
|