#ifndef EOLIAN_CXX_HEADER_GUARDS_HH #define EOLIAN_CXX_HEADER_GUARDS_HH #include #include #include #include "grammar/generator.hpp" #include "grammar/attributes.hpp" #include "grammar/string.hpp" namespace efl { namespace eolian { namespace grammar { template struct header_guards_generator { header_guards_generator(Generator generator) : generator(std::move(generator)) {} template bool generate(OutputIterator sink, Attribute const& attribute, Context const& context) const { using std::get; auto&& v = get<0>(attribute); const char ifndef_directive[] = "#ifndef "; const char define_directive[] = "#define "; const char endif_directive[] = "#endif\n"; std::copy(&ifndef_directive[0], &ifndef_directive[0] + sizeof(ifndef_directive)-1, sink); std::transform(std::begin(v), std::end(v), sink, ::toupper); *sink++ = '\n'; std::copy(&define_directive[0], &define_directive[0] + sizeof(define_directive)-1, sink); std::transform(std::begin(v), std::end(v), sink, ::toupper); *sink++ = '\n'; bool b = as_generator(generator).generate(sink, attributes::pop_front(attribute), context); if(!b) return false; else { std::copy(&endif_directive[0], &endif_directive[0] + sizeof(endif_directive)-1, sink); return true; } } Generator generator; }; 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> {}; } struct header_guards_directive { template header_guards_generator operator[](Generator generator) const { return header_guards_generator(generator); } }; header_guards_directive const header_guards = {}; } } } #endif