adding support for std::set to variant/raw io

This commit is contained in:
Daniel Larimer 2013-07-05 20:29:36 -04:00
parent a8ab947b20
commit b8e08c97b2
2 changed files with 55 additions and 1 deletions

View file

@ -12,9 +12,16 @@
#include <fc/variant.hpp>
#include <fc/exception/exception.hpp>
#include <fc/log/logger.hpp>
#include <set>
namespace fc {
namespace raw {
template<typename Stream, typename T>
inline void pack( Stream& s, const std::set<T>& value );
template<typename Stream, typename T>
inline void unpack( Stream& s, std::set<T>& value );
template<typename Stream>
inline void pack( Stream& s, const variant_object& v );
template<typename Stream>
@ -106,7 +113,7 @@ namespace fc {
if( b ) { v = T(); unpack( s, *v ); }
}
// std::vector
// std::vector<char>
template<typename Stream> inline void pack( Stream& s, const std::vector<char>& value ) {
pack( s, unsigned_int(value.size()) );
if( value.size() )
@ -235,6 +242,30 @@ namespace fc {
}
}
template<typename Stream, typename T>
inline void pack( Stream& s, const std::set<T>& 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<typename Stream, typename T>
inline void unpack( Stream& s, std::set<T>& 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<typename Stream, typename T>
inline void pack( Stream& s, const T& v ) {
fc::raw::detail::if_reflected< typename fc::reflector<T>::is_defined >::pack(s,v);

View file

@ -5,6 +5,7 @@
#include <memory>
#include <string.h> // memset
#include <unordered_set>
#include <set>
namespace fc
{
@ -44,6 +45,10 @@ namespace fc
void to_variant( const std::unordered_set<T>& var, variant& vo );
template<typename T>
void from_variant( const variant& var, std::unordered_set<T>& vo );
template<typename T>
void to_variant( const std::set<T>& var, variant& vo );
template<typename T>
void from_variant( const variant& var, std::set<T>& 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<T>() );
}
template<typename T>
void to_variant( const std::set<T>& var, variant& vo )
{
std::vector<variant> vars(var.size());
size_t i = 0;
for( auto itr = var.begin(); itr != var.end(); ++itr )
vars[i] = variant(*itr);
vo = vars;
}
template<typename T>
void from_variant( const variant& var, std::set<T>& 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<T>() );
}
/** @ingroup Serializable */
template<typename T>