00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00029
00127 #ifndef SCYTHE_DEFS_H
00128 #define SCYTHE_DEFS_H
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146 #define SCYTHE_VIEW_RETURN(_TYPE_, _ORDER_, _STYLE_, _MATRIX_) \
00147 return _MATRIX_;
00148
00149
00150
00151
00152
00153
00154 #define SCYTHE_ITER_CHECK_POINTER_BOUNDS(POINTER) \
00155 { \
00156 SCYTHE_CHECK_30(POINTER >= start_ + size_ || POINTER < start_, \
00157 scythe_bounds_error, "Iterator access (offset " \
00158 << offset_ << ") out of matrix bounds") \
00159 }
00160
00161 #define SCYTHE_ITER_CHECK_OFFSET_BOUNDS(OFFSET) \
00162 { \
00163 SCYTHE_CHECK_30(OFFSET >= size_, scythe_bounds_error, \
00164 "Iterator access (offset " << offset_ << ") out of matrix bounds")\
00165 }
00166
00167 #define SCYTHE_ITER_CHECK_BOUNDS() \
00168 { \
00169 if (M_STYLE != Concrete || M_ORDER != ORDER) { \
00170 SCYTHE_ITER_CHECK_OFFSET_BOUNDS(offset_); \
00171 } else { \
00172 SCYTHE_ITER_CHECK_POINTER_BOUNDS(pos_); \
00173 } \
00174 }
00175
00183 namespace scythe {
00184
00196 enum matrix_order { Col, Row };
00197
00213 enum matrix_style { Concrete, View };
00214
00231 struct all_elements {
00232 } const _ = {};
00233
00234
00235
00236 template <matrix_order o1, matrix_order o2, matrix_order o3>
00237 bool maj_col()
00238 {
00239 if ((o1 == Col && o2 == Col) ||
00240 (o1 == Col && o3 == Col) ||
00241 (o2 == Col && o3 == Col))
00242 return true;
00243 return false;
00244 }
00245
00246 template <matrix_order o1, matrix_order o2, matrix_order o3,
00247 matrix_order o4>
00248 bool maj_col()
00249 {
00250 if ((o1 == Col && o2 == Col) ||
00251 (o1 == Col && o3 == Col) ||
00252 (o1 == Col && o4 == Col) ||
00253 (o2 == Col && o3 == Col) ||
00254 (o2 == Col && o4 == Col) ||
00255 (o3 == Col && o4 == Col))
00256 return true;
00257 return false;
00258 }
00259 }
00260
00261 #endif