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>
|
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;
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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 )
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue