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 です。

[コンパイラ]

  • g++ (GCC) 4.7.0 20111210 (experimental)