#ifndef EOLIAN_CXX_ALTERNATIVE_HH #define EOLIAN_CXX_ALTERNATIVE_HH #include "grammar/generator.hpp" #include "grammar/meta.hpp" namespace efl { namespace eolian { namespace grammar { template struct alternative_generator { template bool generate(OutputIterator /*sink*/, eina::variant const& /*attribute*/, Context const& /*context*/) const { // return grammar::alternative_sequence(left, right, sink, attribute); return false; } template bool generate(OutputIterator sink, Attribute const& attribute, Context const& context) const { if(!attributes::generate(as_generator(left), sink, attribute, context)) return attributes::generate(as_generator(right), sink, attribute, context); else return true; } L left; R right; }; template struct is_eager_generator > : std::true_type {}; namespace type_traits { template struct attributes_needed > : std::integral_constant ::value, attributes_needed::value>::value> {}; template struct accepts_tuple > : std::true_type {}; } template typename std::enable_if::value && grammar::is_generator::value, alternative_generator>::type operator|(L l, R r) { return alternative_generator{l, r}; } } } } #endif