Support enums in blockchain objects (fix serialization)

This commit is contained in:
Eric Frias 2017-03-21 09:24:08 -04:00
parent f99bf1c6e6
commit 65aa509ec9
3 changed files with 66 additions and 31 deletions

@ -1 +1 @@
Subproject commit 57d14c7de849c567d753fc5cab5465d68602ff95 Subproject commit 9d408aa53267834542279490eac4c25878107967

View file

@ -110,6 +110,37 @@ void class_processor::process_class( const static_variant< T... >* dummy )
} }
} }
template<typename IsEnum = fc::false_type>
struct if_enum
{
template< typename T >
static void process_class( class_processor* proc, const T* dummy )
{
std::string tname = fc::get_typename<T>::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<T> vtor( proc );
fc::reflector<T>::visit( vtor );
ilog( "members of class ${c} are ${m}", ("c", tname)("m", vtor.members) );
proc->result[tname] = vtor.members;
}
};
template<>
struct if_enum<fc::true_type>
{
template< typename T >
static void process_class( class_processor* proc, const T* dummy )
{
std::string tname = fc::get_typename<T>::name();
std::cerr << "skipping reflected enum " << tname << std::endl;
}
};
template<typename IsReflected=fc::false_type> template<typename IsReflected=fc::false_type>
struct if_reflected struct if_reflected
{ {
@ -127,17 +158,7 @@ struct if_reflected<fc::true_type>
template< typename T > template< typename T >
static void process_class( class_processor* proc, const T* dummy ) static void process_class( class_processor* proc, const T* dummy )
{ {
std::string tname = fc::get_typename<T>::name(); if_enum< typename fc::reflector<T>::is_enum >::process_class(proc, dummy);
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<T> vtor( proc );
fc::reflector<T>::visit( vtor );
ilog( "members of class ${c} are ${m}", ("c", tname)("m", vtor.members) );
proc->result[tname] = vtor.members;
} }
}; };

View file

@ -348,10 +348,8 @@ class register_member_visitor
} }
}; };
template<typename T, bool reflected> template <typename T, typename IsEnum = fc::false_type>
struct serializer struct serializer_init_helper {
{
static_assert( fc::reflector<T>::is_defined::value == reflected, "invalid template arguments" );
static void init() static void init()
{ {
auto name = js_name<T>::name(); auto name = js_name<T>::name();
@ -361,7 +359,6 @@ struct serializer
register_serializer( name, [=](){ generate(); } ); register_serializer( name, [=](){ generate(); } );
} }
} }
static void generate() static void generate()
{ {
auto name = remove_namespace( js_name<T>::name() ); auto name = remove_namespace( js_name<T>::name() );
@ -376,6 +373,23 @@ struct serializer
} }
}; };
template <typename T>
struct serializer_init_helper<T, fc::true_type> {
static void init()
{
}
};
template<typename T, bool reflected>
struct serializer
{
static_assert( fc::reflector<T>::is_defined::value == reflected, "invalid template arguments" );
static void init()
{
serializer_init_helper< T, typename fc::reflector<T>::is_enum >::init();
}
};
} // namespace detail_ns } // namespace detail_ns
int main( int argc, char** argv ) int main( int argc, char** argv )