9 #ifndef stk_util_util_SimpleArrayOps_hpp 10 #define stk_util_util_SimpleArrayOps_hpp 20 template<
unsigned n,
int i=0>
struct Copy ;
21 template<
unsigned n,
int i=0>
struct Sum ;
22 template<
unsigned n,
int i=0>
struct Prod ;
23 template<
unsigned n,
int i=0>
struct Max ;
24 template<
unsigned n,
int i=0>
struct Min ;
25 template<
unsigned n,
int i=0>
struct BitOr ;
26 template<
unsigned n,
int i=0>
struct BitAnd ;
27 template<
unsigned n,
int i=0>
struct InnerProduct ;
28 template<
unsigned n,
int i=0>
struct Compare ;
36 template<
typename T>
inline Copy( T *
const ,
const T *
const ) {}
37 template<
typename T>
inline Copy( T *
const ,
const T ) {}
44 template<
typename T>
inline Sum( T *
const ,
const T *
const ) {}
45 template<
typename T>
inline Sum( T *
const ,
const T ,
const T *
const ) {}
52 template<
typename T>
inline Prod( T *
const ,
const T *
const ) {}
59 template<
typename T>
inline Max( T *
const ,
const T *
const ) {}
66 template<
typename T>
inline Min( T *
const ,
const T *
const ) {}
73 template<
typename T>
inline BitOr( T *
const ,
const T *
const ) {}
80 template<
typename T>
inline BitAnd( T *
const ,
const T *
const ) {}
84 struct InnerProduct<0,i> {
88 inline InnerProduct( T & value ,
const T *
const x ,
const T *
const y ) {}
97 inline static bool equal(
const T *
const ,
const T *
const )
101 inline static bool not_equal(
const T *
const ,
const T *
const )
105 inline static bool less(
const T *
const ,
const T *
const )
109 inline static bool less_equal(
const T *
const ,
const T *
const )
113 inline static bool greater(
const T *
const ,
const T *
const )
117 inline static bool greater_equal(
const T *
const ,
const T *
const )
128 inline Copy( T *
const dst ,
const T *
const src )
129 {
for (
unsigned i = 0 ; i < N ; ++i ) { dst[i] = src[i]; } }
132 inline Copy( T *
const dst ,
const T src )
133 {
for (
unsigned i = 0 ; i < N ; ++i ) { dst[i] = src ; } }
142 inline Sum( T *
const dst ,
const T *
const src )
143 {
for (
unsigned i = 0 ; i < N ; ++i ) { dst[i] += src[i]; } }
146 inline Sum( T *
const dst ,
const T a ,
const T *
const src )
147 {
for (
unsigned i = 0 ; i < N ; ++i ) { dst[i] += a * src[i]; } }
155 inline Prod( T *
const dst ,
const T *
const src )
156 {
for (
unsigned i = 0 ; i < N ; ++i ) { dst[i] *= src[i]; } }
164 inline BitOr( T *
const dst ,
const T *
const src )
165 {
for (
unsigned i = 0 ; i < N ; ++i ) { dst[i] |= src[i]; } }
169 struct BitAnd<n,-1> {
173 inline BitAnd( T *
const dst ,
const T *
const src )
174 {
for (
unsigned i = 0 ; i < N ; ++i ) { dst[i] &= src[i]; } }
182 inline Max( T *
const dst ,
const T *
const src )
184 for (
unsigned i = 0 ; i < N ; ++i )
185 {
if ( dst[i] < src[i] ) { dst[i] = src[i] ; } }
194 inline Min( T *
const dst ,
const T *
const src )
196 for (
unsigned i = 0 ; i < N ; ++i )
197 {
if ( src[i] < dst[i] ) { dst[i] = src[i] ; } }
202 struct InnerProduct<n,-1> {
206 inline InnerProduct( T & value ,
const T *
const x ,
const T *
const y )
207 {
for (
unsigned i = 0 ; i < N ; ++i ) { value += x[i] * y[i] ; } }
212 struct Compare<n,-1> {
217 inline static bool equal(
const T *
const dst ,
const T *
const src )
220 for (
unsigned i = 0 ; result && i < N ; ++i )
221 { result = dst[i] == src[i] ; }
226 inline static bool not_equal(
const T *
const dst ,
const T *
const src )
227 {
return !
equal( dst , src ); }
230 inline static bool less(
const T *
const dst ,
const T *
const src )
233 for ( ; i < N && dst[i] == src[i] ; ++i );
234 return i < N && dst[i] < src[i] ;
238 inline static bool less_equal(
const T *
const dst ,
const T *
const src )
239 {
return ! less( src , dst ); }
242 inline static bool greater(
const T *
const dst ,
const T *
const src )
243 {
return less( src , dst ); }
246 inline static bool greater_equal(
const T *
const dst ,
const T *
const src )
247 {
return ! less( dst , src ); }
251 template<
unsigned n,
int i>
253 enum { N = n , I = i };
257 inline Copy( T *
const dst ,
const T *
const src )
258 { dst[I] = src[I] ; Copy<N-1,I+1>(dst,src); }
261 inline Copy( T *
const dst ,
const T src )
262 { dst[I] = src ; Copy<N-1,I+1>(dst,src); }
265 template<
unsigned n,
int i>
267 enum { N = n , I = i };
271 inline Sum( T *
const dst ,
const T *
const src )
272 { dst[I] += src[I] ; Sum<N-1,I+1>(dst,src); }
275 inline Sum( T *
const dst ,
const T a ,
const T *
const src )
276 { dst[I] += a * src[I] ; Sum<N-1,I+1>(dst,a,src); }
279 template<
unsigned n,
int i>
281 enum { N = n , I = i };
284 inline Prod( T *
const dst ,
const T *
const src )
285 { dst[I] *= src[I] ; Prod<N-1,I+1>(dst,src); }
288 template<
unsigned n,
int i>
290 enum { N = n , I = i };
293 inline BitOr( T *
const dst ,
const T *
const src )
294 { dst[I] |= src[I] ; BitOr<N-1,I+1>(dst,src); }
297 template<
unsigned n,
int i>
299 enum { N = n , I = i };
302 inline BitAnd( T *
const dst ,
const T *
const src )
303 { dst[I] &= src[I] ; BitAnd<N-1,I+1>(dst,src); }
306 template<
unsigned n,
int i>
308 enum { N = n , I = i };
311 inline Max( T *
const dst ,
const T *
const src )
312 {
if ( dst[I] < src[I] ) { dst[I] = src[I] ; } Max<N-1,I+1>(dst,src); }
315 template<
unsigned n,
int i>
317 enum { N = n , I = i };
320 inline Min( T *
const dst ,
const T *
const src )
321 {
if ( src[I] < dst[I] ) { dst[I] = src[I] ; } Min<N-1,I+1>(dst,src); }
324 template<
unsigned n,
int i>
325 struct InnerProduct {
326 enum { N = n , I = i };
329 inline InnerProduct( T & value ,
const T *
const x ,
const T *
const y )
330 { value += x[I] * y[I] ; InnerProduct<N-1,I+1>( value , x , y ); }
334 template<
unsigned n,
int i>
336 enum { N = n , I = i };
340 inline static bool equal(
const T *
const dst ,
const T *
const src )
341 {
return dst[I] == src[I] && Compare<N-1,I+1>::equal(dst,src); }
344 inline static bool not_equal(
const T *
const dst ,
const T *
const src )
345 {
return dst[I] != src[I] || Compare<N-1,I+1>::not_equal(dst,src); }
348 inline static bool less(
const T *
const dst ,
const T *
const src )
350 return dst[I] != src[I] ? dst[I] < src[I]
351 : Compare<N-1,I+1>::less(dst,src);
355 inline static bool less_equal(
const T *
const dst ,
const T *
const src )
357 return dst[I] != src[I] ? dst[I] < src[I]
358 : Compare<N-1,I+1>::less_equal(dst,src);
362 inline static bool greater(
const T *
const dst ,
const T *
const src )
364 return dst[I] != src[I] ? dst[I] > src[I]
365 : Compare<N-1,I+1>::greater(dst,src);
369 inline static bool greater_equal(
const T *
const dst ,
const T *
const src )
371 return dst[I] != src[I] ? dst[I] > src[I]
372 : Compare<N-1,I+1>::greater_equal(dst,src);
bool equal(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2)