OpenFPM_pdata  4.1.0
Project that contain the implementation of distributed structures
 
Loading...
Searching...
No Matches
copy_general.hpp
1/*
2 * aggregate_copy.hpp
3 *
4 * Created on: Oct 31, 2015
5 * Author: i-bird
6 */
7
8#ifndef OPENFPM_DATA_SRC_UTIL_COPY_GENERAL_HPP_
9#define OPENFPM_DATA_SRC_UTIL_COPY_GENERAL_HPP_
10
11#include "util/common.hpp"
12#include "util/util_debug.hpp"
13#include "copy_compare_aggregates.hpp"
14#include "util/for_each_ref.hpp"
15#include <boost/mpl/range_c.hpp>
16#include <iostream>
17#include "util/cuda_util.hpp"
18#include "data_type/aggregate.hpp"
19
26template<typename Tdst, typename Tsrc>
27struct max_
28{
35 static inline void operation(Tdst & dst, const Tsrc & src)
36 {
37 dst = (src > dst)?src:dst;
38 }
39};
40
47template<typename Tdst, typename Tsrc>
48struct min_
49{
56 static inline void operation(Tdst & dst, const Tsrc & src)
57 {
58 dst = (src < dst)?src:dst;
59 }
60};
61
68template<typename Tdst, typename Tsrc>
69struct add_
70{
77 __device__ __host__ static inline void operation(Tdst & dst, const Tsrc & src)
78 {
79 dst += src;
80 }
81};
82
83#if defined(__clang__) && !defined(CUDA_ON_CPU)
84
85template<typename Tsrc>
86__host__ Tsrc atomicAdd(Tsrc * ptr, Tsrc value)
87{
88 std::cout << __FILE__ << ":" << __LINE__ << "Error: atomicAdd is supported only in device code not host" << std::endl;
89 return 0;
90}
91#endif
92
99template<typename Tdst, typename Tsrc>
101{
108 __device__ __host__ static inline void operation(Tdst & dst, const Tsrc & src)
109 {
110 atomicAdd(&dst,src);
111 }
112};
113
120template<typename Tdst, typename Tsrc>
122{
129 static inline void operation(Tdst & dst, const Tsrc & src)
130 {
131 dst = src;
132 }
133};
134
141template<typename Tdst, typename Tsrc>
142struct merge_
143{
150 static inline void operation(Tdst & dst, const Tsrc & src)
151 {
152 dst.add(src);
153 }
154};
155
161template<typename T, unsigned int agg=2 * is_aggregate<T>::value + std::is_copy_assignable<T>::value>
163{
170 inline copy_general(const T & src, T & dst)
171 {
172#ifndef DISABLE_ALL_RTTI
173 std::cerr << "Error: " << __FILE__ << ":" << __LINE__ << " " << demangle(typeid(T).name()) << " does not have an operator= and is not an aggregate or an openfpm native structure, copy is not possible" << "\n";
174#endif
175 }
176};
177
179template<typename T>
180struct copy_general<T,1>
181{
188 __device__ __host__ inline copy_general(const T & src, T & dst)
189 {
190 dst = src;
191 }
192};
193
195template<typename T>
196struct copy_general<T,2>
197{
204 inline copy_general(const T & src, T & dst)
205 {
206 copy_aggregate<T> cp(src,dst);
207
208 boost::mpl::for_each_ref<boost::mpl::range_c<int,0,T::max_prop>>(cp);
209 }
210};
211
213template<typename T>
214struct copy_general<T,3>
215{
222 inline copy_general(const T & src, T & dst)
223 {
224 dst = src;
225 }
226};
227
229
235template<template<typename,typename> class op, typename T, unsigned int agg=2 * is_aggregate<T>::value + std::is_copy_assignable<T>::value>
237{
244 inline copy_general_op(const T & src, T & dst)
245 {
246#ifndef DISABLE_ALL_RTTI
247 std::cerr << "Error: " << __FILE__ << ":" << __LINE__ << " " << demangle(typeid(T).name()) << " does not have an operator " << demangle(typeid(op<T,T>).name()) << "defined" << std::endl;
248#endif
249 }
250};
251
253template<template<typename,typename> class op,typename T>
254struct copy_general_op<op,T,1>
255{
262 __device__ __host__ inline copy_general_op(const T & src, T & dst)
263 {
264 op<T,T>::operation(dst,src);
265 }
266};
267
269template<template<typename,typename> class op, typename T>
270struct copy_general_op<op,T,3>
271{
278 __device__ __host__ inline copy_general_op(const T & src, T & dst)
279 {
280 copy_aggregate_op<op,T> cp(src,dst);
281
282 boost::mpl::for_each_ref<boost::mpl::range_c<int,0,T::max_prop>>(cp);
283 }
284};
285
286
287#endif /* OPENFPM_DATA_SRC_UTIL_COPY_GENERAL_HPP_ */
This structure define the operation add to use with copy general.
__device__ static __host__ void operation(Tdst &dst, const Tsrc &src)
Defition of the add operation.
This structure define the operation add to use with copy general.
__device__ static __host__ void operation(Tdst &dst, const Tsrc &src)
Defition of the add operation.
Structure to copy aggregates applying an operation.
Structure to copy aggregates.
__device__ __host__ copy_general(const T &src, T &dst)
copy objects that has an operator= (implicit or explicit)
copy_general(const T &src, T &dst)
copy objects that are aggregates
copy_general(const T &src, T &dst)
copy objects that are aggregates but define an operator=
__device__ __host__ copy_general_op(const T &src, T &dst)
copy objects that has an operator= (implicit or explicit)
__device__ __host__ copy_general_op(const T &src, T &dst)
copy objects that are aggregates
structure to copy aggregates applying an operation
copy_general_op(const T &src, T &dst)
Specialization when there is unknown copy method.
structure to copy aggregates
copy_general(const T &src, T &dst)
Specialization when there is unknown copy method.
This structure define the operation add to use with copy general.
static void operation(Tdst &dst, const Tsrc &src)
Defition of the add operation.
This structure define the operation add to use with copy general.
static void operation(Tdst &dst, const Tsrc &src)
Defition of the add operation.
This structure define the operation add to use with copy general.
static void operation(Tdst &dst, const Tsrc &src)
Defition of the add operation.
This structure define the operation add to use with copy general.
static void operation(Tdst &dst, const Tsrc &src)
Defition of the replace operation.