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.