annotate DEPENDENCIES/generic/include/boost/spirit/home/classic/dynamic/impl/conditions.ipp @ 93:99f91ceb1aa9

Add Dockerfile for assembling a build image
author Chris Cannam
date Tue, 14 Apr 2015 17:16:34 +0100
parents 2665513ce2d3
children c530137014c0
rev   line source
Chris@16 1 /*=============================================================================
Chris@16 2 Copyright (c) 2002-2003 Martin Wille
Chris@16 3 http://spirit.sourceforge.net/
Chris@16 4
Chris@16 5 Use, modification and distribution is subject to the Boost Software
Chris@16 6 License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
Chris@16 7 http://www.boost.org/LICENSE_1_0.txt)
Chris@16 8 =============================================================================*/
Chris@16 9 #ifndef BOOST_SPIRIT_CONDITIONS_IPP
Chris@16 10 #define BOOST_SPIRIT_CONDITIONS_IPP
Chris@16 11
Chris@16 12 ///////////////////////////////////////////////////////////////////////////////
Chris@16 13 #include <boost/spirit/home/classic/meta/parser_traits.hpp>
Chris@16 14 #include <boost/spirit/home/classic/core/composite/epsilon.hpp>
Chris@16 15
Chris@16 16 ///////////////////////////////////////////////////////////////////////////////
Chris@16 17 namespace boost { namespace spirit {
Chris@16 18
Chris@16 19 BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN
Chris@16 20
Chris@16 21 namespace impl {
Chris@16 22
Chris@16 23 ///////////////////////////////////////////////////////////////////////////////
Chris@16 24 //
Chris@16 25 // condition evaluation
Chris@16 26 //
Chris@16 27 ///////////////////////////////////////////////////////////////////////////////
Chris@16 28 //////////////////////////////////
Chris@16 29 // condition_parser_selector, decides which parser to use for a condition
Chris@16 30 // If the template argument is a parser then that parser is used.
Chris@16 31 // If the template argument is a functor then a condition parser using
Chris@16 32 // the functor is chosen
Chris@16 33
Chris@16 34 template <typename T> struct embed_t_accessor
Chris@16 35 {
Chris@16 36 typedef typename T::embed_t type;
Chris@16 37 };
Chris@16 38
Chris@16 39 #if defined(BOOST_MSVC) && BOOST_MSVC <= 1300
Chris@16 40 template <> struct embed_t_accessor<int>
Chris@16 41 {
Chris@16 42 typedef int type;
Chris@16 43 };
Chris@16 44 #endif
Chris@16 45
Chris@16 46 template <typename ConditionT>
Chris@16 47 struct condition_parser_selector
Chris@16 48 {
Chris@16 49 typedef
Chris@16 50 typename mpl::if_<
Chris@16 51 is_parser<ConditionT>,
Chris@16 52 ConditionT,
Chris@16 53 condition_parser<ConditionT>
Chris@16 54 >::type
Chris@16 55 type;
Chris@16 56
Chris@16 57 typedef typename embed_t_accessor<type>::type embed_t;
Chris@16 58 };
Chris@16 59
Chris@16 60 //////////////////////////////////
Chris@16 61 // condition_evaluator, uses a parser to check wether a condition is met
Chris@16 62 // takes a parser or a functor that can be evaluated in boolean context
Chris@16 63 // as template parameter.
Chris@16 64
Chris@16 65 // JDG 4-15-03 refactored
Chris@16 66 template <typename ConditionT>
Chris@16 67 struct condition_evaluator
Chris@16 68 {
Chris@16 69 typedef condition_parser_selector<ConditionT> selector_t;
Chris@16 70 typedef typename selector_t::type selected_t;
Chris@16 71 typedef typename selector_t::embed_t cond_embed_t;
Chris@16 72
Chris@16 73 typedef typename boost::call_traits<cond_embed_t>::param_type
Chris@16 74 param_t;
Chris@16 75
Chris@16 76 condition_evaluator(param_t s) : cond(s) {}
Chris@16 77
Chris@16 78 /////////////////////////////
Chris@16 79 // evaluate, checks wether condition is met
Chris@16 80 // returns length of a match or a negative number for no-match
Chris@16 81 template <typename ScannerT>
Chris@16 82 std::ptrdiff_t
Chris@16 83 evaluate(ScannerT const &scan) const
Chris@16 84 {
Chris@16 85 typedef typename ScannerT::iterator_t iterator_t;
Chris@16 86 typedef typename parser_result<selected_t, ScannerT>::type cres_t;
Chris@16 87 iterator_t save(scan.first);
Chris@16 88 cres_t result = cond.parse(scan);
Chris@16 89 if (!result) // reset the position if evaluation
Chris@16 90 scan.first = save; // fails.
Chris@16 91 return result.length();
Chris@16 92 }
Chris@16 93
Chris@16 94 cond_embed_t cond;
Chris@16 95 };
Chris@16 96
Chris@16 97 ///////////////////////////////////////////////////////////////////////////////
Chris@16 98 } // namespace impl
Chris@16 99
Chris@16 100 BOOST_SPIRIT_CLASSIC_NAMESPACE_END
Chris@16 101
Chris@16 102 }} // namespace boost::spirit
Chris@16 103
Chris@16 104 #endif