OpenFPM_pdata  1.1.0
Project that contain the implementation of distributed structures
 All Data Structures Namespaces Functions Variables Typedefs Enumerations Friends Pages
object_si_d.hpp
1 /*
2  * vector_prop_copy.hpp
3  *
4  * Created on: May 31, 2015
5  * Author: Pietro Incardona
6  */
7 
8 #ifndef VECTOR_PROP_COPY_HPP_
9 #define VECTOR_PROP_COPY_HPP_
10 
11 #include "for_each_ref.hpp"
12 #include <boost/mpl/range_c.hpp>
13 #include <boost/fusion/include/size.hpp>
14 
26 template<typename v_src,typename v_dst, int... prp>
28 {
30  typedef typename to_boost_vmpl<prp...>::type v_prp;
31 
33  const v_src & src;
34 
36  v_dst & dst;
37 
44  object_si_d_e(const v_src & src, v_dst & dst)
45  :src(src),dst(dst)
46  {
47  };
48 
50  template<typename T>
51  void operator()(T& t)
52  {
53  typedef typename boost::mpl::at<typename v_dst::type,typename boost::mpl::int_<T::value>>::type dtype;
54  typedef decltype(src.template get<boost::mpl::at<v_prp,boost::mpl::int_<T::value>>::type::value>()) stype;
55 
56  meta_copy_d<stype,dtype>::meta_copy_d_(src.template get<boost::mpl::at<v_prp,boost::mpl::int_<T::value>>::type::value>(),dst.template get<T::value>());
57  }
58 };
59 
60 
72 template<typename v_src,typename v_dst, int... prp>
74 {
75  // Convert the packed properties into an MPL vector
76  typedef typename to_boost_vmpl<prp...>::type v_prp;
77 
78  // Source object
79  const v_src & src;
80 
81  // Destination object
82  v_dst & dst;
83 
90  object_si_d_f(const v_src & src, v_dst & dst)
91  :src(src),dst(dst)
92  {
93  };
94 
96  template<typename T>
97  void operator()(T& t)
98  {
99  typedef typename boost::mpl::at<typename v_dst::type,typename boost::mpl::int_<T::value>>::type ctype;
100 
101  meta_copy<ctype>::meta_copy_(boost::fusion::at_c<boost::mpl::at<v_prp,boost::mpl::int_<T::value>>::type::value>(src.data),boost::fusion::at_c<T::value>(dst.data));
102  }
103 };
104 
105 #define OBJ_ENCAP 1
106 #define OBJ_NORMAL 2
107 
116 template<typename v_src, typename v_dst,int type_copy, int... prp>
118 {
119  inline object_si_d(const v_src & vs, v_dst & vd)
120  {
121  std::cerr << "Error object_copy: " << __FILE__ << " " << __LINE__ << "\n";
122  };
123 };
124 
134 template<typename v_src, typename v_dst, int... prp>
135 struct object_si_d<v_src,v_dst,OBJ_NORMAL,prp...>
136 {
137  inline object_si_d(const v_src && vs, v_dst && vd)
138  {
139  object_si_d_f<v_src,v_dst,prp...> obj(vs,vd);
140  boost::mpl::for_each_ref< boost::mpl::range_c<int,0,v_dst::max_prop> >(obj);
141  }
142 
143  inline object_si_d(const v_src & vs, v_dst & vd)
144  {
145  object_si_d_f<v_src,v_dst,prp...> obj(vs,vd);
146  boost::mpl::for_each_ref< boost::mpl::range_c<int,0,v_dst::max_prop> >(obj);
147  }
148 };
149 
164 template<typename v_src, typename v_dst, int... prp>
165 struct object_si_d<v_src,v_dst,OBJ_ENCAP,prp...>
166 {
167  inline object_si_d(const v_src && vs, v_dst && vd)
168  {
169  object_si_d_e<v_src,v_dst,prp...> obj(vs,vd);
170  boost::mpl::for_each_ref< boost::mpl::range_c<int,0,v_dst::max_prop> >(obj);
171  }
172 
173  inline object_si_d(const v_src & vs, v_dst & vd)
174  {
175  object_si_d_e<v_src,v_dst,prp...> obj(vs,vd);
176  boost::mpl::for_each_ref< boost::mpl::range_c<int,0,v_dst::max_prop> >(obj);
177  }
178 };
179 
180 template<typename v_src, typename v_dst>
181 struct object_si_d<v_src,v_dst,OBJ_ENCAP>
182 {
183  inline object_si_d(const v_src && vs, v_dst && vd)
184  {
185  }
186 
187  inline object_si_d(const v_src & vs, v_dst & vd)
188  {
189  }
190 };
191 
192 #endif /* VECTOR_PROP_COPY_HPP_ */
v_dst & dst
Destination object.
Definition: object_si_d.hpp:36
const v_src & src
Source object.
Definition: object_si_d.hpp:33
static void meta_copy_(const T &src, T &dst)
copy and object from src to dst
Definition: meta_copy.hpp:37
object_si_d_f(const v_src &src, v_dst &dst)
Constructor.
Definition: object_si_d.hpp:90
to_boost_vmpl< prp...>::type v_prp
Convert the packed properties into an MPL vector.
Definition: object_si_d.hpp:30
void operator()(T &t)
It call the functor for each member.
Definition: object_si_d.hpp:51
void operator()(T &t)
It call the functor for each member.
Definition: object_si_d.hpp:97
this class is a functor for "for_each" algorithm
Definition: object_si_d.hpp:27
this class is a functor for "for_each" algorithm
Definition: object_si_d.hpp:73
static void meta_copy_d_(const Tsrc &src, Tdst &dst)
copy and object from src to dst
Definition: meta_copy.hpp:69
It copy the properties from one object to another.
object_si_d_e(const v_src &src, v_dst &dst)
Constructor.
Definition: object_si_d.hpp:44