From b391ecb4c7992cb2d091bf1ce79506ec2767d4a6 Mon Sep 17 00:00:00 2001 From: theoreticalbts Date: Thu, 28 May 2015 14:39:52 -0400 Subject: [PATCH 1/3] deque: Add std::deque to serialization / reflection --- include/fc/container/deque.hpp | 52 ++++++++++++++++++++++++++++++ include/fc/container/deque_fwd.hpp | 13 ++++++++ include/fc/io/raw_fwd.hpp | 5 +++ include/fc/reflect/typename.hpp | 17 ++++++++-- include/fc/variant.hpp | 1 + 5 files changed, 86 insertions(+), 2 deletions(-) create mode 100644 include/fc/container/deque.hpp create mode 100644 include/fc/container/deque_fwd.hpp diff --git a/include/fc/container/deque.hpp b/include/fc/container/deque.hpp new file mode 100644 index 0000000..224b02d --- /dev/null +++ b/include/fc/container/deque.hpp @@ -0,0 +1,52 @@ +#pragma once + +#include + +namespace fc { + namespace raw { + + template + inline void pack( Stream& s, const std::deque& 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, std::deque& value ) { + unsigned_int size; unpack( s, size ); + FC_ASSERT( size.value*sizeof(T) < MAX_ARRAY_ALLOC_SIZE ); + value.resize(size.value); + auto itr = value.begin(); + auto end = value.end(); + while( itr != end ) { + fc::raw::unpack( s, *itr ); + ++itr; + } + } + + } // namespace raw + + template + void to_variant( const std::deque& 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, std::deque& 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() ); + } +} // namespace fc diff --git a/include/fc/container/deque_fwd.hpp b/include/fc/container/deque_fwd.hpp new file mode 100644 index 0000000..80359ea --- /dev/null +++ b/include/fc/container/deque_fwd.hpp @@ -0,0 +1,13 @@ +#pragma once + +#include + +namespace fc { + + namespace raw { + template + void pack( Stream& s, const std::deque& value ); + template + void unpack( Stream& s, std::deque& value ); + } +} // namespace fc diff --git a/include/fc/io/raw_fwd.hpp b/include/fc/io/raw_fwd.hpp index d75f6c0..9192ca3 100644 --- a/include/fc/io/raw_fwd.hpp +++ b/include/fc/io/raw_fwd.hpp @@ -1,8 +1,10 @@ #pragma once #include +#include #include #include #include +#include #include #include #include @@ -40,6 +42,9 @@ namespace fc { template inline void pack( Stream& s, const flat_set& value ); template inline void unpack( Stream& s, flat_set& value ); + template inline void pack( Stream& s, const std::deque& value ); + template inline void unpack( Stream& s, std::deque& value ); + template inline void pack( Stream& s, const std::unordered_map& value ); template inline void unpack( Stream& s, std::unordered_map& value ); diff --git a/include/fc/reflect/typename.hpp b/include/fc/reflect/typename.hpp index a7d3503..312c927 100644 --- a/include/fc/reflect/typename.hpp +++ b/include/fc/reflect/typename.hpp @@ -1,9 +1,14 @@ #pragma once + +#include +#include +#include + #include #include -#include -#include + #include +#include namespace fc { class value; @@ -42,6 +47,14 @@ namespace fc { return n.c_str(); } }; + template struct get_typename< std::deque > + { + static const char* name() + { + static std::string n = std::string("std::deque<") + get_typename::name() + ">"; + return n.c_str(); + } + }; template struct get_typename> { static const char* name() { diff --git a/include/fc/variant.hpp b/include/fc/variant.hpp index aff502c..a3f5ccb 100644 --- a/include/fc/variant.hpp +++ b/include/fc/variant.hpp @@ -9,6 +9,7 @@ #include #include #include +#include namespace fc { From 0ad91391c75d5ac36a17c7bcc3b4ac6bc8854319 Mon Sep 17 00:00:00 2001 From: theoreticalbts Date: Mon, 1 Jun 2015 17:12:36 -0400 Subject: [PATCH 2/3] variant.hpp: Prettify includes --- include/fc/variant.hpp | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/include/fc/variant.hpp b/include/fc/variant.hpp index a3f5ccb..a373efb 100644 --- a/include/fc/variant.hpp +++ b/include/fc/variant.hpp @@ -1,15 +1,19 @@ #pragma once + +#include +#include +#include +#include +#include +#include #include + +#include // memset + #include #include -#include -#include // memset -#include -#include -#include -#include -#include #include +#include namespace fc { From 1bbb748c4ebbaaf42440cec220562c8c2027cb80 Mon Sep 17 00:00:00 2001 From: Nathan Hourt Date: Thu, 4 Jun 2015 10:42:59 -0400 Subject: [PATCH 3/3] Optimize deque to/from variant --- include/fc/container/deque.hpp | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/include/fc/container/deque.hpp b/include/fc/container/deque.hpp index 224b02d..d59a1ad 100644 --- a/include/fc/container/deque.hpp +++ b/include/fc/container/deque.hpp @@ -34,10 +34,9 @@ namespace fc { template void to_variant( const std::deque& 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); + std::vector vars; + vars.reserve(var.size()); + std::transform(var.begin(), var.end(), std::back_inserter(vars), [](const T& t) { return variant(t); }); vo = vars; } template @@ -45,8 +44,6 @@ namespace fc { { 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() ); + std::transform(vars.begin(), vars.end(), std::back_inserter(vo), [](const variant& t) { return t.template as(); }); } } // namespace fc