diff -r 000000000000 -r bde4ae8d615e os/ossrv/ossrv_pub/boost_apis/boost/spirit/utility/loops.hpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/os/ossrv/ossrv_pub/boost_apis/boost/spirit/utility/loops.hpp Fri Jun 15 03:10:57 2012 +0200 @@ -0,0 +1,313 @@ +/*============================================================================= + Copyright (c) 1998-2003 Joel de Guzman + Copyright (c) 2002 Raghavendra Satish + Copyright (c) 2002 Jeff Westfahl + 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) +=============================================================================*/ +#if !defined(BOOST_SPIRIT_LOOPS_HPP) +#define BOOST_SPIRIT_LOOPS_HPP + +/////////////////////////////////////////////////////////////////////////////// +#include +#include + +/////////////////////////////////////////////////////////////////////////////// +namespace boost { namespace spirit { + + /////////////////////////////////////////////////////////////////////////// + // + // fixed_loop class + // + // This class takes care of the construct: + // + // repeat_p (exact) [p] + // + // where 'p' is a parser and 'exact' is the number of times to + // repeat. The parser iterates over the input exactly 'exact' times. + // The parse function fails if the parser does not match the input + // exactly 'exact' times. + // + // This class is parametizable and can accept constant arguments + // (e.g. repeat_p (5) [p]) as well as references to variables (e.g. + // repeat_p (ref (n)) [p]). + // + /////////////////////////////////////////////////////////////////////////// + template + class fixed_loop + : public unary > > + { + public: + + typedef fixed_loop self_t; + typedef unary > base_t; + + fixed_loop (ParserT const & subject, ExactT const & exact) + : base_t(subject), m_exact(exact) {} + + template + typename parser_result ::type + parse (ScannerT const & scan) const + { + typedef typename parser_result::type result_t; + result_t hit = scan.empty_match(); + std::size_t n = m_exact; + + for (std::size_t i = 0; i < n; ++i) + { + if (result_t next = this->subject().parse(scan)) + { + scan.concat_match(hit, next); + } + else + { + return scan.no_match(); + } + } + + return hit; + } + + template + struct result + { + typedef typename match_result::type type; + }; + + private: + + ExactT m_exact; + }; + + /////////////////////////////////////////////////////////////////////////////// + // + // finite_loop class + // + // This class takes care of the construct: + // + // repeat_p (min, max) [p] + // + // where 'p' is a parser, 'min' and 'max' specifies the minimum and + // maximum iterations over 'p'. The parser iterates over the input + // at least 'min' times and at most 'max' times. The parse function + // fails if the parser does not match the input at least 'min' times + // and at most 'max' times. + // + // This class is parametizable and can accept constant arguments + // (e.g. repeat_p (5, 10) [p]) as well as references to variables + // (e.g. repeat_p (ref (n1), ref (n2)) [p]). + // + /////////////////////////////////////////////////////////////////////////////// + template + class finite_loop + : public unary > > + { + public: + + typedef finite_loop self_t; + typedef unary > base_t; + + finite_loop (ParserT const & subject, MinT const & min, MaxT const & max) + : base_t(subject), m_min(min), m_max(max) {} + + template + typename parser_result ::type + parse(ScannerT const & scan) const + { + BOOST_SPIRIT_ASSERT(m_min <= m_max); + typedef typename parser_result::type result_t; + result_t hit = scan.empty_match(); + + std::size_t n1 = m_min; + std::size_t n2 = m_max; + + for (std::size_t i = 0; i < n2; ++i) + { + typename ScannerT::iterator_t save = scan.first; + result_t next = this->subject().parse(scan); + + if (!next) + { + if (i >= n1) + { + scan.first = save; + break; + } + else + { + return scan.no_match(); + } + } + + scan.concat_match(hit, next); + } + + return hit; + } + + template + struct result + { + typedef typename match_result::type type; + }; + + private: + + MinT m_min; + MaxT m_max; + }; + + /////////////////////////////////////////////////////////////////////////////// + // + // infinite_loop class + // + // This class takes care of the construct: + // + // repeat_p (min, more) [p] + // + // where 'p' is a parser, 'min' is the minimum iteration over 'p' + // and more specifies that the iteration should proceed + // indefinitely. The parser iterates over the input at least 'min' + // times and continues indefinitely until 'p' fails or all of the + // input is parsed. The parse function fails if the parser does not + // match the input at least 'min' times. + // + // This class is parametizable and can accept constant arguments + // (e.g. repeat_p (5, more) [p]) as well as references to variables + // (e.g. repeat_p (ref (n), more) [p]). + // + /////////////////////////////////////////////////////////////////////////////// + + struct more_t {}; + more_t const more = more_t (); + + template + class infinite_loop + : public unary > > + { + public: + + typedef infinite_loop self_t; + typedef unary > base_t; + + infinite_loop ( + ParserT const& subject, + MinT const& min, + more_t const& + ) + : base_t(subject), m_min(min) {} + + template + typename parser_result ::type + parse(ScannerT const & scan) const + { + typedef typename parser_result::type result_t; + result_t hit = scan.empty_match(); + std::size_t n = m_min; + + for (std::size_t i = 0; ; ++i) + { + typename ScannerT::iterator_t save = scan.first; + result_t next = this->subject().parse(scan); + + if (!next) + { + if (i >= n) + { + scan.first = save; + break; + } + else + { + return scan.no_match(); + } + } + + scan.concat_match(hit, next); + } + + return hit; + } + + template + struct result + { + typedef typename match_result::type type; + }; + + private: + + MinT m_min; + }; + + template + struct fixed_loop_gen + { + fixed_loop_gen (ExactT const & exact) + : m_exact (exact) {} + + template + fixed_loop + operator[](parser const & subject) const + { + return fixed_loop (subject.derived (), m_exact); + } + + ExactT m_exact; + }; + + namespace impl { + + template + struct loop_traits + { + typedef typename mpl::if_< + boost::is_same, + infinite_loop, + finite_loop + >::type type; + }; + + } // namespace impl + + template + struct nonfixed_loop_gen + { + nonfixed_loop_gen (MinT min, MaxT max) + : m_min (min), m_max (max) {} + + template + typename impl::loop_traits::type + operator[](parser const & subject) const + { + typedef typename impl::loop_traits::type ret_t; + return ret_t( + subject.derived(), + m_min, + m_max); + } + + MinT m_min; + MaxT m_max; + }; + + template + fixed_loop_gen + repeat_p(ExactT const & exact) + { + return fixed_loop_gen (exact); + } + + template + nonfixed_loop_gen + repeat_p(MinT const & min, MaxT const & max) + { + return nonfixed_loop_gen (min, max); + } + +}} // namespace boost::spirit + +#endif // #if !defined(BOOST_SPIRIT_LOOPS_HPP)