#pragma once #include #include #include #include #include namespace fc { namespace raw { template inline void pack( Stream& s, const flat_set& value ) { pack( s, unsigned_int((uint32_t)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, flat_set& value ) { unsigned_int size; unpack( s, size ); value.clear(); FC_ASSERT( size.value*sizeof(T) < MAX_ARRAY_ALLOC_SIZE ); value.reserve(size.value); for( uint32_t i = 0; i < size.value; ++i ) { T tmp; fc::raw::unpack( s, tmp ); value.insert( std::move(tmp) ); } } template inline void pack( Stream& s, const flat_map& value ) { pack( s, unsigned_int((uint32_t)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, flat_map& value ) { unsigned_int size; unpack( s, size ); value.clear(); FC_ASSERT( size.value*(sizeof(K)+sizeof(V)) < MAX_ARRAY_ALLOC_SIZE ); value.reserve(size.value); for( uint32_t i = 0; i < size.value; ++i ) { std::pair tmp; fc::raw::unpack( s, tmp ); value.insert( std::move(tmp) ); } } template void pack( Stream& s, const bip::vector& value ) { pack( s, unsigned_int((uint32_t)value.size()) ); if( !std::is_fundamental::value ) { auto itr = value.begin(); auto end = value.end(); while( itr != end ) { fc::raw::pack( s, *itr ); ++itr; } } else { s.write( (const char*)value.data(), value.size() ); } } template void unpack( Stream& s, bip::vector& value ) { unsigned_int size; unpack( s, size ); value.resize( size ); if( !std::is_fundamental::value ) { for( auto& item : value ) unpack( s, item ); } else { s.read( (char*)value.data(), value.size() ); } } } // namespace raw template void to_variant( const flat_set& var, variant& vo ) { std::vector vars(var.size()); size_t i = 0; for( auto itr = var.begin(); itr != var.end(); ++itr, ++i ) vars[i] = variant(*itr); vo = vars; } template void from_variant( const variant& var, flat_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() ); } template void to_variant( const flat_map& var, variant& vo ) { std::vector< variant > vars(var.size()); size_t i = 0; for( auto itr = var.begin(); itr != var.end(); ++itr, ++i ) vars[i] = fc::variant(*itr); vo = vars; } template void from_variant( const variant& var, flat_map& vo ) { const variants& vars = var.get_array(); vo.clear(); for( auto itr = vars.begin(); itr != vars.end(); ++itr ) vo.insert( itr->as< std::pair >() ); } }