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>
struct if_reflected
{
@ -127,17 +158,7 @@ struct if_reflected<fc::true_type>
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;
if_enum< typename fc::reflector<T>::is_enum >::process_class(proc, dummy);
}
};

View file

@ -348,31 +348,45 @@ class register_member_visitor
}
};
template <typename T, typename IsEnum = fc::false_type>
struct serializer_init_helper {
static void init()
{
auto name = js_name<T>::name();
if( st.find(name) == st.end() )
{
fc::reflector<T>::visit( register_member_visitor() );
register_serializer( name, [=](){ generate(); } );
}
}
static void generate()
{
auto name = remove_namespace( js_name<T>::name() );
if( name == "int64" ) return;
std::cout << "" << name
<< " = new Serializer( \n"
<< " \"" + name + "\"\n";
fc::reflector<T>::visit( serialize_member_visitor() );
std::cout <<")\n\n";
}
};
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()
{
auto name = js_name<T>::name();
if( st.find(name) == st.end() )
{
fc::reflector<T>::visit( register_member_visitor() );
register_serializer( name, [=](){ generate(); } );
}
}
static void generate()
{
auto name = remove_namespace( js_name<T>::name() );
if( name == "int64" ) return;
std::cout << "" << name
<< " = new Serializer( \n"
<< " \"" + name + "\"\n";
fc::reflector<T>::visit( serialize_member_visitor() );
std::cout <<")\n\n";
serializer_init_helper< T, typename fc::reflector<T>::is_enum >::init();
}
};