#ifndef SPROUT_WEED_PARSER_NUMERIC_UINT_P_HPP #define SPROUT_WEED_PARSER_NUMERIC_UINT_P_HPP #include #include #include #include #include #include #include #include #include namespace sprout { namespace weed { // // uint_p // template< typename IntType, std::size_t Radix, std::size_t MinDigits = 1, std::size_t MaxDigits = sprout::integer_digits::value > struct uint_p : public sprout::weed::parser_base { public: template struct attribute { public: typedef IntType type; }; template struct result { public: typedef sprout::weed::parser_result::type> type; }; private: template SPROUT_CONSTEXPR typename std::enable_if< N == MaxDigits, typename result::type >::type call_1( Iterator first, Iterator last, Iterator temp_first, IntType t, PResult const& res ) const { typedef typename result::type result_type; typedef typename attribute::type attribute_type; return sprout::tuples::get<1>(res) ? result_type( true, sprout::next(first), static_cast(t * Radix | sprout::tuples::get<0>(res)) ) : N < MinDigits ? result_type(false, temp_first, attribute_type()) : result_type(true, first, t) ; } template SPROUT_CONSTEXPR typename std::enable_if< N != MaxDigits, typename result::type >::type call_1( Iterator first, Iterator last, Iterator temp_first, IntType t, PResult const& res ) const { typedef typename result::type result_type; typedef typename attribute::type attribute_type; return sprout::tuples::get<1>(res) ? call_0( sprout::next(first), last, temp_first, static_cast(t * Radix | sprout::tuples::get<0>(res)) ) : N < MinDigits ? result_type(false, temp_first, attribute_type()) : result_type(true, first, t) ; } template SPROUT_CONSTEXPR typename result::type call_0( Iterator first, Iterator last, Iterator temp_first, IntType t ) const { typedef typename result::type result_type; typedef typename attribute::type attribute_type; return first != last ? call_1( first, last, temp_first, t, sprout::weed::detail::from_ndigit(*first) ) : N < MinDigits ? result_type(false, temp_first, attribute_type()) : result_type(true, first, t) ; } template SPROUT_CONSTEXPR typename result::type call( Iterator first, Iterator last, Iterator temp_first, PResult const& res ) const { typedef typename result::type result_type; typedef typename attribute::type attribute_type; return sprout::tuples::get<1>(res) ? call_0<1, Context>( sprout::next(first), last, temp_first, sprout::tuples::get<0>(res) ) : result_type(false, temp_first, attribute_type()) ; } public: template SPROUT_CONSTEXPR typename result::type operator()( Iterator first, Iterator last, Context const& ) const { typedef typename result::type result_type; typedef typename attribute::type attribute_type; return first != last ? call( first, last, first, sprout::weed::detail::from_ndigit(*first) ) : result_type(false, first, attribute_type()) ; } }; } // namespace weed } // namespace sprout #endif // #ifndef SPROUT_WEED_PARSER_NUMERIC_UINT_P_HPP