test.hpp

来自「Boost provides free peer-reviewed portab」· HPP 代码 · 共 93 行

HPP
93
字号
//  Copyright (c) 2001-2008 Hartmut Kaiser// //  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)#if !defined(BOOST_SPIRIT_LEX_TEST_MAR_23_2007_0721PM)#define BOOST_SPIRIT_LEX_TEST_MAR_23_2007_0721PM#include <boost/variant.hpp>#include <boost/range/iterator_range.hpp>namespace spirit_test{    ///////////////////////////////////////////////////////////////////////////    struct display_type    {        template<typename T>        void operator()(T const &) const        {            std::cout << typeid(T).name() << std::endl;        }        template<typename T>        static void print()         {            std::cout << typeid(T).name() << std::endl;        }    };    ///////////////////////////////////////////////////////////////////////////    display_type const display = {};        ///////////////////////////////////////////////////////////////////////////    template <typename Iterator>    inline boost::iterator_range<Iterator> const&     get_iterpair(boost::iterator_range<Iterator> const& itp)    {        return itp;    }        template <typename Iterator, BOOST_VARIANT_ENUM_PARAMS(typename T)>    inline boost::iterator_range<Iterator> const&     get_iterpair(boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)> const& v)    {        return boost::get<boost::iterator_range<Iterator> >(v);    }        ///////////////////////////////////////////////////////////////////////////    template <typename Lexer, typename Char>    inline bool     test(Lexer& lex, Char const* input, std::size_t token_id = 0,         Char const* state = NULL)    {        typedef typename Lexer::iterator_type iterator_type;        typedef std::basic_string<Char> string_type;                string_type str(input);        typename string_type::iterator it = str.begin();                iterator_type first = lex.begin(it, str.end());        iterator_type last = lex.end();                bool r = true;                if (NULL != state) {            std::size_t stateid = lex.map_state(state);            r = r && (static_cast<unsigned>(~0) != stateid);            first.set_state(stateid);        }                    r = r && lex;        r = r && first != last;                if (token_id != 0)            r = r && (*first).id() == token_id;        else            r = r && (*first).id() != 0;                    using namespace boost;                typedef typename Lexer::iterator_type::base_iterator_type iterator;        typedef iterator_range<iterator> iterpair_type;        iterpair_type const& ip = get_iterpair<iterator>((*first).value());        r = r && string_type(ip.begin(), ip.end()) == str;        return r && first != last && ++first == last;    }}#endif

⌨️ 快捷键说明

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