diff --git a/include/fc/variant.hpp b/include/fc/variant.hpp index 11ab95a..ebb6934 100644 --- a/include/fc/variant.hpp +++ b/include/fc/variant.hpp @@ -93,10 +93,17 @@ namespace fc template void from_variant( const variant& var, fc::flat_map& vo ); + template + void to_variant( const std::map& var, variant& vo ); + template + void from_variant( const variant& var, std::map& vo ); + template void to_variant( const std::map& var, variant& vo ); template void from_variant( const variant& var, std::map& vo ); + + template void to_variant( const std::multimap& var, variant& vo ); template @@ -401,6 +408,8 @@ namespace fc vo.insert( itr->as< std::pair >() ); } + + template void to_variant( const std::map& var, variant& vo ) { diff --git a/include/fc/variant_object.hpp b/include/fc/variant_object.hpp index 5a39c80..99b0d86 100644 --- a/include/fc/variant_object.hpp +++ b/include/fc/variant_object.hpp @@ -5,6 +5,7 @@ namespace fc { + using std::map; class mutable_variant_object; /** @@ -66,6 +67,15 @@ namespace fc /** initializes the first key/value pair in the object */ variant_object( string key, variant val ); + + template + variant_object( const map& values ) + :_key_value( new std::vector() ) { + _key_value->reserve( values.size() ); + for( const auto& item : values ) { + _key_value->emplace_back( entry( item.first, fc::variant(item.second) ) ); + } + } template variant_object( string key, T&& val ) @@ -196,6 +206,15 @@ namespace fc mutable_variant_object(); + template + mutable_variant_object( const map& values ) + :_key_value( new std::vector() ) { + _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 */ mutable_variant_object( string key, variant val ); template @@ -212,6 +231,8 @@ namespace fc mutable_variant_object& operator=( mutable_variant_object&& ); mutable_variant_object& operator=( const mutable_variant_object& ); mutable_variant_object& operator=( const variant_object& ); + + private: std::unique_ptr< std::vector< entry > > _key_value; friend class variant_object; @@ -221,4 +242,19 @@ namespace fc /** @ingroup Serializable */ void from_variant( const variant& var, mutable_variant_object& vo ); + template + void to_variant( const std::map& var, variant& vo ) + { + vo = variant_object( var ); + } + + template + void from_variant( const variant& var, std::map& vo ) + { + const auto& obj = var.get_object(); + vo.clear(); + for( auto itr = obj.begin(); itr != obj.end(); ++itr ) + vo[itr->key()] = itr->value().as(); + } + } // namespace fc diff --git a/src/rpc/websocket_api.cpp b/src/rpc/websocket_api.cpp index 39381ab..df09a68 100644 --- a/src/rpc/websocket_api.cpp +++ b/src/rpc/websocket_api.cpp @@ -74,6 +74,7 @@ std::string websocket_api_connection::on_message( const std::string& message, bool send_message /* = true */ ) { + wdump((message)); try { auto var = fc::json::from_string(message); diff --git a/src/variant_object.cpp b/src/variant_object.cpp index 6f3b1dc..38851b0 100644 --- a/src/variant_object.cpp +++ b/src/variant_object.cpp @@ -163,6 +163,7 @@ namespace fc return *this; } + void to_variant( const variant_object& var, variant& vo ) { vo = variant(var); diff --git a/vendor/websocketpp b/vendor/websocketpp index 378437a..c5510d6 160000 --- a/vendor/websocketpp +++ b/vendor/websocketpp @@ -1 +1 @@ -Subproject commit 378437aecdcb1dfe62096ffd5d944bf1f640ccc3 +Subproject commit c5510d6de04917812b910a8dd44735c1f17061d9