diff --git a/libraries/fc b/libraries/fc index 57d14c7d..9d408aa5 160000 --- a/libraries/fc +++ b/libraries/fc @@ -1 +1 @@ -Subproject commit 57d14c7de849c567d753fc5cab5465d68602ff95 +Subproject commit 9d408aa53267834542279490eac4c25878107967 diff --git a/programs/build_helpers/member_enumerator.cpp b/programs/build_helpers/member_enumerator.cpp index 001b47bd..1ce32fc0 100644 --- a/programs/build_helpers/member_enumerator.cpp +++ b/programs/build_helpers/member_enumerator.cpp @@ -110,6 +110,37 @@ void class_processor::process_class( const static_variant< T... >* dummy ) } } +template +struct if_enum +{ + template< typename T > + static void process_class( class_processor* proc, const T* dummy ) + { + std::string tname = fc::get_typename::name(); + if( proc->result.find( tname ) != proc->result.end() ) + return; + ilog( "processing class ${c}", ("c", tname) ); + // need this to keep from recursing on same class + proc->result.emplace( tname, std::vector< std::string >() ); + + member_visitor vtor( proc ); + fc::reflector::visit( vtor ); + ilog( "members of class ${c} are ${m}", ("c", tname)("m", vtor.members) ); + proc->result[tname] = vtor.members; + } +}; + +template<> +struct if_enum +{ + template< typename T > + static void process_class( class_processor* proc, const T* dummy ) + { + std::string tname = fc::get_typename::name(); + std::cerr << "skipping reflected enum " << tname << std::endl; + } +}; + template struct if_reflected { @@ -127,17 +158,7 @@ struct if_reflected template< typename T > static void process_class( class_processor* proc, const T* dummy ) { - std::string tname = fc::get_typename::name(); - if( proc->result.find( tname ) != proc->result.end() ) - return; - ilog( "processing class ${c}", ("c", tname) ); - // need this to keep from recursing on same class - proc->result.emplace( tname, std::vector< std::string >() ); - - member_visitor vtor( proc ); - fc::reflector::visit( vtor ); - ilog( "members of class ${c} are ${m}", ("c", tname)("m", vtor.members) ); - proc->result[tname] = vtor.members; + if_enum< typename fc::reflector::is_enum >::process_class(proc, dummy); } }; diff --git a/programs/js_operation_serializer/main.cpp b/programs/js_operation_serializer/main.cpp index 26791a6c..f81e907e 100644 --- a/programs/js_operation_serializer/main.cpp +++ b/programs/js_operation_serializer/main.cpp @@ -348,31 +348,45 @@ class register_member_visitor } }; +template +struct serializer_init_helper { + static void init() + { + auto name = js_name::name(); + if( st.find(name) == st.end() ) + { + fc::reflector::visit( register_member_visitor() ); + register_serializer( name, [=](){ generate(); } ); + } + } + static void generate() + { + auto name = remove_namespace( js_name::name() ); + if( name == "int64" ) return; + std::cout << "" << name + << " = new Serializer( \n" + << " \"" + name + "\"\n"; + + fc::reflector::visit( serialize_member_visitor() ); + + std::cout <<")\n\n"; + } +}; + +template +struct serializer_init_helper { + static void init() + { + } +}; + template struct serializer { static_assert( fc::reflector::is_defined::value == reflected, "invalid template arguments" ); static void init() { - auto name = js_name::name(); - if( st.find(name) == st.end() ) - { - fc::reflector::visit( register_member_visitor() ); - register_serializer( name, [=](){ generate(); } ); - } - } - - static void generate() - { - auto name = remove_namespace( js_name::name() ); - if( name == "int64" ) return; - std::cout << "" << name - << " = new Serializer( \n" - << " \"" + name + "\"\n"; - - fc::reflector::visit( serialize_member_visitor() ); - - std::cout <<")\n\n"; + serializer_init_helper< T, typename fc::reflector::is_enum >::init(); } };