#ifndef EOLIAN_CXX_CASE_HH #define EOLIAN_CXX_CASE_HH #include "grammar/context.hpp" #include "grammar/generator.hpp" namespace efl { namespace eolian { namespace grammar { struct upper_case_tag {}; struct lower_case_tag {}; template context_cons add_upper_case_context(Context const& context) { return context_add_tag(upper_case_tag{}, context); } template context_cons add_lower_case_context(Context const& context) { return context_add_tag(lower_case_tag{}, context); } template struct lower_case_generator { lower_case_generator(G g) : g(g) {} template bool generate(OutputIterator sink, Attribute const& attribute, Context const& context) const { return as_generator(g).generate(sink, attribute, add_lower_case_context(context)); } G g; }; template struct upper_case_generator { upper_case_generator(G g) : g(g) {} template bool generate(OutputIterator sink, Attribute const& attribute, Context const& context) const { return as_generator(g).generate(sink, attribute, add_upper_case_context(context)); } G g; }; template struct is_eager_generator> : std::true_type {}; template struct is_eager_generator> : std::true_type {}; template struct is_generator> : std::true_type {}; template struct is_generator> : std::true_type {}; namespace type_traits { template struct attributes_needed> : attributes_needed {}; template struct attributes_needed> : attributes_needed {}; } struct lower_case_directive { template lower_case_generator operator[](G&& g) const { return lower_case_generator{g}; } } const lower_case = {}; struct upper_case_directive { template upper_case_generator operator[](G&& g) const { return upper_case_generator{g}; } } const upper_case = {}; } } } #endif