#ifndef NUMBER_HPP_ #define NUMBER_HPP_ #include "terminal.hpp" #include "alt.hpp" #include "opt.hpp" #include "concat.hpp" typedef alt < terminal< '0' > , terminal< '1' > , terminal< '2' > , terminal< '3' > , terminal< '4' > , terminal< '5' > , terminal< '6' > , terminal< '7' > , terminal< '8' > , terminal< '9' > > digit_09; struct digit_get_val { typedef unsigned int result_type; constexpr unsigned int null() { return 10; } template< char C > constexpr unsigned int operator()( terminal< C > ) { return C - 48; } }; struct sequence_09 : concat < digit_09 , opt< sequence_09 > > { template< class ...ArgTypes > constexpr sequence_09( ArgTypes ...args ) : concat < digit_09 , opt< sequence_09 > >( args... ) { } constexpr unsigned int significance() { return get< 1 >() ? 10 * get< 1 >().get().significance() : 1; } constexpr unsigned int eval() { return get< 0 >().apply_visitor( digit_get_val() ) * significance() + ( get< 1 >() ? get< 1 >().get().eval() : 0 ); } }; typedef sequence_09 number; #endif