Chris@16: /*============================================================================= Chris@16: Copyright (c) 2002-2003 Hartmut Kaiser Chris@16: http://spirit.sourceforge.net/ Chris@16: Chris@16: Use, modification and distribution is subject to the Boost Software Chris@16: License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at Chris@16: http://www.boost.org/LICENSE_1_0.txt) Chris@16: =============================================================================*/ Chris@16: #if !defined(BOOST_SPIRIT_FUNDAMENTAL_IPP) Chris@16: #define BOOST_SPIRIT_FUNDAMENTAL_IPP Chris@16: Chris@16: #include Chris@16: Chris@16: namespace boost { namespace spirit { Chris@16: Chris@16: BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN Chris@16: Chris@16: namespace impl Chris@16: { Chris@16: /////////////////////////////////////////////////////////////////////////// Chris@16: // Chris@16: // Helper template for counting the number of nodes contained in a Chris@16: // given parser type. Chris@16: // All parser_category type parsers are counted as nodes. Chris@16: // Chris@16: /////////////////////////////////////////////////////////////////////////// Chris@16: template Chris@16: struct nodes; Chris@16: Chris@16: template <> Chris@16: struct nodes { Chris@16: Chris@16: template Chris@16: struct count { Chris@16: Chris@16: // __BORLANDC__ == 0x0561 isn't happy with BOOST_STATIC_CONSTANT Chris@16: enum { value = (LeafCountT::value + 1) }; Chris@16: }; Chris@16: }; Chris@16: Chris@16: template <> Chris@16: struct nodes { Chris@16: Chris@16: template Chris@16: struct count { Chris@16: Chris@16: typedef typename ParserT::subject_t subject_t; Chris@16: typedef typename subject_t::parser_category_t subject_category_t; Chris@16: Chris@16: // __BORLANDC__ == 0x0561 isn't happy with BOOST_STATIC_CONSTANT Chris@16: enum { value = (nodes Chris@16: ::template count::value + 1) }; Chris@16: }; Chris@16: }; Chris@16: Chris@16: template <> Chris@16: struct nodes { Chris@16: Chris@16: template Chris@16: struct count { Chris@16: Chris@16: typedef typename ParserT::subject_t subject_t; Chris@16: typedef typename subject_t::parser_category_t subject_category_t; Chris@16: Chris@16: // __BORLANDC__ == 0x0561 isn't happy with BOOST_STATIC_CONSTANT Chris@16: enum { value = (nodes Chris@16: ::template count::value + 1) }; Chris@16: }; Chris@16: }; Chris@16: Chris@16: template <> Chris@16: struct nodes { Chris@16: Chris@16: template Chris@16: struct count { Chris@16: Chris@16: typedef typename ParserT::left_t left_t; Chris@16: typedef typename ParserT::right_t right_t; Chris@16: typedef typename left_t::parser_category_t left_category_t; Chris@16: typedef typename right_t::parser_category_t right_category_t; Chris@16: Chris@16: typedef count self_t; Chris@16: Chris@16: // __BORLANDC__ == 0x0561 isn't happy with BOOST_STATIC_CONSTANT Chris@16: enum { Chris@16: leftcount = (nodes Chris@16: ::template count::value), Chris@16: rightcount = (nodes Chris@16: ::template count::value), Chris@16: value = ((self_t::leftcount) + (self_t::rightcount) + 1) Chris@16: }; Chris@16: }; Chris@16: }; Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////// Chris@16: // Chris@16: // Helper template for counting the number of leaf nodes contained in a Chris@16: // given parser type. Chris@16: // Only plain_parser_category type parsers are counted as leaf nodes. Chris@16: // Chris@16: /////////////////////////////////////////////////////////////////////////// Chris@16: template Chris@16: struct leafs; Chris@16: Chris@16: template <> Chris@16: struct leafs { Chris@16: Chris@16: template Chris@16: struct count { Chris@16: Chris@16: // __BORLANDC__ == 0x0561 isn't happy with BOOST_STATIC_CONSTANT Chris@16: enum { value = (LeafCountT::value + 1) }; Chris@16: }; Chris@16: }; Chris@16: Chris@16: template <> Chris@16: struct leafs { Chris@16: Chris@16: template Chris@16: struct count { Chris@16: Chris@16: typedef typename ParserT::subject_t subject_t; Chris@16: typedef typename subject_t::parser_category_t subject_category_t; Chris@16: Chris@16: // __BORLANDC__ == 0x0561 isn't happy with BOOST_STATIC_CONSTANT Chris@16: enum { value = (leafs Chris@16: ::template count::value) }; Chris@16: }; Chris@16: }; Chris@16: Chris@16: template <> Chris@16: struct leafs { Chris@16: Chris@16: template Chris@16: struct count { Chris@16: Chris@16: typedef typename ParserT::subject_t subject_t; Chris@16: typedef typename subject_t::parser_category_t subject_category_t; Chris@16: Chris@16: // __BORLANDC__ == 0x0561 isn't happy with BOOST_STATIC_CONSTANT Chris@16: enum { value = (leafs Chris@16: ::template count::value) }; Chris@16: }; Chris@16: }; Chris@16: Chris@16: template <> Chris@16: struct leafs { Chris@16: Chris@16: template Chris@16: struct count { Chris@16: Chris@16: typedef typename ParserT::left_t left_t; Chris@16: typedef typename ParserT::right_t right_t; Chris@16: typedef typename left_t::parser_category_t left_category_t; Chris@16: typedef typename right_t::parser_category_t right_category_t; Chris@16: Chris@16: typedef count self_t; Chris@16: Chris@16: // __BORLANDC__ == 0x0561 isn't happy with BOOST_STATIC_CONSTANT Chris@16: enum { Chris@16: leftcount = (leafs Chris@16: ::template count::value), Chris@16: rightcount = (leafs Chris@16: ::template count::value), Chris@16: value = (self_t::leftcount + self_t::rightcount) Chris@16: }; Chris@16: }; Chris@16: }; Chris@16: Chris@16: } // namespace impl Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: BOOST_SPIRIT_CLASSIC_NAMESPACE_END Chris@16: Chris@16: }} // namespace boost::spirit Chris@16: Chris@16: #endif // !defined(BOOST_SPIRIT_FUNDAMENTAL_IPP)