while_tests.cpp
来自「Boost provides free peer-reviewed portab」· C++ 代码 · 共 207 行
CPP
207 行
/*============================================================================= Phoenix V1.0 Copyright (c) 2002-2003 Martin Wille 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)==============================================================================*/// vi:ts=4:sw=4:et// Tests for BOOST_SPIRIT_CLASSIC_NS::while_p// [28-Dec-2002]////////////////////////////////////////////////////////////////////////////////#define qDebug 0#include <iostream>#include <cstring>#if qDebug#define BOOST_SPIRIT_DEBUG#endif#include "impl/string_length.hpp"#include <boost/spirit/include/classic_core.hpp>#include <boost/spirit/include/classic_assign_actor.hpp>#include <boost/spirit/include/classic_while.hpp>#include <boost/ref.hpp>namespace local{ template <typename T> struct var_wrapper : public ::boost::reference_wrapper<T> { typedef boost::reference_wrapper<T> parent; explicit inline var_wrapper(T& t) : parent(t) {} inline T& operator()() const { return parent::get(); } }; template <typename T> inline var_wrapper<T> var(T& t) { return var_wrapper<T>(t); }}namespace{ template <typename T> class add_actor { public: explicit add_actor(T &ref_) : ref(ref_) {} template <typename T2> void operator()(T2 const &val) const { ref += val; } private: T& ref; }; template <typename T> inline add_actor<T> const add(T& ref) { return add_actor<T>(ref); }}typedef BOOST_SPIRIT_CLASSIC_NS::rule<> rule_t;unsigned int test_count = 0;unsigned int error_count = 0;unsigned int iterations_performed;unsigned int number_result;static const unsigned int kError = 999;static const bool good = true;static const bool bad = false;rule_t while_rule;rule_t do_while_rule;voidtest_while( char const *s, unsigned int wanted, rule_t const &r, unsigned int iterations_wanted){ using namespace std; ++test_count; number_result = 0; iterations_performed = 0; BOOST_SPIRIT_CLASSIC_NS::parse_info<> m = BOOST_SPIRIT_CLASSIC_NS::parse(s, s+ test_impl::string_length(s), r); bool result = wanted == kError?(m.full?bad:good): (number_result==wanted); result &= iterations_performed == iterations_wanted; if (m.full && (m.length != test_impl::string_length(s))) result = bad; if (result==good) cout << "PASSED"; else { ++error_count; cout << "FAILED"; } cout << ": \"" << s << "\" ==> "; if (!m.full) cout << "<error>"; else cout << number_result; cout << " " << iterations_performed << " of " << iterations_wanted << " iterations\n";}template<typename T>struct inc_actor{ explicit inc_actor(T &t) : var(t) {} template<typename IteratorT> void operator()(IteratorT const &, IteratorT const &) const { ++var; } template<typename U> void operator()(U) const { ++var; } T &var;};template<typename T>inc_actor<T>inc(T &t){ return inc_actor<T>(t);}intmain(){ using namespace std; using ::BOOST_SPIRIT_CLASSIC_NS::uint_p; using ::BOOST_SPIRIT_CLASSIC_NS::while_p; using ::BOOST_SPIRIT_CLASSIC_NS::do_p; using ::BOOST_SPIRIT_CLASSIC_NS::assign_a;#if qDebug BOOST_SPIRIT_DEBUG_RULE(while_rule); BOOST_SPIRIT_DEBUG_RULE(do_while_rule);#endif while_rule = uint_p[assign_a(number_result)] >> while_p('+') [ uint_p[add(number_result)][inc(iterations_performed)] ]; do_while_rule = do_p [ uint_p[add(number_result)][inc(iterations_performed)] ].while_p('+'); cout << "/////////////////////////////////////////////////////////\n"; cout << "\n"; cout << " while_p test\n"; cout << "\n"; cout << "/////////////////////////////////////////////////////////\n"; cout << "\n"; cout << "while_p()[]\n"; test_while("", kError, while_rule, 0); test_while("1", 1, while_rule, 0); test_while("1+1", 2, while_rule, 1); test_while("1+1+12", 14, while_rule, 2); test_while("1+1+x", kError, while_rule, 1); cout << "do_p[].while_p()\n"; test_while("", kError, do_while_rule, 0); test_while("1", 1, do_while_rule, 1); test_while("1+1", 2, do_while_rule, 2); test_while("1+1+12", 14, do_while_rule, 3); test_while("1+1+x", kError, do_while_rule, 2); std::cout << "\n "; if (error_count==0) cout << "All " << test_count << " while_p-tests passed.\n" << "Test concluded successfully\n"; else cout << error_count << " of " << test_count << " while_p-tests failed\n" << "Test failed\n"; return error_count!=0;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?