for_tests.cpp
来自「Boost provides free peer-reviewed portab」· C++ 代码 · 共 197 行
CPP
197 行
/*============================================================================= Copyright (c) 2003 Martin Wille http://spirit.sourceforge.net/ 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 spirit::for_p// [13-Jan-2003]////////////////////////////////////////////////////////////////////////////////#define qDebug 0#include <iostream>#include <cstring>#if qDebug#define SPIRIT_DEBUG#endif#include <string>#include <boost/spirit/include/classic_core.hpp>#include <boost/spirit/include/classic_assign_actor.hpp>#include <boost/spirit/include/classic_for.hpp>#include <boost/ref.hpp>#include "impl/string_length.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 iterations_desired;std::string input_matched;//static const unsigned int kError = 999;static const bool good = true;static const bool bad = false;rule_t for_rule;rule_t for_rule2;voidtest_for( char const *s, bool succeed, rule_t const &r, unsigned int iterations_expected){ using namespace std; ++test_count; 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 = (succeed==m.full)?good:bad; if (m.full && (m.length != test_impl::string_length(s))) result = bad; result &= iterations_expected == iterations_performed; if (result==good) cout << "PASSED"; else { ++error_count; cout << "FAILED"; } cout << ": \"" << s << "\" ==> "; if (!m.full) cout << "<error>"; else cout << '"' << input_matched << '"'; cout << " " << iterations_performed << " of " << iterations_desired << " iterations\n";}namespace{ void zero() { iterations_performed = 0; } struct inc { inline void operator()() const { ++iterations_performed; } }; struct cmp { inline bool operator()() const { return iterations_performed<iterations_desired; } };}intmain(){ using namespace std; using BOOST_SPIRIT_CLASSIC_NS::uint_p; using BOOST_SPIRIT_CLASSIC_NS::for_p; using BOOST_SPIRIT_CLASSIC_NS::assign_a;#if qDebug SPIRIT_DEBUG_RULE(for_rule); SPIRIT_DEBUG_RULE(for_rule2);#endif for_rule = uint_p[assign_a(iterations_desired)] >> ':' >> for_p(&zero, cmp(), inc())["xy"] [assign_a(input_matched)] ; for_rule2 = for_p(&zero, '.', inc())["xy"] [assign_a(input_matched)] ; cout << "/////////////////////////////////////////////////////////\n"; cout << "\n"; cout << " for_p test\n"; cout << "\n"; cout << "/////////////////////////////////////////////////////////\n"; cout << "\n"; test_for("3:xyxyxy", true, for_rule, 3); test_for("3:", false, for_rule, 0); test_for("3:xyxy", false, for_rule, 2); test_for("3:xyxyxyxy", false, for_rule, 3); test_for(".xy.xy.xy", true, for_rule2, 3); test_for(".xy.xy.xy.", false, for_rule2, 3); std::cout << "\n "; if (error_count==0) cout << "All " << test_count << " for_p-tests passed.\n" << "Test concluded successfully\n"; else cout << error_count << " of " << test_count << " for_p-tests failed\n" << "Test failed\n"; return error_count!=0;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?