Wire Sysio Wire Sysion 1.0.0
Loading...
Searching...
No Matches
sysio::chain::abi_serializer Struct Reference

#include <abi_serializer.hpp>

Collaboration diagram for sysio::chain::abi_serializer:

Public Types

using yield_function_t = fc::optional_delegate<void(size_t)>
 passed recursion_depth on each invocation
 
typedef std::function< fc::variant(fc::datastream< const char * > &, bool, bool, const abi_serializer::yield_function_t &)> unpack_function
 
typedef std::function< void(const fc::variant &, fc::datastream< char * > &, bool, bool, const abi_serializer::yield_function_t &)> pack_function
 

Public Member Functions

 abi_serializer ()
 
 abi_serializer (const abi_def &abi, const yield_function_t &yield)
 
 abi_serializer (const abi_def &abi, const fc::microseconds &max_serialization_time)
 
void set_abi (const abi_def &abi, const yield_function_t &yield)
 
void set_abi (const abi_def &abi, const fc::microseconds &max_serialization_time)
 
std::string_view resolve_type (const std::string_view &t) const
 
bool is_array (const std::string_view &type) const
 
bool is_optional (const std::string_view &type) const
 
bool is_type (const std::string_view &type, const yield_function_t &yield) const
 
bool is_type (const std::string_view &type, const fc::microseconds &max_serialization_time) const
 
bool is_builtin_type (const std::string_view &type) const
 
bool is_integer (const std::string_view &type) const
 
int get_integer_size (const std::string_view &type) const
 
bool is_struct (const std::string_view &type) const
 
std::string_view fundamental_type (const std::string_view &type) const
 
const struct_defget_struct (const std::string_view &type) const
 
type_name get_action_type (name action) const
 
type_name get_table_type (name action) const
 
type_name get_action_result_type (name action_result) const
 
std::optional< stringget_error_message (uint64_t error_code) const
 
fc::variant binary_to_variant (const std::string_view &type, const bytes &binary, const yield_function_t &yield, bool short_path=false) const
 
fc::variant binary_to_variant (const std::string_view &type, const bytes &binary, const fc::microseconds &max_serialization_time, bool short_path=false) const
 
fc::variant binary_to_variant (const std::string_view &type, fc::datastream< const char * > &binary, const yield_function_t &yield, bool short_path=false) const
 
fc::variant binary_to_variant (const std::string_view &type, fc::datastream< const char * > &binary, const fc::microseconds &max_serialization_time, bool short_path=false) const
 
bytes variant_to_binary (const std::string_view &type, const fc::variant &var, const fc::microseconds &max_serialization_time, bool short_path=false) const
 
bytes variant_to_binary (const std::string_view &type, const fc::variant &var, const yield_function_t &yield, bool short_path=false) const
 
void variant_to_binary (const std::string_view &type, const fc::variant &var, fc::datastream< char * > &ds, const fc::microseconds &max_serialization_time, bool short_path=false) const
 
void variant_to_binary (const std::string_view &type, const fc::variant &var, fc::datastream< char * > &ds, const yield_function_t &yield, bool short_path=false) const
 
void add_specialized_unpack_pack (const string &name, std::pair< abi_serializer::unpack_function, abi_serializer::pack_function > unpack_pack)
 

Static Public Member Functions

template<typename T , typename Resolver >
static void to_variant (const T &o, fc::variant &vo, Resolver resolver, const yield_function_t &yield)
 namespace sysio::chain::impl
 
template<typename T , typename Resolver >
static void to_variant (const T &o, fc::variant &vo, Resolver resolver, const fc::microseconds &max_serialization_time)
 
template<typename T , typename Resolver >
static void to_log_variant (const T &o, fc::variant &vo, Resolver resolver, const yield_function_t &yield)
 
template<typename T , typename Resolver >
static void from_variant (const fc::variant &v, T &o, Resolver resolver, const yield_function_t &yield)
 
template<typename T , typename Resolver >
static void from_variant (const fc::variant &v, T &o, Resolver resolver, const fc::microseconds &max_serialization_time)
 
template<typename Vec >
static bool is_empty_abi (const Vec &abi_vec)
 
template<typename Vec >
static bool to_abi (const Vec &abi_vec, abi_def &abi)
 
static yield_function_t create_yield_function (const fc::microseconds &max_serialization_time)
 

Static Public Attributes

static constexpr size_t max_recursion_depth = 32
 

Friends

struct impl::abi_from_variant
 
struct impl::abi_to_variant
 
struct impl::abi_traverse_context_with_path
 

Detailed Description

Describes the binary representation message and table contents so that it can be converted to and from JSON.

Definition at line 32 of file abi_serializer.hpp.

Member Typedef Documentation

◆ pack_function

Definition at line 115 of file abi_serializer.hpp.

◆ unpack_function

Definition at line 114 of file abi_serializer.hpp.

◆ yield_function_t

Constructor & Destructor Documentation

◆ abi_serializer() [1/3]

sysio::chain::abi_serializer::abi_serializer ( )
inline

Definition at line 37 of file abi_serializer.hpp.

37{ configure_built_in_types(); }

◆ abi_serializer() [2/3]

sysio::chain::abi_serializer::abi_serializer ( const abi_def & abi,
const yield_function_t & yield )

Definition at line 73 of file abi_serializer.cpp.

73 {
74 configure_built_in_types();
75 set_abi(abi, yield);
76 }
void set_abi(const abi_def &abi, const yield_function_t &yield)
Here is the call graph for this function:

◆ abi_serializer() [3/3]

sysio::chain::abi_serializer::abi_serializer ( const abi_def & abi,
const fc::microseconds & max_serialization_time )

Definition at line 78 of file abi_serializer.cpp.

78 {
79 configure_built_in_types();
80 set_abi(abi, max_serialization_time);
81 }
Here is the call graph for this function:

Member Function Documentation

◆ add_specialized_unpack_pack()

void sysio::chain::abi_serializer::add_specialized_unpack_pack ( const string & name,
std::pair< abi_serializer::unpack_function, abi_serializer::pack_function > unpack_pack )

Definition at line 83 of file abi_serializer.cpp.

84 {
85 built_in_types[name] = std::move( unpack_pack );
86 }
std::string name

◆ binary_to_variant() [1/4]

fc::variant sysio::chain::abi_serializer::binary_to_variant ( const std::string_view & type,
const bytes & binary,
const fc::microseconds & max_serialization_time,
bool short_path = false ) const

Definition at line 451 of file abi_serializer.cpp.

451 {
452 return binary_to_variant( type, binary, create_yield_function(max_serialization_time), short_path );
453 }
static yield_function_t create_yield_function(const fc::microseconds &max_serialization_time)
fc::variant binary_to_variant(const std::string_view &type, const bytes &binary, const yield_function_t &yield, bool short_path=false) const
Here is the call graph for this function:

◆ binary_to_variant() [2/4]

fc::variant sysio::chain::abi_serializer::binary_to_variant ( const std::string_view & type,
const bytes & binary,
const yield_function_t & yield,
bool short_path = false ) const

Definition at line 445 of file abi_serializer.cpp.

445 {
446 impl::binary_to_variant_context ctx(*this, yield, type);
447 ctx.short_path = short_path;
448 return _binary_to_variant(type, binary, ctx);
449 }
Here is the caller graph for this function:

◆ binary_to_variant() [3/4]

fc::variant sysio::chain::abi_serializer::binary_to_variant ( const std::string_view & type,
fc::datastream< const char * > & binary,
const fc::microseconds & max_serialization_time,
bool short_path = false ) const

Definition at line 461 of file abi_serializer.cpp.

461 {
462 return binary_to_variant( type, binary, create_yield_function(max_serialization_time), short_path );
463 }
Here is the call graph for this function:

◆ binary_to_variant() [4/4]

fc::variant sysio::chain::abi_serializer::binary_to_variant ( const std::string_view & type,
fc::datastream< const char * > & binary,
const yield_function_t & yield,
bool short_path = false ) const

Definition at line 455 of file abi_serializer.cpp.

455 {
456 impl::binary_to_variant_context ctx(*this, yield, type);
457 ctx.short_path = short_path;
458 return _binary_to_variant(type, binary, ctx);
459 }

◆ create_yield_function()

static yield_function_t sysio::chain::abi_serializer::create_yield_function ( const fc::microseconds & max_serialization_time)
inlinestatic

Definition at line 123 of file abi_serializer.hpp.

123 {
125 if( max_serialization_time > fc::microseconds::maximum() - deadline.time_since_epoch() ) {
126 deadline = fc::time_point::maximum();
127 } else {
128 deadline += max_serialization_time;
129 }
130 return [max_serialization_time, deadline](size_t recursion_depth) {
131 SYS_ASSERT( recursion_depth < max_recursion_depth, abi_recursion_depth_exception,
132 "recursive definition, max_recursion_depth ${r} ", ("r", max_recursion_depth) );
133
134 SYS_ASSERT( fc::time_point::now() < deadline, abi_serialization_deadline_exception,
135 "serialization time limit ${t}us exceeded", ("t", max_serialization_time) );
136 };
137 }
#define SYS_ASSERT(expr, exc_type, FORMAT,...)
Definition exceptions.hpp:7
static constexpr microseconds maximum()
Definition time.hpp:14
static time_point now()
Definition time.cpp:14
static constexpr time_point maximum()
Definition time.hpp:46
static constexpr size_t max_recursion_depth
Here is the call graph for this function:
Here is the caller graph for this function:

◆ from_variant() [1/2]

template<typename T , typename Resolver >
Resolver void sysio::chain::abi_serializer::from_variant ( const fc::variant & v,
T & o,
Resolver resolver,
const fc::microseconds & max_serialization_time )
static

Definition at line 933 of file abi_serializer.hpp.

933 {
934 from_variant( v, o, resolver, create_yield_function(max_serialization_time) );
935}
static void from_variant(const fc::variant &v, T &o, Resolver resolver, const yield_function_t &yield)
Here is the call graph for this function:

◆ from_variant() [2/2]

template<typename T , typename Resolver >
Resolver void sysio::chain::abi_serializer::from_variant ( const fc::variant & v,
T & o,
Resolver resolver,
const yield_function_t & yield )
static

Definition at line 927 of file abi_serializer.hpp.

927 {
928 impl::abi_traverse_context ctx( yield );
929 impl::abi_from_variant::extract(v, o, resolver, ctx);
930} FC_RETHROW_EXCEPTIONS(error, "Failed to deserialize variant", ("variant",v))
#define FC_RETHROW_EXCEPTIONS(LOG_LEVEL, FORMAT,...)
Catchs all exception's, std::exceptions, and ... and rethrows them after appending the provided log m...
static void extract(const fc::variant &v, M &o, Resolver, abi_traverse_context &ctx)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ fundamental_type()

std::string_view sysio::chain::abi_serializer::fundamental_type ( const std::string_view & type) const
Returns
string_view of type

Definition at line 225 of file abi_serializer.cpp.

225 {
226 if( is_array(type) ) {
227 return type.substr(0, type.size()-2);
228 } else if ( is_optional(type) ) {
229 return type.substr(0, type.size()-1);
230 } else {
231 return type;
232 }
233 }
bool is_optional(const std::string_view &type) const
bool is_array(const std::string_view &type) const
yh_object_type type
Definition yubihsm.h:672
Here is the call graph for this function:

◆ get_action_result_type()

type_name sysio::chain::abi_serializer::get_action_result_type ( name action_result) const

Definition at line 615 of file abi_serializer.cpp.

615 {
616 auto itr = action_results.find(action_result);
617 if( itr != action_results.end() ) return itr->second;
618 return type_name();
619 }
string type_name
Definition abi_def.hpp:7

◆ get_action_type()

type_name sysio::chain::abi_serializer::get_action_type ( name action) const

Definition at line 604 of file abi_serializer.cpp.

604 {
605 auto itr = actions.find(action);
606 if( itr != actions.end() ) return itr->second;
607 return type_name();
608 }
Here is the caller graph for this function:

◆ get_error_message()

std::optional< string > sysio::chain::abi_serializer::get_error_message ( uint64_t error_code) const

Definition at line 621 of file abi_serializer.cpp.

621 {
622 auto itr = error_messages.find( error_code );
623 if( itr == error_messages.end() )
624 return std::optional<string>();
625
626 return itr->second;
627 }

◆ get_integer_size()

int sysio::chain::abi_serializer::get_integer_size ( const std::string_view & type) const

Definition at line 195 of file abi_serializer.cpp.

195 {
196 SYS_ASSERT( is_integer(type), invalid_type_inside_abi, "${type} is not an integer type", ("type",impl::limit_size(type)));
197 if( boost::starts_with(type, "uint") ) {
198 return boost::lexical_cast<int>(type.substr(4));
199 } else {
200 return boost::lexical_cast<int>(type.substr(3));
201 }
202 }
string limit_size(const std::string_view &str)
limits the string size to default max_length of output_name
bool is_integer(const std::string_view &type) const
Here is the call graph for this function:

◆ get_struct()

const struct_def & sysio::chain::abi_serializer::get_struct ( const std::string_view & type) const

Definition at line 252 of file abi_serializer.cpp.

252 {
253 auto itr = structs.find(resolve_type(type) );
254 SYS_ASSERT( itr != structs.end(), invalid_type_inside_abi, "Unknown struct ${type}", ("type",impl::limit_size(type)) );
255 return itr->second;
256 }
std::string_view resolve_type(const std::string_view &t) const
Here is the call graph for this function:

◆ get_table_type()

type_name sysio::chain::abi_serializer::get_table_type ( name action) const

Definition at line 609 of file abi_serializer.cpp.

609 {
610 auto itr = tables.find(action);
611 if( itr != tables.end() ) return itr->second;
612 return type_name();
613 }
Here is the caller graph for this function:

◆ is_array()

bool sysio::chain::abi_serializer::is_array ( const std::string_view & type) const

Definition at line 208 of file abi_serializer.cpp.

208 {
209 return ends_with(type, "[]");
210 }
Here is the caller graph for this function:

◆ is_builtin_type()

bool sysio::chain::abi_serializer::is_builtin_type ( const std::string_view & type) const

Definition at line 187 of file abi_serializer.cpp.

187 {
188 return built_in_types.find(type) != built_in_types.end();
189 }

◆ is_empty_abi()

template<typename Vec >
static bool sysio::chain::abi_serializer::is_empty_abi ( const Vec & abi_vec)
inlinestatic

Definition at line 98 of file abi_serializer.hpp.

99 {
100 return abi_vec.size() <= 4;
101 }
Here is the caller graph for this function:

◆ is_integer()

bool sysio::chain::abi_serializer::is_integer ( const std::string_view & type) const

Definition at line 191 of file abi_serializer.cpp.

191 {
192 return boost::starts_with(type, "uint") || boost::starts_with(type, "int");
193 }
Here is the caller graph for this function:

◆ is_optional()

bool sysio::chain::abi_serializer::is_optional ( const std::string_view & type) const

Definition at line 212 of file abi_serializer.cpp.

212 {
213 return ends_with(type, "?");
214 }
Here is the caller graph for this function:

◆ is_struct()

bool sysio::chain::abi_serializer::is_struct ( const std::string_view & type) const

Definition at line 204 of file abi_serializer.cpp.

204 {
205 return structs.find(resolve_type(type)) != structs.end();
206 }
Here is the call graph for this function:

◆ is_type() [1/2]

bool sysio::chain::abi_serializer::is_type ( const std::string_view & type,
const fc::microseconds & max_serialization_time ) const

Definition at line 221 of file abi_serializer.cpp.

221 {
222 return is_type(type, create_yield_function(max_serialization_time));
223 }
bool is_type(const std::string_view &type, const yield_function_t &yield) const
Here is the call graph for this function:

◆ is_type() [2/2]

bool sysio::chain::abi_serializer::is_type ( const std::string_view & type,
const yield_function_t & yield ) const

Definition at line 216 of file abi_serializer.cpp.

216 {
217 impl::abi_traverse_context ctx(yield);
218 return _is_type(type, ctx);
219 }
Here is the caller graph for this function:

◆ resolve_type()

std::string_view sysio::chain::abi_serializer::resolve_type ( const std::string_view & t) const
Returns
string_view of t or internal string type

Definition at line 314 of file abi_serializer.cpp.

314 {
315 auto itr = typedefs.find(type);
316 if( itr != typedefs.end() ) {
317 for( auto i = typedefs.size(); i > 0; --i ) { // avoid infinite recursion
318 const std::string_view& t = itr->second;
319 itr = typedefs.find( t );
320 if( itr == typedefs.end() ) return t;
321 }
322 }
323 return type;
324 }
Here is the caller graph for this function:

◆ set_abi() [1/2]

void sysio::chain::abi_serializer::set_abi ( const abi_def & abi,
const fc::microseconds & max_serialization_time )

Definition at line 183 of file abi_serializer.cpp.

183 {
184 return set_abi(abi, create_yield_function(max_serialization_time));
185 }
Here is the call graph for this function:

◆ set_abi() [2/2]

void sysio::chain::abi_serializer::set_abi ( const abi_def & abi,
const yield_function_t & yield )

The ABI vector may contain duplicates which would make it an invalid ABI

Definition at line 131 of file abi_serializer.cpp.

131 {
132 impl::abi_traverse_context ctx(yield);
133
134 SYS_ASSERT(starts_with(abi.version, "sysio::abi/1."), unsupported_abi_version_exception, "ABI has an unsupported version");
135
136 typedefs.clear();
137 structs.clear();
138 actions.clear();
139 tables.clear();
140 error_messages.clear();
141 variants.clear();
142 action_results.clear();
143
144 for( const auto& st : abi.structs )
145 structs[st.name] = st;
146
147 for( const auto& td : abi.types ) {
148 SYS_ASSERT(!_is_type(td.new_type_name, ctx), duplicate_abi_type_def_exception,
149 "type already exists", ("new_type_name",impl::limit_size(td.new_type_name)));
150 typedefs[td.new_type_name] = td.type;
151 }
152
153 for( const auto& a : abi.actions )
154 actions[a.name] = a.type;
155
156 for( const auto& t : abi.tables )
157 tables[t.name] = t.type;
158
159 for( const auto& e : abi.error_messages )
160 error_messages[e.error_code] = e.error_msg;
161
162 for( const auto& v : abi.variants.value )
163 variants[v.name] = v;
164
165 for( const auto& r : abi.action_results.value )
166 action_results[r.name] = r.result_type;
167
172 SYS_ASSERT( typedefs.size() == abi.types.size(), duplicate_abi_type_def_exception, "duplicate type definition detected" );
173 SYS_ASSERT( structs.size() == abi.structs.size(), duplicate_abi_struct_def_exception, "duplicate struct definition detected" );
174 SYS_ASSERT( actions.size() == abi.actions.size(), duplicate_abi_action_def_exception, "duplicate action definition detected" );
175 SYS_ASSERT( tables.size() == abi.tables.size(), duplicate_abi_table_def_exception, "duplicate table definition detected" );
176 SYS_ASSERT( error_messages.size() == abi.error_messages.size(), duplicate_abi_err_msg_def_exception, "duplicate error message definition detected" );
177 SYS_ASSERT( variants.size() == abi.variants.value.size(), duplicate_abi_variant_def_exception, "duplicate variant definition detected" );
178 SYS_ASSERT( action_results.size() == abi.action_results.value.size(), duplicate_abi_action_results_def_exception, "duplicate action results definition detected" );
179
180 validate(ctx);
181 }
const mie::Vuint & r
Definition bn.cpp:28
bool starts_with(std::string const &str, std::string const &pref)
const GenericPointer< typename T::ValueType > T2 T::AllocatorType & a
Definition pointer.h:1181
Here is the call graph for this function:
Here is the caller graph for this function:

◆ to_abi()

template<typename Vec >
static bool sysio::chain::abi_serializer::to_abi ( const Vec & abi_vec,
abi_def & abi )
inlinestatic

4 == packsize of empty Abi

Definition at line 104 of file abi_serializer.hpp.

105 {
106 if( !is_empty_abi(abi_vec) ) {
107 fc::datastream<const char*> ds( abi_vec.data(), abi_vec.size() );
108 fc::raw::unpack( ds, abi );
109 return true;
110 }
111 return false;
112 }
static const Segment ds(Segment::ds)
void unpack(Stream &s, std::deque< T > &value)
Definition raw.hpp:540
static bool is_empty_abi(const Vec &abi_vec)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ to_log_variant()

template<typename T , typename Resolver >
void sysio::chain::abi_serializer::to_log_variant ( const T & o,
fc::variant & vo,
Resolver resolver,
const yield_function_t & yield )
static

Definition at line 917 of file abi_serializer.hpp.

917 {
918 mutable_variant_object mvo;
919 impl::abi_traverse_context ctx( yield );
920 ctx.logging();
921 impl::abi_to_variant::add(mvo, "_", o, resolver, ctx);
922 vo = std::move(mvo["_"]);
923} FC_RETHROW_EXCEPTIONS(error, "Failed to serialize: ${type}", ("type", boost::core::demangle( typeid(o).name() ) ))
static void add(mutable_variant_object &mvo, const char *name, const M &v, Resolver, abi_traverse_context &ctx)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ to_variant() [1/2]

template<typename T , typename Resolver >
Resolver void sysio::chain::abi_serializer::to_variant ( const T & o,
fc::variant & vo,
Resolver resolver,
const fc::microseconds & max_serialization_time )
static

Definition at line 912 of file abi_serializer.hpp.

912 {
913 to_variant( o, vo, resolver, create_yield_function(max_serialization_time) );
914}
static void to_variant(const T &o, fc::variant &vo, Resolver resolver, const yield_function_t &yield)
namespace sysio::chain::impl
Here is the call graph for this function:

◆ to_variant() [2/2]

template<typename T , typename Resolver >
void sysio::chain::abi_serializer::to_variant ( const T & o,
fc::variant & vo,
Resolver resolver,
const yield_function_t & yield )
static

Definition at line 904 of file abi_serializer.hpp.

904 {
905 mutable_variant_object mvo;
906 impl::abi_traverse_context ctx( yield );
907 impl::abi_to_variant::add(mvo, "_", o, resolver, ctx);
908 vo = std::move(mvo["_"]);
909} FC_RETHROW_EXCEPTIONS(error, "Failed to serialize: ${type}", ("type", boost::core::demangle( typeid(o).name() ) ))
Here is the call graph for this function:
Here is the caller graph for this function:

◆ variant_to_binary() [1/4]

bytes sysio::chain::abi_serializer::variant_to_binary ( const std::string_view & type,
const fc::variant & var,
const fc::microseconds & max_serialization_time,
bool short_path = false ) const

Definition at line 590 of file abi_serializer.cpp.

590 {
591 return variant_to_binary( type, var, create_yield_function(max_serialization_time), short_path );
592 }
bytes variant_to_binary(const std::string_view &type, const fc::variant &var, const fc::microseconds &max_serialization_time, bool short_path=false) const
Here is the call graph for this function:
Here is the caller graph for this function:

◆ variant_to_binary() [2/4]

bytes sysio::chain::abi_serializer::variant_to_binary ( const std::string_view & type,
const fc::variant & var,
const yield_function_t & yield,
bool short_path = false ) const

Definition at line 584 of file abi_serializer.cpp.

584 {
585 impl::variant_to_binary_context ctx(*this, yield, type);
586 ctx.short_path = short_path;
587 return _variant_to_binary(type, var, ctx);
588 }

◆ variant_to_binary() [3/4]

void sysio::chain::abi_serializer::variant_to_binary ( const std::string_view & type,
const fc::variant & var,
fc::datastream< char * > & ds,
const fc::microseconds & max_serialization_time,
bool short_path = false ) const

Definition at line 600 of file abi_serializer.cpp.

600 {
601 variant_to_binary( type, var, create_yield_function(max_serialization_time), short_path );
602 }
Here is the call graph for this function:

◆ variant_to_binary() [4/4]

void sysio::chain::abi_serializer::variant_to_binary ( const std::string_view & type,
const fc::variant & var,
fc::datastream< char * > & ds,
const yield_function_t & yield,
bool short_path = false ) const

Definition at line 594 of file abi_serializer.cpp.

594 {
595 impl::variant_to_binary_context ctx(*this, yield, type);
596 ctx.short_path = short_path;
597 _variant_to_binary(type, var, ds, ctx);
598 }

Friends And Related Symbol Documentation

◆ impl::abi_from_variant

friend struct impl::abi_from_variant
friend

Definition at line 166 of file abi_serializer.hpp.

◆ impl::abi_to_variant

friend struct impl::abi_to_variant
friend

Definition at line 167 of file abi_serializer.hpp.

◆ impl::abi_traverse_context_with_path

Definition at line 168 of file abi_serializer.hpp.

Member Data Documentation

◆ max_recursion_depth

const size_t sysio::chain::abi_serializer::max_recursion_depth = 32
staticconstexpr

Definition at line 119 of file abi_serializer.hpp.


The documentation for this struct was generated from the following files: