13#ifndef CLASSDESC_PACK_STL_H
14#define CLASSDESC_PACK_STL_H
18#if defined(__cplusplus) && __cplusplus>=201103L
27 typedef unsigned long long uint64;
31 {
typedef typename C::value_type value_type;};
33 template <
class K,
class V,
class C,
class A>
34 struct Value_Type<
std::map<K,V,C,A> > {
typedef std::pair<K,V> value_type;};
36 template <
class K,
class V,
class C,
class A>
38 {
typedef std::pair<K,V> value_type;};
58 Iterator(
T& container): container(&container) {}
59 void operator=(
const typename T::iterator& i) {T::iterator::operator=(i);}
60 typename T::iterator& iter() {
return *
this;}
61 const typename T::iterator& iter()
const {
return *
this;}
74 Iterator(
const T& container): container(&container) {}
75 void operator=(
const typename T::const_iterator& i) {T::const_iterator::operator=(i);}
76 typename T::const_iterator& iter() {
return *
this;}
77 const typename T::const_iterator& iter()
const {
return *
this;}
80 template <
class T,
class A>
81 BinStream& BinStream::operator<<(
const std::vector<T,A>& x)
83 (*this) << uint64(x.size());
85 packer.packraw(
reinterpret_cast<const char*
>(x.data()),
86 x.size()*
sizeof(x[0]));
89 template <
class T,
class A>
90 BinStream& BinStream::operator>>(std::vector<T,A>& x)
94 if (uint64(packer.
size()-packer.
pos())<sz*
sizeof(
T))
95 throw pack_error(
"invalid size for data available");
98 packer.unpackraw(
reinterpret_cast<char*
>(x.data()),
99 x.size()*
sizeof(x[0]));
105 typename enable_if<is_container<T>,
void>::T
108 b << uint64(a.size());
109 for (
typename T::const_iterator i=a.begin(); i!=a.end(); ++i)
112#if defined(__GNUC__) && !defined(__ICC)
113#pragma GCC diagnostic push
114#pragma GCC diagnostic ignored "-Wunused-value"
118 void unpackSequence(classdesc::pack_t& b,
const classdesc::string& d,
T& a)
123 for (
typename T::iterator j=a.begin(); i<sz; ++i, ++j)
125 typename T::value_type x;
127 classdesc::push_back(a, x);
131#if defined(__cplusplus) && __cplusplus>=201103L
132 template <
class T,
size_t N>
133 void unpackSequence(classdesc::pack_t& b,
const classdesc::string& d, std::array<T,N>& a)
137 for (
size_t i=0; i<sz && i<N; ++i)
144 unpack(classdesc::pack_t& b,
const classdesc::string& d,
T& a)
145 {unpackSequence(b,d,a);}
149 unpack(classdesc::pack_t& b,
const classdesc::string&,
const T& a)
153 typename T::value_type x;
154 for (
typename T::size_type i=0; i<sz; ++i) b>>x;
157#if defined(__GNUC__) && !defined(__ICC)
158#pragma GCC diagnostic pop
163 unpack(classdesc::pack_t& b,
const classdesc::string&,
T& a)
168 for (
typename T::size_type i=0; i<sz; ++i)
170 typename classdesc::Value_Type<T>::value_type e;
178 unpack(classdesc::pack_t& b,
const classdesc::string&,
const T& a)
182 for (
typename T::size_type i=0; i<sz; ++i)
184 typename classdesc::Value_Type<T>::value_type e;
202 typename T::size_type i=a.container?
203 std::distance(a.container->begin(),a.iter()): 0;
214 typename T::size_type i;
218 a=a.container->begin();
219 std::advance(a.iter(),i);
229#pragma omit pack std::char_traits
230#pragma omit unpack std::char_traits
231#pragma omit pack std::basic_string
232#pragma omit unpack std::basic_string
233#pragma omit pack std::string
234#pragma omit unpack std::string
237 template <
class cT,
class t,
class A>
243 targ<<classdesc::uint64(arg.size());
244 targ.packraw((
const char*)arg.data(),
sizeof(cT)*arg.size());
248 template <
class cT,
class t,
class A>
251 typedef std::basic_string<cT,t,A> string;
252 void asg(
const string& x,
const std::vector<cT>& b) {}
253 void asg(
string& x,
const std::vector<cT>& b)
256 x=string(b.data(), b.size()-1);
262 classdesc::uint64 size=0; targ>>size;
263 std::vector<cT> buf(size+1);
264 targ.unpackraw(buf.data(),
sizeof(cT)*size);
274#if defined(__GNUC__) && __GNUC__ < 3
280#pragma omit pack std::pair
281#pragma omit unpack std::pair
291 ::pack(targ,desc,arg.first);
292 ::pack(targ,desc,arg.second);
301 ::unpack(targ,desc,arg.first);
302 ::unpack(targ,desc,arg.second);
307#pragma omit pack std::plus
308#pragma omit unpack std::plus
309#pragma omit pack std::minus
310#pragma omit unpack std::minus
311#pragma omit pack std::multiplies
312#pragma omit unpack std::multiplies
313#pragma omit pack std::divides
314#pragma omit unpack std::divides
315#pragma omit pack std::modulus
316#pragma omit unpack std::modulus
317#pragma omit pack negate
318#pragma omit unpack negate
320#pragma omit pack equal_to
321#pragma omit unpack equal_to
322#pragma omit pack not_equal_to
323#pragma omit unpack not_equal_to
324#pragma omit pack less
325#pragma omit unpack less
326#pragma omit pack greater
327#pragma omit unpack greater
328#pragma omit pack less_equal
329#pragma omit unpack less_equal
330#pragma omit pack greater_equal
331#pragma omit unpack greater_equal
333#pragma omit pack logical_and
334#pragma omit unpack logical_and
335#pragma omit pack logical_or
336#pragma omit unpack logical_or
337#pragma omit pack logical_not
338#pragma omit unpack logical_not
340#pragma omit pack identity
341#pragma omit unpack identity
342#pragma omit pack project1st
343#pragma omit unpack project1st
344#pragma omit pack project2nd
345#pragma omit unpack project2nd
346#pragma omit pack select1st
347#pragma omit unpack select1st
348#pragma omit pack select2nd
349#pragma omit unpack select2nd
352#pragma omit pack binary_function
353#pragma omit unpack binary_function
354#pragma omit pack unary_function
355#pragma omit unpack unary_function
359#if defined(__cplusplus) && __cplusplus<201103L
361template <
class A1,
class A2,
class R>
362void pack(
classdesc::pack_t& targ,
const classdesc::string& desc, std::binary_function<A1,A2,R>& arg) {}
364template <
class A1,
class A2,
class R>
365void unpack(
classdesc::pack_t& targ,
const classdesc::string& desc, std::binary_function<A1,A2,R>& arg) {}
368template <
class A,
class R>
369void pack(
classdesc::pack_t& targ,
const classdesc::string& desc, std::unary_function<A,R>& arg) {}
371template <
class A,
class R>
372void unpack(
classdesc::pack_t& targ,
const classdesc::string& desc, std::unary_function<A,R>& arg) {}
375template <
class C>
typename
379template <
class C>
typename
Definition pack_base.h:372
Iterator()
serialisation is a nop if no container provided
Definition pack_stl.h:73
Iterator()
serialisation is a nop if no container provided
Definition pack_stl.h:57
Definition pack_base.h:41
Definition pack_base.h:138
size_t size() const
size of buffer
Definition pack_base.h:170
size_t pos() const
position of read pointer
Definition pack_base.h:171
Contains access_* structs, and nothing else. These structs are used to gain access to private members...
Definition classdesc_access.h:20
Contains definitions related to classdesc functionality.
void pack(pack_t &targ, const string &desc, is_treenode dum, const T *const &arg)
serialise a tree (or DAG)
Definition pack_graph.h:28
void unpack(unpack_t &targ, const string &desc, is_treenode dum, T *&arg)
unserialise a tree.
Definition pack_graph.h:44
controlled template specialisation: stolen from boost::enable_if.
Definition classdesc.h:282
class to allow access to private members
Definition classdesc_access.h:21
class to allow access to private members
Definition classdesc_access.h:22