diff --git a/include/fc/io/raw.hpp b/include/fc/io/raw.hpp index 5d4b81f..5163036 100644 --- a/include/fc/io/raw.hpp +++ b/include/fc/io/raw.hpp @@ -12,9 +12,16 @@ #include #include #include +#include namespace fc { namespace raw { + + template + inline void pack( Stream& s, const std::set& value ); + template + inline void unpack( Stream& s, std::set& value ); + template inline void pack( Stream& s, const variant_object& v ); template @@ -106,7 +113,7 @@ namespace fc { if( b ) { v = T(); unpack( s, *v ); } } - // std::vector + // std::vector template inline void pack( Stream& s, const std::vector& value ) { pack( s, unsigned_int(value.size()) ); if( value.size() ) @@ -235,6 +242,30 @@ namespace fc { } } + template + inline void pack( Stream& s, const std::set& value ) { + pack( s, unsigned_int(value.size()) ); + auto itr = value.begin(); + auto end = value.end(); + while( itr != end ) { + fc::raw::pack( s, *itr ); + ++itr; + } + } + + template + inline void unpack( Stream& s, std::set& value ) { + unsigned_int size; unpack( s, size ); + for( uint64_t i = 0; i < size.value; ++i ) + { + T tmp; + unpack( s, tmp ); + value.insert( std::move(tmp) ); + } + } + + + template inline void pack( Stream& s, const T& v ) { fc::raw::detail::if_reflected< typename fc::reflector::is_defined >::pack(s,v); diff --git a/include/fc/variant.hpp b/include/fc/variant.hpp index c248682..ed5c02b 100644 --- a/include/fc/variant.hpp +++ b/include/fc/variant.hpp @@ -5,6 +5,7 @@ #include #include // memset #include +#include namespace fc { @@ -44,6 +45,10 @@ namespace fc void to_variant( const std::unordered_set& var, variant& vo ); template void from_variant( const variant& var, std::unordered_set& vo ); + template + void to_variant( const std::set& var, variant& vo ); + template + void from_variant( const variant& var, std::set& vo ); void to_variant( const time_point& var, variant& vo ); void from_variant( const variant& var, time_point& vo ); @@ -269,6 +274,24 @@ namespace fc for( auto itr = vars.begin(); itr != vars.end(); ++itr ) vo.insert( itr->as() ); } + template + void to_variant( const std::set& var, variant& vo ) + { + std::vector vars(var.size()); + size_t i = 0; + for( auto itr = var.begin(); itr != var.end(); ++itr ) + vars[i] = variant(*itr); + vo = vars; + } + template + void from_variant( const variant& var, std::set& vo ) + { + const variants& vars = var.get_array(); + vo.clear(); + vo.reserve( vars.size() ); + for( auto itr = vars.begin(); itr != vars.end(); ++itr ) + vo.insert( itr->as() ); + } /** @ingroup Serializable */ template