/*============================================================================= Copyright (c) 2011-2018 Bolero MURAKAMI https://github.com/bolero-MURAKAMI/Sprout 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) =============================================================================*/ #ifndef SPROUT_WEED_CONTEXT_PARSE_CONTEXT_TERMINAL_STRING_HPP #define SPROUT_WEED_CONTEXT_PARSE_CONTEXT_TERMINAL_STRING_HPP #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace sprout { namespace weed { // // parse_context::eval // template template struct parse_context::eval< Expr, typename std::enable_if< std::is_same< typename sprout::weed::traits::tag_of::type, sprout::weed::tag::terminal >::value && sprout::weed::traits::is_string< typename sprout::tuples::tuple_element<0, typename Expr::args_type>::type >::value >::type > { private: typedef sprout::weed::parse_context context_type; public: typedef sprout::weed::unused attribute_type; typedef sprout::weed::eval_result result_type; private: template SPROUT_CONSTEXPR result_type call( Arg const& arg, context_type const& ctx ) const { return sprout::distance(ctx.begin(), ctx.end()) >= sprout::size(arg) && sprout::equal(sprout::begin(arg), sprout::end(arg), ctx.begin()) ? result_type( true, sprout::next(ctx.begin(), sprout::size(arg)), attribute_type(), context_type(ctx, sprout::next(ctx.begin(), sprout::size(arg))) ) : result_type(false, ctx.begin(), attribute_type(), ctx) ; } public: SPROUT_CONSTEXPR result_type operator()( Expr const& expr, context_type const& ctx ) const { return call(sprout::tuples::get<0>(expr.args()), ctx); } }; } // namespace weed } // namespace sprout #endif // #ifndef SPROUT_WEED_CONTEXT_PARSE_CONTEXT_TERMINAL_STRING_HPP