Add missing integer variant conversions
This commit is contained in:
parent
f644b1e475
commit
a23f3a86be
2 changed files with 106 additions and 69 deletions
|
|
@ -31,14 +31,20 @@ namespace fc
|
||||||
class time_point_sec;
|
class time_point_sec;
|
||||||
class microseconds;
|
class microseconds;
|
||||||
|
|
||||||
void to_variant( const int16_t& var, variant& vo );
|
|
||||||
void from_variant( const variant& var, int16_t& vo );
|
|
||||||
void to_variant( const uint16_t& var, variant& vo );
|
|
||||||
void from_variant( const variant& var, uint16_t& vo );
|
|
||||||
void to_variant( const uint32_t& var, variant& vo );
|
|
||||||
void from_variant( const variant& var, uint32_t& vo );
|
|
||||||
void to_variant( const uint8_t& var, variant& vo );
|
void to_variant( const uint8_t& var, variant& vo );
|
||||||
void from_variant( const variant& var, uint8_t& vo );
|
void from_variant( const variant& var, uint8_t& vo );
|
||||||
|
void to_variant( const int8_t& var, variant& vo );
|
||||||
|
void from_variant( const variant& var, int8_t& vo );
|
||||||
|
|
||||||
|
void to_variant( const uint16_t& var, variant& vo );
|
||||||
|
void from_variant( const variant& var, uint16_t& vo );
|
||||||
|
void to_variant( const int16_t& var, variant& vo );
|
||||||
|
void from_variant( const variant& var, int16_t& vo );
|
||||||
|
|
||||||
|
void to_variant( const uint32_t& var, variant& vo );
|
||||||
|
void from_variant( const variant& var, uint32_t& vo );
|
||||||
|
void to_variant( const int32_t& var, variant& vo );
|
||||||
|
void from_variant( const variant& var, int32_t& vo );
|
||||||
|
|
||||||
void to_variant( const variant_object& var, variant& vo );
|
void to_variant( const variant_object& var, variant& vo );
|
||||||
void from_variant( const variant& var, variant_object& vo );
|
void from_variant( const variant& var, variant_object& vo );
|
||||||
|
|
@ -94,7 +100,6 @@ namespace fc
|
||||||
template<typename A, typename B>
|
template<typename A, typename B>
|
||||||
void from_variant( const variant& v, std::pair<A,B>& p );
|
void from_variant( const variant& v, std::pair<A,B>& p );
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief stores null, int64, uint64, double, bool, string, std::vector<variant>,
|
* @brief stores null, int64, uint64, double, bool, string, std::vector<variant>,
|
||||||
* and variant_object's.
|
* and variant_object's.
|
||||||
|
|
@ -129,11 +134,15 @@ namespace fc
|
||||||
variant( char* str );
|
variant( char* str );
|
||||||
variant( wchar_t* str );
|
variant( wchar_t* str );
|
||||||
variant( const wchar_t* str );
|
variant( const wchar_t* str );
|
||||||
variant( int val );
|
|
||||||
variant( float val );
|
variant( float val );
|
||||||
|
variant( uint8_t val );
|
||||||
|
variant( int8_t val );
|
||||||
|
variant( uint16_t val );
|
||||||
|
variant( int16_t val );
|
||||||
variant( uint32_t val );
|
variant( uint32_t val );
|
||||||
variant( int64_t val );
|
variant( int32_t val );
|
||||||
variant( uint64_t val );
|
variant( uint64_t val );
|
||||||
|
variant( int64_t val );
|
||||||
variant( double val );
|
variant( double val );
|
||||||
variant( bool val );
|
variant( bool val );
|
||||||
variant( fc::string val );
|
variant( fc::string val );
|
||||||
|
|
|
||||||
148
src/variant.cpp
148
src/variant.cpp
|
|
@ -12,34 +12,6 @@
|
||||||
|
|
||||||
namespace fc
|
namespace fc
|
||||||
{
|
{
|
||||||
|
|
||||||
void to_variant( const uint16_t& var, variant& vo ) { vo = uint64_t(var); }
|
|
||||||
// TODO: warn on overflow?
|
|
||||||
void from_variant( const variant& var, uint16_t& vo ){ vo = static_cast<uint16_t>(var.as_uint64()); }
|
|
||||||
|
|
||||||
void to_variant( const int16_t& var, variant& vo ) { vo = int64_t(var); }
|
|
||||||
// TODO: warn on overflow?
|
|
||||||
void from_variant( const variant& var, int16_t& vo ){ vo = static_cast<int16_t>(var.as_int64()); }
|
|
||||||
|
|
||||||
void to_variant( const std::vector<char>& var, variant& vo )
|
|
||||||
{
|
|
||||||
if( var.size() )
|
|
||||||
//vo = variant(base64_encode((unsigned char*)var.data(),var.size()));
|
|
||||||
vo = variant(to_hex(var.data(),var.size()));
|
|
||||||
else vo = "";
|
|
||||||
}
|
|
||||||
void from_variant( const variant& var, std::vector<char>& vo )
|
|
||||||
{
|
|
||||||
auto str = var.as_string();
|
|
||||||
vo.resize( str.size() / 2 );
|
|
||||||
if( vo.size() )
|
|
||||||
{
|
|
||||||
size_t r = from_hex( str, vo.data(), vo.size() );
|
|
||||||
FC_ASSERT( r = vo.size() );
|
|
||||||
}
|
|
||||||
// std::string b64 = base64_decode( var.as_string() );
|
|
||||||
// vo = std::vector<char>( b64.c_str(), b64.c_str() + b64.size() );
|
|
||||||
}
|
|
||||||
/**
|
/**
|
||||||
* The TypeID is stored in the 'last byte' of the variant.
|
* The TypeID is stored in the 'last byte' of the variant.
|
||||||
*/
|
*/
|
||||||
|
|
@ -59,35 +31,60 @@ variant::variant( fc::nullptr_t )
|
||||||
set_variant_type( this, null_type );
|
set_variant_type( this, null_type );
|
||||||
}
|
}
|
||||||
|
|
||||||
variant::variant( uint32_t val )
|
variant::variant( uint8_t val )
|
||||||
|
{
|
||||||
|
*reinterpret_cast<uint64_t*>(this) = val;
|
||||||
|
set_variant_type( this, uint64_type );
|
||||||
|
}
|
||||||
|
|
||||||
|
variant::variant( int8_t val )
|
||||||
{
|
{
|
||||||
*reinterpret_cast<int64_t*>(this) = val;
|
*reinterpret_cast<int64_t*>(this) = val;
|
||||||
set_variant_type( this, int64_type );
|
set_variant_type( this, int64_type );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
variant::variant( uint16_t val )
|
||||||
|
{
|
||||||
|
*reinterpret_cast<uint64_t*>(this) = val;
|
||||||
|
set_variant_type( this, uint64_type );
|
||||||
|
}
|
||||||
|
|
||||||
|
variant::variant( int16_t val )
|
||||||
|
{
|
||||||
|
*reinterpret_cast<int64_t*>(this) = val;
|
||||||
|
set_variant_type( this, int64_type );
|
||||||
|
}
|
||||||
|
|
||||||
|
variant::variant( uint32_t val )
|
||||||
|
{
|
||||||
|
*reinterpret_cast<uint64_t*>(this) = val;
|
||||||
|
set_variant_type( this, uint64_type );
|
||||||
|
}
|
||||||
|
|
||||||
|
variant::variant( int32_t val )
|
||||||
|
{
|
||||||
|
*reinterpret_cast<int64_t*>(this) = val;
|
||||||
|
set_variant_type( this, int64_type );
|
||||||
|
}
|
||||||
|
|
||||||
|
variant::variant( uint64_t val )
|
||||||
|
{
|
||||||
|
*reinterpret_cast<uint64_t*>(this) = val;
|
||||||
|
set_variant_type( this, uint64_type );
|
||||||
|
}
|
||||||
|
|
||||||
variant::variant( int64_t val )
|
variant::variant( int64_t val )
|
||||||
{
|
{
|
||||||
*reinterpret_cast<int64_t*>(this) = val;
|
*reinterpret_cast<int64_t*>(this) = val;
|
||||||
set_variant_type( this, int64_type );
|
set_variant_type( this, int64_type );
|
||||||
}
|
}
|
||||||
|
|
||||||
variant::variant( int val )
|
|
||||||
{
|
|
||||||
*reinterpret_cast<int64_t*>(this) = val;
|
|
||||||
set_variant_type( this, int64_type );
|
|
||||||
}
|
|
||||||
variant::variant( float val )
|
variant::variant( float val )
|
||||||
{
|
{
|
||||||
*reinterpret_cast<double*>(this) = val;
|
*reinterpret_cast<double*>(this) = val;
|
||||||
set_variant_type( this, double_type );
|
set_variant_type( this, double_type );
|
||||||
}
|
}
|
||||||
|
|
||||||
variant::variant( uint64_t val )
|
|
||||||
{
|
|
||||||
*reinterpret_cast<uint64_t*>(this) = val;
|
|
||||||
set_variant_type( this, uint64_type );
|
|
||||||
}
|
|
||||||
|
|
||||||
variant::variant( double val )
|
variant::variant( double val )
|
||||||
{
|
{
|
||||||
*reinterpret_cast<double*>(this) = val;
|
*reinterpret_cast<double*>(this) = val;
|
||||||
|
|
@ -496,7 +493,6 @@ const string& variant::get_string()const
|
||||||
FC_THROW_EXCEPTION( bad_cast_exception, "Invalid cast from type '${type}' to Object", ("type",get_type()) );
|
FC_THROW_EXCEPTION( bad_cast_exception, "Invalid cast from type '${type}' to Object", ("type",get_type()) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// @throw if get_type() != object_type
|
/// @throw if get_type() != object_type
|
||||||
const variant_object& variant::get_object()const
|
const variant_object& variant::get_object()const
|
||||||
{
|
{
|
||||||
|
|
@ -505,27 +501,45 @@ const variant_object& variant::get_object()const
|
||||||
FC_THROW_EXCEPTION( bad_cast_exception, "Invalid cast from type '${type}' to Object", ("type",get_type()) );
|
FC_THROW_EXCEPTION( bad_cast_exception, "Invalid cast from type '${type}' to Object", ("type",get_type()) );
|
||||||
}
|
}
|
||||||
|
|
||||||
void to_variant( const std::string& s, variant& v )
|
void from_variant( const variant& var, variants& vo )
|
||||||
{
|
{
|
||||||
v = variant( fc::string(s) );
|
vo = var.get_array();
|
||||||
}
|
}
|
||||||
|
|
||||||
//void from_variant( const variant& var, variant_object& vo )
|
//void from_variant( const variant& var, variant_object& vo )
|
||||||
//{
|
//{
|
||||||
// vo = var.get_object();
|
// vo = var.get_object();
|
||||||
//}
|
//}
|
||||||
void from_variant( const variant& var, string& vo )
|
|
||||||
{
|
|
||||||
vo = var.as_string();
|
|
||||||
}
|
|
||||||
|
|
||||||
void from_variant( const variant& var, variants& vo )
|
|
||||||
{
|
|
||||||
vo = var.get_array();
|
|
||||||
}
|
|
||||||
|
|
||||||
void from_variant( const variant& var, variant& vo ) { vo = var; }
|
void from_variant( const variant& var, variant& vo ) { vo = var; }
|
||||||
|
|
||||||
|
void to_variant( const uint8_t& var, variant& vo ) { vo = uint64_t(var); }
|
||||||
|
// TODO: warn on overflow?
|
||||||
|
void from_variant( const variant& var, uint8_t& vo ){ vo = static_cast<uint8_t>(var.as_uint64()); }
|
||||||
|
|
||||||
|
void to_variant( const int8_t& var, variant& vo ) { vo = int64_t(var); }
|
||||||
|
// TODO: warn on overflow?
|
||||||
|
void from_variant( const variant& var, int8_t& vo ){ vo = static_cast<int8_t>(var.as_int64()); }
|
||||||
|
|
||||||
|
void to_variant( const uint16_t& var, variant& vo ) { vo = uint64_t(var); }
|
||||||
|
// TODO: warn on overflow?
|
||||||
|
void from_variant( const variant& var, uint16_t& vo ){ vo = static_cast<uint16_t>(var.as_uint64()); }
|
||||||
|
|
||||||
|
void to_variant( const int16_t& var, variant& vo ) { vo = int64_t(var); }
|
||||||
|
// TODO: warn on overflow?
|
||||||
|
void from_variant( const variant& var, int16_t& vo ){ vo = static_cast<int16_t>(var.as_int64()); }
|
||||||
|
|
||||||
|
void to_variant( const uint32_t& var, variant& vo ) { vo = uint64_t(var); }
|
||||||
|
void from_variant( const variant& var, uint32_t& vo )
|
||||||
|
{
|
||||||
|
vo = static_cast<uint32_t>(var.as_uint64());
|
||||||
|
}
|
||||||
|
|
||||||
|
void from_variant( const variant& var, int32_t& vo )
|
||||||
|
{
|
||||||
|
vo = static_cast<int32_t>(var.as_int64());
|
||||||
|
}
|
||||||
|
|
||||||
void from_variant( const variant& var, int64_t& vo )
|
void from_variant( const variant& var, int64_t& vo )
|
||||||
{
|
{
|
||||||
vo = var.as_int64();
|
vo = var.as_int64();
|
||||||
|
|
@ -551,20 +565,34 @@ void from_variant( const variant& var, float& vo )
|
||||||
vo = static_cast<float>(var.as_double());
|
vo = static_cast<float>(var.as_double());
|
||||||
}
|
}
|
||||||
|
|
||||||
void from_variant( const variant& var, int32_t& vo )
|
void to_variant( const std::string& s, variant& v )
|
||||||
{
|
{
|
||||||
vo = static_cast<int32_t>(var.as_int64());
|
v = variant( fc::string(s) );
|
||||||
}
|
}
|
||||||
|
|
||||||
void to_variant( const uint32_t& var, variant& vo ) { vo = uint64_t(var); }
|
void from_variant( const variant& var, string& vo )
|
||||||
void from_variant( const variant& var, uint32_t& vo )
|
|
||||||
{
|
{
|
||||||
vo = static_cast<uint32_t>(var.as_uint64());
|
vo = var.as_string();
|
||||||
}
|
}
|
||||||
void to_variant( const uint8_t& var, variant& vo ) { vo = uint64_t(var); }
|
|
||||||
void from_variant( const variant& var, uint8_t& vo )
|
void to_variant( const std::vector<char>& var, variant& vo )
|
||||||
{
|
{
|
||||||
vo = static_cast<uint8_t>(var.as_uint64());
|
if( var.size() )
|
||||||
|
//vo = variant(base64_encode((unsigned char*)var.data(),var.size()));
|
||||||
|
vo = variant(to_hex(var.data(),var.size()));
|
||||||
|
else vo = "";
|
||||||
|
}
|
||||||
|
void from_variant( const variant& var, std::vector<char>& vo )
|
||||||
|
{
|
||||||
|
auto str = var.as_string();
|
||||||
|
vo.resize( str.size() / 2 );
|
||||||
|
if( vo.size() )
|
||||||
|
{
|
||||||
|
size_t r = from_hex( str, vo.data(), vo.size() );
|
||||||
|
FC_ASSERT( r = vo.size() );
|
||||||
|
}
|
||||||
|
// std::string b64 = base64_decode( var.as_string() );
|
||||||
|
// vo = std::vector<char>( b64.c_str(), b64.c_str() + b64.size() );
|
||||||
}
|
}
|
||||||
|
|
||||||
string format_string( const string& format, const variant_object& args )
|
string format_string( const string& format, const variant_object& args )
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue