diff --git a/include/fc/container/deque.hpp b/include/fc/container/deque.hpp new file mode 100644 index 0000000..d59a1ad --- /dev/null +++ b/include/fc/container/deque.hpp @@ -0,0 +1,49 @@ +#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; + vars.reserve(var.size()); + std::transform(var.begin(), var.end(), std::back_inserter(vars), [](const T& t) { return variant(t); }); + vo = vars; + } + template + void from_variant( const variant& var, std::deque& vo ) + { + const variants& vars = var.get_array(); + vo.clear(); + std::transform(vars.begin(), vars.end(), std::back_inserter(vo), [](const variant& t) { return t.template 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 142a2f4..2b9012d 100644 --- a/include/fc/variant.hpp +++ b/include/fc/variant.hpp @@ -1,13 +1,18 @@ #pragma once + +#include +#include +#include +#include +#include +#include #include + +#include // memset + #include #include -#include -#include // memset -#include -#include -#include -#include +#include #include namespace fc