scanner_value_type_tests.cpp
来自「Boost provides free peer-reviewed portab」· C++ 代码 · 共 139 行
CPP
139 行
/*============================================================================= Copyright (c) 2005 Jordan DeLong 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)=============================================================================*/// Some tests of parsing on value_t's that aren't char or wchar_t.//// Part of what this is testing is that BOOST_SPIRIT_DEBUG doesn't// break when the scanner::value_t is some sort of non-char.#define SPIRIT_DEBUG_NODE#include <boost/spirit/include/classic_core.hpp>#include <boost/static_assert.hpp>#include <boost/type_traits/is_same.hpp>#include <deque>#include <iostream>namespace sp = BOOST_SPIRIT_CLASSIC_NS;namespace { struct grammar : sp::grammar<grammar> { template<class Scanner> struct definition { definition(grammar const&) { foo = sp::alpha_p | sp::alnum_p | sp::cntrl_p | sp::print_p | sp::blank_p | sp::digit_p | sp::graph_p | sp::lower_p | sp::upper_p | sp::xdigit_p | sp::punct_p ; } sp::rule<Scanner> foo; sp::rule<Scanner> const& start() const { return foo; } }; }; struct non_pod { non_pod() : value('1') {} char value; bool operator==(non_pod const& o) const { return value == o.value; } }; std::ostream& operator<<(std::ostream& out, non_pod const& x) { out << x.value; return out; } template<class T> struct convertable_non_pod : non_pod { operator T() { return value; } }; struct nonpod_gram : sp::grammar<nonpod_gram> { template<class Scanner> struct definition { definition(nonpod_gram const&) { foo = sp::ch_p(typename Scanner::value_t()); } sp::rule<Scanner> foo; sp::rule<Scanner> const& start() const { return foo; } }; }; template<class Grammar, class ValueType> void test_type() { typedef std::deque<ValueType> container; typedef typename container::iterator iterator; typedef sp::scanner<iterator> scanner; container blah; blah.push_back(typename container::value_type()); blah.push_back(typename container::value_type()); iterator first = blah.begin(); iterator last = blah.end(); scanner scan(first, last); // Make sure this actually tries what we think it tries. BOOST_STATIC_ASSERT(( boost::is_same<typename scanner::value_t, ValueType>::value )); Grammar().parse(scan); }}intmain(){ // Make sure isfoo() style functions work for integral types. test_type<grammar, char>(); test_type<grammar, unsigned char>(); test_type<grammar, wchar_t>(); test_type<grammar, int>(); test_type<grammar, long>(); test_type<grammar, short>(); test_type<grammar, bool>(); // Non-POD's should work with things like alpha_p as long as we // can turn them into a type that can do isalpha(). test_type<grammar, convertable_non_pod<char> >(); test_type<grammar, convertable_non_pod<wchar_t> >(); test_type<grammar, convertable_non_pod<int> >(); // BOOST_SPIRIT_DEBUG should work with grammars that parse // non-POD's even if they can't do things like isalpha(). test_type<nonpod_gram, non_pod>();}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?