switch_construct.cpp

来自「Boost provides free peer-reviewed portab」· C++ 代码 · 共 393 行

CPP
393
字号
//  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 0bool 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;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?