Adding support for flat_map,flat_set

This commit is contained in:
Daniel Larimer 2015-02-23 09:06:04 -05:00
parent ec66863902
commit 7e34d8fe56
4 changed files with 140 additions and 0 deletions

View file

@ -0,0 +1,96 @@
#pragma once
#include <fc/variant.hpp>
#include <boost/container/flat_map.hpp>
#include <boost/container/flat_set.hpp>
namespace fc {
namespace raw {
template<typename Stream, typename T>
inline void pack( Stream& s, const flat_set<T>& 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<typename Stream, typename T>
inline void unpack( Stream& s, flat_set<T>& 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<typename Stream, typename K, typename V>
inline void pack( Stream& s, const flat_map<K,V>& 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<typename Stream, typename K, typename V>
inline void unpack( Stream& s, flat_map<K,V>& 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<K,V> tmp;
fc::raw::unpack( s, tmp );
value.insert( std::move(tmp) );
}
}
} // namespace raw
template<typename T>
void to_variant( const flat_set<T>& 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] = variant(*itr);
vo = vars;
}
template<typename T>
void from_variant( const variant& var, flat_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>() );
}
template<typename K, typename T>
void to_variant( const flat_map<K, T>& 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<typename K, typename T>
void from_variant( const variant& var, flat_map<K, T>& vo )
{
const variants& vars = var.get_array();
vo.clear();
for( auto itr = vars.begin(); itr != vars.end(); ++itr )
vo.insert( itr->as< std::pair<K,T> >() );
}
}

View file

@ -0,0 +1,23 @@
#pragma once
namespace boost { namespace container {
template<typename Key,
typename Compare,
typename Allocator >
class flat_set;
template<typename Key,
typename T,
typename Compare,
typename Allocator >
class flat_map;
} } // boost::container
namespace fc {
template<typename K, typename V>
using flat_map = boost::container::flat_map<K,V,std::less<K>,std::allocator<std::pair<K,V>> >;
template<typename V>
using flat_set = boost::container::flat_set<V,std::less<V>, std::allocator<V> >;
} // fc

View file

@ -7,6 +7,7 @@
#include <unordered_set>
#include <unordered_map>
#include <set>
#include <fc/container/flat_fwd.hpp>
namespace fc {
class time_point;
@ -29,11 +30,18 @@ namespace fc {
template<typename Stream, typename T> inline void pack( Stream& s, const std::unordered_set<T>& value );
template<typename Stream, typename T> inline void unpack( Stream& s, std::unordered_set<T>& value );
template<typename Stream, typename T> inline void pack( Stream& s, const flat_set<T>& value );
template<typename Stream, typename T> inline void unpack( Stream& s, flat_set<T>& value );
template<typename Stream, typename K, typename V> inline void pack( Stream& s, const std::unordered_map<K,V>& value );
template<typename Stream, typename K, typename V> inline void unpack( Stream& s, std::unordered_map<K,V>& value );
template<typename Stream, typename K, typename V> inline void pack( Stream& s, const std::map<K,V>& value );
template<typename Stream, typename K, typename V> inline void unpack( Stream& s, std::map<K,V>& value );
template<typename Stream, typename K, typename V> inline void pack( Stream& s, const flat_map<K,V>& value );
template<typename Stream, typename K, typename V> inline void unpack( Stream& s, flat_map<K,V>& value );
template<typename Stream, typename K, typename V> inline void pack( Stream& s, const std::pair<K,V>& value );
template<typename Stream, typename K, typename V> inline void unpack( Stream& s, std::pair<K,V>& value );

View file

@ -8,6 +8,7 @@
#include <unordered_map>
#include <map>
#include <set>
#include <fc/container/flat_fwd.hpp>
namespace fc
{
@ -65,6 +66,12 @@ namespace fc
void to_variant( const std::unordered_map<K,T>& var, variant& vo );
template<typename K, typename T>
void from_variant( const variant& var, std::unordered_map<K,T>& vo );
template<typename K, typename T>
void to_variant( const flat_map<K,T>& var, variant& vo );
template<typename K, typename T>
void from_variant( const variant& var, flat_map<K,T>& vo );
template<typename K, typename T>
void to_variant( const std::map<K,T>& var, variant& vo );
template<typename K, typename T>
@ -79,6 +86,12 @@ 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 flat_set<T>& var, variant& vo );
template<typename T>
void from_variant( const variant& var, flat_set<T>& vo );
template<typename T>
void to_variant( const std::set<T>& var, variant& vo );
template<typename T>