change json seralization of map<string,T> to be object rather than array of pairs

This commit is contained in:
Daniel Larimer 2016-03-17 17:24:25 -04:00
parent 0dca15c395
commit a421e28048
5 changed files with 48 additions and 1 deletions

View file

@ -93,10 +93,17 @@ namespace fc
template<typename K, typename T> template<typename K, typename T>
void from_variant( const variant& var, fc::flat_map<K,T>& vo ); void from_variant( const variant& var, fc::flat_map<K,T>& vo );
template<typename T>
void to_variant( const std::map<string,T>& var, variant& vo );
template<typename T>
void from_variant( const variant& var, std::map<string,T>& vo );
template<typename K, typename T> template<typename K, typename T>
void to_variant( const std::map<K,T>& var, variant& vo ); void to_variant( const std::map<K,T>& var, variant& vo );
template<typename K, typename T> template<typename K, typename T>
void from_variant( const variant& var, std::map<K,T>& vo ); void from_variant( const variant& var, std::map<K,T>& vo );
template<typename K, typename T> template<typename K, typename T>
void to_variant( const std::multimap<K,T>& var, variant& vo ); void to_variant( const std::multimap<K,T>& var, variant& vo );
template<typename K, typename T> template<typename K, typename T>
@ -401,6 +408,8 @@ namespace fc
vo.insert( itr->as< std::pair<K,T> >() ); vo.insert( itr->as< std::pair<K,T> >() );
} }
template<typename K, typename T> template<typename K, typename T>
void to_variant( const std::map<K, T>& var, variant& vo ) void to_variant( const std::map<K, T>& var, variant& vo )
{ {

View file

@ -5,6 +5,7 @@
namespace fc namespace fc
{ {
using std::map;
class mutable_variant_object; class mutable_variant_object;
/** /**
@ -66,6 +67,15 @@ namespace fc
/** initializes the first key/value pair in the object */ /** initializes the first key/value pair in the object */
variant_object( string key, variant val ); variant_object( string key, variant val );
template<typename T>
variant_object( const map<string,T>& values )
:_key_value( new std::vector<entry>() ) {
_key_value->reserve( values.size() );
for( const auto& item : values ) {
_key_value->emplace_back( entry( item.first, fc::variant(item.second) ) );
}
}
template<typename T> template<typename T>
variant_object( string key, T&& val ) variant_object( string key, T&& val )
@ -196,6 +206,15 @@ namespace fc
mutable_variant_object(); mutable_variant_object();
template<typename T>
mutable_variant_object( const map<string,T>& values )
:_key_value( new std::vector<entry>() ) {
_key_value->reserve( values.size() );
for( const auto& item : values ) {
_key_value->emplace_back( variant_object::entry( item.first, fc::variant(item.second) ) );
}
}
/** initializes the first key/value pair in the object */ /** initializes the first key/value pair in the object */
mutable_variant_object( string key, variant val ); mutable_variant_object( string key, variant val );
template<typename T> template<typename T>
@ -212,6 +231,8 @@ namespace fc
mutable_variant_object& operator=( mutable_variant_object&& ); mutable_variant_object& operator=( mutable_variant_object&& );
mutable_variant_object& operator=( const mutable_variant_object& ); mutable_variant_object& operator=( const mutable_variant_object& );
mutable_variant_object& operator=( const variant_object& ); mutable_variant_object& operator=( const variant_object& );
private: private:
std::unique_ptr< std::vector< entry > > _key_value; std::unique_ptr< std::vector< entry > > _key_value;
friend class variant_object; friend class variant_object;
@ -221,4 +242,19 @@ namespace fc
/** @ingroup Serializable */ /** @ingroup Serializable */
void from_variant( const variant& var, mutable_variant_object& vo ); void from_variant( const variant& var, mutable_variant_object& vo );
template<typename T>
void to_variant( const std::map<string, T>& var, variant& vo )
{
vo = variant_object( var );
}
template<typename T>
void from_variant( const variant& var, std::map<string, T>& vo )
{
const auto& obj = var.get_object();
vo.clear();
for( auto itr = obj.begin(); itr != obj.end(); ++itr )
vo[itr->key()] = itr->value().as<T>();
}
} // namespace fc } // namespace fc

View file

@ -74,6 +74,7 @@ std::string websocket_api_connection::on_message(
const std::string& message, const std::string& message,
bool send_message /* = true */ ) bool send_message /* = true */ )
{ {
wdump((message));
try try
{ {
auto var = fc::json::from_string(message); auto var = fc::json::from_string(message);

View file

@ -163,6 +163,7 @@ namespace fc
return *this; return *this;
} }
void to_variant( const variant_object& var, variant& vo ) void to_variant( const variant_object& var, variant& vo )
{ {
vo = variant(var); vo = variant(var);

2
vendor/websocketpp vendored

@ -1 +1 @@
Subproject commit 378437aecdcb1dfe62096ffd5d944bf1f640ccc3 Subproject commit c5510d6de04917812b910a8dd44735c1f17061d9