Mercurial > hg > vamp-build-and-test
diff DEPENDENCIES/generic/include/boost/spirit/home/classic/dynamic/select.hpp @ 16:2665513ce2d3
Add boost headers
author | Chris Cannam |
---|---|
date | Tue, 05 Aug 2014 11:11:38 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DEPENDENCIES/generic/include/boost/spirit/home/classic/dynamic/select.hpp Tue Aug 05 11:11:38 2014 +0100 @@ -0,0 +1,245 @@ +/*============================================================================= + Copyright (c) 2003 Hartmut Kaiser + http://spirit.sourceforge.net/ + + 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 BOOST_SPIRIT_SELECT_HPP +#define BOOST_SPIRIT_SELECT_HPP + +#include <boost/preprocessor/repeat.hpp> +#include <boost/preprocessor/enum.hpp> +#include <boost/preprocessor/enum_params.hpp> +#include <boost/preprocessor/enum_params_with_defaults.hpp> +#include <boost/preprocessor/inc.hpp> +#include <boost/preprocessor/cat.hpp> +#include <boost/preprocessor/facilities/intercept.hpp> + +#include <boost/spirit/home/classic/namespace.hpp> +#include <boost/spirit/home/classic/core/parser.hpp> + +#include <boost/spirit/home/classic/phoenix/tuples.hpp> + +/////////////////////////////////////////////////////////////////////////////// +// +// Spirit predefined maximum number of possible embedded select_p parsers. +// It should NOT be greater than PHOENIX_LIMIT! +// +/////////////////////////////////////////////////////////////////////////////// +#if !defined(BOOST_SPIRIT_SELECT_LIMIT) +#define BOOST_SPIRIT_SELECT_LIMIT PHOENIX_LIMIT +#endif // !defined(BOOST_SPIRIT_SELECT_LIMIT) + +/////////////////////////////////////////////////////////////////////////////// +// +// ensure BOOST_SPIRIT_SELECT_LIMIT <= PHOENIX_LIMIT and +// BOOST_SPIRIT_SELECT_LIMIT > 0 +// BOOST_SPIRIT_SELECT_LIMIT <= 15 +// +// [Pushed this down a little to make CW happy with BOOST_STATIC_ASSERT] +// [Otherwise, it complains: 'boost_static_assert_test_42' redefined] +// +/////////////////////////////////////////////////////////////////////////////// +BOOST_STATIC_ASSERT(BOOST_SPIRIT_SELECT_LIMIT <= PHOENIX_LIMIT); +BOOST_STATIC_ASSERT(BOOST_SPIRIT_SELECT_LIMIT > 0); +BOOST_STATIC_ASSERT(BOOST_SPIRIT_SELECT_LIMIT <= 15); + +/////////////////////////////////////////////////////////////////////////////// +// +// Calculate the required amount of tuple members rounded up to the nearest +// integer dividable by 3 +// +/////////////////////////////////////////////////////////////////////////////// +#if BOOST_SPIRIT_SELECT_LIMIT > 12 +#define BOOST_SPIRIT_SELECT_LIMIT_A 15 +#elif BOOST_SPIRIT_SELECT_LIMIT > 9 +#define BOOST_SPIRIT_SELECT_LIMIT_A 12 +#elif BOOST_SPIRIT_SELECT_LIMIT > 6 +#define BOOST_SPIRIT_SELECT_LIMIT_A 9 +#elif BOOST_SPIRIT_SELECT_LIMIT > 3 +#define BOOST_SPIRIT_SELECT_LIMIT_A 6 +#else +#define BOOST_SPIRIT_SELECT_LIMIT_A 3 +#endif + +/////////////////////////////////////////////////////////////////////////////// +namespace boost { namespace spirit { + +BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN + +/////////////////////////////////////////////////////////////////////////////// +// +// The select_default_no_fail and select_default_fail structs are used to +// distinguish two different behaviours for the select_parser in case that not +// any of the given sub-parsers match. +// +// If the select_parser is used with the select_default_no_fail behaviour, +// then in case of no matching sub-parser the whole select_parser returns an +// empty match and the value -1. +// +// If the select_parser is used with the select_default_fail behaviour, then +// in case of no matching sub-parser the whole select_parser fails to match at +// all. +// +/////////////////////////////////////////////////////////////////////////////// +struct select_default_no_fail {}; +struct select_default_fail {}; + +BOOST_SPIRIT_CLASSIC_NAMESPACE_END + +}} // namespace BOOST_SPIRIT_CLASSIC_NS + +/////////////////////////////////////////////////////////////////////////////// +#include <boost/spirit/home/classic/dynamic/impl/select.ipp> + +/////////////////////////////////////////////////////////////////////////////// +namespace boost { namespace spirit { + +BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN + +/////////////////////////////////////////////////////////////////////////////// +template <typename TupleT, typename BehaviourT, typename T> +struct select_parser +: public parser<select_parser<TupleT, BehaviourT, T> > +{ + typedef select_parser<TupleT, BehaviourT, T> self_t; + + select_parser(TupleT const &t_) + : t(t_) + {} + + template <typename ScannerT> + struct result + { + typedef typename match_result<ScannerT, T>::type type; + }; + + template <typename ScannerT> + typename parser_result<self_t, ScannerT>::type + parse(ScannerT const& scan) const + { + typedef typename parser_result<self_t, ScannerT>::type result_t; + + if (!scan.at_end()) { + return impl::parse_tuple_element< + TupleT::length, result_t, TupleT, BehaviourT>::do_(t, scan); + } + return impl::select_match_gen<result_t, BehaviourT>::do_(scan); + } + + TupleT const t; +}; + +/////////////////////////////////////////////////////////////////////////////// +template <typename BehaviourT, typename T = int> +struct select_parser_gen { + + /////////////////////////////////////////////////////////////////////////// + // + // This generates different select_parser_gen::operator()() functions with + // an increasing number of parser parameters: + // + // template <typename ParserT0, ...> + // select_parser< + // ::phoenix::tuple< + // typename impl::as_embedded_parser<ParserT0>::type, + // ... + // >, + // BehaviourT, + // T + // > + // operator()(ParserT0 const &p0, ...) const + // { + // typedef impl::as_embedded_parser<ParserT0> parser_t0; + // ... + // + // typedef ::phoenix::tuple< + // parser_t0::type, + // ... + // > tuple_t; + // typedef select_parser<tuple_t, BehaviourT, T> result_t; + // + // return result_t(tuple_t( + // parser_t0::convert(p0), + // ... + // )); + // } + // + // The number of generated functions depends on the maximum tuple member + // limit defined by the PHOENIX_LIMIT pp constant. + // + /////////////////////////////////////////////////////////////////////////// + #define BOOST_SPIRIT_SELECT_EMBEDDED(z, N, _) \ + typename impl::as_embedded_parser<BOOST_PP_CAT(ParserT, N)>::type \ + /**/ + #define BOOST_SPIRIT_SELECT_EMBEDDED_TYPEDEF(z, N, _) \ + typedef impl::as_embedded_parser<BOOST_PP_CAT(ParserT, N)> \ + BOOST_PP_CAT(parser_t, N); \ + /**/ + #define BOOST_SPIRIT_SELECT_CONVERT(z, N, _) \ + BOOST_PP_CAT(parser_t, N)::convert(BOOST_PP_CAT(p, N)) \ + /**/ + + #define BOOST_SPIRIT_SELECT_PARSER(z, N, _) \ + template < \ + BOOST_PP_ENUM_PARAMS_Z(z, BOOST_PP_INC(N), typename ParserT) \ + > \ + select_parser< \ + ::phoenix::tuple< \ + BOOST_PP_ENUM_ ## z(BOOST_PP_INC(N), \ + BOOST_SPIRIT_SELECT_EMBEDDED, _) \ + >, \ + BehaviourT, \ + T \ + > \ + operator()( \ + BOOST_PP_ENUM_BINARY_PARAMS_Z(z, BOOST_PP_INC(N), \ + ParserT, const &p) \ + ) const \ + { \ + BOOST_PP_REPEAT_ ## z(BOOST_PP_INC(N), \ + BOOST_SPIRIT_SELECT_EMBEDDED_TYPEDEF, _) \ + \ + typedef ::phoenix::tuple< \ + BOOST_PP_ENUM_BINARY_PARAMS_Z(z, BOOST_PP_INC(N), \ + typename parser_t, ::type BOOST_PP_INTERCEPT) \ + > tuple_t; \ + typedef select_parser<tuple_t, BehaviourT, T> result_t; \ + \ + return result_t(tuple_t( \ + BOOST_PP_ENUM_ ## z(BOOST_PP_INC(N), \ + BOOST_SPIRIT_SELECT_CONVERT, _) \ + )); \ + } \ + /**/ + + BOOST_PP_REPEAT(BOOST_SPIRIT_SELECT_LIMIT_A, + BOOST_SPIRIT_SELECT_PARSER, _) + + #undef BOOST_SPIRIT_SELECT_PARSER + #undef BOOST_SPIRIT_SELECT_CONVERT + #undef BOOST_SPIRIT_SELECT_EMBEDDED_TYPEDEF + #undef BOOST_SPIRIT_SELECT_EMBEDDED + /////////////////////////////////////////////////////////////////////////// +}; + +/////////////////////////////////////////////////////////////////////////////// +// +// Predefined parser generator helper objects +// +/////////////////////////////////////////////////////////////////////////////// +select_parser_gen<select_default_no_fail> const select_p = + select_parser_gen<select_default_no_fail>(); + +select_parser_gen<select_default_fail> const select_fail_p = + select_parser_gen<select_default_fail>(); + +#undef BOOST_SPIRIT_SELECT_LIMIT_A + +/////////////////////////////////////////////////////////////////////////////// +BOOST_SPIRIT_CLASSIC_NAMESPACE_END + +}} // namespace BOOST_SPIRIT_CLASSIC_NS + +#endif // BOOST_SPIRIT_SELECT_HPP