Mercurial > hg > vamp-build-and-test
diff DEPENDENCIES/generic/include/boost/spirit/home/classic/meta/impl/fundamental.ipp @ 16:2665513ce2d3
Add boost headers
author | Chris Cannam |
---|---|
date | Tue, 05 Aug 2014 11:11:38 +0100 |
parents | |
children | c530137014c0 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DEPENDENCIES/generic/include/boost/spirit/home/classic/meta/impl/fundamental.ipp Tue Aug 05 11:11:38 2014 +0100 @@ -0,0 +1,309 @@ +/*============================================================================= + Copyright (c) 2002-2003 Hartmut Kaiser + 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_FUNDAMENTAL_IPP) +#define BOOST_SPIRIT_FUNDAMENTAL_IPP + +#include <boost/mpl/int.hpp> + +namespace boost { namespace spirit { + +BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN + +#if defined(BOOST_MSVC) && (BOOST_MSVC <= 1300) + BOOST_SPIRIT_DEPENDENT_TEMPLATE_WRAPPER2(count_wrapper, count); +#endif // defined(BOOST_MSVC) && (BOOST_MSVC <= 1300) + +namespace impl +{ + /////////////////////////////////////////////////////////////////////////// + // + // Helper template for counting the number of nodes contained in a + // given parser type. + // All parser_category type parsers are counted as nodes. + // + /////////////////////////////////////////////////////////////////////////// + template <typename CategoryT> + struct nodes; + + template <> + struct nodes<plain_parser_category> { + + template <typename ParserT, typename LeafCountT> + struct count { + + // __BORLANDC__ == 0x0561 isn't happy with BOOST_STATIC_CONSTANT + enum { value = (LeafCountT::value + 1) }; + }; + }; + +#if defined(BOOST_MSVC) && (BOOST_MSVC <= 1300) + + template <> + struct nodes<unary_parser_category> { + + template <typename ParserT, typename LeafCountT> + struct count { + + typedef typename ParserT::subject_t subject_t; + typedef typename subject_t::parser_category_t subject_category_t; + + typedef nodes<subject_category_t> nodes_t; + typedef typename count_wrapper<nodes_t> + ::template result_<subject_t, LeafCountT> count_t; + + BOOST_STATIC_CONSTANT(int, value = count_t::value + 1); + }; + }; + + template <> + struct nodes<action_parser_category> { + + template <typename ParserT, typename LeafCountT> + struct count { + + typedef typename ParserT::subject_t subject_t; + typedef typename subject_t::parser_category_t subject_category_t; + + typedef nodes<subject_category_t> nodes_t; + typedef typename count_wrapper<nodes_t> + ::template result_<subject_t, LeafCountT> count_t; + + BOOST_STATIC_CONSTANT(int, value = count_t::value + 1); + }; + }; + + template <> + struct nodes<binary_parser_category> { + + template <typename ParserT, typename LeafCountT> + struct count { + + typedef typename ParserT::left_t left_t; + typedef typename ParserT::right_t right_t; + typedef typename left_t::parser_category_t left_category_t; + typedef typename right_t::parser_category_t right_category_t; + + typedef nodes<left_category_t> left_nodes_t; + typedef typename count_wrapper<left_nodes_t> + ::template result_<left_t, LeafCountT> left_count_t; + + typedef nodes<right_category_t> right_nodes_t; + typedef typename count_wrapper<right_nodes_t> + ::template result_<right_t, LeafCountT> right_count_t; + + BOOST_STATIC_CONSTANT(int, + value = (left_count_t::value + right_count_t::value + 1)); + }; + }; + +#else + + template <> + struct nodes<unary_parser_category> { + + template <typename ParserT, typename LeafCountT> + struct count { + + typedef typename ParserT::subject_t subject_t; + typedef typename subject_t::parser_category_t subject_category_t; + + // __BORLANDC__ == 0x0561 isn't happy with BOOST_STATIC_CONSTANT + enum { value = (nodes<subject_category_t> + ::template count<subject_t, LeafCountT>::value + 1) }; + }; + }; + + template <> + struct nodes<action_parser_category> { + + template <typename ParserT, typename LeafCountT> + struct count { + + typedef typename ParserT::subject_t subject_t; + typedef typename subject_t::parser_category_t subject_category_t; + + // __BORLANDC__ == 0x0561 isn't happy with BOOST_STATIC_CONSTANT + enum { value = (nodes<subject_category_t> + ::template count<subject_t, LeafCountT>::value + 1) }; + }; + }; + + template <> + struct nodes<binary_parser_category> { + + template <typename ParserT, typename LeafCountT> + struct count { + + typedef typename ParserT::left_t left_t; + typedef typename ParserT::right_t right_t; + typedef typename left_t::parser_category_t left_category_t; + typedef typename right_t::parser_category_t right_category_t; + + typedef count self_t; + + // __BORLANDC__ == 0x0561 isn't happy with BOOST_STATIC_CONSTANT + enum { + leftcount = (nodes<left_category_t> + ::template count<left_t, LeafCountT>::value), + rightcount = (nodes<right_category_t> + ::template count<right_t, LeafCountT>::value), + value = ((self_t::leftcount) + (self_t::rightcount) + 1) + }; + }; + }; + +#endif + + /////////////////////////////////////////////////////////////////////////// + // + // Helper template for counting the number of leaf nodes contained in a + // given parser type. + // Only plain_parser_category type parsers are counted as leaf nodes. + // + /////////////////////////////////////////////////////////////////////////// + template <typename CategoryT> + struct leafs; + + template <> + struct leafs<plain_parser_category> { + + template <typename ParserT, typename LeafCountT> + struct count { + + // __BORLANDC__ == 0x0561 isn't happy with BOOST_STATIC_CONSTANT + enum { value = (LeafCountT::value + 1) }; + }; + }; + +#if defined(BOOST_MSVC) && (BOOST_MSVC <= 1300) + + template <> + struct leafs<unary_parser_category> { + + template <typename ParserT, typename LeafCountT> + struct count { + + typedef typename ParserT::subject_t subject_t; + typedef typename subject_t::parser_category_t subject_category_t; + + typedef leafs<subject_category_t> nodes_t; + typedef typename count_wrapper<nodes_t> + ::template result_<subject_t, LeafCountT> count_t; + + BOOST_STATIC_CONSTANT(int, value = count_t::value); + }; + }; + + template <> + struct leafs<action_parser_category> { + + template <typename ParserT, typename LeafCountT> + struct count { + + typedef typename ParserT::subject_t subject_t; + typedef typename subject_t::parser_category_t subject_category_t; + + typedef leafs<subject_category_t> nodes_t; + typedef typename count_wrapper<nodes_t> + ::template result_<subject_t, LeafCountT> count_t; + + BOOST_STATIC_CONSTANT(int, value = count_t::value); + }; + }; + + template <> + struct leafs<binary_parser_category> { + + template <typename ParserT, typename LeafCountT> + struct count { + + typedef typename ParserT::left_t left_t; + typedef typename ParserT::right_t right_t; + typedef typename left_t::parser_category_t left_category_t; + typedef typename right_t::parser_category_t right_category_t; + + typedef leafs<left_category_t> left_nodes_t; + typedef typename count_wrapper<left_nodes_t> + ::template result_<left_t, LeafCountT> left_count_t; + + typedef leafs<right_category_t> right_nodes_t; + typedef typename count_wrapper<right_nodes_t> + ::template result_<right_t, LeafCountT> right_count_t; + + BOOST_STATIC_CONSTANT(int, + value = (left_count_t::value + right_count_t::value)); + }; + }; + +#else + + template <> + struct leafs<unary_parser_category> { + + template <typename ParserT, typename LeafCountT> + struct count { + + typedef typename ParserT::subject_t subject_t; + typedef typename subject_t::parser_category_t subject_category_t; + + // __BORLANDC__ == 0x0561 isn't happy with BOOST_STATIC_CONSTANT + enum { value = (leafs<subject_category_t> + ::template count<subject_t, LeafCountT>::value) }; + }; + }; + + template <> + struct leafs<action_parser_category> { + + template <typename ParserT, typename LeafCountT> + struct count { + + typedef typename ParserT::subject_t subject_t; + typedef typename subject_t::parser_category_t subject_category_t; + + // __BORLANDC__ == 0x0561 isn't happy with BOOST_STATIC_CONSTANT + enum { value = (leafs<subject_category_t> + ::template count<subject_t, LeafCountT>::value) }; + }; + }; + + template <> + struct leafs<binary_parser_category> { + + template <typename ParserT, typename LeafCountT> + struct count { + + typedef typename ParserT::left_t left_t; + typedef typename ParserT::right_t right_t; + typedef typename left_t::parser_category_t left_category_t; + typedef typename right_t::parser_category_t right_category_t; + + typedef count self_t; + + // __BORLANDC__ == 0x0561 isn't happy with BOOST_STATIC_CONSTANT + enum { + leftcount = (leafs<left_category_t> + ::template count<left_t, LeafCountT>::value), + rightcount = (leafs<right_category_t> + ::template count<right_t, LeafCountT>::value), + value = (self_t::leftcount + self_t::rightcount) + }; + }; + }; + +#endif + +} // namespace impl + +/////////////////////////////////////////////////////////////////////////////// +BOOST_SPIRIT_CLASSIC_NAMESPACE_END + +}} // namespace boost::spirit + +#endif // !defined(BOOST_SPIRIT_FUNDAMENTAL_IPP)