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 のテストが捗りそう。