/* * Copyright 2019 by its authors. See AUTHORS. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #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 {}; template struct is_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