#ifndef EOLIAN_CXX_ATTRIBUTE_REORDER_HH #define EOLIAN_CXX_ATTRIBUTE_REORDER_HH #include "grammar/generator.hpp" #include "grammar/attributes.hpp" namespace efl { namespace eolian { namespace grammar { template struct reorder_tuple { Tuple* tuple; }; namespace impl { template struct index_calc; template struct index_calc<0, reorder_tuple> : std::integral_constant {}; template struct index_calc> : index_calc> {}; } namespace attributes { template struct tuple_element> { template struct identity { typedef T type; }; typedef impl::index_calc> index; typedef typename std::conditional , tuple_element::type>>::type::type type; static type const& get_impl(reorder_tuple const& t , std::integral_constant) { return *t.tuple; } template static type const& get_impl(reorder_tuple const& t , std::integral_constant) { using std::get; return get(*t.tuple); } static type const& get(reorder_tuple const& t) { return get_impl(t, index{}); } }; } template typename attributes::tuple_element>::type const& get(reorder_tupleconst& t) { return attributes::tuple_element>::get(t); } template struct attribute_reorder_generator { template bool generate(OutputIterator sink, Attribute const& attribute, Context const& ctx) const { return attributes::generate(as_generator(g), sink, reorder_tuple{&attribute}, ctx); } G g; }; template struct is_eager_generator> : std::true_type {}; template struct is_generator> : std::true_type {}; template attribute_reorder_generator attribute_reorder(G g) { return {g}; } namespace type_traits { template struct attributes_needed> : attributes_needed {}; template struct is_explicit_tuple> : std::true_type {}; template struct is_tuple> : std::true_type {}; } } } } #endif