8#ifndef OBJECT_WRITE_HPP_
9#define OBJECT_WRITE_HPP_
12#include "for_each_ref.hpp"
13#include "util/variadic_to_vmpl.hpp"
14#include "util/copy_compare/meta_copy.hpp"
15#include <boost/mpl/range_c.hpp>
16#include <boost/fusion/include/size.hpp>
21 template<
unsigned int T_value,
typename v_prp,
typename copy_rtype,
typename Tsrc,
typename Tdst>
22 static inline void copy(
const Tsrc & src, Tdst & dst,
int sub_id)
28template<
unsigned int N1,
typename T>
31 template<
unsigned int T_value,
typename v_prp,
typename copy_rtype,
typename Tsrc,
typename Tdst>
32 static inline void copy(
const Tsrc & src, Tdst & dst,
int sub_id)
34 for (
int i = 0 ; i < N1 ; i++)
53template<
typename v_src,
typename v_dst,
int... prp>
84 typedef typename boost::remove_reference<
decltype(
dst.template get<boost::mpl::at<v_prp,boost::mpl::int_<T::value>>::type::value>())>::type copy_rtype;
105template<
typename v_src,
typename v_dst,
int... prp>
137 {std::cerr <<
"Error: " <<__FILE__ <<
":" << __LINE__ <<
" Passing a temporal object\n";};
145 typedef typename boost::remove_reference<
decltype(
dst.template get<boost::mpl::at<v_prp,boost::mpl::int_<T::value>>::type::value>())>::type copy_dtype;
146 typedef typename std::remove_reference<
decltype(
src.template get<T::value>())>::type copy_stype;
166template<
template<
typename,
typename>
class op,
typename v_src,
typename v_dst,
int... prp>
198 {std::cerr <<
"Error: " <<__FILE__ <<
":" << __LINE__ <<
" Passing a temporal object\n";};
206 typedef typename boost::remove_reference<
decltype(
dst.template get<boost::mpl::at<v_prp,boost::mpl::int_<T::value>>::type::value>())>::type copy_dtype;
207 typedef typename std::remove_reference<
decltype(
src.template get<T::value>())>::type copy_stype;
226template<
template<
typename,
typename>
class op,
typename v_src,
typename v_dst,
int... prp>
261 {std::cerr <<
"Error: " <<__FILE__ <<
":" << __LINE__ <<
" Passing a temporal object\n";};
269 typedef typename boost::remove_reference<
decltype(
dst.template get<boost::mpl::at<v_prp,boost::mpl::int_<T::value>>::type::value>()[
sub_id])>::type copy_rtype;
286template<
typename v_src,
typename v_dst,
int... prp>
318 {std::cerr <<
"Error: " <<__FILE__ <<
":" << __LINE__ <<
" Passing a temporal object\n";};
325 typedef typename boost::mpl::at<typename v_dst::type,typename boost::mpl::int_<boost::mpl::at<v_prp,boost::mpl::int_<T::value>>::type::value>>::type ctype;
344template<
template<
typename,
typename>
class op,
typename v_src,
typename v_dst,
int... prp>
376 {std::cerr <<
"Error: " <<__FILE__ <<
":" << __LINE__ <<
" Passing a temporal object\n";};
383 typedef typename boost::mpl::at<typename v_dst::type,typename boost::mpl::int_<boost::mpl::at<v_prp,boost::mpl::int_<T::value>>::type::value>>::type ctype;
391#define OBJ_ENCAP_CHUNKING 3
401template<
typename v_src,
typename v_dst,
int type_copy,
int... prp>
412 std::cerr <<
"Error object_copy: " << __FILE__ <<
" " << __LINE__ <<
"\n";
423template<
typename v_src,
typename v_dst,
int... prp>
435 boost::mpl::for_each_ref< boost::mpl::range_c<int,0,
sizeof...(prp)> >(obj);
447 boost::mpl::for_each_ref< boost::mpl::range_c<int,0,
sizeof...(prp)> >(obj);
465template<
typename v_src,
typename v_dst,
int... prp>
474 __host__ __device__
inline object_s_di(
const v_src & vs, v_dst && vd)
477 boost::mpl::for_each_ref< boost::mpl::range_c<int,0,(int)
sizeof...(prp)> >(obj);
486 __host__ __device__
inline object_s_di(
const v_src & vs, v_dst & vd)
489 boost::mpl::for_each_ref< boost::mpl::range_c<int,0,
sizeof...(prp)> >(obj);
495template<
typename v_src,
typename v_dst,
int... prp>
507 boost::mpl::for_each_ref< boost::mpl::range_c<int,0,
sizeof...(prp)> >(obj);
519 boost::mpl::for_each_ref< boost::mpl::range_c<int,0,
sizeof...(prp)> >(obj);
533template<
template<
typename,
typename>
class op,
typename v_src,
typename v_dst,
int type_copy,
int... prp>
544 std::cerr <<
"Error object_copy: " << __FILE__ <<
" " << __LINE__ <<
"\n";
556template<
template<
typename,
typename>
class op,
typename v_src,
typename v_dst,
int... prp>
568 boost::mpl::for_each_ref< boost::mpl::range_c<int,0,
sizeof...(prp)> >(obj);
580 boost::mpl::for_each_ref< boost::mpl::range_c<int,0,
sizeof...(prp)> >(obj);
599template<
template<
typename,
typename>
class op,
typename v_src,
typename v_dst,
int... prp>
611 boost::mpl::for_each_ref< boost::mpl::range_c<int,0,
sizeof...(prp)> >(obj);
623 boost::mpl::for_each_ref< boost::mpl::range_c<int,0,
sizeof...(prp)> >(obj);
641template<
template<
typename,
typename>
class op,
typename v_src,
typename v_dst,
int... prp>
653 boost::mpl::for_each_ref< boost::mpl::range_c<int,0,
sizeof...(prp)> >(obj);
665 boost::mpl::for_each_ref< boost::mpl::range_c<int,0,
sizeof...(prp)> >(obj);
__host__ __device__ object_s_di(const v_src &vs, v_dst &vd)
Implementation of the copy.
__host__ __device__ object_s_di(const v_src &vs, v_dst &&vd)
Implementation of the copy.
object_s_di(const v_src &vs, v_dst &vd, size_t sub_id)
Implementation of the copy.
object_s_di(const v_src &vs, v_dst &&vd, size_t sub_id)
Implementation of the copy.
object_s_di(const v_src &vs, v_dst &vd)
Implementation of the copy.
object_s_di(const v_src &&vs, v_dst &&vd)
Implementation of the copy.
this class is a functor for "for_each" algorithm
const v_src & src
Source object.
void operator()(T &t)
It call the functor for each member.
v_dst & dst
Destination object.
object_s_di_e_cnk(const v_src &src, v_dst &dst, size_t sub_id)
Constructor.
to_boost_vmpl< prp... >::type v_prp
Convert the packed properties into an MPL vector.
this class is a functor for "for_each" algorithm
object_s_di_e_op_cnk(const v_src &src, v_dst &dst, size_t sub_id)
Constructor.
void operator()(T &t)
It call the functor for each member.
v_dst & dst
Destination object.
to_boost_vmpl< prp... >::type v_prp
Convert the packed properties into an MPL vector.
const v_src & src
Source object.
this class is a functor for "for_each" algorithm
to_boost_vmpl< prp... >::type v_prp
Convert the packed properties into an MPL vector.
__device__ __host__ void operator()(T &t)
It call the functor for each member.
const v_src & src
Source object.
__device__ __host__ object_s_di_e_op(const v_src &src, v_dst &dst)
Constructor.
v_dst & dst
Destination object.
this class is a functor for "for_each" algorithm
__device__ __host__ void operator()(T &t)
It call the functor for each member.
const v_src & src
Source object.
v_dst & dst
Destination object.
__device__ __host__ object_s_di_e(const v_src &src, v_dst &dst)
Constructor.
to_boost_vmpl< prp... >::type v_prp
Convert the packed properties into an MPL vector.
this class is a functor for "for_each" algorithm
void operator()(T &t)
It call the functor for each member.
object_s_di_f_op(const v_src &src, v_dst &dst)
Constructor.
const v_src & src
Source object.
v_dst & dst
Destination object.
to_boost_vmpl< prp... >::type v_prp
Convert the packed properties into an MPL vector.
this class is a functor for "for_each" algorithm
const v_src & src
Source object.
to_boost_vmpl< prp... >::type v_prp
Convert the packed properties into an MPL vector.
object_s_di_f(const v_src &src, v_dst &dst)
Constructor.
v_dst & dst
Destination object.
void operator()(T &t)
It call the functor for each member.
__device__ __host__ object_s_di_op(const v_src &vs, v_dst &vd)
Implementation of the copy with operation.
__device__ __host__ object_s_di_op(const v_src &vs, v_dst &&vd)
Implementation of the copy with operation.
object_s_di_op(const v_src &vs, v_dst &&vd)
Implementation of the copy with operation.
object_s_di_op(const v_src &vs, v_dst &vd, size_t sub_id)
Implementation of the copy with operation.
object_s_di_op(const v_src &&vs, v_dst &&vd)
Implementation of the copy with operation.
object_s_di_op(const v_src &vs, v_dst &vd)
Implementation of the copy with operation.
It copy the properties from one object to another applying an operation.
object_s_di_op(const v_src &vs, v_dst &vd)
Stub method.
It copy the properties from one object to another.
object_s_di(const v_src &vs, v_dst &vd)
Stub method.