OpenFPM_pdata  1.1.0
Project that contain the implementation of distributed structures
 All Data Structures Namespaces Functions Variables Typedefs Enumerations Friends Pages
VCluster_meta_function.hpp
1 /*
2  * VCluster_meta_function.hpp
3  *
4  * Created on: Dec 8, 2016
5  * Author: i-bird
6  */
7 
8 #ifndef OPENFPM_VCLUSTER_SRC_VCLUSTER_VCLUSTER_META_FUNCTION_HPP_
9 #define OPENFPM_VCLUSTER_SRC_VCLUSTER_VCLUSTER_META_FUNCTION_HPP_
10 
11 #include "memory/BHeapMemory.hpp"
12 #include "Packer_Unpacker/has_max_prop.hpp"
13 
14 template<bool result, typename T, typename S>
16 {
17  template<typename op,
18  template <typename> class layout_base,
19  int ... prp>
20  static void call_unpack(S & recv,
23  openfpm::vector<size_t> * sz_byte,
24  op & op_param)
25  {
26  if (sz_byte != NULL)
27  sz_byte->resize(recv_buf.size());
28 
29  for (size_t i = 0 ; i < recv_buf.size() ; i++)
30  {
31  T unp;
32 
33  ExtPreAlloc<HeapMemory> & mem = *(new ExtPreAlloc<HeapMemory>(recv_buf.get(i).size(),recv_buf.get(i)));
34  mem.incRef();
35 
36  Unpack_stat ps;
37 
38  Unpacker<T,HeapMemory>::template unpack<>(mem, unp, ps);
39 
40  size_t recv_size_old = recv.size();
41  // Merge the information
42 
43  op_param.template execute<true,T,decltype(recv),decltype(unp),layout_base,prp...>(recv,unp,i);
44 
45  size_t recv_size_new = recv.size();
46 
47  if (sz_byte != NULL)
48  sz_byte->get(i) = recv_buf.get(i).size();
49  if (sz != NULL)
50  sz->get(i) = recv_size_new - recv_size_old;
51 
52  mem.decRef();
53  delete &mem;
54  }
55  }
56 };
57 
58 //
59 template<typename T, typename S>
60 struct unpack_selector_with_prp<true,T,S>
61 {
62  template<typename op,
63  template <typename> class layout_base,
64  unsigned int ... prp>
65  static void call_unpack(S & recv, openfpm::vector<BHeapMemory> & recv_buf, openfpm::vector<size_t> * sz, openfpm::vector<size_t> * sz_byte, op & op_param)
66  {
67  if (sz_byte != NULL)
68  sz_byte->resize(recv_buf.size());
69 
70  for (size_t i = 0 ; i < recv_buf.size() ; i++)
71  {
72  // calculate the number of received elements
73  size_t n_ele = recv_buf.get(i).size() / sizeof(typename T::value_type);
74 
75  // add the received particles to the vector
76  PtrMemory * ptr1 = new PtrMemory(recv_buf.get(i).getPointer(),recv_buf.get(i).size());
77 
78  // create vector representation to a piece of memory already allocated
80 
81  v2.setMemory(*ptr1);
82 
83  // resize with the number of elements
84  v2.resize(n_ele);
85 
86  // Merge the information
87 
88  size_t recv_size_old = recv.size();
89 
90  op_param.template execute<false,T,decltype(recv),decltype(v2),memory_traits_lin,prp...>(recv,v2,i);
91 
92  size_t recv_size_new = recv.size();
93 
94  if (sz_byte != NULL)
95  sz_byte->get(i) = recv_buf.get(i).size();
96  if (sz != NULL)
97  sz->get(i) = recv_size_new - recv_size_old;
98  }
99  }
100 };
101 
102 
103 template<typename T>
105 
106 template<int ... prp>
108 {
109  template<typename T> inline static void call_pr(T & send, size_t & tot_size)
110  {
111  Packer<T,HeapMemory>::template packRequest<prp...>(send,tot_size);
112  }
113 
114  template<typename T> inline static void call_pack(ExtPreAlloc<HeapMemory> & mem, T & send, Pack_stat & sts)
115  {
116  Packer<T,HeapMemory>::template pack<prp...>(mem,send,sts);
117  }
118 
119  template<typename op,
120  typename T,
121  typename S,
122  template <typename> class layout_base>
123  inline static void call_unpack(S & recv,
124  openfpm::vector<BHeapMemory> & recv_buf,
126  openfpm::vector<size_t> * sz_byte,
127  op & op_param)
128  {
129  const bool result = has_pack_gen<typename T::value_type>::value == false && is_vector<T>::value == true;
130 
131  unpack_selector_with_prp<result, T, S>::template call_unpack<op,layout_base,prp...>(recv, recv_buf, sz, sz_byte, op_param);
132  }
133 };
134 
136 template<bool cond,
137  typename op,
138  typename T,
139  typename S,
140  template <typename> class layout_base,
141  unsigned int ... prp>
143 {
144  static void packingRequest(T & send, size_t & tot_size, openfpm::vector<size_t> & sz)
145  {
146  typedef typename ::generate_indexes<int, has_max_prop<T, has_value_type<T>::value>::number, MetaFuncOrd>::result ind_prop_to_pack;
148  //if (has_pack<typename T::value_type>::type::value == false && has_pack_agg<typename T::value_type>::result::value == false && is_vector<T>::value == true)
149  {
150  sz.add(send.size()*sizeof(typename T::value_type));
151  }
152  else
153  {
155 
156  sz.add(tot_size);
157  }
158  }
159 
160  static void packing(ExtPreAlloc<HeapMemory> & mem, T & send, Pack_stat & sts, openfpm::vector<const void *> & send_buf)
161  {
162  typedef typename ::generate_indexes<int, has_max_prop<T, has_value_type<T>::value>::number, MetaFuncOrd>::result ind_prop_to_pack;
164  //if (has_pack<typename T::value_type>::type::value == false && has_pack_agg<typename T::value_type>::result::value == false && is_vector<T>::value == true)
165  {
166  //std::cout << demangle(typeid(T).name()) << std::endl;
167  send_buf.add(send.getPointer());
168  }
169  else
170  {
171  send_buf.add(mem.getPointerEnd());
173  }
174  }
175 
176  static void unpacking(S & recv,
177  openfpm::vector<BHeapMemory> & recv_buf,
179  openfpm::vector<size_t> * sz_byte,
180  op & op_param)
181  {
182  typedef index_tuple<prp...> ind_prop_to_pack;
183  call_serialize_variadic<ind_prop_to_pack>::template call_unpack<op,T,S,layout_base>(recv, recv_buf, sz, sz_byte, op_param);
184  }
185 };
186 
187 
189 
191 template<bool sr>
193 {
195  template<typename T,
196  typename D,
197  typename S,
198  template <typename> class layout_base,
199  int ... prp> static void execute(D & recv,S & v2, size_t i)
200  {
201  // Merge the information
202  recv.template add_prp<typename T::value_type,
203  PtrMemory,
206  layout_base,
207  prp...>(v2);
208  }
209 };
210 
212 template<>
214 {
216  template<typename T,
217  typename D,
218  typename S,
219  template <typename> class layout_base,
220  int ... prp>
221  static void execute(D & recv,S & v2, size_t i)
222  {
223  // Merge the information
224  recv.template add_prp<typename T::value_type,
225  HeapMemory,
228  layout_base,
229  prp...>(v2);
230  }
231 };
232 
234 template<typename op>
236 {
238  template<bool sr,
239  typename T,
240  typename D,
241  typename S,
242  template <typename> class layout_base,
243  int ... prp>
244  static void execute(D & recv,S & v2, size_t i)
245  {
246  // Merge the information
247  op_ssend_recv_add_sr<sr>::template execute<T,D,S,layout_base,prp...>(recv,v2,i);
248  }
249 };
250 
252 template<bool sr,template<typename,typename> class op>
254 {
256  template<typename T,
257  typename D,
258  typename S,
259  template <typename> class layout_base,
260  int ... prp>
261  inline static void execute(D & recv,S & v2,size_t i,openfpm::vector<openfpm::vector<aggregate<size_t,size_t>>> & opart)
262  {
263  // Merge the information
264  recv.template merge_prp_v<op,
265  typename T::value_type,
266  PtrMemory,
268  layout_base,
269  prp...>(v2,opart.get(i));
270  }
271 };
272 
274 template<template<typename,typename> class op>
276 {
278  template<typename T,
279  typename D,
280  typename S,
281  template <typename> class layout_base,
282  int ... prp>
283  inline static void execute(D & recv,S & v2,size_t i,openfpm::vector<openfpm::vector<aggregate<size_t,size_t>>> & opart)
284  {
285  // Merge the information
286  recv.template merge_prp_v<op,
287  typename T::value_type,
288  HeapMemory,
290  layout_base,
291  prp...>(v2,opart.get(i));
292  }
293 };
294 
296 template<template<typename,typename> class op>
298 {
301 
304  :opart(opart)
305  {}
306 
308  template<bool sr,
309  typename T,
310  typename D,
311  typename S,
312  template <typename> class layout_base,
313  int ... prp>
314  void execute(D & recv,S & v2,size_t i)
315  {
316  op_ssend_recv_merge_impl<sr,op>::template execute<T,D,S,layout_base,prp...>(recv,v2,i,opart);
317  }
318 };
319 
321 template<bool sr>
323 {
325  template<typename T,
326  typename D,
327  typename S,
328  template <typename> class layout_base,
329  int ... prp>
330  inline static void execute(D & recv,S & v2,size_t i,size_t & start)
331  {
332  // Merge the information
333  recv.template merge_prp_v<replace_,
334  typename T::value_type,
335  PtrMemory,
337  layout_base,
338  prp...>(v2,start);
339 
340  start += v2.size();
341  }
342 };
343 
345 template<>
347 {
349  template<typename T,
350  typename D,
351  typename S,
352  template <typename> class layout_base,
353  int ... prp> inline static void execute(D & recv,S & v2,size_t i,size_t & start)
354  {
355  // Merge the information
356  recv.template merge_prp_v<replace_,
357  typename T::value_type,
358  HeapMemory,
360  layout_base,
361  prp...>(v2,start);
362 
363  // from
364  start += v2.size();
365  }
366 };
367 
370 {
372  size_t start;
373 
376  :start(start)
377  {}
378 
380  template<bool sr, typename T, typename D, typename S, template <typename> class layout_base, int ... prp> void execute(D & recv,S & v2,size_t i)
381  {
382  op_ssend_gg_recv_merge_impl<sr>::template execute<T,D,S,layout_base,prp...>(recv,v2,i,start);
383  }
384 };
385 
387 
388 
389 
390 #endif /* OPENFPM_VCLUSTER_SRC_VCLUSTER_VCLUSTER_META_FUNCTION_HPP_ */
op_ssend_recv_merge(openfpm::vector< openfpm::vector< aggregate< size_t, size_t >>> &opart)
constructor
static void execute(D &recv, S &v2, size_t i, openfpm::vector< openfpm::vector< aggregate< size_t, size_t >>> &opart)
Merge the.
Derivative second order on h (spacing)
Definition: Derivative.hpp:28
Transform the boost::fusion::vector into memory specification (memory_traits)
Definition: memory_conf.hpp:93
Unpacker class.
Definition: Packer_util.hpp:20
Helper class to merge data.
Grow policy define how the vector should grow every time we exceed the size.
static void execute(D &recv, S &v2, size_t i, openfpm::vector< openfpm::vector< aggregate< size_t, size_t >>> &opart)
merge the data
There is max_prop inside.
size_t start
starting marker
static void execute(D &recv, S &v2, size_t i)
Add data.
Helper class to merge data without serialization.
size_t size()
Stub size.
Definition: map_vector.hpp:70
static void execute(D &recv, S &v2, size_t i)
Add data.
This class allocate, and destroy CPU memory.
Definition: HeapMemory.hpp:39
op_ssend_gg_recv_merge(size_t start)
constructor
Helper class to merge data without serialization.
static void execute(D &recv, S &v2, size_t i, size_t &start)
Merge the.
Grow policy define how the vector should grow every time we exceed the size.
It analyze the type given and it select correctly the implementation for vector.
Definition: vect_isel.hpp:36
openfpm::vector< openfpm::vector< aggregate< size_t, size_t > > > & opart
For each processor contain the list of the particles with which I must merge the information.
Helper class to merge data.
Packing class.
Definition: Packer.hpp:44
static void execute(D &recv, S &v2, size_t i, size_t &start)
merge the data
virtual void incRef()
Increment the reference counter.
Definition: ExtPreAlloc.hpp:69
Unpacking status object.
Definition: Pack_stat.hpp:15
These set of classes generate an array definition at compile-time.
Definition: ct_array.hpp:25
virtual size_t size() const
the the size of the allocated memory
Definition: PtrMemory.cpp:117
It return true if the object T require complex serialization.
Helper class to add data.
Helper class to add data without serialization.
aggregate of properties, from a list of object if create a struct that follow the OPENFPM native stru...
Definition: aggregate.hpp:81
This structure define the operation add to use with copy general.
Packing status object.
Definition: Pack_stat.hpp:51
void execute(D &recv, S &v2, size_t i)
execute the merge
void execute(D &recv, S &v2, size_t i)
execute the merge
void * getPointerEnd()
Return the end pointer of the previous allocated memory.
static void execute(D &recv, S &v2, size_t i)
Add data.
This class give memory from a preallocated memory, memory destruction is not performed.
Definition: PtrMemory.hpp:42