Support enums in blockchain objects (fix serialization)
This commit is contained in:
parent
f99bf1c6e6
commit
65aa509ec9
3 changed files with 66 additions and 31 deletions
|
|
@ -1 +1 @@
|
|||
Subproject commit 57d14c7de849c567d753fc5cab5465d68602ff95
|
||||
Subproject commit 9d408aa53267834542279490eac4c25878107967
|
||||
|
|
@ -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);
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue