Sprout.Weed で符号なし10進数のパーサ
Sprout.Weed では以下の符号付き10進数のパーサが用意されています。
Expression | Attribute |
---|---|
uint_ | std::uintmax_t |
uint8 | std::uint8_t |
uint16 | std::uint16_t |
uint32 | std::uint32_t |
uint64 | std::uint64_t |
[ソース]
#define SPROUT_CONFIG_SUPPORT_TEMPORARY_CONTAINER_ITERATION #include <sprout/weed.hpp> template<typename Parsed> struct parsed_holder{ constexpr operator bool() const{ return parsed.success(); } template<typename T> constexpr bool operator ==(T&& t) const{ return parsed.attr() == t; } Parsed parsed; }; template<typename Char, std::size_t N, typename Parser> constexpr auto parse(Char const(&str)[N], Parser&& parser) ->parsed_holder<decltype( sprout::weed::parse(str, str+N-1, sprout::forward<Parser>(parser)) )>{ return { sprout::weed::parse(str, str+N-1, sprout::forward<Parser>(parser)) }; } int main(){ namespace w = sprout::weed; static_assert( parse( "123", w::uint_), ""); static_assert(!parse("+123", w::uint_), ""); static_assert(!parse("-123", w::uint_), ""); static_assert( parse( "123", w::uint_) == std::uintmax_t{123}, ""); static_assert( parse( "123", w::uint16), ""); static_assert(!parse("+123", w::uint8), ""); static_assert(!parse("-123", w::uint8), ""); static_assert( parse( "123", w::uint8) == std::uint8_t{123}, ""); static_assert( parse( "123", w::uint16), ""); static_assert(!parse("+123", w::uint16), ""); static_assert(!parse("-123", w::uint16), ""); static_assert( parse( "123", w::uint16) == std::uint16_t{123}, ""); static_assert( parse( "123", w::uint32), ""); static_assert(!parse("+123", w::uint32), ""); static_assert(!parse("-123", w::uint32), ""); static_assert( parse( "123", w::uint32) == std::uint32_t{123}, ""); static_assert( parse( "123", w::uint64), ""); static_assert(!parse("+123", w::uint64), ""); static_assert(!parse("-123", w::uint64), ""); static_assert( parse( "123", w::uint64) == std::uint64_t{123}, ""); return 0; }
こちらも weed::int_ と同様に Boost.Spirit.Qi の uint_ と型が違います。
"+" 付きだとパースに失敗するので注意して下さい。