proto_fusion_s.cpp

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

CPP
199
字号
///////////////////////////////////////////////////////////////////////////////// proto_fusion_s.cpp////  Copyright 2008 Eric Niebler. 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)#include <boost/version.hpp>#if BOOST_VERSION < 103500# error This test only works on Boost v1.35#endif#include <boost/proto/core.hpp>#include <boost/proto/fusion.hpp>#include <boost/fusion/algorithm/iteration/ext_/for_each_s.hpp>#include <boost/test/unit_test.hpp>#include <boost/utility/addressof.hpp>#include <sstream>std::ostream &operator <<(std::ostream &sout, boost::proto::tag::shift_right){    return sout << ">>";}std::ostream &operator <<(std::ostream &sout, boost::proto::tag::bitwise_or){    return sout << "|";}template<typename Args>std::ostream &operator <<(std::ostream &sout, boost::proto::expr<boost::proto::tag::terminal, Args, 0> const *op){    return sout << boost::proto::value(*op);}template<typename Tag, typename Args>std::ostream &operator <<(std::ostream &sout, boost::proto::expr<Tag, Args, 1> const *op){    return sout << Tag() << boost::addressof(boost::proto::child(*op).proto_base());}template<typename Tag, typename Args>std::ostream &operator <<(std::ostream &sout, boost::proto::expr<Tag, Args, 2> const *op){    return sout << boost::addressof(boost::proto::left(*op).proto_base()) << Tag() << boost::addressof(boost::proto::right(*op).proto_base());}///////////////////////////////////////////////////////////////////////////////// to_string//struct to_string{    to_string(std::ostream &sout)      : sout_(sout)    {}    template<typename Op>    void operator ()(Op const &op) const    {        this->sout_ << '(' << boost::addressof(op.proto_base()) << ')';    }private:    std::ostream &sout_;};void test1(){    using boost::proto::flatten;    boost::proto::terminal<char>::type a_ = {'a'};    boost::proto::terminal<char>::type b_ = {'b'};    boost::proto::terminal<char>::type c_ = {'c'};    boost::proto::terminal<char>::type d_ = {'d'};    boost::proto::terminal<char>::type e_ = {'e'};    boost::proto::terminal<char>::type f_ = {'f'};    boost::proto::terminal<char>::type g_ = {'g'};    boost::proto::terminal<char>::type h_ = {'h'};    boost::proto::terminal<char>::type i_ = {'i'};    std::stringstream sout;    // Test for 1-way branching "tree"    sout.str("");    boost::fusion::for_each_s(flatten(!!!!(a_ >> b_)), to_string(sout));    BOOST_CHECK_EQUAL("(a>>b)", sout.str());    // Tests for 2-way branching trees    sout.str("");    boost::fusion::for_each_s(flatten(a_ >> b_ >> c_), to_string(sout));    BOOST_CHECK_EQUAL("(a)(b)(c)", sout.str());    sout.str("");    boost::fusion::for_each_s(flatten(a_ | b_ | c_), to_string(sout));    BOOST_CHECK_EQUAL("(a)(b)(c)", sout.str());    sout.str("");    boost::fusion::for_each_s(flatten(a_ >> b_ | c_ >> d_), to_string(sout));    BOOST_CHECK_EQUAL("(a>>b)(c>>d)", sout.str());    sout.str("");    boost::fusion::for_each_s(flatten(a_ | b_ >> c_ | d_), to_string(sout));    BOOST_CHECK_EQUAL("(a)(b>>c)(d)", sout.str());    sout.str("");    boost::fusion::for_each_s(flatten(a_ >> b_ | c_ >> d_ | e_ >> f_ >> g_), to_string(sout));    BOOST_CHECK_EQUAL("(a>>b)(c>>d)(e>>f>>g)", sout.str());    sout.str("");    boost::fusion::for_each_s(flatten(a_ >> b_ | c_ >> d_ | e_ >> (f_ | g_) >> h_), to_string(sout));    BOOST_CHECK_EQUAL("(a>>b)(c>>d)(e>>f|g>>h)", sout.str());    // Test for n-way branching tree    sout.str("");    boost::fusion::for_each_s(flatten(a_(b_(c_ >> d_, e_ | f_), g_ >> h_)(i_)), to_string(sout));    BOOST_CHECK_EQUAL("(a)(b)(c>>d)(e|f)(g>>h)(i)", sout.str());}////////////////////////////////////////////////////////////////////////// Test that EXTENDS expression wrappers are also valid fusion sequencestemplate<typename Expr>struct My;struct MyDomain  : boost::proto::domain<boost::proto::pod_generator<My> >{};template<typename Expr>struct My{    BOOST_PROTO_EXTENDS(Expr, My<Expr>, MyDomain)};void test2(){    using boost::proto::flatten;    My<boost::proto::terminal<char>::type> a_ = {{'a'}};    My<boost::proto::terminal<char>::type> b_ = {{'b'}};    My<boost::proto::terminal<char>::type> c_ = {{'c'}};    My<boost::proto::terminal<char>::type> d_ = {{'d'}};    My<boost::proto::terminal<char>::type> e_ = {{'e'}};    My<boost::proto::terminal<char>::type> f_ = {{'f'}};    My<boost::proto::terminal<char>::type> g_ = {{'g'}};    My<boost::proto::terminal<char>::type> h_ = {{'h'}};    My<boost::proto::terminal<char>::type> i_ = {{'i'}};    std::stringstream sout;    // Test for 1-way branching "tree"    sout.str("");    boost::fusion::for_each_s(flatten(!!!!(a_ >> b_)), to_string(sout));    BOOST_CHECK_EQUAL("(a>>b)", sout.str());    // Tests for 2-way branching trees    sout.str("");    boost::fusion::for_each_s(flatten(a_ >> b_ >> c_), to_string(sout));    BOOST_CHECK_EQUAL("(a)(b)(c)", sout.str());    sout.str("");    boost::fusion::for_each_s(flatten(a_ | b_ | c_), to_string(sout));    BOOST_CHECK_EQUAL("(a)(b)(c)", sout.str());    sout.str("");    boost::fusion::for_each_s(flatten(a_ >> b_ | c_ >> d_), to_string(sout));    BOOST_CHECK_EQUAL("(a>>b)(c>>d)", sout.str());    sout.str("");    boost::fusion::for_each_s(flatten(a_ | b_ >> c_ | d_), to_string(sout));    BOOST_CHECK_EQUAL("(a)(b>>c)(d)", sout.str());    sout.str("");    boost::fusion::for_each_s(flatten(a_ >> b_ | c_ >> d_ | e_ >> f_ >> g_), to_string(sout));    BOOST_CHECK_EQUAL("(a>>b)(c>>d)(e>>f>>g)", sout.str());    sout.str("");    boost::fusion::for_each_s(flatten(a_ >> b_ | c_ >> d_ | e_ >> (f_ | g_) >> h_), to_string(sout));    BOOST_CHECK_EQUAL("(a>>b)(c>>d)(e>>f|g>>h)", sout.str());    // Test for n-way branching tree    sout.str("");    boost::fusion::for_each_s(flatten(a_(b_(c_ >> d_, e_ | f_), g_ >> h_)(i_)), to_string(sout));    BOOST_CHECK_EQUAL("(a)(b)(c>>d)(e|f)(g>>h)(i)", sout.str());}using namespace boost::unit_test;///////////////////////////////////////////////////////////////////////////////// init_unit_test_suite//test_suite* init_unit_test_suite( int argc, char* argv[] ){    test_suite *test = BOOST_TEST_SUITE("test proto and segmented fusion integration");    test->add(BOOST_TEST_CASE(&test1));    test->add(BOOST_TEST_CASE(&test2));    return test;}

⌨️ 快捷键说明

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