source: Sophya/trunk/SophyaExt/Blitz/blitz/array/where.h@ 221

Last change on this file since 221 was 221, checked in by ansari, 26 years ago

Creation module DPC/Blitz (blitz 0.4) Reza 09/04/99

File size: 4.9 KB
RevLine 
[221]1#ifndef BZ_ARRAYWHERE_H
2#define BZ_ARRAYWHERE_H
3
4#ifndef BZ_ARRAYEXPR_H
5 #error <blitz/array/where.h> must be included via <blitz/array/expr.h>
6#endif
7
8BZ_NAMESPACE(blitz)
9
10template<class P_expr1, class P_expr2, class P_expr3>
11class _bz_ArrayWhere {
12
13public:
14 typedef P_expr1 T_expr1;
15 typedef P_expr2 T_expr2;
16 typedef P_expr3 T_expr3;
17 typedef _bz_typename T_expr2::T_numtype T_numtype2;
18 typedef _bz_typename T_expr3::T_numtype T_numtype3;
19 typedef BZ_PROMOTE(T_numtype2, T_numtype3) T_numtype;
20 typedef T_expr1 T_ctorArg1;
21 typedef T_expr2 T_ctorArg2;
22 typedef T_expr3 T_ctorArg3;
23
24 enum { numArrayOperands = BZ_ENUM_CAST(P_expr1::numArrayOperands)
25 + BZ_ENUM_CAST(P_expr2::numArrayOperands)
26 + BZ_ENUM_CAST(P_expr3::numArrayOperands),
27 numIndexPlaceholders = BZ_ENUM_CAST(P_expr1::numIndexPlaceholders)
28 + BZ_ENUM_CAST(P_expr2::numIndexPlaceholders)
29 + BZ_ENUM_CAST(P_expr3::numIndexPlaceholders),
30 rank = _bz_meta_max<_bz_meta_max<P_expr1::rank,P_expr2::rank>::max,
31 P_expr3::rank>::max
32 };
33
34 _bz_ArrayWhere(const _bz_ArrayWhere<T_expr1,T_expr2,T_expr3>& a)
35 : iter1_(a.iter1_), iter2_(a.iter2_), iter3_(a.iter3_)
36 { }
37
38 template<class T1, class T2, class T3>
39 _bz_ArrayWhere(T1 a, T2 b, T3 c)
40 : iter1_(a), iter2_(b), iter3_(c)
41 { }
42
43 T_numtype operator*()
44 { return (*iter1_) ? (*iter2_) : (*iter3_); }
45
46 template<int N_rank>
47 T_numtype operator()(const TinyVector<int, N_rank>& i)
48 { return iter1_(i) ? iter2_(i) : iter3_(i); }
49
50 int lbound(int rank)
51 {
52 return bounds::compute_lbound(rank, bounds::compute_lbound(
53 rank, iter1_.lbound(rank), iter2_.lbound(rank)),
54 iter3_.lbound(rank));
55 }
56
57 int ubound(int rank)
58 {
59 return bounds::compute_ubound(rank, bounds::compute_ubound(
60 rank, iter1_.ubound(rank), iter2_.ubound(rank)),
61 iter3_.ubound(rank));
62 }
63
64 void push(int position)
65 {
66 iter1_.push(position);
67 iter2_.push(position);
68 iter3_.push(position);
69 }
70
71 void pop(int position)
72 {
73 iter1_.pop(position);
74 iter2_.pop(position);
75 iter3_.pop(position);
76 }
77
78 void advance()
79 {
80 iter1_.advance();
81 iter2_.advance();
82 iter3_.advance();
83 }
84
85 void advance(int n)
86 {
87 iter1_.advance(n);
88 iter2_.advance(n);
89 iter3_.advance(n);
90 }
91
92 void loadStride(int rank)
93 {
94 iter1_.loadStride(rank);
95 iter2_.loadStride(rank);
96 iter3_.loadStride(rank);
97 }
98
99 _bz_bool isUnitStride(int rank) const
100 {
101 return iter1_.isUnitStride(rank)
102 && iter2_.isUnitStride(rank)
103 && iter3_.isUnitStride(rank);
104 }
105
106 void advanceUnitStride()
107 {
108 iter1_.advanceUnitStride();
109 iter2_.advanceUnitStride();
110 iter3_.advanceUnitStride();
111 }
112
113 _bz_bool canCollapse(int outerLoopRank, int innerLoopRank) const
114 {
115 // BZ_DEBUG_MESSAGE("_bz_ArrayExprOp<>::canCollapse");
116 return iter1_.canCollapse(outerLoopRank, innerLoopRank)
117 && iter2_.canCollapse(outerLoopRank, innerLoopRank)
118 && iter3_.canCollapse(outerLoopRank, innerLoopRank);
119 }
120
121 template<int N_rank>
122 void moveTo(const TinyVector<int,N_rank>& i)
123 {
124 iter1_.moveTo(i);
125 iter2_.moveTo(i);
126 iter3_.moveTo(i);
127 }
128
129 T_numtype operator[](int i)
130 { return iter1_[i] ? iter2_[i] : iter3_[i]; }
131
132 T_numtype fastRead(int i)
133 { return iter1_.fastRead(i) ? iter2_.fastRead(i) : iter3_.fastRead(i); }
134
135 int suggestStride(int rank) const
136 {
137 int stride1 = iter1_.suggestStride(rank);
138 int stride2 = iter2_.suggestStride(rank);
139 int stride3 = iter3_.suggestStride(rank);
140 return max(max(stride1,stride2),stride3);
141 }
142
143 _bz_bool isStride(int rank, int stride) const
144 {
145 return iter1_.isStride(rank,stride)
146 && iter2_.isStride(rank,stride)
147 && iter3_.isStride(rank,stride);
148 }
149
150 void prettyPrint(string& str, prettyPrintFormat& format) const
151 {
152 str += "[WHERE]";
153 // NEEDS_WORK
154 }
155
156 template<class T_shape>
157 _bz_bool shapeCheck(const T_shape& shape)
158 {
159 return iter1_.shapeCheck(shape)
160 && iter2_.shapeCheck(shape)
161 && iter3_.shapeCheck(shape);
162 }
163
164private:
165 _bz_ArrayWhere() { }
166
167 T_expr1 iter1_;
168 T_expr2 iter2_;
169 T_expr3 iter3_;
170};
171
172template<class T1, class T2, class T3>
173inline
174_bz_ArrayExpr<_bz_ArrayWhere<_bz_typename asExpr<T1>::T_expr,
175 _bz_typename asExpr<T2>::T_expr, _bz_typename asExpr<T3>::T_expr> >
176where(const T1& a, const T2& b, const T3& c)
177{
178 return _bz_ArrayExpr<_bz_ArrayWhere<_bz_typename asExpr<T1>::T_expr,
179 _bz_typename asExpr<T2>::T_expr,
180 _bz_typename asExpr<T3>::T_expr> >(a,b,c);
181}
182
183BZ_NAMESPACE_END
184
185#endif // BZ_ARRAYWHERE_H
186
Note: See TracBrowser for help on using the repository browser.