Sprout.Weed で符号付き10進数のパーサ
Sprout.Weed では以下の符号付き10進数のパーサが用意されています。
Expression | Attribute |
---|---|
int_ | std::intmax_t |
int8 | std::int8_t |
int16 | std::int16_t |
int32 | std::int32_t |
int64 | std::int64_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::int_), ""); static_assert(parse("+123", w::int_), ""); static_assert(parse("-123", w::int_), ""); static_assert(parse( "123", w::int_) == std::intmax_t{ 123}, ""); static_assert(parse("+123", w::int_) == std::intmax_t{ 123}, ""); static_assert(parse("-123", w::int_) == std::intmax_t{-123}, ""); static_assert(parse("+123", w::int8), ""); static_assert(parse("-123", w::int8), ""); static_assert(parse( "123", w::int8) == std::int8_t{ 123}, ""); static_assert(parse("+123", w::int8) == std::int8_t{ 123}, ""); static_assert(parse("-123", w::int8) == std::int8_t{-123}, ""); static_assert(parse( "123", w::int16), ""); static_assert(parse("+123", w::int16), ""); static_assert(parse("-123", w::int16), ""); static_assert(parse( "123", w::int16) == std::int16_t{ 123}, ""); static_assert(parse("+123", w::int16) == std::int16_t{ 123}, ""); static_assert(parse("-123", w::int16) == std::int16_t{-123}, ""); static_assert(parse( "123", w::int32), ""); static_assert(parse("+123", w::int32), ""); static_assert(parse("-123", w::int32), ""); static_assert(parse( "123", w::int32) == std::int32_t{ 123}, ""); static_assert(parse("+123", w::int32) == std::int32_t{ 123}, ""); static_assert(parse("-123", w::int32) == std::int32_t{-123}, ""); static_assert(parse( "123", w::int64), ""); static_assert(parse("+123", w::int64), ""); static_assert(parse("-123", w::int64), ""); static_assert(parse( "123", w::int64) == std::int64_t{ 123}, ""); static_assert(parse("+123", w::int64) == std::int64_t{ 123}, ""); static_assert(parse("-123", w::int64) == std::int64_t{-123}, ""); return 0; }
厳密なチェックは行なっていませんがだいたいこんな感じですかね。
あと Sprout.Weed の int_ と Boost.Spirit.Qi の int_ では Attribute が違うので注意して下さい。
Sprout.Weed では std::intmax_t、Boost.Spirit.Qi の int_ は int です。