#ifndef EOLIAN_CXX_KLEENE_HH #define EOLIAN_CXX_KLEENE_HH #include "grammar/generator.hpp" namespace efl { namespace eolian { namespace grammar { template struct kleene_generator { kleene_generator(Generator g) : generator(g) {} template bool generate(OutputIterator sink, Attribute const& attribute, Context const& context) const { bool b; for(auto&& c : attribute) { b = as_generator(generator).generate(sink, c, context); if(!b) return false; } return true; } Generator generator; }; template struct is_eager_generator > : std::true_type {}; namespace type_traits { template struct attributes_needed > : std::integral_constant {}; } template typename std::enable_if::value, kleene_generator>::type operator*(Generator g) { return kleene_generator{g}; } } } } #endif