adding support for std::set to variant/raw io
This commit is contained in:
parent
a8ab947b20
commit
b8e08c97b2
2 changed files with 55 additions and 1 deletions
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
Loading…
Reference in a new issue