Sprout.Weed の lim に渡す category の違い
以前もチラッと書いたのですが、もうちょっと分かりやすい違いをコードで書いてみました。
知っておいて損はないかな?
[ソース]
#define SPROUT_CONFIG_SUPPORT_TEMPORARY_CONTAINER_ITERATION #include <sprout/weed.hpp> template<typename Parsed> struct parsed_holder{ constexpr operator bool() const{ return parsed.success(); } constexpr decltype(std::declval<Parsed>().current()) current(){ return parsed.current(); } 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; using sprout::to_string; using w::limited; //-------------------------------------------------------- // 2文字のアルファベットを読み込む static constexpr auto item = w::alpha; // 最初に一致した値を返して、一致しなくなるまで読み込む static_assert(parse("homu14", *w::lim<2>(item, limited::discard)) == "ho", ""); static_assert(parse("homu14", *w::lim<2>(item, limited::discard)).current() == to_string("14"), ""); // 最後に一致した値を返して、一致しなくなるまで読み込む static_assert(parse("homu14", *w::lim<2>(item, limited::circular)) == "mu", ""); static_assert(parse("homu14", *w::lim<2>(item, limited::circular)).current() == to_string("14"), ""); // 最初に一致した値を返して、その時点で読み込みを止める static_assert(parse("homu14", *w::lim<2>(item, limited::stopover)) == "ho", ""); static_assert(parse("homu14", *w::lim<2>(item, limited::stopover)).current() == to_string("mu14"), ""); // 指定しない場合は、limited::discard が使用される static_assert(parse("homu14", *w::lim<2>(item)) == "ho", ""); static_assert(parse("homu14", *w::lim<2>(item)).current() == to_string("14"), ""); return 0; }
こんな感じですね。
デフォルトだと limited::discard が使用されます。