Sprout.Weed で test_parser

Boost.Spirit.Qi のドキュメントに載っている test_parser を Sprout.Weed でも書いてみました。
ただし、関数内で static_assert はできないので、結果の出力は実行時に行います。
コンパイル時にチェックを行いたい場合は、check_parser で static_assert を使用する必要があります。

[ソース]

#define SPROUT_CONFIG_SUPPORT_TEMPORARY_CONTAINER_ITERATION
#include <sprout/weed.hpp>
#include <sprout/string.hpp>
#include <iostream>


template<typename String, typename Parser>
constexpr bool
check_parser(String const& str, Parser&& parser){
    using sprout::weed::parse;
    return parse(str.begin(), str.end(), sprout::forward<Parser>(parser)).success();
}

template<typename Char, std::size_t N, typename Parser>
constexpr bool
check_parser(Char const(&str)[N], Parser&& parser){
    return check_parser(sprout::to_string(str), sprout::forward<Parser>(parser));
}


template<typename String, typename Parser>
void
test_parser(String&& str, Parser&& parser){
    namespace weed = sprout::weed;
    auto result = check_parser(sprout::forward<String>(str), sprout::forward<Parser>(parser));
    std::cout << (result ? "ok" : "fail") << std::endl;
}

template<typename Char, std::size_t N, typename Parser>
void
test_parser(Char const(&str)[N], Parser&& parser){
    test_parser(sprout::to_string(str), sprout::forward<Parser>(parser));
}


int
main(){
    namespace weed = sprout::weed;
    using weed::int_;

    // コンパイル時にチェック
    static_assert(check_parser("12", int_),                   "" );
    static_assert(check_parser("12:12", int_ >> ':' >> int_), "" );
    static_assert(check_parser("xxx", int_) == false,         "" );

    // 実行時にチェック
    auto str = sprout::to_string("12");
    test_parser(str, int_);
    test_parser(str, int_ >> ":" >> int_);
    
    return 0;
}

[出力]

ok
fail

これで Sprout.Weed のテストが捗りそう。

[コンパイラ]

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