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 が使用されます。

[コンパイラ]

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