Add missing integer variant conversions

This commit is contained in:
Vikram Rajkumar 2014-07-28 22:36:47 -04:00
parent f644b1e475
commit a23f3a86be
2 changed files with 106 additions and 69 deletions

View file

@ -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 );

View file

@ -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 )