8 #ifndef OPENFPM_VCLUSTER_SRC_VCLUSTER_VCLUSTER_META_FUNCTION_HPP_
9 #define OPENFPM_VCLUSTER_SRC_VCLUSTER_VCLUSTER_META_FUNCTION_HPP_
11 #include "memory/BHeapMemory.hpp"
12 #include "Packer_Unpacker/has_max_prop.hpp"
14 template<
bool result,
typename T,
typename S>
18 template <
typename>
class layout_base,
20 static void call_unpack(S & recv,
27 sz_byte->resize(recv_buf.
size());
29 for (
size_t i = 0 ; i < recv_buf.
size() ; i++)
40 size_t recv_size_old = recv.size();
43 op_param.template execute<
true,T,decltype(recv),decltype(unp),layout_base,prp...>(recv,unp,i);
45 size_t recv_size_new = recv.size();
48 sz_byte->get(i) = recv_buf.get(i).
size();
50 sz->get(i) = recv_size_new - recv_size_old;
59 template<
typename T,
typename S>
63 template <
typename>
class layout_base,
68 sz_byte->resize(recv_buf.
size());
70 for (
size_t i = 0 ; i < recv_buf.
size() ; i++)
73 size_t n_ele = recv_buf.get(i).
size() /
sizeof(
typename T::value_type);
88 size_t recv_size_old = recv.size();
90 op_param.template execute<
false,T,decltype(recv),decltype(v2),memory_traits_lin,prp...>(recv,v2,i);
92 size_t recv_size_new = recv.
size();
95 sz_byte->get(i) = recv_buf.get(i).
size();
97 sz->get(i) = recv_size_new - recv_size_old;
106 template<
int ... prp>
109 template<
typename T>
inline static void call_pr(T & send,
size_t & tot_size)
119 template<
typename op,
122 template <
typename>
class layout_base>
123 inline static void call_unpack(S & recv,
140 template <
typename>
class layout_base,
141 unsigned int ... prp>
146 typedef typename ::generate_indexes<int, has_max_prop<T, has_value_type<T>::value>::number,
MetaFuncOrd>::result ind_prop_to_pack;
150 sz.add(send.size()*
sizeof(
typename T::value_type));
162 typedef typename ::generate_indexes<int, has_max_prop<T, has_value_type<T>::value>::number,
MetaFuncOrd>::result ind_prop_to_pack;
167 send_buf.add(send.getPointer());
176 static void unpacking(S & recv,
198 template <
typename>
class layout_base,
199 int ... prp>
static void execute(
D & recv,S & v2,
size_t i)
202 recv.template add_prp<
typename T::value_type,
219 template <
typename>
class layout_base,
224 recv.template add_prp<
typename T::value_type,
234 template<
typename op>
242 template <
typename>
class layout_base,
252 template<
bool sr,
template<
typename,
typename>
class op>
259 template <
typename>
class layout_base,
264 recv.template merge_prp_v<op,
265 typename T::value_type,
269 prp...>(v2,opart.get(i));
274 template<
template<
typename,
typename>
class op>
281 template <
typename>
class layout_base,
286 recv.template merge_prp_v<op,
287 typename T::value_type,
291 prp...>(v2,opart.get(i));
296 template<
template<
typename,
typename>
class op>
312 template <
typename>
class layout_base,
328 template <
typename>
class layout_base,
330 inline static void execute(
D & recv,S & v2,
size_t i,
size_t & start)
334 typename T::value_type,
352 template <
typename>
class layout_base,
353 int ... prp>
inline static void execute(
D & recv,S & v2,
size_t i,
size_t & start)
357 typename T::value_type,
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)
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)
Transform the boost::fusion::vector into memory specification (memory_traits)
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.
static void execute(D &recv, S &v2, size_t i)
Add data.
This class allocate, and destroy CPU memory.
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.
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.
static void execute(D &recv, S &v2, size_t i, size_t &start)
merge the data
virtual void incRef()
Increment the reference counter.
These set of classes generate an array definition at compile-time.
virtual size_t size() const
the the size of the allocated memory
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...
This structure define the operation add to use with copy general.
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.