OpenFPM_pdata  1.1.0
Project that contain the implementation of distributed structures
 All Data Structures Namespaces Functions Variables Typedefs Enumerations Friends Pages
Packer_util.hpp
1 /*
2  * Packer_util.hpp
3  *
4  * Created on: Jan 25, 2016
5  * Author: Yaroslav Zaluzhnyi
6  */
7 
8 #ifndef PACKER_UTIL_HPP_
9 #define PACKER_UTIL_HPP_
10 
11 #include "prp_all_zero.hpp"
12 #include "Packer_Unpacker/Pack_selector.hpp"
13 #include "memory/HeapMemory.hpp"
14 #include "Vector/map_vector_grow_p.hpp"
15 #include "Vector/vect_isel.hpp"
16 #include "memory_ly/memory_conf.hpp"
17 #include "util/Pack_stat.hpp"
18 
19 template<typename T, typename Mem, int pack_type=Pack_selector<T>::value > class Packer;
20 template<typename T, typename Mem, int pack_type=Pack_selector<T>::value > class Unpacker;
21 
22 #include "Vector/vector_def.hpp"
23 
27 
28 
29 //A functor for call_aggregatePackRequest
30 template<typename encap, typename Mem>
32 {
34  encap & obj;
35 
37  size_t & req;
38 
39  /* \brief Constructor
40  *
41  * \param obj object to pack/serialize
42  * \param req byte to pack/serialize
43  *
44  */
45  call_packRequest_enc_functor(encap & obj, size_t & req)
46  :obj(obj),req(req)
47  {}
48 
50  template<typename T>
51  inline void operator()(T& t)
52  {
53  typedef typename boost::mpl::at<typename encap::T_type,T>::type obj_type;
54 
55  Packer<obj_type,Mem>::packRequest(obj.template get<T::value>(),req);
56  }
57 };
58 
59 
60 //Calls a pack request in nested way
61 template<typename encap, typename Mem, int ... prp>
63 {
70  static inline void call_packRequest(encap & obj, size_t & req)
71  {
72  //Property sequence into boost::mpl::range_c or boost::mpl::vector, depending on sizeof...(prp)
73  typedef typename prp_all_zero<encap,sizeof...(prp) == 0,prp...>::type b_prp;
74 
76 
77  //Apply functor for each property
78  boost::mpl::for_each_ref<b_prp>(functor);
79  }
80 };
81 
82 //A functor for call_aggregatePack
83 template<typename encap, typename Mem>
85 {
88 
90  const encap & obj;
91 
94 
96  :mem(mem), obj(obj), sts(sts)
97  {
98  }
99 
101  template<typename T>
102  inline void operator()(T& t)
103  {
104  typedef typename boost::mpl::at<typename encap::type,T>::type obj_type;
105 
106  Packer<obj_type,Mem>::pack(mem,obj.template get<T::value>(),sts);
107  }
108 };
109 
110 //Calls a packer in nested way
111 template<typename encap, typename Mem, int ... prp>
113 {
114  static inline void call_pack(const encap & obj, ExtPreAlloc<Mem> & mem, Pack_stat & sts)
115  {
116  //Property sequence into boost::mpl::range_c or boost::mpl::vector, depending on sizeof...(prp)
117  typedef typename prp_all_zero<typename encap::T_type,sizeof...(prp) == 0,prp...>::type b_prp;
118 
119  call_pack_enc_functor<encap,Mem> functor(mem,obj,sts);
120 
121  //Apply functor for each property
122  boost::mpl::for_each_ref<b_prp>(functor);
123  }
124 };
125 
126 
127 //A functor for call_aggregateUnpack
128 template<typename encap, typename Mem, int ... prp>
130 {
131  ExtPreAlloc<Mem> & mem;
132  const encap & obj;
133  Unpack_stat & ps;
134 
135  call_unpack_encap_functor(ExtPreAlloc<Mem> & mem, const encap & obj, Unpack_stat & ps)
136  :mem(mem), obj(obj), ps(ps)
137  {
138  }
139 
141  template<typename T>
142  inline void operator()(T& t)
143  {
144  typedef typename boost::mpl::at<typename encap::type,T>::type obj_type;
145 
146  Unpacker<obj_type,Mem>::unpack(mem,obj.template get<T::value>(),ps);
147  }
148 };
149 
150 //Calls an unpacker in nested way
151 template<typename encap, typename Mem, int ... prp>
153 {
154  static inline void call_unpack(encap & obj, ExtPreAlloc<Mem> & mem, Unpack_stat & ps)
155  {
156  //Property sequence into boost::mpl::range_c or boost::mpl::vector, depending on sizeof...(prp)
157  typedef typename prp_all_zero<encap,sizeof...(prp) == 0,prp...>::type b_prp;
158 
160 
161  //Apply functor for each property
162  boost::mpl::for_each_ref<b_prp>(functor);
163  }
164 };
165 
166 
170 
171 //A functor for call_aggregatePackRequest
172 
173 template<typename obj_type, typename Mem>
175 {
177  const obj_type & obj;
178 
180  size_t & req;
181 
182  call_packRequest_agg_functor(const obj_type & obj, size_t & req)
183  :obj(obj),req(req)
184  {}
185 
187  template<typename T>
188  inline void operator()(T& t)
189  {
190  typedef typename boost::mpl::at<typename obj_type::type,T>::type obj_t;
191 
192  //for (size_t i = 0; i < obj_type::max_prop ; i++)
193  Packer<obj_t,Mem>::packRequest(obj.template get<T::value>(),req);
194  }
195 };
196 
197 
198 //Calls a pack request in nested way
199 template<typename obj_type, typename Mem, int ... prp>
201 {
208  static inline void call_packRequest(const obj_type & obj, size_t & req)
209  {
210  //Property sequence into boost::mpl::range_c or boost::mpl::vector, depending on sizeof...(prp)
211  typedef typename prp_all_zero<obj_type,sizeof...(prp) == 0,prp...>::type b_prp;
212 
214 
215  //Apply functor for each property
216  boost::mpl::for_each_ref<b_prp>(functor);
217  }
218 };
219 
220 //A functor for call_aggregatePack
221 template<typename obj_type, typename Mem>
223 {
224  ExtPreAlloc<Mem> & mem;
225  const obj_type & obj;
226  Pack_stat & sts;
227 
228  call_pack_agg_functor(ExtPreAlloc<Mem> & mem, const obj_type & obj, Pack_stat & sts)
229  :mem(mem), obj(obj), sts(sts)
230  {
231  }
232 
234  template<typename T>
235  inline void operator()(T& t)
236  {
237  typedef typename boost::mpl::at<typename obj_type::type,T>::type obj_t;
238 
239  //for (size_t i = 0; i < obj.size(); i++)
240  Packer<obj_t,Mem>::pack(mem,obj.template get<T::value>(),sts);
241  }
242 };
243 
245 template<typename obj_type, typename Mem, int ... prp>
247 {
255  static inline void call_pack(const obj_type & obj, ExtPreAlloc<Mem> & mem, Pack_stat & sts)
256  {
257  //Property sequence into boost::mpl::range_c or boost::mpl::vector, depending on sizeof...(prp)
258  typedef typename prp_all_zero<obj_type,sizeof...(prp) == 0,prp...>::type b_prp;
259 
260  call_pack_agg_functor<obj_type,Mem> functor(mem,obj,sts);
261 
262  //Apply functor for each property
263  boost::mpl::for_each_ref<b_prp>(functor);
264  }
265 };
266 
267 
268 //A functor for call_aggregateUnpack
269 template<typename obj_type, typename Mem>
271 {
274 
276  obj_type & obj;
277 
280 
289  :mem(mem), obj(obj), ps(ps)
290  {
291  }
292 
294  template<typename T>
295  inline void operator()(T& t)
296  {
297  typedef typename boost::mpl::at<typename obj_type::type,T>::type obj_t;
298 
299  //for (size_t i = 0; i < obj.size(); i++)
300  Unpacker<obj_t,Mem>::unpack(mem,obj.template get<T::value>(),ps);
301  }
302 };
303 
305 template<typename obj_type, typename Mem, int ... prp>
307 {
315  static inline void call_unpack(obj_type && obj, ExtPreAlloc<Mem> & mem, Unpack_stat & ps)
316  {
317  //Property sequence into boost::mpl::range_c or boost::mpl::vector, depending on sizeof...(prp)
318  typedef typename prp_all_zero<obj_type,sizeof...(prp) == 0,prp...>::type b_prp;
319 
320  call_unpack_agg_functor<obj_type,Mem> functor(mem,obj,ps);
321 
322  //Apply functor for each property
323  boost::mpl::for_each_ref<b_prp>(functor);
324  }
325 };
326 
327 #endif /* PACKER_UTIL_HPP_ */
void operator()(T &t)
It calls the packer for each property.
Unpack_stat & ps
statistic about packing
Unpacker class.
Definition: Packer_util.hpp:20
void operator()(T &t)
It calls the unpacker for each property.
call_unpack_agg_functor(ExtPreAlloc< Mem > &mem, obj_type &obj, Unpack_stat &ps)
constructor
const encap & obj
Object to serialize.
Definition: Packer_util.hpp:90
size_t & req
offset of the packed memory
ExtPreAlloc< Mem > & mem
Memory that pack/serialize the object.
Definition: Packer_util.hpp:87
void operator()(T &t)
It calls the pack request for each property.
Definition: Packer_util.hpp:51
encap & obj
encap object to pack (serialize)
Definition: Packer_util.hpp:34
void operator()(T &t)
It calls the pack request for each property.
static void call_pack(const obj_type &obj, ExtPreAlloc< Mem > &mem, Pack_stat &sts)
Call the packer.
static size_t packRequest(const T &obj, size_t &req)
Error, no implementation.
Definition: Packer.hpp:59
Packing class.
Definition: Packer.hpp:44
Pack_stat & sts
serialization status
Definition: Packer_util.hpp:93
Unpacking status object.
Definition: Pack_stat.hpp:15
void operator()(T &t)
It calls the unpacker for each property.
obj_type & obj
object to pack
static void unpack(ExtPreAlloc< Mem >, T &obj)
Error, no implementation.
Definition: Unpacker.hpp:36
void operator()(T &t)
It calls the packer for each property.
const obj_type & obj
object to pack
static void call_unpack(obj_type &&obj, ExtPreAlloc< Mem > &mem, Unpack_stat &ps)
constructor
Calls a packer in nested way.
Structure to convert a variadic template into boost::mpl::vector.
static void call_packRequest(const obj_type &obj, size_t &req)
Pack the object.
Calls an unpacker in nested way.
Packing status object.
Definition: Pack_stat.hpp:51
static void pack(ExtPreAlloc< Mem >, const T &obj)
Error, no implementation.
Definition: Packer.hpp:51
ExtPreAlloc< Mem > & mem
Memory where to pack.
size_t & req
byte counter
Definition: Packer_util.hpp:37
static void call_packRequest(encap &obj, size_t &req)
pack/serialize
Definition: Packer_util.hpp:70