Adding support for flat_map,flat_set
This commit is contained in:
parent
ec66863902
commit
7e34d8fe56
4 changed files with 140 additions and 0 deletions
96
include/fc/container/flat.hpp
Normal file
96
include/fc/container/flat.hpp
Normal 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> >() );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
23
include/fc/container/flat_fwd.hpp
Normal file
23
include/fc/container/flat_fwd.hpp
Normal 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
|
||||
|
|
@ -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 );
|
||||
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
Loading…
Reference in a new issue