1#ifndef GRID_KEY_EXPRESSION
2#define GRID_KEY_EXPRESSION
3
4#include "util/common.hpp"
5
6template<unsigned int dim, typename index_type = long int> class grid_key_dx;
7template<int dim, typename exp1, typename exp2> class grid_key_dx_sum;
8template<int dim, typename exp1, typename exp2> class grid_key_dx_sub;
9
10
11/*! \brief Expression template for grid_key_dx
12 *
13 */
14
15/*! \brief Main class that encapsulate an expression
16 *
17 * \param dim dimensionality
18 * \param exp expression type
19 *
20 */
21template<unsigned int dim, typename exp>
22class grid_key_dx_expression
23{
24public:
25
26 __device__ __host__ mem_id value(int i) const
27 {
28 return static_cast<const exp &>(*this).value(i);
29 }
30
31 /* \brief subtract this expression with another expression
32 *
33 * \param key to subtract
34 *
35 * \return a grid_key_dx_expression that encapsulate the expression
36 *
37 */
38 template<typename index_type>
39 __device__ __host__ inline grid_key_dx_sub<dim,grid_key_dx_expression<dim,exp>,grid_key_dx<dim,index_type>> operator-(const grid_key_dx<dim,index_type> & key) const
40 {
41 grid_key_dx_sub<dim,grid_key_dx_expression<dim,exp>,grid_key_dx<dim,index_type>> exp_sum(*this,key);
42
43 return exp_sum;
44 }
45
46 /* \brief subtract this expression a grid key
47 *
48 * \param key to subtract
49 *
50 * \return a grid_key_dx_expression that encapsulate the expression
51 *
52 */
53 template <typename T>
54 __device__ __host__ inline grid_key_dx_sub<dim,grid_key_dx_expression<dim,exp>,grid_key_dx_expression<dim,T> > operator-(const grid_key_dx_expression<dim,T> & key) const
55 {
56 grid_key_dx_sub< dim,grid_key_dx_expression<dim,exp>,grid_key_dx_expression<dim,T> > exp_sum(*this,key);
57
58 return exp_sum;
59 }
60
61 /* \brief subtract this expression with another expression
62 *
63 * \param key to subtract
64 *
65 * \return a grid_key_dx_expression that encapsulate the expression
66 *
67 */
68 template<typename index_type>
69 __device__ __host__ inline grid_key_dx_sum<dim,grid_key_dx_expression<dim,exp>,grid_key_dx<dim,index_type>> operator+(const grid_key_dx<dim,index_type> & key) const
70 {
71 grid_key_dx_sum<dim,grid_key_dx_expression<dim,exp>,grid_key_dx<dim,index_type>> exp_sum(*this,key);
72
73 return exp_sum;
74 }
75
76 /* \brief subtract this expression a grid key
77 *
78 * \param key to subtract
79 *
80 * \return a grid_key_dx_expression that encapsulate the expression
81 *
82 */
83 template <typename T>
84 __device__ __host__ inline grid_key_dx_sum<dim,grid_key_dx_expression<dim,exp>,grid_key_dx_expression<dim,T> > operator+(const grid_key_dx_expression<dim,T> & key) const
85 {
86 grid_key_dx_sum< dim,grid_key_dx_expression<dim,exp>,grid_key_dx_expression<dim,T> > exp_sum(*this,key);
87
88 return exp_sum;
89 }
90};
91
92
93/*! \brief Main class that encapsulate a sum expression
94 *
95 * \param dim dimensionality
96 * \param exp1 expression 1
97 * \param exp2 expression 2
98 *
99 */
100template<int dim, typename exp1, typename exp2>
101class grid_key_dx_sum : public grid_key_dx_expression<dim,grid_key_dx_sum<dim,exp1,exp2>>
102{
103 const exp1 & e1;
104 const exp2 & e2;
105
106public:
107
108 __device__ __host__ grid_key_dx_sum(const exp1 & ex1, const exp2 & ex2)
109 :e1(ex1),e2(ex2)
110 {}
111
112 __device__ __host__ mem_id value(int i) const
113 {
114 return e1.value(i) + e2.value(i);
115 }
116};
117
118/*! \brief Main class that encapsulate a sub expression
119 *
120 * \param dim dimensionality
121 * \param exp1 expression 1
122 * \param exp2 expression 2
123 *
124 */
125template<int dim, typename exp1, typename exp2>
126class grid_key_dx_sub : public grid_key_dx_expression<dim,grid_key_dx_sub<dim,exp1,exp2>>
127{
128 const exp1 & e1;
129 const exp2 & e2;
130
131public:
132
133 __device__ __host__ grid_key_dx_sub(const exp1 & ex1, const exp2 & ex2)
134 :e1(ex1),e2(ex2)
135 {}
136
137 __device__ __host__ mem_id value(int i) const
138 {
139 return e1.value(i) - e2.value(i);
140 }
141};
142
143#endif
144