source: XMLIO_V2/external/include/blitz/array/uops.cc @ 80

Last change on this file since 80 was 80, checked in by ymipsl, 14 years ago

ajout lib externe

File size: 190.8 KB
Line 
1/***************************************************************************
2 * blitz/../array/uops.cc       Expression templates for arrays, unary functions
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation; either version 2
7 * of the License, or (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 * GNU General Public License for more details.
13 *
14 * Suggestions:          blitz-suggest@cybervision.com
15 * Bugs:                 blitz-bugs@cybervision.com
16 *
17 * For more information, please see the Blitz++ Home Page:
18 *    http://seurat.uwaterloo.ca/blitz/
19 *
20 ***************************************************************************
21 *
22 */ 
23
24// Generated source file.  Do not edit.
25// genarruops.cpp Dec 30 2003 16:49:07
26
27#ifndef BZ_ARRAYUOPS_CC
28#define BZ_ARRAYUOPS_CC
29
30#ifndef BZ_ARRAYEXPR_H
31 #error <blitz/array/uops.cc> must be included after <blitz/arrayexpr.h>
32#endif // BZ_ARRAYEXPR_H
33
34BZ_NAMESPACE(blitz)
35
36/****************************************************************************
37 * abs
38 ****************************************************************************/
39
40template<class T_numtype1, int N_rank1>
41inline
42_bz_ArrayExpr<_bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
43    _bz_abs<T_numtype1> > >
44abs(const Array<T_numtype1, N_rank1>& d1)
45{
46    return _bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
47    _bz_abs<T_numtype1> >(d1.begin());
48}
49
50template<class P_expr1>
51inline
52_bz_ArrayExpr<_bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
53    _bz_abs<typename P_expr1::T_numtype> > >
54abs(_bz_ArrayExpr<P_expr1> d1)
55{
56    return _bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
57    _bz_abs<typename P_expr1::T_numtype> >(d1);
58}
59
60template<int N_index1>
61inline
62_bz_ArrayExpr<_bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
63    _bz_abs<int> > >
64abs(IndexPlaceholder<N_index1> d1)
65{
66    return _bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
67    _bz_abs<int> >(d1);
68}
69
70
71/****************************************************************************
72 * acos
73 ****************************************************************************/
74
75template<class T_numtype1, int N_rank1>
76inline
77_bz_ArrayExpr<_bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
78    _bz_acos<T_numtype1> > >
79acos(const Array<T_numtype1, N_rank1>& d1)
80{
81    return _bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
82    _bz_acos<T_numtype1> >(d1.begin());
83}
84
85template<class P_expr1>
86inline
87_bz_ArrayExpr<_bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
88    _bz_acos<typename P_expr1::T_numtype> > >
89acos(_bz_ArrayExpr<P_expr1> d1)
90{
91    return _bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
92    _bz_acos<typename P_expr1::T_numtype> >(d1);
93}
94
95template<int N_index1>
96inline
97_bz_ArrayExpr<_bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
98    _bz_acos<int> > >
99acos(IndexPlaceholder<N_index1> d1)
100{
101    return _bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
102    _bz_acos<int> >(d1);
103}
104
105
106/****************************************************************************
107 * acosh
108 ****************************************************************************/
109
110#ifdef BZ_HAVE_IEEE_MATH
111template<class T_numtype1, int N_rank1>
112inline
113_bz_ArrayExpr<_bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
114    _bz_acosh<T_numtype1> > >
115acosh(const Array<T_numtype1, N_rank1>& d1)
116{
117    return _bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
118    _bz_acosh<T_numtype1> >(d1.begin());
119}
120
121template<class P_expr1>
122inline
123_bz_ArrayExpr<_bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
124    _bz_acosh<typename P_expr1::T_numtype> > >
125acosh(_bz_ArrayExpr<P_expr1> d1)
126{
127    return _bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
128    _bz_acosh<typename P_expr1::T_numtype> >(d1);
129}
130
131template<int N_index1>
132inline
133_bz_ArrayExpr<_bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
134    _bz_acosh<int> > >
135acosh(IndexPlaceholder<N_index1> d1)
136{
137    return _bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
138    _bz_acosh<int> >(d1);
139}
140
141#endif
142
143/****************************************************************************
144 * asin
145 ****************************************************************************/
146
147template<class T_numtype1, int N_rank1>
148inline
149_bz_ArrayExpr<_bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
150    _bz_asin<T_numtype1> > >
151asin(const Array<T_numtype1, N_rank1>& d1)
152{
153    return _bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
154    _bz_asin<T_numtype1> >(d1.begin());
155}
156
157template<class P_expr1>
158inline
159_bz_ArrayExpr<_bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
160    _bz_asin<typename P_expr1::T_numtype> > >
161asin(_bz_ArrayExpr<P_expr1> d1)
162{
163    return _bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
164    _bz_asin<typename P_expr1::T_numtype> >(d1);
165}
166
167template<int N_index1>
168inline
169_bz_ArrayExpr<_bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
170    _bz_asin<int> > >
171asin(IndexPlaceholder<N_index1> d1)
172{
173    return _bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
174    _bz_asin<int> >(d1);
175}
176
177
178/****************************************************************************
179 * asinh
180 ****************************************************************************/
181
182#ifdef BZ_HAVE_IEEE_MATH
183template<class T_numtype1, int N_rank1>
184inline
185_bz_ArrayExpr<_bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
186    _bz_asinh<T_numtype1> > >
187asinh(const Array<T_numtype1, N_rank1>& d1)
188{
189    return _bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
190    _bz_asinh<T_numtype1> >(d1.begin());
191}
192
193template<class P_expr1>
194inline
195_bz_ArrayExpr<_bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
196    _bz_asinh<typename P_expr1::T_numtype> > >
197asinh(_bz_ArrayExpr<P_expr1> d1)
198{
199    return _bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
200    _bz_asinh<typename P_expr1::T_numtype> >(d1);
201}
202
203template<int N_index1>
204inline
205_bz_ArrayExpr<_bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
206    _bz_asinh<int> > >
207asinh(IndexPlaceholder<N_index1> d1)
208{
209    return _bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
210    _bz_asinh<int> >(d1);
211}
212
213#endif
214
215/****************************************************************************
216 * atan
217 ****************************************************************************/
218
219template<class T_numtype1, int N_rank1>
220inline
221_bz_ArrayExpr<_bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
222    _bz_atan<T_numtype1> > >
223atan(const Array<T_numtype1, N_rank1>& d1)
224{
225    return _bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
226    _bz_atan<T_numtype1> >(d1.begin());
227}
228
229template<class P_expr1>
230inline
231_bz_ArrayExpr<_bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
232    _bz_atan<typename P_expr1::T_numtype> > >
233atan(_bz_ArrayExpr<P_expr1> d1)
234{
235    return _bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
236    _bz_atan<typename P_expr1::T_numtype> >(d1);
237}
238
239template<int N_index1>
240inline
241_bz_ArrayExpr<_bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
242    _bz_atan<int> > >
243atan(IndexPlaceholder<N_index1> d1)
244{
245    return _bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
246    _bz_atan<int> >(d1);
247}
248
249
250/****************************************************************************
251 * atanh
252 ****************************************************************************/
253
254#ifdef BZ_HAVE_IEEE_MATH
255template<class T_numtype1, int N_rank1>
256inline
257_bz_ArrayExpr<_bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
258    _bz_atanh<T_numtype1> > >
259atanh(const Array<T_numtype1, N_rank1>& d1)
260{
261    return _bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
262    _bz_atanh<T_numtype1> >(d1.begin());
263}
264
265template<class P_expr1>
266inline
267_bz_ArrayExpr<_bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
268    _bz_atanh<typename P_expr1::T_numtype> > >
269atanh(_bz_ArrayExpr<P_expr1> d1)
270{
271    return _bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
272    _bz_atanh<typename P_expr1::T_numtype> >(d1);
273}
274
275template<int N_index1>
276inline
277_bz_ArrayExpr<_bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
278    _bz_atanh<int> > >
279atanh(IndexPlaceholder<N_index1> d1)
280{
281    return _bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
282    _bz_atanh<int> >(d1);
283}
284
285#endif
286
287/****************************************************************************
288 * atan2
289 ****************************************************************************/
290
291template<class T_numtype1, int N_rank1, class T_numtype2, int N_rank2>
292inline
293_bz_ArrayExpr<_bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, ArrayIterator<T_numtype2, N_rank2>,
294    _bz_atan2<T_numtype1,T_numtype2> > >
295atan2(const Array<T_numtype1, N_rank1>& d1, const Array<T_numtype2, N_rank2>& d2)
296{
297    return _bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, ArrayIterator<T_numtype2, N_rank2>,
298    _bz_atan2<T_numtype1,T_numtype2> >(d1.begin(), d2.begin());
299}
300
301template<class T_numtype1, int N_rank1, class P_expr2>
302inline
303_bz_ArrayExpr<_bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExpr<P_expr2>,
304    _bz_atan2<T_numtype1,typename P_expr2::T_numtype> > >
305atan2(const Array<T_numtype1, N_rank1>& d1, _bz_ArrayExpr<P_expr2> d2)
306{
307    return _bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExpr<P_expr2>,
308    _bz_atan2<T_numtype1,typename P_expr2::T_numtype> >(d1.begin(), d2);
309}
310
311template<class T_numtype1, int N_rank1, int N_index2>
312inline
313_bz_ArrayExpr<_bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, IndexPlaceholder<N_index2>,
314    _bz_atan2<T_numtype1,int> > >
315atan2(const Array<T_numtype1, N_rank1>& d1, IndexPlaceholder<N_index2> d2)
316{
317    return _bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, IndexPlaceholder<N_index2>,
318    _bz_atan2<T_numtype1,int> >(d1.begin(), d2);
319}
320
321template<class T_numtype1, int N_rank1>
322inline
323_bz_ArrayExpr<_bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExprConstant<float>,
324    _bz_atan2<T_numtype1,float> > >
325atan2(const Array<T_numtype1, N_rank1>& d1, float d2)
326{
327    return _bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExprConstant<float>,
328    _bz_atan2<T_numtype1,float> >(d1.begin(), _bz_ArrayExprConstant<float>(d2));
329}
330
331template<class T_numtype1, int N_rank1>
332inline
333_bz_ArrayExpr<_bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExprConstant<double>,
334    _bz_atan2<T_numtype1,double> > >
335atan2(const Array<T_numtype1, N_rank1>& d1, double d2)
336{
337    return _bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExprConstant<double>,
338    _bz_atan2<T_numtype1,double> >(d1.begin(), _bz_ArrayExprConstant<double>(d2));
339}
340
341template<class T_numtype1, int N_rank1>
342inline
343_bz_ArrayExpr<_bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExprConstant<long double>,
344    _bz_atan2<T_numtype1,long double> > >
345atan2(const Array<T_numtype1, N_rank1>& d1, long double d2)
346{
347    return _bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExprConstant<long double>,
348    _bz_atan2<T_numtype1,long double> >(d1.begin(), _bz_ArrayExprConstant<long double>(d2));
349}
350
351#ifdef BZ_HAVE_COMPLEX
352template<class T_numtype1, int N_rank1, class T2>
353inline
354_bz_ArrayExpr<_bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExprConstant<complex<T2> > ,
355    _bz_atan2<T_numtype1,complex<T2> > > >
356atan2(const Array<T_numtype1, N_rank1>& d1, complex<T2> d2)
357{
358    return _bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExprConstant<complex<T2> > ,
359    _bz_atan2<T_numtype1,complex<T2> > >(d1.begin(), _bz_ArrayExprConstant<complex<T2> > (d2));
360}
361
362#endif // BZ_HAVE_COMPLEX
363
364template<class P_expr1, class T_numtype2, int N_rank2>
365inline
366_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, ArrayIterator<T_numtype2, N_rank2>,
367    _bz_atan2<typename P_expr1::T_numtype,T_numtype2> > >
368atan2(_bz_ArrayExpr<P_expr1> d1, const Array<T_numtype2, N_rank2>& d2)
369{
370    return _bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, ArrayIterator<T_numtype2, N_rank2>,
371    _bz_atan2<typename P_expr1::T_numtype,T_numtype2> >(d1, d2.begin());
372}
373
374template<class P_expr1, class P_expr2>
375inline
376_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExpr<P_expr2>,
377    _bz_atan2<typename P_expr1::T_numtype,typename P_expr2::T_numtype> > >
378atan2(_bz_ArrayExpr<P_expr1> d1, _bz_ArrayExpr<P_expr2> d2)
379{
380    return _bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExpr<P_expr2>,
381    _bz_atan2<typename P_expr1::T_numtype,typename P_expr2::T_numtype> >(d1, d2);
382}
383
384template<class P_expr1, int N_index2>
385inline
386_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, IndexPlaceholder<N_index2>,
387    _bz_atan2<typename P_expr1::T_numtype,int> > >
388atan2(_bz_ArrayExpr<P_expr1> d1, IndexPlaceholder<N_index2> d2)
389{
390    return _bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, IndexPlaceholder<N_index2>,
391    _bz_atan2<typename P_expr1::T_numtype,int> >(d1, d2);
392}
393
394template<class P_expr1>
395inline
396_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExprConstant<float>,
397    _bz_atan2<typename P_expr1::T_numtype,float> > >
398atan2(_bz_ArrayExpr<P_expr1> d1, float d2)
399{
400    return _bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExprConstant<float>,
401    _bz_atan2<typename P_expr1::T_numtype,float> >(d1, _bz_ArrayExprConstant<float>(d2));
402}
403
404template<class P_expr1>
405inline
406_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExprConstant<double>,
407    _bz_atan2<typename P_expr1::T_numtype,double> > >
408atan2(_bz_ArrayExpr<P_expr1> d1, double d2)
409{
410    return _bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExprConstant<double>,
411    _bz_atan2<typename P_expr1::T_numtype,double> >(d1, _bz_ArrayExprConstant<double>(d2));
412}
413
414template<class P_expr1>
415inline
416_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExprConstant<long double>,
417    _bz_atan2<typename P_expr1::T_numtype,long double> > >
418atan2(_bz_ArrayExpr<P_expr1> d1, long double d2)
419{
420    return _bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExprConstant<long double>,
421    _bz_atan2<typename P_expr1::T_numtype,long double> >(d1, _bz_ArrayExprConstant<long double>(d2));
422}
423
424#ifdef BZ_HAVE_COMPLEX
425template<class P_expr1, class T2>
426inline
427_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExprConstant<complex<T2> > ,
428    _bz_atan2<typename P_expr1::T_numtype,complex<T2> > > >
429atan2(_bz_ArrayExpr<P_expr1> d1, complex<T2> d2)
430{
431    return _bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExprConstant<complex<T2> > ,
432    _bz_atan2<typename P_expr1::T_numtype,complex<T2> > >(d1, _bz_ArrayExprConstant<complex<T2> > (d2));
433}
434
435#endif // BZ_HAVE_COMPLEX
436
437template<int N_index1, class T_numtype2, int N_rank2>
438inline
439_bz_ArrayExpr<_bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, ArrayIterator<T_numtype2, N_rank2>,
440    _bz_atan2<int,T_numtype2> > >
441atan2(IndexPlaceholder<N_index1> d1, const Array<T_numtype2, N_rank2>& d2)
442{
443    return _bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, ArrayIterator<T_numtype2, N_rank2>,
444    _bz_atan2<int,T_numtype2> >(d1, d2.begin());
445}
446
447template<int N_index1, class P_expr2>
448inline
449_bz_ArrayExpr<_bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExpr<P_expr2>,
450    _bz_atan2<int,typename P_expr2::T_numtype> > >
451atan2(IndexPlaceholder<N_index1> d1, _bz_ArrayExpr<P_expr2> d2)
452{
453    return _bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExpr<P_expr2>,
454    _bz_atan2<int,typename P_expr2::T_numtype> >(d1, d2);
455}
456
457template<int N_index1, int N_index2>
458inline
459_bz_ArrayExpr<_bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, IndexPlaceholder<N_index2>,
460    _bz_atan2<int,int> > >
461atan2(IndexPlaceholder<N_index1> d1, IndexPlaceholder<N_index2> d2)
462{
463    return _bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, IndexPlaceholder<N_index2>,
464    _bz_atan2<int,int> >(d1, d2);
465}
466
467template<int N_index1>
468inline
469_bz_ArrayExpr<_bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExprConstant<float>,
470    _bz_atan2<int,float> > >
471atan2(IndexPlaceholder<N_index1> d1, float d2)
472{
473    return _bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExprConstant<float>,
474    _bz_atan2<int,float> >(d1, _bz_ArrayExprConstant<float>(d2));
475}
476
477template<int N_index1>
478inline
479_bz_ArrayExpr<_bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExprConstant<double>,
480    _bz_atan2<int,double> > >
481atan2(IndexPlaceholder<N_index1> d1, double d2)
482{
483    return _bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExprConstant<double>,
484    _bz_atan2<int,double> >(d1, _bz_ArrayExprConstant<double>(d2));
485}
486
487template<int N_index1>
488inline
489_bz_ArrayExpr<_bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExprConstant<long double>,
490    _bz_atan2<int,long double> > >
491atan2(IndexPlaceholder<N_index1> d1, long double d2)
492{
493    return _bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExprConstant<long double>,
494    _bz_atan2<int,long double> >(d1, _bz_ArrayExprConstant<long double>(d2));
495}
496
497#ifdef BZ_HAVE_COMPLEX
498template<int N_index1, class T2>
499inline
500_bz_ArrayExpr<_bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExprConstant<complex<T2> > ,
501    _bz_atan2<int,complex<T2> > > >
502atan2(IndexPlaceholder<N_index1> d1, complex<T2> d2)
503{
504    return _bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExprConstant<complex<T2> > ,
505    _bz_atan2<int,complex<T2> > >(d1, _bz_ArrayExprConstant<complex<T2> > (d2));
506}
507
508#endif // BZ_HAVE_COMPLEX
509
510template<class T_numtype2, int N_rank2>
511inline
512_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<float>, ArrayIterator<T_numtype2, N_rank2>,
513    _bz_atan2<float,T_numtype2> > >
514atan2(float d1, const Array<T_numtype2, N_rank2>& d2)
515{
516    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<float>, ArrayIterator<T_numtype2, N_rank2>,
517    _bz_atan2<float,T_numtype2> >(_bz_ArrayExprConstant<float>(d1), d2.begin());
518}
519
520template<class P_expr2>
521inline
522_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<float>, _bz_ArrayExpr<P_expr2>,
523    _bz_atan2<float,typename P_expr2::T_numtype> > >
524atan2(float d1, _bz_ArrayExpr<P_expr2> d2)
525{
526    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<float>, _bz_ArrayExpr<P_expr2>,
527    _bz_atan2<float,typename P_expr2::T_numtype> >(_bz_ArrayExprConstant<float>(d1), d2);
528}
529
530template<int N_index2>
531inline
532_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<float>, IndexPlaceholder<N_index2>,
533    _bz_atan2<float,int> > >
534atan2(float d1, IndexPlaceholder<N_index2> d2)
535{
536    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<float>, IndexPlaceholder<N_index2>,
537    _bz_atan2<float,int> >(_bz_ArrayExprConstant<float>(d1), d2);
538}
539
540template<class T_numtype2, int N_rank2>
541inline
542_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<double>, ArrayIterator<T_numtype2, N_rank2>,
543    _bz_atan2<double,T_numtype2> > >
544atan2(double d1, const Array<T_numtype2, N_rank2>& d2)
545{
546    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<double>, ArrayIterator<T_numtype2, N_rank2>,
547    _bz_atan2<double,T_numtype2> >(_bz_ArrayExprConstant<double>(d1), d2.begin());
548}
549
550template<class P_expr2>
551inline
552_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<double>, _bz_ArrayExpr<P_expr2>,
553    _bz_atan2<double,typename P_expr2::T_numtype> > >
554atan2(double d1, _bz_ArrayExpr<P_expr2> d2)
555{
556    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<double>, _bz_ArrayExpr<P_expr2>,
557    _bz_atan2<double,typename P_expr2::T_numtype> >(_bz_ArrayExprConstant<double>(d1), d2);
558}
559
560template<int N_index2>
561inline
562_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<double>, IndexPlaceholder<N_index2>,
563    _bz_atan2<double,int> > >
564atan2(double d1, IndexPlaceholder<N_index2> d2)
565{
566    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<double>, IndexPlaceholder<N_index2>,
567    _bz_atan2<double,int> >(_bz_ArrayExprConstant<double>(d1), d2);
568}
569
570template<class T_numtype2, int N_rank2>
571inline
572_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<long double>, ArrayIterator<T_numtype2, N_rank2>,
573    _bz_atan2<long double,T_numtype2> > >
574atan2(long double d1, const Array<T_numtype2, N_rank2>& d2)
575{
576    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<long double>, ArrayIterator<T_numtype2, N_rank2>,
577    _bz_atan2<long double,T_numtype2> >(_bz_ArrayExprConstant<long double>(d1), d2.begin());
578}
579
580template<class P_expr2>
581inline
582_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<long double>, _bz_ArrayExpr<P_expr2>,
583    _bz_atan2<long double,typename P_expr2::T_numtype> > >
584atan2(long double d1, _bz_ArrayExpr<P_expr2> d2)
585{
586    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<long double>, _bz_ArrayExpr<P_expr2>,
587    _bz_atan2<long double,typename P_expr2::T_numtype> >(_bz_ArrayExprConstant<long double>(d1), d2);
588}
589
590template<int N_index2>
591inline
592_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<long double>, IndexPlaceholder<N_index2>,
593    _bz_atan2<long double,int> > >
594atan2(long double d1, IndexPlaceholder<N_index2> d2)
595{
596    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<long double>, IndexPlaceholder<N_index2>,
597    _bz_atan2<long double,int> >(_bz_ArrayExprConstant<long double>(d1), d2);
598}
599
600#ifdef BZ_HAVE_COMPLEX
601template<class T1, class T_numtype2, int N_rank2>
602inline
603_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<complex<T1> > , ArrayIterator<T_numtype2, N_rank2>,
604    _bz_atan2<complex<T1> ,T_numtype2> > >
605atan2(complex<T1> d1, const Array<T_numtype2, N_rank2>& d2)
606{
607    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<complex<T1> > , ArrayIterator<T_numtype2, N_rank2>,
608    _bz_atan2<complex<T1> ,T_numtype2> >(_bz_ArrayExprConstant<complex<T1> > (d1), d2.begin());
609}
610
611#endif // BZ_HAVE_COMPLEX
612
613#ifdef BZ_HAVE_COMPLEX
614template<class T1, class P_expr2>
615inline
616_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<complex<T1> > , _bz_ArrayExpr<P_expr2>,
617    _bz_atan2<complex<T1> ,typename P_expr2::T_numtype> > >
618atan2(complex<T1> d1, _bz_ArrayExpr<P_expr2> d2)
619{
620    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<complex<T1> > , _bz_ArrayExpr<P_expr2>,
621    _bz_atan2<complex<T1> ,typename P_expr2::T_numtype> >(_bz_ArrayExprConstant<complex<T1> > (d1), d2);
622}
623
624#endif // BZ_HAVE_COMPLEX
625
626#ifdef BZ_HAVE_COMPLEX
627template<class T1, int N_index2>
628inline
629_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<complex<T1> > , IndexPlaceholder<N_index2>,
630    _bz_atan2<complex<T1> ,int> > >
631atan2(complex<T1> d1, IndexPlaceholder<N_index2> d2)
632{
633    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<complex<T1> > , IndexPlaceholder<N_index2>,
634    _bz_atan2<complex<T1> ,int> >(_bz_ArrayExprConstant<complex<T1> > (d1), d2);
635}
636
637#endif // BZ_HAVE_COMPLEX
638
639
640/****************************************************************************
641 * _class
642 ****************************************************************************/
643
644#ifdef BZ_HAVE_SYSTEM_V_MATH
645template<class T_numtype1, int N_rank1>
646inline
647_bz_ArrayExpr<_bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
648    _bz__class<T_numtype1> > >
649_class(const Array<T_numtype1, N_rank1>& d1)
650{
651    return _bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
652    _bz__class<T_numtype1> >(d1.begin());
653}
654
655template<class P_expr1>
656inline
657_bz_ArrayExpr<_bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
658    _bz__class<typename P_expr1::T_numtype> > >
659_class(_bz_ArrayExpr<P_expr1> d1)
660{
661    return _bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
662    _bz__class<typename P_expr1::T_numtype> >(d1);
663}
664
665template<int N_index1>
666inline
667_bz_ArrayExpr<_bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
668    _bz__class<int> > >
669_class(IndexPlaceholder<N_index1> d1)
670{
671    return _bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
672    _bz__class<int> >(d1);
673}
674
675#endif
676
677/****************************************************************************
678 * cbrt
679 ****************************************************************************/
680
681#ifdef BZ_HAVE_IEEE_MATH
682template<class T_numtype1, int N_rank1>
683inline
684_bz_ArrayExpr<_bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
685    _bz_cbrt<T_numtype1> > >
686cbrt(const Array<T_numtype1, N_rank1>& d1)
687{
688    return _bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
689    _bz_cbrt<T_numtype1> >(d1.begin());
690}
691
692template<class P_expr1>
693inline
694_bz_ArrayExpr<_bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
695    _bz_cbrt<typename P_expr1::T_numtype> > >
696cbrt(_bz_ArrayExpr<P_expr1> d1)
697{
698    return _bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
699    _bz_cbrt<typename P_expr1::T_numtype> >(d1);
700}
701
702template<int N_index1>
703inline
704_bz_ArrayExpr<_bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
705    _bz_cbrt<int> > >
706cbrt(IndexPlaceholder<N_index1> d1)
707{
708    return _bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
709    _bz_cbrt<int> >(d1);
710}
711
712#endif
713
714/****************************************************************************
715 * ceil
716 ****************************************************************************/
717
718template<class T_numtype1, int N_rank1>
719inline
720_bz_ArrayExpr<_bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
721    _bz_ceil<T_numtype1> > >
722ceil(const Array<T_numtype1, N_rank1>& d1)
723{
724    return _bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
725    _bz_ceil<T_numtype1> >(d1.begin());
726}
727
728template<class P_expr1>
729inline
730_bz_ArrayExpr<_bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
731    _bz_ceil<typename P_expr1::T_numtype> > >
732ceil(_bz_ArrayExpr<P_expr1> d1)
733{
734    return _bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
735    _bz_ceil<typename P_expr1::T_numtype> >(d1);
736}
737
738template<int N_index1>
739inline
740_bz_ArrayExpr<_bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
741    _bz_ceil<int> > >
742ceil(IndexPlaceholder<N_index1> d1)
743{
744    return _bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
745    _bz_ceil<int> >(d1);
746}
747
748
749/****************************************************************************
750 * cexp
751 ****************************************************************************/
752
753template<class T_numtype1, int N_rank1>
754inline
755_bz_ArrayExpr<_bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
756    _bz_cexp<T_numtype1> > >
757cexp(const Array<T_numtype1, N_rank1>& d1)
758{
759    return _bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
760    _bz_cexp<T_numtype1> >(d1.begin());
761}
762
763template<class P_expr1>
764inline
765_bz_ArrayExpr<_bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
766    _bz_cexp<typename P_expr1::T_numtype> > >
767cexp(_bz_ArrayExpr<P_expr1> d1)
768{
769    return _bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
770    _bz_cexp<typename P_expr1::T_numtype> >(d1);
771}
772
773template<int N_index1>
774inline
775_bz_ArrayExpr<_bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
776    _bz_cexp<int> > >
777cexp(IndexPlaceholder<N_index1> d1)
778{
779    return _bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
780    _bz_cexp<int> >(d1);
781}
782
783
784/****************************************************************************
785 * cos
786 ****************************************************************************/
787
788template<class T_numtype1, int N_rank1>
789inline
790_bz_ArrayExpr<_bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
791    _bz_cos<T_numtype1> > >
792cos(const Array<T_numtype1, N_rank1>& d1)
793{
794    return _bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
795    _bz_cos<T_numtype1> >(d1.begin());
796}
797
798template<class P_expr1>
799inline
800_bz_ArrayExpr<_bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
801    _bz_cos<typename P_expr1::T_numtype> > >
802cos(_bz_ArrayExpr<P_expr1> d1)
803{
804    return _bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
805    _bz_cos<typename P_expr1::T_numtype> >(d1);
806}
807
808template<int N_index1>
809inline
810_bz_ArrayExpr<_bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
811    _bz_cos<int> > >
812cos(IndexPlaceholder<N_index1> d1)
813{
814    return _bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
815    _bz_cos<int> >(d1);
816}
817
818
819/****************************************************************************
820 * cosh
821 ****************************************************************************/
822
823template<class T_numtype1, int N_rank1>
824inline
825_bz_ArrayExpr<_bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
826    _bz_cosh<T_numtype1> > >
827cosh(const Array<T_numtype1, N_rank1>& d1)
828{
829    return _bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
830    _bz_cosh<T_numtype1> >(d1.begin());
831}
832
833template<class P_expr1>
834inline
835_bz_ArrayExpr<_bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
836    _bz_cosh<typename P_expr1::T_numtype> > >
837cosh(_bz_ArrayExpr<P_expr1> d1)
838{
839    return _bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
840    _bz_cosh<typename P_expr1::T_numtype> >(d1);
841}
842
843template<int N_index1>
844inline
845_bz_ArrayExpr<_bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
846    _bz_cosh<int> > >
847cosh(IndexPlaceholder<N_index1> d1)
848{
849    return _bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
850    _bz_cosh<int> >(d1);
851}
852
853
854/****************************************************************************
855 * copysign
856 ****************************************************************************/
857
858#ifdef BZ_HAVE_SYSTEM_V_MATH
859template<class T_numtype1, int N_rank1, class T_numtype2, int N_rank2>
860inline
861_bz_ArrayExpr<_bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, ArrayIterator<T_numtype2, N_rank2>,
862    _bz_copysign<T_numtype1,T_numtype2> > >
863copysign(const Array<T_numtype1, N_rank1>& d1, const Array<T_numtype2, N_rank2>& d2)
864{
865    return _bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, ArrayIterator<T_numtype2, N_rank2>,
866    _bz_copysign<T_numtype1,T_numtype2> >(d1.begin(), d2.begin());
867}
868
869template<class T_numtype1, int N_rank1, class P_expr2>
870inline
871_bz_ArrayExpr<_bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExpr<P_expr2>,
872    _bz_copysign<T_numtype1,typename P_expr2::T_numtype> > >
873copysign(const Array<T_numtype1, N_rank1>& d1, _bz_ArrayExpr<P_expr2> d2)
874{
875    return _bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExpr<P_expr2>,
876    _bz_copysign<T_numtype1,typename P_expr2::T_numtype> >(d1.begin(), d2);
877}
878
879template<class T_numtype1, int N_rank1, int N_index2>
880inline
881_bz_ArrayExpr<_bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, IndexPlaceholder<N_index2>,
882    _bz_copysign<T_numtype1,int> > >
883copysign(const Array<T_numtype1, N_rank1>& d1, IndexPlaceholder<N_index2> d2)
884{
885    return _bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, IndexPlaceholder<N_index2>,
886    _bz_copysign<T_numtype1,int> >(d1.begin(), d2);
887}
888
889template<class T_numtype1, int N_rank1>
890inline
891_bz_ArrayExpr<_bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExprConstant<float>,
892    _bz_copysign<T_numtype1,float> > >
893copysign(const Array<T_numtype1, N_rank1>& d1, float d2)
894{
895    return _bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExprConstant<float>,
896    _bz_copysign<T_numtype1,float> >(d1.begin(), _bz_ArrayExprConstant<float>(d2));
897}
898
899template<class T_numtype1, int N_rank1>
900inline
901_bz_ArrayExpr<_bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExprConstant<double>,
902    _bz_copysign<T_numtype1,double> > >
903copysign(const Array<T_numtype1, N_rank1>& d1, double d2)
904{
905    return _bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExprConstant<double>,
906    _bz_copysign<T_numtype1,double> >(d1.begin(), _bz_ArrayExprConstant<double>(d2));
907}
908
909template<class T_numtype1, int N_rank1>
910inline
911_bz_ArrayExpr<_bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExprConstant<long double>,
912    _bz_copysign<T_numtype1,long double> > >
913copysign(const Array<T_numtype1, N_rank1>& d1, long double d2)
914{
915    return _bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExprConstant<long double>,
916    _bz_copysign<T_numtype1,long double> >(d1.begin(), _bz_ArrayExprConstant<long double>(d2));
917}
918
919#ifdef BZ_HAVE_COMPLEX
920template<class T_numtype1, int N_rank1, class T2>
921inline
922_bz_ArrayExpr<_bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExprConstant<complex<T2> > ,
923    _bz_copysign<T_numtype1,complex<T2> > > >
924copysign(const Array<T_numtype1, N_rank1>& d1, complex<T2> d2)
925{
926    return _bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExprConstant<complex<T2> > ,
927    _bz_copysign<T_numtype1,complex<T2> > >(d1.begin(), _bz_ArrayExprConstant<complex<T2> > (d2));
928}
929
930#endif // BZ_HAVE_COMPLEX
931
932template<class P_expr1, class T_numtype2, int N_rank2>
933inline
934_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, ArrayIterator<T_numtype2, N_rank2>,
935    _bz_copysign<typename P_expr1::T_numtype,T_numtype2> > >
936copysign(_bz_ArrayExpr<P_expr1> d1, const Array<T_numtype2, N_rank2>& d2)
937{
938    return _bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, ArrayIterator<T_numtype2, N_rank2>,
939    _bz_copysign<typename P_expr1::T_numtype,T_numtype2> >(d1, d2.begin());
940}
941
942template<class P_expr1, class P_expr2>
943inline
944_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExpr<P_expr2>,
945    _bz_copysign<typename P_expr1::T_numtype,typename P_expr2::T_numtype> > >
946copysign(_bz_ArrayExpr<P_expr1> d1, _bz_ArrayExpr<P_expr2> d2)
947{
948    return _bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExpr<P_expr2>,
949    _bz_copysign<typename P_expr1::T_numtype,typename P_expr2::T_numtype> >(d1, d2);
950}
951
952template<class P_expr1, int N_index2>
953inline
954_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, IndexPlaceholder<N_index2>,
955    _bz_copysign<typename P_expr1::T_numtype,int> > >
956copysign(_bz_ArrayExpr<P_expr1> d1, IndexPlaceholder<N_index2> d2)
957{
958    return _bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, IndexPlaceholder<N_index2>,
959    _bz_copysign<typename P_expr1::T_numtype,int> >(d1, d2);
960}
961
962template<class P_expr1>
963inline
964_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExprConstant<float>,
965    _bz_copysign<typename P_expr1::T_numtype,float> > >
966copysign(_bz_ArrayExpr<P_expr1> d1, float d2)
967{
968    return _bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExprConstant<float>,
969    _bz_copysign<typename P_expr1::T_numtype,float> >(d1, _bz_ArrayExprConstant<float>(d2));
970}
971
972template<class P_expr1>
973inline
974_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExprConstant<double>,
975    _bz_copysign<typename P_expr1::T_numtype,double> > >
976copysign(_bz_ArrayExpr<P_expr1> d1, double d2)
977{
978    return _bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExprConstant<double>,
979    _bz_copysign<typename P_expr1::T_numtype,double> >(d1, _bz_ArrayExprConstant<double>(d2));
980}
981
982template<class P_expr1>
983inline
984_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExprConstant<long double>,
985    _bz_copysign<typename P_expr1::T_numtype,long double> > >
986copysign(_bz_ArrayExpr<P_expr1> d1, long double d2)
987{
988    return _bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExprConstant<long double>,
989    _bz_copysign<typename P_expr1::T_numtype,long double> >(d1, _bz_ArrayExprConstant<long double>(d2));
990}
991
992#ifdef BZ_HAVE_COMPLEX
993template<class P_expr1, class T2>
994inline
995_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExprConstant<complex<T2> > ,
996    _bz_copysign<typename P_expr1::T_numtype,complex<T2> > > >
997copysign(_bz_ArrayExpr<P_expr1> d1, complex<T2> d2)
998{
999    return _bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExprConstant<complex<T2> > ,
1000    _bz_copysign<typename P_expr1::T_numtype,complex<T2> > >(d1, _bz_ArrayExprConstant<complex<T2> > (d2));
1001}
1002
1003#endif // BZ_HAVE_COMPLEX
1004
1005template<int N_index1, class T_numtype2, int N_rank2>
1006inline
1007_bz_ArrayExpr<_bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, ArrayIterator<T_numtype2, N_rank2>,
1008    _bz_copysign<int,T_numtype2> > >
1009copysign(IndexPlaceholder<N_index1> d1, const Array<T_numtype2, N_rank2>& d2)
1010{
1011    return _bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, ArrayIterator<T_numtype2, N_rank2>,
1012    _bz_copysign<int,T_numtype2> >(d1, d2.begin());
1013}
1014
1015template<int N_index1, class P_expr2>
1016inline
1017_bz_ArrayExpr<_bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExpr<P_expr2>,
1018    _bz_copysign<int,typename P_expr2::T_numtype> > >
1019copysign(IndexPlaceholder<N_index1> d1, _bz_ArrayExpr<P_expr2> d2)
1020{
1021    return _bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExpr<P_expr2>,
1022    _bz_copysign<int,typename P_expr2::T_numtype> >(d1, d2);
1023}
1024
1025template<int N_index1, int N_index2>
1026inline
1027_bz_ArrayExpr<_bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, IndexPlaceholder<N_index2>,
1028    _bz_copysign<int,int> > >
1029copysign(IndexPlaceholder<N_index1> d1, IndexPlaceholder<N_index2> d2)
1030{
1031    return _bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, IndexPlaceholder<N_index2>,
1032    _bz_copysign<int,int> >(d1, d2);
1033}
1034
1035template<int N_index1>
1036inline
1037_bz_ArrayExpr<_bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExprConstant<float>,
1038    _bz_copysign<int,float> > >
1039copysign(IndexPlaceholder<N_index1> d1, float d2)
1040{
1041    return _bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExprConstant<float>,
1042    _bz_copysign<int,float> >(d1, _bz_ArrayExprConstant<float>(d2));
1043}
1044
1045template<int N_index1>
1046inline
1047_bz_ArrayExpr<_bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExprConstant<double>,
1048    _bz_copysign<int,double> > >
1049copysign(IndexPlaceholder<N_index1> d1, double d2)
1050{
1051    return _bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExprConstant<double>,
1052    _bz_copysign<int,double> >(d1, _bz_ArrayExprConstant<double>(d2));
1053}
1054
1055template<int N_index1>
1056inline
1057_bz_ArrayExpr<_bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExprConstant<long double>,
1058    _bz_copysign<int,long double> > >
1059copysign(IndexPlaceholder<N_index1> d1, long double d2)
1060{
1061    return _bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExprConstant<long double>,
1062    _bz_copysign<int,long double> >(d1, _bz_ArrayExprConstant<long double>(d2));
1063}
1064
1065#ifdef BZ_HAVE_COMPLEX
1066template<int N_index1, class T2>
1067inline
1068_bz_ArrayExpr<_bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExprConstant<complex<T2> > ,
1069    _bz_copysign<int,complex<T2> > > >
1070copysign(IndexPlaceholder<N_index1> d1, complex<T2> d2)
1071{
1072    return _bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExprConstant<complex<T2> > ,
1073    _bz_copysign<int,complex<T2> > >(d1, _bz_ArrayExprConstant<complex<T2> > (d2));
1074}
1075
1076#endif // BZ_HAVE_COMPLEX
1077
1078template<class T_numtype2, int N_rank2>
1079inline
1080_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<float>, ArrayIterator<T_numtype2, N_rank2>,
1081    _bz_copysign<float,T_numtype2> > >
1082copysign(float d1, const Array<T_numtype2, N_rank2>& d2)
1083{
1084    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<float>, ArrayIterator<T_numtype2, N_rank2>,
1085    _bz_copysign<float,T_numtype2> >(_bz_ArrayExprConstant<float>(d1), d2.begin());
1086}
1087
1088template<class P_expr2>
1089inline
1090_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<float>, _bz_ArrayExpr<P_expr2>,
1091    _bz_copysign<float,typename P_expr2::T_numtype> > >
1092copysign(float d1, _bz_ArrayExpr<P_expr2> d2)
1093{
1094    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<float>, _bz_ArrayExpr<P_expr2>,
1095    _bz_copysign<float,typename P_expr2::T_numtype> >(_bz_ArrayExprConstant<float>(d1), d2);
1096}
1097
1098template<int N_index2>
1099inline
1100_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<float>, IndexPlaceholder<N_index2>,
1101    _bz_copysign<float,int> > >
1102copysign(float d1, IndexPlaceholder<N_index2> d2)
1103{
1104    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<float>, IndexPlaceholder<N_index2>,
1105    _bz_copysign<float,int> >(_bz_ArrayExprConstant<float>(d1), d2);
1106}
1107
1108template<class T_numtype2, int N_rank2>
1109inline
1110_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<double>, ArrayIterator<T_numtype2, N_rank2>,
1111    _bz_copysign<double,T_numtype2> > >
1112copysign(double d1, const Array<T_numtype2, N_rank2>& d2)
1113{
1114    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<double>, ArrayIterator<T_numtype2, N_rank2>,
1115    _bz_copysign<double,T_numtype2> >(_bz_ArrayExprConstant<double>(d1), d2.begin());
1116}
1117
1118template<class P_expr2>
1119inline
1120_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<double>, _bz_ArrayExpr<P_expr2>,
1121    _bz_copysign<double,typename P_expr2::T_numtype> > >
1122copysign(double d1, _bz_ArrayExpr<P_expr2> d2)
1123{
1124    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<double>, _bz_ArrayExpr<P_expr2>,
1125    _bz_copysign<double,typename P_expr2::T_numtype> >(_bz_ArrayExprConstant<double>(d1), d2);
1126}
1127
1128template<int N_index2>
1129inline
1130_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<double>, IndexPlaceholder<N_index2>,
1131    _bz_copysign<double,int> > >
1132copysign(double d1, IndexPlaceholder<N_index2> d2)
1133{
1134    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<double>, IndexPlaceholder<N_index2>,
1135    _bz_copysign<double,int> >(_bz_ArrayExprConstant<double>(d1), d2);
1136}
1137
1138template<class T_numtype2, int N_rank2>
1139inline
1140_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<long double>, ArrayIterator<T_numtype2, N_rank2>,
1141    _bz_copysign<long double,T_numtype2> > >
1142copysign(long double d1, const Array<T_numtype2, N_rank2>& d2)
1143{
1144    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<long double>, ArrayIterator<T_numtype2, N_rank2>,
1145    _bz_copysign<long double,T_numtype2> >(_bz_ArrayExprConstant<long double>(d1), d2.begin());
1146}
1147
1148template<class P_expr2>
1149inline
1150_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<long double>, _bz_ArrayExpr<P_expr2>,
1151    _bz_copysign<long double,typename P_expr2::T_numtype> > >
1152copysign(long double d1, _bz_ArrayExpr<P_expr2> d2)
1153{
1154    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<long double>, _bz_ArrayExpr<P_expr2>,
1155    _bz_copysign<long double,typename P_expr2::T_numtype> >(_bz_ArrayExprConstant<long double>(d1), d2);
1156}
1157
1158template<int N_index2>
1159inline
1160_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<long double>, IndexPlaceholder<N_index2>,
1161    _bz_copysign<long double,int> > >
1162copysign(long double d1, IndexPlaceholder<N_index2> d2)
1163{
1164    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<long double>, IndexPlaceholder<N_index2>,
1165    _bz_copysign<long double,int> >(_bz_ArrayExprConstant<long double>(d1), d2);
1166}
1167
1168#ifdef BZ_HAVE_COMPLEX
1169template<class T1, class T_numtype2, int N_rank2>
1170inline
1171_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<complex<T1> > , ArrayIterator<T_numtype2, N_rank2>,
1172    _bz_copysign<complex<T1> ,T_numtype2> > >
1173copysign(complex<T1> d1, const Array<T_numtype2, N_rank2>& d2)
1174{
1175    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<complex<T1> > , ArrayIterator<T_numtype2, N_rank2>,
1176    _bz_copysign<complex<T1> ,T_numtype2> >(_bz_ArrayExprConstant<complex<T1> > (d1), d2.begin());
1177}
1178
1179#endif // BZ_HAVE_COMPLEX
1180
1181#ifdef BZ_HAVE_COMPLEX
1182template<class T1, class P_expr2>
1183inline
1184_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<complex<T1> > , _bz_ArrayExpr<P_expr2>,
1185    _bz_copysign<complex<T1> ,typename P_expr2::T_numtype> > >
1186copysign(complex<T1> d1, _bz_ArrayExpr<P_expr2> d2)
1187{
1188    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<complex<T1> > , _bz_ArrayExpr<P_expr2>,
1189    _bz_copysign<complex<T1> ,typename P_expr2::T_numtype> >(_bz_ArrayExprConstant<complex<T1> > (d1), d2);
1190}
1191
1192#endif // BZ_HAVE_COMPLEX
1193
1194#ifdef BZ_HAVE_COMPLEX
1195template<class T1, int N_index2>
1196inline
1197_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<complex<T1> > , IndexPlaceholder<N_index2>,
1198    _bz_copysign<complex<T1> ,int> > >
1199copysign(complex<T1> d1, IndexPlaceholder<N_index2> d2)
1200{
1201    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<complex<T1> > , IndexPlaceholder<N_index2>,
1202    _bz_copysign<complex<T1> ,int> >(_bz_ArrayExprConstant<complex<T1> > (d1), d2);
1203}
1204
1205#endif // BZ_HAVE_COMPLEX
1206
1207#endif
1208
1209/****************************************************************************
1210 * csqrt
1211 ****************************************************************************/
1212
1213template<class T_numtype1, int N_rank1>
1214inline
1215_bz_ArrayExpr<_bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
1216    _bz_csqrt<T_numtype1> > >
1217csqrt(const Array<T_numtype1, N_rank1>& d1)
1218{
1219    return _bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
1220    _bz_csqrt<T_numtype1> >(d1.begin());
1221}
1222
1223template<class P_expr1>
1224inline
1225_bz_ArrayExpr<_bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
1226    _bz_csqrt<typename P_expr1::T_numtype> > >
1227csqrt(_bz_ArrayExpr<P_expr1> d1)
1228{
1229    return _bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
1230    _bz_csqrt<typename P_expr1::T_numtype> >(d1);
1231}
1232
1233template<int N_index1>
1234inline
1235_bz_ArrayExpr<_bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
1236    _bz_csqrt<int> > >
1237csqrt(IndexPlaceholder<N_index1> d1)
1238{
1239    return _bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
1240    _bz_csqrt<int> >(d1);
1241}
1242
1243
1244/****************************************************************************
1245 * drem
1246 ****************************************************************************/
1247
1248#ifdef BZ_HAVE_SYSTEM_V_MATH
1249template<class T_numtype1, int N_rank1, class T_numtype2, int N_rank2>
1250inline
1251_bz_ArrayExpr<_bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, ArrayIterator<T_numtype2, N_rank2>,
1252    _bz_drem<T_numtype1,T_numtype2> > >
1253drem(const Array<T_numtype1, N_rank1>& d1, const Array<T_numtype2, N_rank2>& d2)
1254{
1255    return _bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, ArrayIterator<T_numtype2, N_rank2>,
1256    _bz_drem<T_numtype1,T_numtype2> >(d1.begin(), d2.begin());
1257}
1258
1259template<class T_numtype1, int N_rank1, class P_expr2>
1260inline
1261_bz_ArrayExpr<_bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExpr<P_expr2>,
1262    _bz_drem<T_numtype1,typename P_expr2::T_numtype> > >
1263drem(const Array<T_numtype1, N_rank1>& d1, _bz_ArrayExpr<P_expr2> d2)
1264{
1265    return _bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExpr<P_expr2>,
1266    _bz_drem<T_numtype1,typename P_expr2::T_numtype> >(d1.begin(), d2);
1267}
1268
1269template<class T_numtype1, int N_rank1, int N_index2>
1270inline
1271_bz_ArrayExpr<_bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, IndexPlaceholder<N_index2>,
1272    _bz_drem<T_numtype1,int> > >
1273drem(const Array<T_numtype1, N_rank1>& d1, IndexPlaceholder<N_index2> d2)
1274{
1275    return _bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, IndexPlaceholder<N_index2>,
1276    _bz_drem<T_numtype1,int> >(d1.begin(), d2);
1277}
1278
1279template<class T_numtype1, int N_rank1>
1280inline
1281_bz_ArrayExpr<_bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExprConstant<float>,
1282    _bz_drem<T_numtype1,float> > >
1283drem(const Array<T_numtype1, N_rank1>& d1, float d2)
1284{
1285    return _bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExprConstant<float>,
1286    _bz_drem<T_numtype1,float> >(d1.begin(), _bz_ArrayExprConstant<float>(d2));
1287}
1288
1289template<class T_numtype1, int N_rank1>
1290inline
1291_bz_ArrayExpr<_bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExprConstant<double>,
1292    _bz_drem<T_numtype1,double> > >
1293drem(const Array<T_numtype1, N_rank1>& d1, double d2)
1294{
1295    return _bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExprConstant<double>,
1296    _bz_drem<T_numtype1,double> >(d1.begin(), _bz_ArrayExprConstant<double>(d2));
1297}
1298
1299template<class T_numtype1, int N_rank1>
1300inline
1301_bz_ArrayExpr<_bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExprConstant<long double>,
1302    _bz_drem<T_numtype1,long double> > >
1303drem(const Array<T_numtype1, N_rank1>& d1, long double d2)
1304{
1305    return _bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExprConstant<long double>,
1306    _bz_drem<T_numtype1,long double> >(d1.begin(), _bz_ArrayExprConstant<long double>(d2));
1307}
1308
1309#ifdef BZ_HAVE_COMPLEX
1310template<class T_numtype1, int N_rank1, class T2>
1311inline
1312_bz_ArrayExpr<_bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExprConstant<complex<T2> > ,
1313    _bz_drem<T_numtype1,complex<T2> > > >
1314drem(const Array<T_numtype1, N_rank1>& d1, complex<T2> d2)
1315{
1316    return _bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExprConstant<complex<T2> > ,
1317    _bz_drem<T_numtype1,complex<T2> > >(d1.begin(), _bz_ArrayExprConstant<complex<T2> > (d2));
1318}
1319
1320#endif // BZ_HAVE_COMPLEX
1321
1322template<class P_expr1, class T_numtype2, int N_rank2>
1323inline
1324_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, ArrayIterator<T_numtype2, N_rank2>,
1325    _bz_drem<typename P_expr1::T_numtype,T_numtype2> > >
1326drem(_bz_ArrayExpr<P_expr1> d1, const Array<T_numtype2, N_rank2>& d2)
1327{
1328    return _bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, ArrayIterator<T_numtype2, N_rank2>,
1329    _bz_drem<typename P_expr1::T_numtype,T_numtype2> >(d1, d2.begin());
1330}
1331
1332template<class P_expr1, class P_expr2>
1333inline
1334_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExpr<P_expr2>,
1335    _bz_drem<typename P_expr1::T_numtype,typename P_expr2::T_numtype> > >
1336drem(_bz_ArrayExpr<P_expr1> d1, _bz_ArrayExpr<P_expr2> d2)
1337{
1338    return _bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExpr<P_expr2>,
1339    _bz_drem<typename P_expr1::T_numtype,typename P_expr2::T_numtype> >(d1, d2);
1340}
1341
1342template<class P_expr1, int N_index2>
1343inline
1344_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, IndexPlaceholder<N_index2>,
1345    _bz_drem<typename P_expr1::T_numtype,int> > >
1346drem(_bz_ArrayExpr<P_expr1> d1, IndexPlaceholder<N_index2> d2)
1347{
1348    return _bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, IndexPlaceholder<N_index2>,
1349    _bz_drem<typename P_expr1::T_numtype,int> >(d1, d2);
1350}
1351
1352template<class P_expr1>
1353inline
1354_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExprConstant<float>,
1355    _bz_drem<typename P_expr1::T_numtype,float> > >
1356drem(_bz_ArrayExpr<P_expr1> d1, float d2)
1357{
1358    return _bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExprConstant<float>,
1359    _bz_drem<typename P_expr1::T_numtype,float> >(d1, _bz_ArrayExprConstant<float>(d2));
1360}
1361
1362template<class P_expr1>
1363inline
1364_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExprConstant<double>,
1365    _bz_drem<typename P_expr1::T_numtype,double> > >
1366drem(_bz_ArrayExpr<P_expr1> d1, double d2)
1367{
1368    return _bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExprConstant<double>,
1369    _bz_drem<typename P_expr1::T_numtype,double> >(d1, _bz_ArrayExprConstant<double>(d2));
1370}
1371
1372template<class P_expr1>
1373inline
1374_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExprConstant<long double>,
1375    _bz_drem<typename P_expr1::T_numtype,long double> > >
1376drem(_bz_ArrayExpr<P_expr1> d1, long double d2)
1377{
1378    return _bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExprConstant<long double>,
1379    _bz_drem<typename P_expr1::T_numtype,long double> >(d1, _bz_ArrayExprConstant<long double>(d2));
1380}
1381
1382#ifdef BZ_HAVE_COMPLEX
1383template<class P_expr1, class T2>
1384inline
1385_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExprConstant<complex<T2> > ,
1386    _bz_drem<typename P_expr1::T_numtype,complex<T2> > > >
1387drem(_bz_ArrayExpr<P_expr1> d1, complex<T2> d2)
1388{
1389    return _bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExprConstant<complex<T2> > ,
1390    _bz_drem<typename P_expr1::T_numtype,complex<T2> > >(d1, _bz_ArrayExprConstant<complex<T2> > (d2));
1391}
1392
1393#endif // BZ_HAVE_COMPLEX
1394
1395template<int N_index1, class T_numtype2, int N_rank2>
1396inline
1397_bz_ArrayExpr<_bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, ArrayIterator<T_numtype2, N_rank2>,
1398    _bz_drem<int,T_numtype2> > >
1399drem(IndexPlaceholder<N_index1> d1, const Array<T_numtype2, N_rank2>& d2)
1400{
1401    return _bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, ArrayIterator<T_numtype2, N_rank2>,
1402    _bz_drem<int,T_numtype2> >(d1, d2.begin());
1403}
1404
1405template<int N_index1, class P_expr2>
1406inline
1407_bz_ArrayExpr<_bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExpr<P_expr2>,
1408    _bz_drem<int,typename P_expr2::T_numtype> > >
1409drem(IndexPlaceholder<N_index1> d1, _bz_ArrayExpr<P_expr2> d2)
1410{
1411    return _bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExpr<P_expr2>,
1412    _bz_drem<int,typename P_expr2::T_numtype> >(d1, d2);
1413}
1414
1415template<int N_index1, int N_index2>
1416inline
1417_bz_ArrayExpr<_bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, IndexPlaceholder<N_index2>,
1418    _bz_drem<int,int> > >
1419drem(IndexPlaceholder<N_index1> d1, IndexPlaceholder<N_index2> d2)
1420{
1421    return _bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, IndexPlaceholder<N_index2>,
1422    _bz_drem<int,int> >(d1, d2);
1423}
1424
1425template<int N_index1>
1426inline
1427_bz_ArrayExpr<_bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExprConstant<float>,
1428    _bz_drem<int,float> > >
1429drem(IndexPlaceholder<N_index1> d1, float d2)
1430{
1431    return _bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExprConstant<float>,
1432    _bz_drem<int,float> >(d1, _bz_ArrayExprConstant<float>(d2));
1433}
1434
1435template<int N_index1>
1436inline
1437_bz_ArrayExpr<_bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExprConstant<double>,
1438    _bz_drem<int,double> > >
1439drem(IndexPlaceholder<N_index1> d1, double d2)
1440{
1441    return _bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExprConstant<double>,
1442    _bz_drem<int,double> >(d1, _bz_ArrayExprConstant<double>(d2));
1443}
1444
1445template<int N_index1>
1446inline
1447_bz_ArrayExpr<_bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExprConstant<long double>,
1448    _bz_drem<int,long double> > >
1449drem(IndexPlaceholder<N_index1> d1, long double d2)
1450{
1451    return _bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExprConstant<long double>,
1452    _bz_drem<int,long double> >(d1, _bz_ArrayExprConstant<long double>(d2));
1453}
1454
1455#ifdef BZ_HAVE_COMPLEX
1456template<int N_index1, class T2>
1457inline
1458_bz_ArrayExpr<_bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExprConstant<complex<T2> > ,
1459    _bz_drem<int,complex<T2> > > >
1460drem(IndexPlaceholder<N_index1> d1, complex<T2> d2)
1461{
1462    return _bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExprConstant<complex<T2> > ,
1463    _bz_drem<int,complex<T2> > >(d1, _bz_ArrayExprConstant<complex<T2> > (d2));
1464}
1465
1466#endif // BZ_HAVE_COMPLEX
1467
1468template<class T_numtype2, int N_rank2>
1469inline
1470_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<float>, ArrayIterator<T_numtype2, N_rank2>,
1471    _bz_drem<float,T_numtype2> > >
1472drem(float d1, const Array<T_numtype2, N_rank2>& d2)
1473{
1474    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<float>, ArrayIterator<T_numtype2, N_rank2>,
1475    _bz_drem<float,T_numtype2> >(_bz_ArrayExprConstant<float>(d1), d2.begin());
1476}
1477
1478template<class P_expr2>
1479inline
1480_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<float>, _bz_ArrayExpr<P_expr2>,
1481    _bz_drem<float,typename P_expr2::T_numtype> > >
1482drem(float d1, _bz_ArrayExpr<P_expr2> d2)
1483{
1484    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<float>, _bz_ArrayExpr<P_expr2>,
1485    _bz_drem<float,typename P_expr2::T_numtype> >(_bz_ArrayExprConstant<float>(d1), d2);
1486}
1487
1488template<int N_index2>
1489inline
1490_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<float>, IndexPlaceholder<N_index2>,
1491    _bz_drem<float,int> > >
1492drem(float d1, IndexPlaceholder<N_index2> d2)
1493{
1494    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<float>, IndexPlaceholder<N_index2>,
1495    _bz_drem<float,int> >(_bz_ArrayExprConstant<float>(d1), d2);
1496}
1497
1498template<class T_numtype2, int N_rank2>
1499inline
1500_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<double>, ArrayIterator<T_numtype2, N_rank2>,
1501    _bz_drem<double,T_numtype2> > >
1502drem(double d1, const Array<T_numtype2, N_rank2>& d2)
1503{
1504    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<double>, ArrayIterator<T_numtype2, N_rank2>,
1505    _bz_drem<double,T_numtype2> >(_bz_ArrayExprConstant<double>(d1), d2.begin());
1506}
1507
1508template<class P_expr2>
1509inline
1510_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<double>, _bz_ArrayExpr<P_expr2>,
1511    _bz_drem<double,typename P_expr2::T_numtype> > >
1512drem(double d1, _bz_ArrayExpr<P_expr2> d2)
1513{
1514    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<double>, _bz_ArrayExpr<P_expr2>,
1515    _bz_drem<double,typename P_expr2::T_numtype> >(_bz_ArrayExprConstant<double>(d1), d2);
1516}
1517
1518template<int N_index2>
1519inline
1520_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<double>, IndexPlaceholder<N_index2>,
1521    _bz_drem<double,int> > >
1522drem(double d1, IndexPlaceholder<N_index2> d2)
1523{
1524    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<double>, IndexPlaceholder<N_index2>,
1525    _bz_drem<double,int> >(_bz_ArrayExprConstant<double>(d1), d2);
1526}
1527
1528template<class T_numtype2, int N_rank2>
1529inline
1530_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<long double>, ArrayIterator<T_numtype2, N_rank2>,
1531    _bz_drem<long double,T_numtype2> > >
1532drem(long double d1, const Array<T_numtype2, N_rank2>& d2)
1533{
1534    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<long double>, ArrayIterator<T_numtype2, N_rank2>,
1535    _bz_drem<long double,T_numtype2> >(_bz_ArrayExprConstant<long double>(d1), d2.begin());
1536}
1537
1538template<class P_expr2>
1539inline
1540_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<long double>, _bz_ArrayExpr<P_expr2>,
1541    _bz_drem<long double,typename P_expr2::T_numtype> > >
1542drem(long double d1, _bz_ArrayExpr<P_expr2> d2)
1543{
1544    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<long double>, _bz_ArrayExpr<P_expr2>,
1545    _bz_drem<long double,typename P_expr2::T_numtype> >(_bz_ArrayExprConstant<long double>(d1), d2);
1546}
1547
1548template<int N_index2>
1549inline
1550_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<long double>, IndexPlaceholder<N_index2>,
1551    _bz_drem<long double,int> > >
1552drem(long double d1, IndexPlaceholder<N_index2> d2)
1553{
1554    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<long double>, IndexPlaceholder<N_index2>,
1555    _bz_drem<long double,int> >(_bz_ArrayExprConstant<long double>(d1), d2);
1556}
1557
1558#ifdef BZ_HAVE_COMPLEX
1559template<class T1, class T_numtype2, int N_rank2>
1560inline
1561_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<complex<T1> > , ArrayIterator<T_numtype2, N_rank2>,
1562    _bz_drem<complex<T1> ,T_numtype2> > >
1563drem(complex<T1> d1, const Array<T_numtype2, N_rank2>& d2)
1564{
1565    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<complex<T1> > , ArrayIterator<T_numtype2, N_rank2>,
1566    _bz_drem<complex<T1> ,T_numtype2> >(_bz_ArrayExprConstant<complex<T1> > (d1), d2.begin());
1567}
1568
1569#endif // BZ_HAVE_COMPLEX
1570
1571#ifdef BZ_HAVE_COMPLEX
1572template<class T1, class P_expr2>
1573inline
1574_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<complex<T1> > , _bz_ArrayExpr<P_expr2>,
1575    _bz_drem<complex<T1> ,typename P_expr2::T_numtype> > >
1576drem(complex<T1> d1, _bz_ArrayExpr<P_expr2> d2)
1577{
1578    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<complex<T1> > , _bz_ArrayExpr<P_expr2>,
1579    _bz_drem<complex<T1> ,typename P_expr2::T_numtype> >(_bz_ArrayExprConstant<complex<T1> > (d1), d2);
1580}
1581
1582#endif // BZ_HAVE_COMPLEX
1583
1584#ifdef BZ_HAVE_COMPLEX
1585template<class T1, int N_index2>
1586inline
1587_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<complex<T1> > , IndexPlaceholder<N_index2>,
1588    _bz_drem<complex<T1> ,int> > >
1589drem(complex<T1> d1, IndexPlaceholder<N_index2> d2)
1590{
1591    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<complex<T1> > , IndexPlaceholder<N_index2>,
1592    _bz_drem<complex<T1> ,int> >(_bz_ArrayExprConstant<complex<T1> > (d1), d2);
1593}
1594
1595#endif // BZ_HAVE_COMPLEX
1596
1597#endif
1598
1599/****************************************************************************
1600 * exp
1601 ****************************************************************************/
1602
1603template<class T_numtype1, int N_rank1>
1604inline
1605_bz_ArrayExpr<_bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
1606    _bz_exp<T_numtype1> > >
1607exp(const Array<T_numtype1, N_rank1>& d1)
1608{
1609    return _bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
1610    _bz_exp<T_numtype1> >(d1.begin());
1611}
1612
1613template<class P_expr1>
1614inline
1615_bz_ArrayExpr<_bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
1616    _bz_exp<typename P_expr1::T_numtype> > >
1617exp(_bz_ArrayExpr<P_expr1> d1)
1618{
1619    return _bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
1620    _bz_exp<typename P_expr1::T_numtype> >(d1);
1621}
1622
1623template<int N_index1>
1624inline
1625_bz_ArrayExpr<_bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
1626    _bz_exp<int> > >
1627exp(IndexPlaceholder<N_index1> d1)
1628{
1629    return _bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
1630    _bz_exp<int> >(d1);
1631}
1632
1633
1634/****************************************************************************
1635 * expm1
1636 ****************************************************************************/
1637
1638#ifdef BZ_HAVE_IEEE_MATH
1639template<class T_numtype1, int N_rank1>
1640inline
1641_bz_ArrayExpr<_bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
1642    _bz_expm1<T_numtype1> > >
1643expm1(const Array<T_numtype1, N_rank1>& d1)
1644{
1645    return _bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
1646    _bz_expm1<T_numtype1> >(d1.begin());
1647}
1648
1649template<class P_expr1>
1650inline
1651_bz_ArrayExpr<_bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
1652    _bz_expm1<typename P_expr1::T_numtype> > >
1653expm1(_bz_ArrayExpr<P_expr1> d1)
1654{
1655    return _bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
1656    _bz_expm1<typename P_expr1::T_numtype> >(d1);
1657}
1658
1659template<int N_index1>
1660inline
1661_bz_ArrayExpr<_bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
1662    _bz_expm1<int> > >
1663expm1(IndexPlaceholder<N_index1> d1)
1664{
1665    return _bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
1666    _bz_expm1<int> >(d1);
1667}
1668
1669#endif
1670
1671/****************************************************************************
1672 * erf
1673 ****************************************************************************/
1674
1675#ifdef BZ_HAVE_IEEE_MATH
1676template<class T_numtype1, int N_rank1>
1677inline
1678_bz_ArrayExpr<_bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
1679    _bz_erf<T_numtype1> > >
1680erf(const Array<T_numtype1, N_rank1>& d1)
1681{
1682    return _bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
1683    _bz_erf<T_numtype1> >(d1.begin());
1684}
1685
1686template<class P_expr1>
1687inline
1688_bz_ArrayExpr<_bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
1689    _bz_erf<typename P_expr1::T_numtype> > >
1690erf(_bz_ArrayExpr<P_expr1> d1)
1691{
1692    return _bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
1693    _bz_erf<typename P_expr1::T_numtype> >(d1);
1694}
1695
1696template<int N_index1>
1697inline
1698_bz_ArrayExpr<_bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
1699    _bz_erf<int> > >
1700erf(IndexPlaceholder<N_index1> d1)
1701{
1702    return _bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
1703    _bz_erf<int> >(d1);
1704}
1705
1706#endif
1707
1708/****************************************************************************
1709 * erfc
1710 ****************************************************************************/
1711
1712#ifdef BZ_HAVE_IEEE_MATH
1713template<class T_numtype1, int N_rank1>
1714inline
1715_bz_ArrayExpr<_bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
1716    _bz_erfc<T_numtype1> > >
1717erfc(const Array<T_numtype1, N_rank1>& d1)
1718{
1719    return _bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
1720    _bz_erfc<T_numtype1> >(d1.begin());
1721}
1722
1723template<class P_expr1>
1724inline
1725_bz_ArrayExpr<_bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
1726    _bz_erfc<typename P_expr1::T_numtype> > >
1727erfc(_bz_ArrayExpr<P_expr1> d1)
1728{
1729    return _bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
1730    _bz_erfc<typename P_expr1::T_numtype> >(d1);
1731}
1732
1733template<int N_index1>
1734inline
1735_bz_ArrayExpr<_bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
1736    _bz_erfc<int> > >
1737erfc(IndexPlaceholder<N_index1> d1)
1738{
1739    return _bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
1740    _bz_erfc<int> >(d1);
1741}
1742
1743#endif
1744
1745/****************************************************************************
1746 * fabs
1747 ****************************************************************************/
1748
1749template<class T_numtype1, int N_rank1>
1750inline
1751_bz_ArrayExpr<_bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
1752    _bz_abs<T_numtype1> > >
1753fabs(const Array<T_numtype1, N_rank1>& d1)
1754{
1755    return _bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
1756    _bz_abs<T_numtype1> >(d1.begin());
1757}
1758
1759template<class P_expr1>
1760inline
1761_bz_ArrayExpr<_bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
1762    _bz_abs<typename P_expr1::T_numtype> > >
1763fabs(_bz_ArrayExpr<P_expr1> d1)
1764{
1765    return _bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
1766    _bz_abs<typename P_expr1::T_numtype> >(d1);
1767}
1768
1769template<int N_index1>
1770inline
1771_bz_ArrayExpr<_bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
1772    _bz_abs<int> > >
1773fabs(IndexPlaceholder<N_index1> d1)
1774{
1775    return _bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
1776    _bz_abs<int> >(d1);
1777}
1778
1779
1780/****************************************************************************
1781 * floor
1782 ****************************************************************************/
1783
1784template<class T_numtype1, int N_rank1>
1785inline
1786_bz_ArrayExpr<_bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
1787    _bz_floor<T_numtype1> > >
1788floor(const Array<T_numtype1, N_rank1>& d1)
1789{
1790    return _bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
1791    _bz_floor<T_numtype1> >(d1.begin());
1792}
1793
1794template<class P_expr1>
1795inline
1796_bz_ArrayExpr<_bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
1797    _bz_floor<typename P_expr1::T_numtype> > >
1798floor(_bz_ArrayExpr<P_expr1> d1)
1799{
1800    return _bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
1801    _bz_floor<typename P_expr1::T_numtype> >(d1);
1802}
1803
1804template<int N_index1>
1805inline
1806_bz_ArrayExpr<_bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
1807    _bz_floor<int> > >
1808floor(IndexPlaceholder<N_index1> d1)
1809{
1810    return _bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
1811    _bz_floor<int> >(d1);
1812}
1813
1814
1815/****************************************************************************
1816 * fmod
1817 ****************************************************************************/
1818
1819#ifdef BZ_HAVE_SYSTEM_V_MATH
1820template<class T_numtype1, int N_rank1, class T_numtype2, int N_rank2>
1821inline
1822_bz_ArrayExpr<_bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, ArrayIterator<T_numtype2, N_rank2>,
1823    _bz_fmod<T_numtype1,T_numtype2> > >
1824fmod(const Array<T_numtype1, N_rank1>& d1, const Array<T_numtype2, N_rank2>& d2)
1825{
1826    return _bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, ArrayIterator<T_numtype2, N_rank2>,
1827    _bz_fmod<T_numtype1,T_numtype2> >(d1.begin(), d2.begin());
1828}
1829
1830template<class T_numtype1, int N_rank1, class P_expr2>
1831inline
1832_bz_ArrayExpr<_bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExpr<P_expr2>,
1833    _bz_fmod<T_numtype1,typename P_expr2::T_numtype> > >
1834fmod(const Array<T_numtype1, N_rank1>& d1, _bz_ArrayExpr<P_expr2> d2)
1835{
1836    return _bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExpr<P_expr2>,
1837    _bz_fmod<T_numtype1,typename P_expr2::T_numtype> >(d1.begin(), d2);
1838}
1839
1840template<class T_numtype1, int N_rank1, int N_index2>
1841inline
1842_bz_ArrayExpr<_bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, IndexPlaceholder<N_index2>,
1843    _bz_fmod<T_numtype1,int> > >
1844fmod(const Array<T_numtype1, N_rank1>& d1, IndexPlaceholder<N_index2> d2)
1845{
1846    return _bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, IndexPlaceholder<N_index2>,
1847    _bz_fmod<T_numtype1,int> >(d1.begin(), d2);
1848}
1849
1850template<class T_numtype1, int N_rank1>
1851inline
1852_bz_ArrayExpr<_bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExprConstant<float>,
1853    _bz_fmod<T_numtype1,float> > >
1854fmod(const Array<T_numtype1, N_rank1>& d1, float d2)
1855{
1856    return _bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExprConstant<float>,
1857    _bz_fmod<T_numtype1,float> >(d1.begin(), _bz_ArrayExprConstant<float>(d2));
1858}
1859
1860template<class T_numtype1, int N_rank1>
1861inline
1862_bz_ArrayExpr<_bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExprConstant<double>,
1863    _bz_fmod<T_numtype1,double> > >
1864fmod(const Array<T_numtype1, N_rank1>& d1, double d2)
1865{
1866    return _bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExprConstant<double>,
1867    _bz_fmod<T_numtype1,double> >(d1.begin(), _bz_ArrayExprConstant<double>(d2));
1868}
1869
1870template<class T_numtype1, int N_rank1>
1871inline
1872_bz_ArrayExpr<_bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExprConstant<long double>,
1873    _bz_fmod<T_numtype1,long double> > >
1874fmod(const Array<T_numtype1, N_rank1>& d1, long double d2)
1875{
1876    return _bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExprConstant<long double>,
1877    _bz_fmod<T_numtype1,long double> >(d1.begin(), _bz_ArrayExprConstant<long double>(d2));
1878}
1879
1880#ifdef BZ_HAVE_COMPLEX
1881template<class T_numtype1, int N_rank1, class T2>
1882inline
1883_bz_ArrayExpr<_bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExprConstant<complex<T2> > ,
1884    _bz_fmod<T_numtype1,complex<T2> > > >
1885fmod(const Array<T_numtype1, N_rank1>& d1, complex<T2> d2)
1886{
1887    return _bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExprConstant<complex<T2> > ,
1888    _bz_fmod<T_numtype1,complex<T2> > >(d1.begin(), _bz_ArrayExprConstant<complex<T2> > (d2));
1889}
1890
1891#endif // BZ_HAVE_COMPLEX
1892
1893template<class P_expr1, class T_numtype2, int N_rank2>
1894inline
1895_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, ArrayIterator<T_numtype2, N_rank2>,
1896    _bz_fmod<typename P_expr1::T_numtype,T_numtype2> > >
1897fmod(_bz_ArrayExpr<P_expr1> d1, const Array<T_numtype2, N_rank2>& d2)
1898{
1899    return _bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, ArrayIterator<T_numtype2, N_rank2>,
1900    _bz_fmod<typename P_expr1::T_numtype,T_numtype2> >(d1, d2.begin());
1901}
1902
1903template<class P_expr1, class P_expr2>
1904inline
1905_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExpr<P_expr2>,
1906    _bz_fmod<typename P_expr1::T_numtype,typename P_expr2::T_numtype> > >
1907fmod(_bz_ArrayExpr<P_expr1> d1, _bz_ArrayExpr<P_expr2> d2)
1908{
1909    return _bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExpr<P_expr2>,
1910    _bz_fmod<typename P_expr1::T_numtype,typename P_expr2::T_numtype> >(d1, d2);
1911}
1912
1913template<class P_expr1, int N_index2>
1914inline
1915_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, IndexPlaceholder<N_index2>,
1916    _bz_fmod<typename P_expr1::T_numtype,int> > >
1917fmod(_bz_ArrayExpr<P_expr1> d1, IndexPlaceholder<N_index2> d2)
1918{
1919    return _bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, IndexPlaceholder<N_index2>,
1920    _bz_fmod<typename P_expr1::T_numtype,int> >(d1, d2);
1921}
1922
1923template<class P_expr1>
1924inline
1925_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExprConstant<float>,
1926    _bz_fmod<typename P_expr1::T_numtype,float> > >
1927fmod(_bz_ArrayExpr<P_expr1> d1, float d2)
1928{
1929    return _bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExprConstant<float>,
1930    _bz_fmod<typename P_expr1::T_numtype,float> >(d1, _bz_ArrayExprConstant<float>(d2));
1931}
1932
1933template<class P_expr1>
1934inline
1935_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExprConstant<double>,
1936    _bz_fmod<typename P_expr1::T_numtype,double> > >
1937fmod(_bz_ArrayExpr<P_expr1> d1, double d2)
1938{
1939    return _bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExprConstant<double>,
1940    _bz_fmod<typename P_expr1::T_numtype,double> >(d1, _bz_ArrayExprConstant<double>(d2));
1941}
1942
1943template<class P_expr1>
1944inline
1945_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExprConstant<long double>,
1946    _bz_fmod<typename P_expr1::T_numtype,long double> > >
1947fmod(_bz_ArrayExpr<P_expr1> d1, long double d2)
1948{
1949    return _bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExprConstant<long double>,
1950    _bz_fmod<typename P_expr1::T_numtype,long double> >(d1, _bz_ArrayExprConstant<long double>(d2));
1951}
1952
1953#ifdef BZ_HAVE_COMPLEX
1954template<class P_expr1, class T2>
1955inline
1956_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExprConstant<complex<T2> > ,
1957    _bz_fmod<typename P_expr1::T_numtype,complex<T2> > > >
1958fmod(_bz_ArrayExpr<P_expr1> d1, complex<T2> d2)
1959{
1960    return _bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExprConstant<complex<T2> > ,
1961    _bz_fmod<typename P_expr1::T_numtype,complex<T2> > >(d1, _bz_ArrayExprConstant<complex<T2> > (d2));
1962}
1963
1964#endif // BZ_HAVE_COMPLEX
1965
1966template<int N_index1, class T_numtype2, int N_rank2>
1967inline
1968_bz_ArrayExpr<_bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, ArrayIterator<T_numtype2, N_rank2>,
1969    _bz_fmod<int,T_numtype2> > >
1970fmod(IndexPlaceholder<N_index1> d1, const Array<T_numtype2, N_rank2>& d2)
1971{
1972    return _bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, ArrayIterator<T_numtype2, N_rank2>,
1973    _bz_fmod<int,T_numtype2> >(d1, d2.begin());
1974}
1975
1976template<int N_index1, class P_expr2>
1977inline
1978_bz_ArrayExpr<_bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExpr<P_expr2>,
1979    _bz_fmod<int,typename P_expr2::T_numtype> > >
1980fmod(IndexPlaceholder<N_index1> d1, _bz_ArrayExpr<P_expr2> d2)
1981{
1982    return _bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExpr<P_expr2>,
1983    _bz_fmod<int,typename P_expr2::T_numtype> >(d1, d2);
1984}
1985
1986template<int N_index1, int N_index2>
1987inline
1988_bz_ArrayExpr<_bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, IndexPlaceholder<N_index2>,
1989    _bz_fmod<int,int> > >
1990fmod(IndexPlaceholder<N_index1> d1, IndexPlaceholder<N_index2> d2)
1991{
1992    return _bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, IndexPlaceholder<N_index2>,
1993    _bz_fmod<int,int> >(d1, d2);
1994}
1995
1996template<int N_index1>
1997inline
1998_bz_ArrayExpr<_bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExprConstant<float>,
1999    _bz_fmod<int,float> > >
2000fmod(IndexPlaceholder<N_index1> d1, float d2)
2001{
2002    return _bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExprConstant<float>,
2003    _bz_fmod<int,float> >(d1, _bz_ArrayExprConstant<float>(d2));
2004}
2005
2006template<int N_index1>
2007inline
2008_bz_ArrayExpr<_bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExprConstant<double>,
2009    _bz_fmod<int,double> > >
2010fmod(IndexPlaceholder<N_index1> d1, double d2)
2011{
2012    return _bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExprConstant<double>,
2013    _bz_fmod<int,double> >(d1, _bz_ArrayExprConstant<double>(d2));
2014}
2015
2016template<int N_index1>
2017inline
2018_bz_ArrayExpr<_bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExprConstant<long double>,
2019    _bz_fmod<int,long double> > >
2020fmod(IndexPlaceholder<N_index1> d1, long double d2)
2021{
2022    return _bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExprConstant<long double>,
2023    _bz_fmod<int,long double> >(d1, _bz_ArrayExprConstant<long double>(d2));
2024}
2025
2026#ifdef BZ_HAVE_COMPLEX
2027template<int N_index1, class T2>
2028inline
2029_bz_ArrayExpr<_bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExprConstant<complex<T2> > ,
2030    _bz_fmod<int,complex<T2> > > >
2031fmod(IndexPlaceholder<N_index1> d1, complex<T2> d2)
2032{
2033    return _bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExprConstant<complex<T2> > ,
2034    _bz_fmod<int,complex<T2> > >(d1, _bz_ArrayExprConstant<complex<T2> > (d2));
2035}
2036
2037#endif // BZ_HAVE_COMPLEX
2038
2039template<class T_numtype2, int N_rank2>
2040inline
2041_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<float>, ArrayIterator<T_numtype2, N_rank2>,
2042    _bz_fmod<float,T_numtype2> > >
2043fmod(float d1, const Array<T_numtype2, N_rank2>& d2)
2044{
2045    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<float>, ArrayIterator<T_numtype2, N_rank2>,
2046    _bz_fmod<float,T_numtype2> >(_bz_ArrayExprConstant<float>(d1), d2.begin());
2047}
2048
2049template<class P_expr2>
2050inline
2051_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<float>, _bz_ArrayExpr<P_expr2>,
2052    _bz_fmod<float,typename P_expr2::T_numtype> > >
2053fmod(float d1, _bz_ArrayExpr<P_expr2> d2)
2054{
2055    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<float>, _bz_ArrayExpr<P_expr2>,
2056    _bz_fmod<float,typename P_expr2::T_numtype> >(_bz_ArrayExprConstant<float>(d1), d2);
2057}
2058
2059template<int N_index2>
2060inline
2061_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<float>, IndexPlaceholder<N_index2>,
2062    _bz_fmod<float,int> > >
2063fmod(float d1, IndexPlaceholder<N_index2> d2)
2064{
2065    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<float>, IndexPlaceholder<N_index2>,
2066    _bz_fmod<float,int> >(_bz_ArrayExprConstant<float>(d1), d2);
2067}
2068
2069template<class T_numtype2, int N_rank2>
2070inline
2071_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<double>, ArrayIterator<T_numtype2, N_rank2>,
2072    _bz_fmod<double,T_numtype2> > >
2073fmod(double d1, const Array<T_numtype2, N_rank2>& d2)
2074{
2075    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<double>, ArrayIterator<T_numtype2, N_rank2>,
2076    _bz_fmod<double,T_numtype2> >(_bz_ArrayExprConstant<double>(d1), d2.begin());
2077}
2078
2079template<class P_expr2>
2080inline
2081_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<double>, _bz_ArrayExpr<P_expr2>,
2082    _bz_fmod<double,typename P_expr2::T_numtype> > >
2083fmod(double d1, _bz_ArrayExpr<P_expr2> d2)
2084{
2085    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<double>, _bz_ArrayExpr<P_expr2>,
2086    _bz_fmod<double,typename P_expr2::T_numtype> >(_bz_ArrayExprConstant<double>(d1), d2);
2087}
2088
2089template<int N_index2>
2090inline
2091_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<double>, IndexPlaceholder<N_index2>,
2092    _bz_fmod<double,int> > >
2093fmod(double d1, IndexPlaceholder<N_index2> d2)
2094{
2095    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<double>, IndexPlaceholder<N_index2>,
2096    _bz_fmod<double,int> >(_bz_ArrayExprConstant<double>(d1), d2);
2097}
2098
2099template<class T_numtype2, int N_rank2>
2100inline
2101_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<long double>, ArrayIterator<T_numtype2, N_rank2>,
2102    _bz_fmod<long double,T_numtype2> > >
2103fmod(long double d1, const Array<T_numtype2, N_rank2>& d2)
2104{
2105    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<long double>, ArrayIterator<T_numtype2, N_rank2>,
2106    _bz_fmod<long double,T_numtype2> >(_bz_ArrayExprConstant<long double>(d1), d2.begin());
2107}
2108
2109template<class P_expr2>
2110inline
2111_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<long double>, _bz_ArrayExpr<P_expr2>,
2112    _bz_fmod<long double,typename P_expr2::T_numtype> > >
2113fmod(long double d1, _bz_ArrayExpr<P_expr2> d2)
2114{
2115    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<long double>, _bz_ArrayExpr<P_expr2>,
2116    _bz_fmod<long double,typename P_expr2::T_numtype> >(_bz_ArrayExprConstant<long double>(d1), d2);
2117}
2118
2119template<int N_index2>
2120inline
2121_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<long double>, IndexPlaceholder<N_index2>,
2122    _bz_fmod<long double,int> > >
2123fmod(long double d1, IndexPlaceholder<N_index2> d2)
2124{
2125    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<long double>, IndexPlaceholder<N_index2>,
2126    _bz_fmod<long double,int> >(_bz_ArrayExprConstant<long double>(d1), d2);
2127}
2128
2129#ifdef BZ_HAVE_COMPLEX
2130template<class T1, class T_numtype2, int N_rank2>
2131inline
2132_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<complex<T1> > , ArrayIterator<T_numtype2, N_rank2>,
2133    _bz_fmod<complex<T1> ,T_numtype2> > >
2134fmod(complex<T1> d1, const Array<T_numtype2, N_rank2>& d2)
2135{
2136    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<complex<T1> > , ArrayIterator<T_numtype2, N_rank2>,
2137    _bz_fmod<complex<T1> ,T_numtype2> >(_bz_ArrayExprConstant<complex<T1> > (d1), d2.begin());
2138}
2139
2140#endif // BZ_HAVE_COMPLEX
2141
2142#ifdef BZ_HAVE_COMPLEX
2143template<class T1, class P_expr2>
2144inline
2145_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<complex<T1> > , _bz_ArrayExpr<P_expr2>,
2146    _bz_fmod<complex<T1> ,typename P_expr2::T_numtype> > >
2147fmod(complex<T1> d1, _bz_ArrayExpr<P_expr2> d2)
2148{
2149    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<complex<T1> > , _bz_ArrayExpr<P_expr2>,
2150    _bz_fmod<complex<T1> ,typename P_expr2::T_numtype> >(_bz_ArrayExprConstant<complex<T1> > (d1), d2);
2151}
2152
2153#endif // BZ_HAVE_COMPLEX
2154
2155#ifdef BZ_HAVE_COMPLEX
2156template<class T1, int N_index2>
2157inline
2158_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<complex<T1> > , IndexPlaceholder<N_index2>,
2159    _bz_fmod<complex<T1> ,int> > >
2160fmod(complex<T1> d1, IndexPlaceholder<N_index2> d2)
2161{
2162    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<complex<T1> > , IndexPlaceholder<N_index2>,
2163    _bz_fmod<complex<T1> ,int> >(_bz_ArrayExprConstant<complex<T1> > (d1), d2);
2164}
2165
2166#endif // BZ_HAVE_COMPLEX
2167
2168#endif
2169
2170/****************************************************************************
2171 * hypot
2172 ****************************************************************************/
2173
2174#ifdef BZ_HAVE_SYSTEM_V_MATH
2175template<class T_numtype1, int N_rank1, class T_numtype2, int N_rank2>
2176inline
2177_bz_ArrayExpr<_bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, ArrayIterator<T_numtype2, N_rank2>,
2178    _bz_hypot<T_numtype1,T_numtype2> > >
2179hypot(const Array<T_numtype1, N_rank1>& d1, const Array<T_numtype2, N_rank2>& d2)
2180{
2181    return _bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, ArrayIterator<T_numtype2, N_rank2>,
2182    _bz_hypot<T_numtype1,T_numtype2> >(d1.begin(), d2.begin());
2183}
2184
2185template<class T_numtype1, int N_rank1, class P_expr2>
2186inline
2187_bz_ArrayExpr<_bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExpr<P_expr2>,
2188    _bz_hypot<T_numtype1,typename P_expr2::T_numtype> > >
2189hypot(const Array<T_numtype1, N_rank1>& d1, _bz_ArrayExpr<P_expr2> d2)
2190{
2191    return _bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExpr<P_expr2>,
2192    _bz_hypot<T_numtype1,typename P_expr2::T_numtype> >(d1.begin(), d2);
2193}
2194
2195template<class T_numtype1, int N_rank1, int N_index2>
2196inline
2197_bz_ArrayExpr<_bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, IndexPlaceholder<N_index2>,
2198    _bz_hypot<T_numtype1,int> > >
2199hypot(const Array<T_numtype1, N_rank1>& d1, IndexPlaceholder<N_index2> d2)
2200{
2201    return _bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, IndexPlaceholder<N_index2>,
2202    _bz_hypot<T_numtype1,int> >(d1.begin(), d2);
2203}
2204
2205template<class T_numtype1, int N_rank1>
2206inline
2207_bz_ArrayExpr<_bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExprConstant<float>,
2208    _bz_hypot<T_numtype1,float> > >
2209hypot(const Array<T_numtype1, N_rank1>& d1, float d2)
2210{
2211    return _bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExprConstant<float>,
2212    _bz_hypot<T_numtype1,float> >(d1.begin(), _bz_ArrayExprConstant<float>(d2));
2213}
2214
2215template<class T_numtype1, int N_rank1>
2216inline
2217_bz_ArrayExpr<_bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExprConstant<double>,
2218    _bz_hypot<T_numtype1,double> > >
2219hypot(const Array<T_numtype1, N_rank1>& d1, double d2)
2220{
2221    return _bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExprConstant<double>,
2222    _bz_hypot<T_numtype1,double> >(d1.begin(), _bz_ArrayExprConstant<double>(d2));
2223}
2224
2225template<class T_numtype1, int N_rank1>
2226inline
2227_bz_ArrayExpr<_bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExprConstant<long double>,
2228    _bz_hypot<T_numtype1,long double> > >
2229hypot(const Array<T_numtype1, N_rank1>& d1, long double d2)
2230{
2231    return _bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExprConstant<long double>,
2232    _bz_hypot<T_numtype1,long double> >(d1.begin(), _bz_ArrayExprConstant<long double>(d2));
2233}
2234
2235#ifdef BZ_HAVE_COMPLEX
2236template<class T_numtype1, int N_rank1, class T2>
2237inline
2238_bz_ArrayExpr<_bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExprConstant<complex<T2> > ,
2239    _bz_hypot<T_numtype1,complex<T2> > > >
2240hypot(const Array<T_numtype1, N_rank1>& d1, complex<T2> d2)
2241{
2242    return _bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExprConstant<complex<T2> > ,
2243    _bz_hypot<T_numtype1,complex<T2> > >(d1.begin(), _bz_ArrayExprConstant<complex<T2> > (d2));
2244}
2245
2246#endif // BZ_HAVE_COMPLEX
2247
2248template<class P_expr1, class T_numtype2, int N_rank2>
2249inline
2250_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, ArrayIterator<T_numtype2, N_rank2>,
2251    _bz_hypot<typename P_expr1::T_numtype,T_numtype2> > >
2252hypot(_bz_ArrayExpr<P_expr1> d1, const Array<T_numtype2, N_rank2>& d2)
2253{
2254    return _bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, ArrayIterator<T_numtype2, N_rank2>,
2255    _bz_hypot<typename P_expr1::T_numtype,T_numtype2> >(d1, d2.begin());
2256}
2257
2258template<class P_expr1, class P_expr2>
2259inline
2260_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExpr<P_expr2>,
2261    _bz_hypot<typename P_expr1::T_numtype,typename P_expr2::T_numtype> > >
2262hypot(_bz_ArrayExpr<P_expr1> d1, _bz_ArrayExpr<P_expr2> d2)
2263{
2264    return _bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExpr<P_expr2>,
2265    _bz_hypot<typename P_expr1::T_numtype,typename P_expr2::T_numtype> >(d1, d2);
2266}
2267
2268template<class P_expr1, int N_index2>
2269inline
2270_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, IndexPlaceholder<N_index2>,
2271    _bz_hypot<typename P_expr1::T_numtype,int> > >
2272hypot(_bz_ArrayExpr<P_expr1> d1, IndexPlaceholder<N_index2> d2)
2273{
2274    return _bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, IndexPlaceholder<N_index2>,
2275    _bz_hypot<typename P_expr1::T_numtype,int> >(d1, d2);
2276}
2277
2278template<class P_expr1>
2279inline
2280_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExprConstant<float>,
2281    _bz_hypot<typename P_expr1::T_numtype,float> > >
2282hypot(_bz_ArrayExpr<P_expr1> d1, float d2)
2283{
2284    return _bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExprConstant<float>,
2285    _bz_hypot<typename P_expr1::T_numtype,float> >(d1, _bz_ArrayExprConstant<float>(d2));
2286}
2287
2288template<class P_expr1>
2289inline
2290_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExprConstant<double>,
2291    _bz_hypot<typename P_expr1::T_numtype,double> > >
2292hypot(_bz_ArrayExpr<P_expr1> d1, double d2)
2293{
2294    return _bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExprConstant<double>,
2295    _bz_hypot<typename P_expr1::T_numtype,double> >(d1, _bz_ArrayExprConstant<double>(d2));
2296}
2297
2298template<class P_expr1>
2299inline
2300_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExprConstant<long double>,
2301    _bz_hypot<typename P_expr1::T_numtype,long double> > >
2302hypot(_bz_ArrayExpr<P_expr1> d1, long double d2)
2303{
2304    return _bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExprConstant<long double>,
2305    _bz_hypot<typename P_expr1::T_numtype,long double> >(d1, _bz_ArrayExprConstant<long double>(d2));
2306}
2307
2308#ifdef BZ_HAVE_COMPLEX
2309template<class P_expr1, class T2>
2310inline
2311_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExprConstant<complex<T2> > ,
2312    _bz_hypot<typename P_expr1::T_numtype,complex<T2> > > >
2313hypot(_bz_ArrayExpr<P_expr1> d1, complex<T2> d2)
2314{
2315    return _bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExprConstant<complex<T2> > ,
2316    _bz_hypot<typename P_expr1::T_numtype,complex<T2> > >(d1, _bz_ArrayExprConstant<complex<T2> > (d2));
2317}
2318
2319#endif // BZ_HAVE_COMPLEX
2320
2321template<int N_index1, class T_numtype2, int N_rank2>
2322inline
2323_bz_ArrayExpr<_bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, ArrayIterator<T_numtype2, N_rank2>,
2324    _bz_hypot<int,T_numtype2> > >
2325hypot(IndexPlaceholder<N_index1> d1, const Array<T_numtype2, N_rank2>& d2)
2326{
2327    return _bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, ArrayIterator<T_numtype2, N_rank2>,
2328    _bz_hypot<int,T_numtype2> >(d1, d2.begin());
2329}
2330
2331template<int N_index1, class P_expr2>
2332inline
2333_bz_ArrayExpr<_bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExpr<P_expr2>,
2334    _bz_hypot<int,typename P_expr2::T_numtype> > >
2335hypot(IndexPlaceholder<N_index1> d1, _bz_ArrayExpr<P_expr2> d2)
2336{
2337    return _bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExpr<P_expr2>,
2338    _bz_hypot<int,typename P_expr2::T_numtype> >(d1, d2);
2339}
2340
2341template<int N_index1, int N_index2>
2342inline
2343_bz_ArrayExpr<_bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, IndexPlaceholder<N_index2>,
2344    _bz_hypot<int,int> > >
2345hypot(IndexPlaceholder<N_index1> d1, IndexPlaceholder<N_index2> d2)
2346{
2347    return _bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, IndexPlaceholder<N_index2>,
2348    _bz_hypot<int,int> >(d1, d2);
2349}
2350
2351template<int N_index1>
2352inline
2353_bz_ArrayExpr<_bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExprConstant<float>,
2354    _bz_hypot<int,float> > >
2355hypot(IndexPlaceholder<N_index1> d1, float d2)
2356{
2357    return _bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExprConstant<float>,
2358    _bz_hypot<int,float> >(d1, _bz_ArrayExprConstant<float>(d2));
2359}
2360
2361template<int N_index1>
2362inline
2363_bz_ArrayExpr<_bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExprConstant<double>,
2364    _bz_hypot<int,double> > >
2365hypot(IndexPlaceholder<N_index1> d1, double d2)
2366{
2367    return _bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExprConstant<double>,
2368    _bz_hypot<int,double> >(d1, _bz_ArrayExprConstant<double>(d2));
2369}
2370
2371template<int N_index1>
2372inline
2373_bz_ArrayExpr<_bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExprConstant<long double>,
2374    _bz_hypot<int,long double> > >
2375hypot(IndexPlaceholder<N_index1> d1, long double d2)
2376{
2377    return _bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExprConstant<long double>,
2378    _bz_hypot<int,long double> >(d1, _bz_ArrayExprConstant<long double>(d2));
2379}
2380
2381#ifdef BZ_HAVE_COMPLEX
2382template<int N_index1, class T2>
2383inline
2384_bz_ArrayExpr<_bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExprConstant<complex<T2> > ,
2385    _bz_hypot<int,complex<T2> > > >
2386hypot(IndexPlaceholder<N_index1> d1, complex<T2> d2)
2387{
2388    return _bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExprConstant<complex<T2> > ,
2389    _bz_hypot<int,complex<T2> > >(d1, _bz_ArrayExprConstant<complex<T2> > (d2));
2390}
2391
2392#endif // BZ_HAVE_COMPLEX
2393
2394template<class T_numtype2, int N_rank2>
2395inline
2396_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<float>, ArrayIterator<T_numtype2, N_rank2>,
2397    _bz_hypot<float,T_numtype2> > >
2398hypot(float d1, const Array<T_numtype2, N_rank2>& d2)
2399{
2400    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<float>, ArrayIterator<T_numtype2, N_rank2>,
2401    _bz_hypot<float,T_numtype2> >(_bz_ArrayExprConstant<float>(d1), d2.begin());
2402}
2403
2404template<class P_expr2>
2405inline
2406_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<float>, _bz_ArrayExpr<P_expr2>,
2407    _bz_hypot<float,typename P_expr2::T_numtype> > >
2408hypot(float d1, _bz_ArrayExpr<P_expr2> d2)
2409{
2410    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<float>, _bz_ArrayExpr<P_expr2>,
2411    _bz_hypot<float,typename P_expr2::T_numtype> >(_bz_ArrayExprConstant<float>(d1), d2);
2412}
2413
2414template<int N_index2>
2415inline
2416_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<float>, IndexPlaceholder<N_index2>,
2417    _bz_hypot<float,int> > >
2418hypot(float d1, IndexPlaceholder<N_index2> d2)
2419{
2420    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<float>, IndexPlaceholder<N_index2>,
2421    _bz_hypot<float,int> >(_bz_ArrayExprConstant<float>(d1), d2);
2422}
2423
2424template<class T_numtype2, int N_rank2>
2425inline
2426_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<double>, ArrayIterator<T_numtype2, N_rank2>,
2427    _bz_hypot<double,T_numtype2> > >
2428hypot(double d1, const Array<T_numtype2, N_rank2>& d2)
2429{
2430    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<double>, ArrayIterator<T_numtype2, N_rank2>,
2431    _bz_hypot<double,T_numtype2> >(_bz_ArrayExprConstant<double>(d1), d2.begin());
2432}
2433
2434template<class P_expr2>
2435inline
2436_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<double>, _bz_ArrayExpr<P_expr2>,
2437    _bz_hypot<double,typename P_expr2::T_numtype> > >
2438hypot(double d1, _bz_ArrayExpr<P_expr2> d2)
2439{
2440    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<double>, _bz_ArrayExpr<P_expr2>,
2441    _bz_hypot<double,typename P_expr2::T_numtype> >(_bz_ArrayExprConstant<double>(d1), d2);
2442}
2443
2444template<int N_index2>
2445inline
2446_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<double>, IndexPlaceholder<N_index2>,
2447    _bz_hypot<double,int> > >
2448hypot(double d1, IndexPlaceholder<N_index2> d2)
2449{
2450    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<double>, IndexPlaceholder<N_index2>,
2451    _bz_hypot<double,int> >(_bz_ArrayExprConstant<double>(d1), d2);
2452}
2453
2454template<class T_numtype2, int N_rank2>
2455inline
2456_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<long double>, ArrayIterator<T_numtype2, N_rank2>,
2457    _bz_hypot<long double,T_numtype2> > >
2458hypot(long double d1, const Array<T_numtype2, N_rank2>& d2)
2459{
2460    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<long double>, ArrayIterator<T_numtype2, N_rank2>,
2461    _bz_hypot<long double,T_numtype2> >(_bz_ArrayExprConstant<long double>(d1), d2.begin());
2462}
2463
2464template<class P_expr2>
2465inline
2466_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<long double>, _bz_ArrayExpr<P_expr2>,
2467    _bz_hypot<long double,typename P_expr2::T_numtype> > >
2468hypot(long double d1, _bz_ArrayExpr<P_expr2> d2)
2469{
2470    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<long double>, _bz_ArrayExpr<P_expr2>,
2471    _bz_hypot<long double,typename P_expr2::T_numtype> >(_bz_ArrayExprConstant<long double>(d1), d2);
2472}
2473
2474template<int N_index2>
2475inline
2476_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<long double>, IndexPlaceholder<N_index2>,
2477    _bz_hypot<long double,int> > >
2478hypot(long double d1, IndexPlaceholder<N_index2> d2)
2479{
2480    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<long double>, IndexPlaceholder<N_index2>,
2481    _bz_hypot<long double,int> >(_bz_ArrayExprConstant<long double>(d1), d2);
2482}
2483
2484#ifdef BZ_HAVE_COMPLEX
2485template<class T1, class T_numtype2, int N_rank2>
2486inline
2487_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<complex<T1> > , ArrayIterator<T_numtype2, N_rank2>,
2488    _bz_hypot<complex<T1> ,T_numtype2> > >
2489hypot(complex<T1> d1, const Array<T_numtype2, N_rank2>& d2)
2490{
2491    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<complex<T1> > , ArrayIterator<T_numtype2, N_rank2>,
2492    _bz_hypot<complex<T1> ,T_numtype2> >(_bz_ArrayExprConstant<complex<T1> > (d1), d2.begin());
2493}
2494
2495#endif // BZ_HAVE_COMPLEX
2496
2497#ifdef BZ_HAVE_COMPLEX
2498template<class T1, class P_expr2>
2499inline
2500_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<complex<T1> > , _bz_ArrayExpr<P_expr2>,
2501    _bz_hypot<complex<T1> ,typename P_expr2::T_numtype> > >
2502hypot(complex<T1> d1, _bz_ArrayExpr<P_expr2> d2)
2503{
2504    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<complex<T1> > , _bz_ArrayExpr<P_expr2>,
2505    _bz_hypot<complex<T1> ,typename P_expr2::T_numtype> >(_bz_ArrayExprConstant<complex<T1> > (d1), d2);
2506}
2507
2508#endif // BZ_HAVE_COMPLEX
2509
2510#ifdef BZ_HAVE_COMPLEX
2511template<class T1, int N_index2>
2512inline
2513_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<complex<T1> > , IndexPlaceholder<N_index2>,
2514    _bz_hypot<complex<T1> ,int> > >
2515hypot(complex<T1> d1, IndexPlaceholder<N_index2> d2)
2516{
2517    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<complex<T1> > , IndexPlaceholder<N_index2>,
2518    _bz_hypot<complex<T1> ,int> >(_bz_ArrayExprConstant<complex<T1> > (d1), d2);
2519}
2520
2521#endif // BZ_HAVE_COMPLEX
2522
2523#endif
2524
2525/****************************************************************************
2526 * ilogb
2527 ****************************************************************************/
2528
2529#ifdef BZ_HAVE_SYSTEM_V_MATH
2530template<class T_numtype1, int N_rank1>
2531inline
2532_bz_ArrayExpr<_bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
2533    _bz_ilogb<T_numtype1> > >
2534ilogb(const Array<T_numtype1, N_rank1>& d1)
2535{
2536    return _bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
2537    _bz_ilogb<T_numtype1> >(d1.begin());
2538}
2539
2540template<class P_expr1>
2541inline
2542_bz_ArrayExpr<_bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
2543    _bz_ilogb<typename P_expr1::T_numtype> > >
2544ilogb(_bz_ArrayExpr<P_expr1> d1)
2545{
2546    return _bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
2547    _bz_ilogb<typename P_expr1::T_numtype> >(d1);
2548}
2549
2550template<int N_index1>
2551inline
2552_bz_ArrayExpr<_bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
2553    _bz_ilogb<int> > >
2554ilogb(IndexPlaceholder<N_index1> d1)
2555{
2556    return _bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
2557    _bz_ilogb<int> >(d1);
2558}
2559
2560#endif
2561
2562/****************************************************************************
2563 * isnan
2564 ****************************************************************************/
2565
2566#ifdef BZ_HAVE_IEEE_MATH
2567template<class T_numtype1, int N_rank1>
2568inline
2569_bz_ArrayExpr<_bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
2570    _bz_isnan<T_numtype1> > >
2571isnan(const Array<T_numtype1, N_rank1>& d1)
2572{
2573    return _bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
2574    _bz_isnan<T_numtype1> >(d1.begin());
2575}
2576
2577template<class P_expr1>
2578inline
2579_bz_ArrayExpr<_bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
2580    _bz_isnan<typename P_expr1::T_numtype> > >
2581isnan(_bz_ArrayExpr<P_expr1> d1)
2582{
2583    return _bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
2584    _bz_isnan<typename P_expr1::T_numtype> >(d1);
2585}
2586
2587template<int N_index1>
2588inline
2589_bz_ArrayExpr<_bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
2590    _bz_isnan<int> > >
2591isnan(IndexPlaceholder<N_index1> d1)
2592{
2593    return _bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
2594    _bz_isnan<int> >(d1);
2595}
2596
2597#endif
2598
2599/****************************************************************************
2600 * itrunc
2601 ****************************************************************************/
2602
2603#ifdef BZ_HAVE_SYSTEM_V_MATH
2604template<class T_numtype1, int N_rank1>
2605inline
2606_bz_ArrayExpr<_bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
2607    _bz_itrunc<T_numtype1> > >
2608itrunc(const Array<T_numtype1, N_rank1>& d1)
2609{
2610    return _bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
2611    _bz_itrunc<T_numtype1> >(d1.begin());
2612}
2613
2614template<class P_expr1>
2615inline
2616_bz_ArrayExpr<_bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
2617    _bz_itrunc<typename P_expr1::T_numtype> > >
2618itrunc(_bz_ArrayExpr<P_expr1> d1)
2619{
2620    return _bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
2621    _bz_itrunc<typename P_expr1::T_numtype> >(d1);
2622}
2623
2624template<int N_index1>
2625inline
2626_bz_ArrayExpr<_bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
2627    _bz_itrunc<int> > >
2628itrunc(IndexPlaceholder<N_index1> d1)
2629{
2630    return _bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
2631    _bz_itrunc<int> >(d1);
2632}
2633
2634#endif
2635
2636/****************************************************************************
2637 * j0
2638 ****************************************************************************/
2639
2640#ifdef BZ_HAVE_IEEE_MATH
2641template<class T_numtype1, int N_rank1>
2642inline
2643_bz_ArrayExpr<_bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
2644    _bz_j0<T_numtype1> > >
2645j0(const Array<T_numtype1, N_rank1>& d1)
2646{
2647    return _bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
2648    _bz_j0<T_numtype1> >(d1.begin());
2649}
2650
2651template<class P_expr1>
2652inline
2653_bz_ArrayExpr<_bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
2654    _bz_j0<typename P_expr1::T_numtype> > >
2655j0(_bz_ArrayExpr<P_expr1> d1)
2656{
2657    return _bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
2658    _bz_j0<typename P_expr1::T_numtype> >(d1);
2659}
2660
2661template<int N_index1>
2662inline
2663_bz_ArrayExpr<_bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
2664    _bz_j0<int> > >
2665j0(IndexPlaceholder<N_index1> d1)
2666{
2667    return _bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
2668    _bz_j0<int> >(d1);
2669}
2670
2671#endif
2672
2673/****************************************************************************
2674 * j1
2675 ****************************************************************************/
2676
2677#ifdef BZ_HAVE_IEEE_MATH
2678template<class T_numtype1, int N_rank1>
2679inline
2680_bz_ArrayExpr<_bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
2681    _bz_j1<T_numtype1> > >
2682j1(const Array<T_numtype1, N_rank1>& d1)
2683{
2684    return _bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
2685    _bz_j1<T_numtype1> >(d1.begin());
2686}
2687
2688template<class P_expr1>
2689inline
2690_bz_ArrayExpr<_bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
2691    _bz_j1<typename P_expr1::T_numtype> > >
2692j1(_bz_ArrayExpr<P_expr1> d1)
2693{
2694    return _bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
2695    _bz_j1<typename P_expr1::T_numtype> >(d1);
2696}
2697
2698template<int N_index1>
2699inline
2700_bz_ArrayExpr<_bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
2701    _bz_j1<int> > >
2702j1(IndexPlaceholder<N_index1> d1)
2703{
2704    return _bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
2705    _bz_j1<int> >(d1);
2706}
2707
2708#endif
2709
2710/****************************************************************************
2711 * lgamma
2712 ****************************************************************************/
2713
2714#ifdef BZ_HAVE_IEEE_MATH
2715template<class T_numtype1, int N_rank1>
2716inline
2717_bz_ArrayExpr<_bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
2718    _bz_lgamma<T_numtype1> > >
2719lgamma(const Array<T_numtype1, N_rank1>& d1)
2720{
2721    return _bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
2722    _bz_lgamma<T_numtype1> >(d1.begin());
2723}
2724
2725template<class P_expr1>
2726inline
2727_bz_ArrayExpr<_bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
2728    _bz_lgamma<typename P_expr1::T_numtype> > >
2729lgamma(_bz_ArrayExpr<P_expr1> d1)
2730{
2731    return _bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
2732    _bz_lgamma<typename P_expr1::T_numtype> >(d1);
2733}
2734
2735template<int N_index1>
2736inline
2737_bz_ArrayExpr<_bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
2738    _bz_lgamma<int> > >
2739lgamma(IndexPlaceholder<N_index1> d1)
2740{
2741    return _bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
2742    _bz_lgamma<int> >(d1);
2743}
2744
2745#endif
2746
2747/****************************************************************************
2748 * log
2749 ****************************************************************************/
2750
2751template<class T_numtype1, int N_rank1>
2752inline
2753_bz_ArrayExpr<_bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
2754    _bz_log<T_numtype1> > >
2755log(const Array<T_numtype1, N_rank1>& d1)
2756{
2757    return _bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
2758    _bz_log<T_numtype1> >(d1.begin());
2759}
2760
2761template<class P_expr1>
2762inline
2763_bz_ArrayExpr<_bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
2764    _bz_log<typename P_expr1::T_numtype> > >
2765log(_bz_ArrayExpr<P_expr1> d1)
2766{
2767    return _bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
2768    _bz_log<typename P_expr1::T_numtype> >(d1);
2769}
2770
2771template<int N_index1>
2772inline
2773_bz_ArrayExpr<_bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
2774    _bz_log<int> > >
2775log(IndexPlaceholder<N_index1> d1)
2776{
2777    return _bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
2778    _bz_log<int> >(d1);
2779}
2780
2781
2782/****************************************************************************
2783 * logb
2784 ****************************************************************************/
2785
2786#ifdef BZ_HAVE_IEEE_MATH
2787template<class T_numtype1, int N_rank1>
2788inline
2789_bz_ArrayExpr<_bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
2790    _bz_logb<T_numtype1> > >
2791logb(const Array<T_numtype1, N_rank1>& d1)
2792{
2793    return _bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
2794    _bz_logb<T_numtype1> >(d1.begin());
2795}
2796
2797template<class P_expr1>
2798inline
2799_bz_ArrayExpr<_bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
2800    _bz_logb<typename P_expr1::T_numtype> > >
2801logb(_bz_ArrayExpr<P_expr1> d1)
2802{
2803    return _bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
2804    _bz_logb<typename P_expr1::T_numtype> >(d1);
2805}
2806
2807template<int N_index1>
2808inline
2809_bz_ArrayExpr<_bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
2810    _bz_logb<int> > >
2811logb(IndexPlaceholder<N_index1> d1)
2812{
2813    return _bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
2814    _bz_logb<int> >(d1);
2815}
2816
2817#endif
2818
2819/****************************************************************************
2820 * log1p
2821 ****************************************************************************/
2822
2823#ifdef BZ_HAVE_IEEE_MATH
2824template<class T_numtype1, int N_rank1>
2825inline
2826_bz_ArrayExpr<_bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
2827    _bz_log1p<T_numtype1> > >
2828log1p(const Array<T_numtype1, N_rank1>& d1)
2829{
2830    return _bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
2831    _bz_log1p<T_numtype1> >(d1.begin());
2832}
2833
2834template<class P_expr1>
2835inline
2836_bz_ArrayExpr<_bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
2837    _bz_log1p<typename P_expr1::T_numtype> > >
2838log1p(_bz_ArrayExpr<P_expr1> d1)
2839{
2840    return _bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
2841    _bz_log1p<typename P_expr1::T_numtype> >(d1);
2842}
2843
2844template<int N_index1>
2845inline
2846_bz_ArrayExpr<_bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
2847    _bz_log1p<int> > >
2848log1p(IndexPlaceholder<N_index1> d1)
2849{
2850    return _bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
2851    _bz_log1p<int> >(d1);
2852}
2853
2854#endif
2855
2856/****************************************************************************
2857 * log10
2858 ****************************************************************************/
2859
2860template<class T_numtype1, int N_rank1>
2861inline
2862_bz_ArrayExpr<_bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
2863    _bz_log10<T_numtype1> > >
2864log10(const Array<T_numtype1, N_rank1>& d1)
2865{
2866    return _bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
2867    _bz_log10<T_numtype1> >(d1.begin());
2868}
2869
2870template<class P_expr1>
2871inline
2872_bz_ArrayExpr<_bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
2873    _bz_log10<typename P_expr1::T_numtype> > >
2874log10(_bz_ArrayExpr<P_expr1> d1)
2875{
2876    return _bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
2877    _bz_log10<typename P_expr1::T_numtype> >(d1);
2878}
2879
2880template<int N_index1>
2881inline
2882_bz_ArrayExpr<_bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
2883    _bz_log10<int> > >
2884log10(IndexPlaceholder<N_index1> d1)
2885{
2886    return _bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
2887    _bz_log10<int> >(d1);
2888}
2889
2890
2891/****************************************************************************
2892 * nearest
2893 ****************************************************************************/
2894
2895#ifdef BZ_HAVE_SYSTEM_V_MATH
2896template<class T_numtype1, int N_rank1>
2897inline
2898_bz_ArrayExpr<_bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
2899    _bz_nearest<T_numtype1> > >
2900nearest(const Array<T_numtype1, N_rank1>& d1)
2901{
2902    return _bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
2903    _bz_nearest<T_numtype1> >(d1.begin());
2904}
2905
2906template<class P_expr1>
2907inline
2908_bz_ArrayExpr<_bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
2909    _bz_nearest<typename P_expr1::T_numtype> > >
2910nearest(_bz_ArrayExpr<P_expr1> d1)
2911{
2912    return _bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
2913    _bz_nearest<typename P_expr1::T_numtype> >(d1);
2914}
2915
2916template<int N_index1>
2917inline
2918_bz_ArrayExpr<_bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
2919    _bz_nearest<int> > >
2920nearest(IndexPlaceholder<N_index1> d1)
2921{
2922    return _bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
2923    _bz_nearest<int> >(d1);
2924}
2925
2926#endif
2927
2928/****************************************************************************
2929 * nextafter
2930 ****************************************************************************/
2931
2932#ifdef BZ_HAVE_SYSTEM_V_MATH
2933template<class T_numtype1, int N_rank1, class T_numtype2, int N_rank2>
2934inline
2935_bz_ArrayExpr<_bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, ArrayIterator<T_numtype2, N_rank2>,
2936    _bz_nextafter<T_numtype1,T_numtype2> > >
2937nextafter(const Array<T_numtype1, N_rank1>& d1, const Array<T_numtype2, N_rank2>& d2)
2938{
2939    return _bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, ArrayIterator<T_numtype2, N_rank2>,
2940    _bz_nextafter<T_numtype1,T_numtype2> >(d1.begin(), d2.begin());
2941}
2942
2943template<class T_numtype1, int N_rank1, class P_expr2>
2944inline
2945_bz_ArrayExpr<_bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExpr<P_expr2>,
2946    _bz_nextafter<T_numtype1,typename P_expr2::T_numtype> > >
2947nextafter(const Array<T_numtype1, N_rank1>& d1, _bz_ArrayExpr<P_expr2> d2)
2948{
2949    return _bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExpr<P_expr2>,
2950    _bz_nextafter<T_numtype1,typename P_expr2::T_numtype> >(d1.begin(), d2);
2951}
2952
2953template<class T_numtype1, int N_rank1, int N_index2>
2954inline
2955_bz_ArrayExpr<_bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, IndexPlaceholder<N_index2>,
2956    _bz_nextafter<T_numtype1,int> > >
2957nextafter(const Array<T_numtype1, N_rank1>& d1, IndexPlaceholder<N_index2> d2)
2958{
2959    return _bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, IndexPlaceholder<N_index2>,
2960    _bz_nextafter<T_numtype1,int> >(d1.begin(), d2);
2961}
2962
2963template<class T_numtype1, int N_rank1>
2964inline
2965_bz_ArrayExpr<_bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExprConstant<float>,
2966    _bz_nextafter<T_numtype1,float> > >
2967nextafter(const Array<T_numtype1, N_rank1>& d1, float d2)
2968{
2969    return _bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExprConstant<float>,
2970    _bz_nextafter<T_numtype1,float> >(d1.begin(), _bz_ArrayExprConstant<float>(d2));
2971}
2972
2973template<class T_numtype1, int N_rank1>
2974inline
2975_bz_ArrayExpr<_bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExprConstant<double>,
2976    _bz_nextafter<T_numtype1,double> > >
2977nextafter(const Array<T_numtype1, N_rank1>& d1, double d2)
2978{
2979    return _bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExprConstant<double>,
2980    _bz_nextafter<T_numtype1,double> >(d1.begin(), _bz_ArrayExprConstant<double>(d2));
2981}
2982
2983template<class T_numtype1, int N_rank1>
2984inline
2985_bz_ArrayExpr<_bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExprConstant<long double>,
2986    _bz_nextafter<T_numtype1,long double> > >
2987nextafter(const Array<T_numtype1, N_rank1>& d1, long double d2)
2988{
2989    return _bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExprConstant<long double>,
2990    _bz_nextafter<T_numtype1,long double> >(d1.begin(), _bz_ArrayExprConstant<long double>(d2));
2991}
2992
2993#ifdef BZ_HAVE_COMPLEX
2994template<class T_numtype1, int N_rank1, class T2>
2995inline
2996_bz_ArrayExpr<_bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExprConstant<complex<T2> > ,
2997    _bz_nextafter<T_numtype1,complex<T2> > > >
2998nextafter(const Array<T_numtype1, N_rank1>& d1, complex<T2> d2)
2999{
3000    return _bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExprConstant<complex<T2> > ,
3001    _bz_nextafter<T_numtype1,complex<T2> > >(d1.begin(), _bz_ArrayExprConstant<complex<T2> > (d2));
3002}
3003
3004#endif // BZ_HAVE_COMPLEX
3005
3006template<class P_expr1, class T_numtype2, int N_rank2>
3007inline
3008_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, ArrayIterator<T_numtype2, N_rank2>,
3009    _bz_nextafter<typename P_expr1::T_numtype,T_numtype2> > >
3010nextafter(_bz_ArrayExpr<P_expr1> d1, const Array<T_numtype2, N_rank2>& d2)
3011{
3012    return _bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, ArrayIterator<T_numtype2, N_rank2>,
3013    _bz_nextafter<typename P_expr1::T_numtype,T_numtype2> >(d1, d2.begin());
3014}
3015
3016template<class P_expr1, class P_expr2>
3017inline
3018_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExpr<P_expr2>,
3019    _bz_nextafter<typename P_expr1::T_numtype,typename P_expr2::T_numtype> > >
3020nextafter(_bz_ArrayExpr<P_expr1> d1, _bz_ArrayExpr<P_expr2> d2)
3021{
3022    return _bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExpr<P_expr2>,
3023    _bz_nextafter<typename P_expr1::T_numtype,typename P_expr2::T_numtype> >(d1, d2);
3024}
3025
3026template<class P_expr1, int N_index2>
3027inline
3028_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, IndexPlaceholder<N_index2>,
3029    _bz_nextafter<typename P_expr1::T_numtype,int> > >
3030nextafter(_bz_ArrayExpr<P_expr1> d1, IndexPlaceholder<N_index2> d2)
3031{
3032    return _bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, IndexPlaceholder<N_index2>,
3033    _bz_nextafter<typename P_expr1::T_numtype,int> >(d1, d2);
3034}
3035
3036template<class P_expr1>
3037inline
3038_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExprConstant<float>,
3039    _bz_nextafter<typename P_expr1::T_numtype,float> > >
3040nextafter(_bz_ArrayExpr<P_expr1> d1, float d2)
3041{
3042    return _bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExprConstant<float>,
3043    _bz_nextafter<typename P_expr1::T_numtype,float> >(d1, _bz_ArrayExprConstant<float>(d2));
3044}
3045
3046template<class P_expr1>
3047inline
3048_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExprConstant<double>,
3049    _bz_nextafter<typename P_expr1::T_numtype,double> > >
3050nextafter(_bz_ArrayExpr<P_expr1> d1, double d2)
3051{
3052    return _bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExprConstant<double>,
3053    _bz_nextafter<typename P_expr1::T_numtype,double> >(d1, _bz_ArrayExprConstant<double>(d2));
3054}
3055
3056template<class P_expr1>
3057inline
3058_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExprConstant<long double>,
3059    _bz_nextafter<typename P_expr1::T_numtype,long double> > >
3060nextafter(_bz_ArrayExpr<P_expr1> d1, long double d2)
3061{
3062    return _bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExprConstant<long double>,
3063    _bz_nextafter<typename P_expr1::T_numtype,long double> >(d1, _bz_ArrayExprConstant<long double>(d2));
3064}
3065
3066#ifdef BZ_HAVE_COMPLEX
3067template<class P_expr1, class T2>
3068inline
3069_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExprConstant<complex<T2> > ,
3070    _bz_nextafter<typename P_expr1::T_numtype,complex<T2> > > >
3071nextafter(_bz_ArrayExpr<P_expr1> d1, complex<T2> d2)
3072{
3073    return _bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExprConstant<complex<T2> > ,
3074    _bz_nextafter<typename P_expr1::T_numtype,complex<T2> > >(d1, _bz_ArrayExprConstant<complex<T2> > (d2));
3075}
3076
3077#endif // BZ_HAVE_COMPLEX
3078
3079template<int N_index1, class T_numtype2, int N_rank2>
3080inline
3081_bz_ArrayExpr<_bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, ArrayIterator<T_numtype2, N_rank2>,
3082    _bz_nextafter<int,T_numtype2> > >
3083nextafter(IndexPlaceholder<N_index1> d1, const Array<T_numtype2, N_rank2>& d2)
3084{
3085    return _bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, ArrayIterator<T_numtype2, N_rank2>,
3086    _bz_nextafter<int,T_numtype2> >(d1, d2.begin());
3087}
3088
3089template<int N_index1, class P_expr2>
3090inline
3091_bz_ArrayExpr<_bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExpr<P_expr2>,
3092    _bz_nextafter<int,typename P_expr2::T_numtype> > >
3093nextafter(IndexPlaceholder<N_index1> d1, _bz_ArrayExpr<P_expr2> d2)
3094{
3095    return _bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExpr<P_expr2>,
3096    _bz_nextafter<int,typename P_expr2::T_numtype> >(d1, d2);
3097}
3098
3099template<int N_index1, int N_index2>
3100inline
3101_bz_ArrayExpr<_bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, IndexPlaceholder<N_index2>,
3102    _bz_nextafter<int,int> > >
3103nextafter(IndexPlaceholder<N_index1> d1, IndexPlaceholder<N_index2> d2)
3104{
3105    return _bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, IndexPlaceholder<N_index2>,
3106    _bz_nextafter<int,int> >(d1, d2);
3107}
3108
3109template<int N_index1>
3110inline
3111_bz_ArrayExpr<_bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExprConstant<float>,
3112    _bz_nextafter<int,float> > >
3113nextafter(IndexPlaceholder<N_index1> d1, float d2)
3114{
3115    return _bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExprConstant<float>,
3116    _bz_nextafter<int,float> >(d1, _bz_ArrayExprConstant<float>(d2));
3117}
3118
3119template<int N_index1>
3120inline
3121_bz_ArrayExpr<_bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExprConstant<double>,
3122    _bz_nextafter<int,double> > >
3123nextafter(IndexPlaceholder<N_index1> d1, double d2)
3124{
3125    return _bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExprConstant<double>,
3126    _bz_nextafter<int,double> >(d1, _bz_ArrayExprConstant<double>(d2));
3127}
3128
3129template<int N_index1>
3130inline
3131_bz_ArrayExpr<_bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExprConstant<long double>,
3132    _bz_nextafter<int,long double> > >
3133nextafter(IndexPlaceholder<N_index1> d1, long double d2)
3134{
3135    return _bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExprConstant<long double>,
3136    _bz_nextafter<int,long double> >(d1, _bz_ArrayExprConstant<long double>(d2));
3137}
3138
3139#ifdef BZ_HAVE_COMPLEX
3140template<int N_index1, class T2>
3141inline
3142_bz_ArrayExpr<_bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExprConstant<complex<T2> > ,
3143    _bz_nextafter<int,complex<T2> > > >
3144nextafter(IndexPlaceholder<N_index1> d1, complex<T2> d2)
3145{
3146    return _bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExprConstant<complex<T2> > ,
3147    _bz_nextafter<int,complex<T2> > >(d1, _bz_ArrayExprConstant<complex<T2> > (d2));
3148}
3149
3150#endif // BZ_HAVE_COMPLEX
3151
3152template<class T_numtype2, int N_rank2>
3153inline
3154_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<float>, ArrayIterator<T_numtype2, N_rank2>,
3155    _bz_nextafter<float,T_numtype2> > >
3156nextafter(float d1, const Array<T_numtype2, N_rank2>& d2)
3157{
3158    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<float>, ArrayIterator<T_numtype2, N_rank2>,
3159    _bz_nextafter<float,T_numtype2> >(_bz_ArrayExprConstant<float>(d1), d2.begin());
3160}
3161
3162template<class P_expr2>
3163inline
3164_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<float>, _bz_ArrayExpr<P_expr2>,
3165    _bz_nextafter<float,typename P_expr2::T_numtype> > >
3166nextafter(float d1, _bz_ArrayExpr<P_expr2> d2)
3167{
3168    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<float>, _bz_ArrayExpr<P_expr2>,
3169    _bz_nextafter<float,typename P_expr2::T_numtype> >(_bz_ArrayExprConstant<float>(d1), d2);
3170}
3171
3172template<int N_index2>
3173inline
3174_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<float>, IndexPlaceholder<N_index2>,
3175    _bz_nextafter<float,int> > >
3176nextafter(float d1, IndexPlaceholder<N_index2> d2)
3177{
3178    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<float>, IndexPlaceholder<N_index2>,
3179    _bz_nextafter<float,int> >(_bz_ArrayExprConstant<float>(d1), d2);
3180}
3181
3182template<class T_numtype2, int N_rank2>
3183inline
3184_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<double>, ArrayIterator<T_numtype2, N_rank2>,
3185    _bz_nextafter<double,T_numtype2> > >
3186nextafter(double d1, const Array<T_numtype2, N_rank2>& d2)
3187{
3188    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<double>, ArrayIterator<T_numtype2, N_rank2>,
3189    _bz_nextafter<double,T_numtype2> >(_bz_ArrayExprConstant<double>(d1), d2.begin());
3190}
3191
3192template<class P_expr2>
3193inline
3194_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<double>, _bz_ArrayExpr<P_expr2>,
3195    _bz_nextafter<double,typename P_expr2::T_numtype> > >
3196nextafter(double d1, _bz_ArrayExpr<P_expr2> d2)
3197{
3198    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<double>, _bz_ArrayExpr<P_expr2>,
3199    _bz_nextafter<double,typename P_expr2::T_numtype> >(_bz_ArrayExprConstant<double>(d1), d2);
3200}
3201
3202template<int N_index2>
3203inline
3204_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<double>, IndexPlaceholder<N_index2>,
3205    _bz_nextafter<double,int> > >
3206nextafter(double d1, IndexPlaceholder<N_index2> d2)
3207{
3208    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<double>, IndexPlaceholder<N_index2>,
3209    _bz_nextafter<double,int> >(_bz_ArrayExprConstant<double>(d1), d2);
3210}
3211
3212template<class T_numtype2, int N_rank2>
3213inline
3214_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<long double>, ArrayIterator<T_numtype2, N_rank2>,
3215    _bz_nextafter<long double,T_numtype2> > >
3216nextafter(long double d1, const Array<T_numtype2, N_rank2>& d2)
3217{
3218    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<long double>, ArrayIterator<T_numtype2, N_rank2>,
3219    _bz_nextafter<long double,T_numtype2> >(_bz_ArrayExprConstant<long double>(d1), d2.begin());
3220}
3221
3222template<class P_expr2>
3223inline
3224_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<long double>, _bz_ArrayExpr<P_expr2>,
3225    _bz_nextafter<long double,typename P_expr2::T_numtype> > >
3226nextafter(long double d1, _bz_ArrayExpr<P_expr2> d2)
3227{
3228    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<long double>, _bz_ArrayExpr<P_expr2>,
3229    _bz_nextafter<long double,typename P_expr2::T_numtype> >(_bz_ArrayExprConstant<long double>(d1), d2);
3230}
3231
3232template<int N_index2>
3233inline
3234_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<long double>, IndexPlaceholder<N_index2>,
3235    _bz_nextafter<long double,int> > >
3236nextafter(long double d1, IndexPlaceholder<N_index2> d2)
3237{
3238    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<long double>, IndexPlaceholder<N_index2>,
3239    _bz_nextafter<long double,int> >(_bz_ArrayExprConstant<long double>(d1), d2);
3240}
3241
3242#ifdef BZ_HAVE_COMPLEX
3243template<class T1, class T_numtype2, int N_rank2>
3244inline
3245_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<complex<T1> > , ArrayIterator<T_numtype2, N_rank2>,
3246    _bz_nextafter<complex<T1> ,T_numtype2> > >
3247nextafter(complex<T1> d1, const Array<T_numtype2, N_rank2>& d2)
3248{
3249    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<complex<T1> > , ArrayIterator<T_numtype2, N_rank2>,
3250    _bz_nextafter<complex<T1> ,T_numtype2> >(_bz_ArrayExprConstant<complex<T1> > (d1), d2.begin());
3251}
3252
3253#endif // BZ_HAVE_COMPLEX
3254
3255#ifdef BZ_HAVE_COMPLEX
3256template<class T1, class P_expr2>
3257inline
3258_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<complex<T1> > , _bz_ArrayExpr<P_expr2>,
3259    _bz_nextafter<complex<T1> ,typename P_expr2::T_numtype> > >
3260nextafter(complex<T1> d1, _bz_ArrayExpr<P_expr2> d2)
3261{
3262    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<complex<T1> > , _bz_ArrayExpr<P_expr2>,
3263    _bz_nextafter<complex<T1> ,typename P_expr2::T_numtype> >(_bz_ArrayExprConstant<complex<T1> > (d1), d2);
3264}
3265
3266#endif // BZ_HAVE_COMPLEX
3267
3268#ifdef BZ_HAVE_COMPLEX
3269template<class T1, int N_index2>
3270inline
3271_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<complex<T1> > , IndexPlaceholder<N_index2>,
3272    _bz_nextafter<complex<T1> ,int> > >
3273nextafter(complex<T1> d1, IndexPlaceholder<N_index2> d2)
3274{
3275    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<complex<T1> > , IndexPlaceholder<N_index2>,
3276    _bz_nextafter<complex<T1> ,int> >(_bz_ArrayExprConstant<complex<T1> > (d1), d2);
3277}
3278
3279#endif // BZ_HAVE_COMPLEX
3280
3281#endif
3282
3283/****************************************************************************
3284 * pow
3285 ****************************************************************************/
3286
3287template<class T_numtype1, int N_rank1, class T_numtype2, int N_rank2>
3288inline
3289_bz_ArrayExpr<_bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, ArrayIterator<T_numtype2, N_rank2>,
3290    _bz_pow<T_numtype1,T_numtype2> > >
3291pow(const Array<T_numtype1, N_rank1>& d1, const Array<T_numtype2, N_rank2>& d2)
3292{
3293    return _bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, ArrayIterator<T_numtype2, N_rank2>,
3294    _bz_pow<T_numtype1,T_numtype2> >(d1.begin(), d2.begin());
3295}
3296
3297template<class T_numtype1, int N_rank1, class P_expr2>
3298inline
3299_bz_ArrayExpr<_bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExpr<P_expr2>,
3300    _bz_pow<T_numtype1,typename P_expr2::T_numtype> > >
3301pow(const Array<T_numtype1, N_rank1>& d1, _bz_ArrayExpr<P_expr2> d2)
3302{
3303    return _bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExpr<P_expr2>,
3304    _bz_pow<T_numtype1,typename P_expr2::T_numtype> >(d1.begin(), d2);
3305}
3306
3307template<class T_numtype1, int N_rank1, int N_index2>
3308inline
3309_bz_ArrayExpr<_bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, IndexPlaceholder<N_index2>,
3310    _bz_pow<T_numtype1,int> > >
3311pow(const Array<T_numtype1, N_rank1>& d1, IndexPlaceholder<N_index2> d2)
3312{
3313    return _bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, IndexPlaceholder<N_index2>,
3314    _bz_pow<T_numtype1,int> >(d1.begin(), d2);
3315}
3316
3317template<class T_numtype1, int N_rank1>
3318inline
3319_bz_ArrayExpr<_bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExprConstant<float>,
3320    _bz_pow<T_numtype1,float> > >
3321pow(const Array<T_numtype1, N_rank1>& d1, float d2)
3322{
3323    return _bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExprConstant<float>,
3324    _bz_pow<T_numtype1,float> >(d1.begin(), _bz_ArrayExprConstant<float>(d2));
3325}
3326
3327template<class T_numtype1, int N_rank1>
3328inline
3329_bz_ArrayExpr<_bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExprConstant<double>,
3330    _bz_pow<T_numtype1,double> > >
3331pow(const Array<T_numtype1, N_rank1>& d1, double d2)
3332{
3333    return _bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExprConstant<double>,
3334    _bz_pow<T_numtype1,double> >(d1.begin(), _bz_ArrayExprConstant<double>(d2));
3335}
3336
3337template<class T_numtype1, int N_rank1>
3338inline
3339_bz_ArrayExpr<_bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExprConstant<long double>,
3340    _bz_pow<T_numtype1,long double> > >
3341pow(const Array<T_numtype1, N_rank1>& d1, long double d2)
3342{
3343    return _bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExprConstant<long double>,
3344    _bz_pow<T_numtype1,long double> >(d1.begin(), _bz_ArrayExprConstant<long double>(d2));
3345}
3346
3347#ifdef BZ_HAVE_COMPLEX
3348template<class T_numtype1, int N_rank1, class T2>
3349inline
3350_bz_ArrayExpr<_bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExprConstant<complex<T2> > ,
3351    _bz_pow<T_numtype1,complex<T2> > > >
3352pow(const Array<T_numtype1, N_rank1>& d1, complex<T2> d2)
3353{
3354    return _bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExprConstant<complex<T2> > ,
3355    _bz_pow<T_numtype1,complex<T2> > >(d1.begin(), _bz_ArrayExprConstant<complex<T2> > (d2));
3356}
3357
3358#endif // BZ_HAVE_COMPLEX
3359
3360template<class P_expr1, class T_numtype2, int N_rank2>
3361inline
3362_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, ArrayIterator<T_numtype2, N_rank2>,
3363    _bz_pow<typename P_expr1::T_numtype,T_numtype2> > >
3364pow(_bz_ArrayExpr<P_expr1> d1, const Array<T_numtype2, N_rank2>& d2)
3365{
3366    return _bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, ArrayIterator<T_numtype2, N_rank2>,
3367    _bz_pow<typename P_expr1::T_numtype,T_numtype2> >(d1, d2.begin());
3368}
3369
3370template<class P_expr1, class P_expr2>
3371inline
3372_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExpr<P_expr2>,
3373    _bz_pow<typename P_expr1::T_numtype,typename P_expr2::T_numtype> > >
3374pow(_bz_ArrayExpr<P_expr1> d1, _bz_ArrayExpr<P_expr2> d2)
3375{
3376    return _bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExpr<P_expr2>,
3377    _bz_pow<typename P_expr1::T_numtype,typename P_expr2::T_numtype> >(d1, d2);
3378}
3379
3380template<class P_expr1, int N_index2>
3381inline
3382_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, IndexPlaceholder<N_index2>,
3383    _bz_pow<typename P_expr1::T_numtype,int> > >
3384pow(_bz_ArrayExpr<P_expr1> d1, IndexPlaceholder<N_index2> d2)
3385{
3386    return _bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, IndexPlaceholder<N_index2>,
3387    _bz_pow<typename P_expr1::T_numtype,int> >(d1, d2);
3388}
3389
3390template<class P_expr1>
3391inline
3392_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExprConstant<float>,
3393    _bz_pow<typename P_expr1::T_numtype,float> > >
3394pow(_bz_ArrayExpr<P_expr1> d1, float d2)
3395{
3396    return _bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExprConstant<float>,
3397    _bz_pow<typename P_expr1::T_numtype,float> >(d1, _bz_ArrayExprConstant<float>(d2));
3398}
3399
3400template<class P_expr1>
3401inline
3402_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExprConstant<double>,
3403    _bz_pow<typename P_expr1::T_numtype,double> > >
3404pow(_bz_ArrayExpr<P_expr1> d1, double d2)
3405{
3406    return _bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExprConstant<double>,
3407    _bz_pow<typename P_expr1::T_numtype,double> >(d1, _bz_ArrayExprConstant<double>(d2));
3408}
3409
3410template<class P_expr1>
3411inline
3412_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExprConstant<long double>,
3413    _bz_pow<typename P_expr1::T_numtype,long double> > >
3414pow(_bz_ArrayExpr<P_expr1> d1, long double d2)
3415{
3416    return _bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExprConstant<long double>,
3417    _bz_pow<typename P_expr1::T_numtype,long double> >(d1, _bz_ArrayExprConstant<long double>(d2));
3418}
3419
3420#ifdef BZ_HAVE_COMPLEX
3421template<class P_expr1, class T2>
3422inline
3423_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExprConstant<complex<T2> > ,
3424    _bz_pow<typename P_expr1::T_numtype,complex<T2> > > >
3425pow(_bz_ArrayExpr<P_expr1> d1, complex<T2> d2)
3426{
3427    return _bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExprConstant<complex<T2> > ,
3428    _bz_pow<typename P_expr1::T_numtype,complex<T2> > >(d1, _bz_ArrayExprConstant<complex<T2> > (d2));
3429}
3430
3431#endif // BZ_HAVE_COMPLEX
3432
3433template<int N_index1, class T_numtype2, int N_rank2>
3434inline
3435_bz_ArrayExpr<_bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, ArrayIterator<T_numtype2, N_rank2>,
3436    _bz_pow<int,T_numtype2> > >
3437pow(IndexPlaceholder<N_index1> d1, const Array<T_numtype2, N_rank2>& d2)
3438{
3439    return _bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, ArrayIterator<T_numtype2, N_rank2>,
3440    _bz_pow<int,T_numtype2> >(d1, d2.begin());
3441}
3442
3443template<int N_index1, class P_expr2>
3444inline
3445_bz_ArrayExpr<_bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExpr<P_expr2>,
3446    _bz_pow<int,typename P_expr2::T_numtype> > >
3447pow(IndexPlaceholder<N_index1> d1, _bz_ArrayExpr<P_expr2> d2)
3448{
3449    return _bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExpr<P_expr2>,
3450    _bz_pow<int,typename P_expr2::T_numtype> >(d1, d2);
3451}
3452
3453template<int N_index1, int N_index2>
3454inline
3455_bz_ArrayExpr<_bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, IndexPlaceholder<N_index2>,
3456    _bz_pow<int,int> > >
3457pow(IndexPlaceholder<N_index1> d1, IndexPlaceholder<N_index2> d2)
3458{
3459    return _bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, IndexPlaceholder<N_index2>,
3460    _bz_pow<int,int> >(d1, d2);
3461}
3462
3463template<int N_index1>
3464inline
3465_bz_ArrayExpr<_bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExprConstant<float>,
3466    _bz_pow<int,float> > >
3467pow(IndexPlaceholder<N_index1> d1, float d2)
3468{
3469    return _bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExprConstant<float>,
3470    _bz_pow<int,float> >(d1, _bz_ArrayExprConstant<float>(d2));
3471}
3472
3473template<int N_index1>
3474inline
3475_bz_ArrayExpr<_bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExprConstant<double>,
3476    _bz_pow<int,double> > >
3477pow(IndexPlaceholder<N_index1> d1, double d2)
3478{
3479    return _bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExprConstant<double>,
3480    _bz_pow<int,double> >(d1, _bz_ArrayExprConstant<double>(d2));
3481}
3482
3483template<int N_index1>
3484inline
3485_bz_ArrayExpr<_bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExprConstant<long double>,
3486    _bz_pow<int,long double> > >
3487pow(IndexPlaceholder<N_index1> d1, long double d2)
3488{
3489    return _bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExprConstant<long double>,
3490    _bz_pow<int,long double> >(d1, _bz_ArrayExprConstant<long double>(d2));
3491}
3492
3493#ifdef BZ_HAVE_COMPLEX
3494template<int N_index1, class T2>
3495inline
3496_bz_ArrayExpr<_bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExprConstant<complex<T2> > ,
3497    _bz_pow<int,complex<T2> > > >
3498pow(IndexPlaceholder<N_index1> d1, complex<T2> d2)
3499{
3500    return _bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExprConstant<complex<T2> > ,
3501    _bz_pow<int,complex<T2> > >(d1, _bz_ArrayExprConstant<complex<T2> > (d2));
3502}
3503
3504#endif // BZ_HAVE_COMPLEX
3505
3506template<class T_numtype2, int N_rank2>
3507inline
3508_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<float>, ArrayIterator<T_numtype2, N_rank2>,
3509    _bz_pow<float,T_numtype2> > >
3510pow(float d1, const Array<T_numtype2, N_rank2>& d2)
3511{
3512    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<float>, ArrayIterator<T_numtype2, N_rank2>,
3513    _bz_pow<float,T_numtype2> >(_bz_ArrayExprConstant<float>(d1), d2.begin());
3514}
3515
3516template<class P_expr2>
3517inline
3518_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<float>, _bz_ArrayExpr<P_expr2>,
3519    _bz_pow<float,typename P_expr2::T_numtype> > >
3520pow(float d1, _bz_ArrayExpr<P_expr2> d2)
3521{
3522    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<float>, _bz_ArrayExpr<P_expr2>,
3523    _bz_pow<float,typename P_expr2::T_numtype> >(_bz_ArrayExprConstant<float>(d1), d2);
3524}
3525
3526template<int N_index2>
3527inline
3528_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<float>, IndexPlaceholder<N_index2>,
3529    _bz_pow<float,int> > >
3530pow(float d1, IndexPlaceholder<N_index2> d2)
3531{
3532    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<float>, IndexPlaceholder<N_index2>,
3533    _bz_pow<float,int> >(_bz_ArrayExprConstant<float>(d1), d2);
3534}
3535
3536template<class T_numtype2, int N_rank2>
3537inline
3538_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<double>, ArrayIterator<T_numtype2, N_rank2>,
3539    _bz_pow<double,T_numtype2> > >
3540pow(double d1, const Array<T_numtype2, N_rank2>& d2)
3541{
3542    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<double>, ArrayIterator<T_numtype2, N_rank2>,
3543    _bz_pow<double,T_numtype2> >(_bz_ArrayExprConstant<double>(d1), d2.begin());
3544}
3545
3546template<class P_expr2>
3547inline
3548_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<double>, _bz_ArrayExpr<P_expr2>,
3549    _bz_pow<double,typename P_expr2::T_numtype> > >
3550pow(double d1, _bz_ArrayExpr<P_expr2> d2)
3551{
3552    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<double>, _bz_ArrayExpr<P_expr2>,
3553    _bz_pow<double,typename P_expr2::T_numtype> >(_bz_ArrayExprConstant<double>(d1), d2);
3554}
3555
3556template<int N_index2>
3557inline
3558_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<double>, IndexPlaceholder<N_index2>,
3559    _bz_pow<double,int> > >
3560pow(double d1, IndexPlaceholder<N_index2> d2)
3561{
3562    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<double>, IndexPlaceholder<N_index2>,
3563    _bz_pow<double,int> >(_bz_ArrayExprConstant<double>(d1), d2);
3564}
3565
3566template<class T_numtype2, int N_rank2>
3567inline
3568_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<long double>, ArrayIterator<T_numtype2, N_rank2>,
3569    _bz_pow<long double,T_numtype2> > >
3570pow(long double d1, const Array<T_numtype2, N_rank2>& d2)
3571{
3572    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<long double>, ArrayIterator<T_numtype2, N_rank2>,
3573    _bz_pow<long double,T_numtype2> >(_bz_ArrayExprConstant<long double>(d1), d2.begin());
3574}
3575
3576template<class P_expr2>
3577inline
3578_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<long double>, _bz_ArrayExpr<P_expr2>,
3579    _bz_pow<long double,typename P_expr2::T_numtype> > >
3580pow(long double d1, _bz_ArrayExpr<P_expr2> d2)
3581{
3582    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<long double>, _bz_ArrayExpr<P_expr2>,
3583    _bz_pow<long double,typename P_expr2::T_numtype> >(_bz_ArrayExprConstant<long double>(d1), d2);
3584}
3585
3586template<int N_index2>
3587inline
3588_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<long double>, IndexPlaceholder<N_index2>,
3589    _bz_pow<long double,int> > >
3590pow(long double d1, IndexPlaceholder<N_index2> d2)
3591{
3592    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<long double>, IndexPlaceholder<N_index2>,
3593    _bz_pow<long double,int> >(_bz_ArrayExprConstant<long double>(d1), d2);
3594}
3595
3596#ifdef BZ_HAVE_COMPLEX
3597template<class T1, class T_numtype2, int N_rank2>
3598inline
3599_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<complex<T1> > , ArrayIterator<T_numtype2, N_rank2>,
3600    _bz_pow<complex<T1> ,T_numtype2> > >
3601pow(complex<T1> d1, const Array<T_numtype2, N_rank2>& d2)
3602{
3603    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<complex<T1> > , ArrayIterator<T_numtype2, N_rank2>,
3604    _bz_pow<complex<T1> ,T_numtype2> >(_bz_ArrayExprConstant<complex<T1> > (d1), d2.begin());
3605}
3606
3607#endif // BZ_HAVE_COMPLEX
3608
3609#ifdef BZ_HAVE_COMPLEX
3610template<class T1, class P_expr2>
3611inline
3612_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<complex<T1> > , _bz_ArrayExpr<P_expr2>,
3613    _bz_pow<complex<T1> ,typename P_expr2::T_numtype> > >
3614pow(complex<T1> d1, _bz_ArrayExpr<P_expr2> d2)
3615{
3616    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<complex<T1> > , _bz_ArrayExpr<P_expr2>,
3617    _bz_pow<complex<T1> ,typename P_expr2::T_numtype> >(_bz_ArrayExprConstant<complex<T1> > (d1), d2);
3618}
3619
3620#endif // BZ_HAVE_COMPLEX
3621
3622#ifdef BZ_HAVE_COMPLEX
3623template<class T1, int N_index2>
3624inline
3625_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<complex<T1> > , IndexPlaceholder<N_index2>,
3626    _bz_pow<complex<T1> ,int> > >
3627pow(complex<T1> d1, IndexPlaceholder<N_index2> d2)
3628{
3629    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<complex<T1> > , IndexPlaceholder<N_index2>,
3630    _bz_pow<complex<T1> ,int> >(_bz_ArrayExprConstant<complex<T1> > (d1), d2);
3631}
3632
3633#endif // BZ_HAVE_COMPLEX
3634
3635
3636/****************************************************************************
3637 * pow2
3638 ****************************************************************************/
3639
3640template<class T_numtype1, int N_rank1>
3641inline
3642_bz_ArrayExpr<_bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
3643    _bz_pow2<T_numtype1> > >
3644pow2(const Array<T_numtype1, N_rank1>& d1)
3645{
3646    return _bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
3647    _bz_pow2<T_numtype1> >(d1.begin());
3648}
3649
3650template<class P_expr1>
3651inline
3652_bz_ArrayExpr<_bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
3653    _bz_pow2<typename P_expr1::T_numtype> > >
3654pow2(_bz_ArrayExpr<P_expr1> d1)
3655{
3656    return _bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
3657    _bz_pow2<typename P_expr1::T_numtype> >(d1);
3658}
3659
3660template<int N_index1>
3661inline
3662_bz_ArrayExpr<_bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
3663    _bz_pow2<int> > >
3664pow2(IndexPlaceholder<N_index1> d1)
3665{
3666    return _bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
3667    _bz_pow2<int> >(d1);
3668}
3669
3670
3671/****************************************************************************
3672 * pow3
3673 ****************************************************************************/
3674
3675template<class T_numtype1, int N_rank1>
3676inline
3677_bz_ArrayExpr<_bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
3678    _bz_pow3<T_numtype1> > >
3679pow3(const Array<T_numtype1, N_rank1>& d1)
3680{
3681    return _bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
3682    _bz_pow3<T_numtype1> >(d1.begin());
3683}
3684
3685template<class P_expr1>
3686inline
3687_bz_ArrayExpr<_bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
3688    _bz_pow3<typename P_expr1::T_numtype> > >
3689pow3(_bz_ArrayExpr<P_expr1> d1)
3690{
3691    return _bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
3692    _bz_pow3<typename P_expr1::T_numtype> >(d1);
3693}
3694
3695template<int N_index1>
3696inline
3697_bz_ArrayExpr<_bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
3698    _bz_pow3<int> > >
3699pow3(IndexPlaceholder<N_index1> d1)
3700{
3701    return _bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
3702    _bz_pow3<int> >(d1);
3703}
3704
3705
3706/****************************************************************************
3707 * pow4
3708 ****************************************************************************/
3709
3710template<class T_numtype1, int N_rank1>
3711inline
3712_bz_ArrayExpr<_bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
3713    _bz_pow4<T_numtype1> > >
3714pow4(const Array<T_numtype1, N_rank1>& d1)
3715{
3716    return _bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
3717    _bz_pow4<T_numtype1> >(d1.begin());
3718}
3719
3720template<class P_expr1>
3721inline
3722_bz_ArrayExpr<_bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
3723    _bz_pow4<typename P_expr1::T_numtype> > >
3724pow4(_bz_ArrayExpr<P_expr1> d1)
3725{
3726    return _bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
3727    _bz_pow4<typename P_expr1::T_numtype> >(d1);
3728}
3729
3730template<int N_index1>
3731inline
3732_bz_ArrayExpr<_bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
3733    _bz_pow4<int> > >
3734pow4(IndexPlaceholder<N_index1> d1)
3735{
3736    return _bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
3737    _bz_pow4<int> >(d1);
3738}
3739
3740
3741/****************************************************************************
3742 * pow5
3743 ****************************************************************************/
3744
3745template<class T_numtype1, int N_rank1>
3746inline
3747_bz_ArrayExpr<_bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
3748    _bz_pow5<T_numtype1> > >
3749pow5(const Array<T_numtype1, N_rank1>& d1)
3750{
3751    return _bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
3752    _bz_pow5<T_numtype1> >(d1.begin());
3753}
3754
3755template<class P_expr1>
3756inline
3757_bz_ArrayExpr<_bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
3758    _bz_pow5<typename P_expr1::T_numtype> > >
3759pow5(_bz_ArrayExpr<P_expr1> d1)
3760{
3761    return _bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
3762    _bz_pow5<typename P_expr1::T_numtype> >(d1);
3763}
3764
3765template<int N_index1>
3766inline
3767_bz_ArrayExpr<_bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
3768    _bz_pow5<int> > >
3769pow5(IndexPlaceholder<N_index1> d1)
3770{
3771    return _bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
3772    _bz_pow5<int> >(d1);
3773}
3774
3775
3776/****************************************************************************
3777 * pow6
3778 ****************************************************************************/
3779
3780template<class T_numtype1, int N_rank1>
3781inline
3782_bz_ArrayExpr<_bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
3783    _bz_pow6<T_numtype1> > >
3784pow6(const Array<T_numtype1, N_rank1>& d1)
3785{
3786    return _bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
3787    _bz_pow6<T_numtype1> >(d1.begin());
3788}
3789
3790template<class P_expr1>
3791inline
3792_bz_ArrayExpr<_bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
3793    _bz_pow6<typename P_expr1::T_numtype> > >
3794pow6(_bz_ArrayExpr<P_expr1> d1)
3795{
3796    return _bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
3797    _bz_pow6<typename P_expr1::T_numtype> >(d1);
3798}
3799
3800template<int N_index1>
3801inline
3802_bz_ArrayExpr<_bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
3803    _bz_pow6<int> > >
3804pow6(IndexPlaceholder<N_index1> d1)
3805{
3806    return _bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
3807    _bz_pow6<int> >(d1);
3808}
3809
3810
3811/****************************************************************************
3812 * pow7
3813 ****************************************************************************/
3814
3815template<class T_numtype1, int N_rank1>
3816inline
3817_bz_ArrayExpr<_bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
3818    _bz_pow7<T_numtype1> > >
3819pow7(const Array<T_numtype1, N_rank1>& d1)
3820{
3821    return _bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
3822    _bz_pow7<T_numtype1> >(d1.begin());
3823}
3824
3825template<class P_expr1>
3826inline
3827_bz_ArrayExpr<_bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
3828    _bz_pow7<typename P_expr1::T_numtype> > >
3829pow7(_bz_ArrayExpr<P_expr1> d1)
3830{
3831    return _bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
3832    _bz_pow7<typename P_expr1::T_numtype> >(d1);
3833}
3834
3835template<int N_index1>
3836inline
3837_bz_ArrayExpr<_bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
3838    _bz_pow7<int> > >
3839pow7(IndexPlaceholder<N_index1> d1)
3840{
3841    return _bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
3842    _bz_pow7<int> >(d1);
3843}
3844
3845
3846/****************************************************************************
3847 * pow8
3848 ****************************************************************************/
3849
3850template<class T_numtype1, int N_rank1>
3851inline
3852_bz_ArrayExpr<_bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
3853    _bz_pow8<T_numtype1> > >
3854pow8(const Array<T_numtype1, N_rank1>& d1)
3855{
3856    return _bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
3857    _bz_pow8<T_numtype1> >(d1.begin());
3858}
3859
3860template<class P_expr1>
3861inline
3862_bz_ArrayExpr<_bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
3863    _bz_pow8<typename P_expr1::T_numtype> > >
3864pow8(_bz_ArrayExpr<P_expr1> d1)
3865{
3866    return _bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
3867    _bz_pow8<typename P_expr1::T_numtype> >(d1);
3868}
3869
3870template<int N_index1>
3871inline
3872_bz_ArrayExpr<_bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
3873    _bz_pow8<int> > >
3874pow8(IndexPlaceholder<N_index1> d1)
3875{
3876    return _bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
3877    _bz_pow8<int> >(d1);
3878}
3879
3880
3881/****************************************************************************
3882 * remainder
3883 ****************************************************************************/
3884
3885#ifdef BZ_HAVE_SYSTEM_V_MATH
3886template<class T_numtype1, int N_rank1, class T_numtype2, int N_rank2>
3887inline
3888_bz_ArrayExpr<_bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, ArrayIterator<T_numtype2, N_rank2>,
3889    _bz_remainder<T_numtype1,T_numtype2> > >
3890remainder(const Array<T_numtype1, N_rank1>& d1, const Array<T_numtype2, N_rank2>& d2)
3891{
3892    return _bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, ArrayIterator<T_numtype2, N_rank2>,
3893    _bz_remainder<T_numtype1,T_numtype2> >(d1.begin(), d2.begin());
3894}
3895
3896template<class T_numtype1, int N_rank1, class P_expr2>
3897inline
3898_bz_ArrayExpr<_bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExpr<P_expr2>,
3899    _bz_remainder<T_numtype1,typename P_expr2::T_numtype> > >
3900remainder(const Array<T_numtype1, N_rank1>& d1, _bz_ArrayExpr<P_expr2> d2)
3901{
3902    return _bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExpr<P_expr2>,
3903    _bz_remainder<T_numtype1,typename P_expr2::T_numtype> >(d1.begin(), d2);
3904}
3905
3906template<class T_numtype1, int N_rank1, int N_index2>
3907inline
3908_bz_ArrayExpr<_bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, IndexPlaceholder<N_index2>,
3909    _bz_remainder<T_numtype1,int> > >
3910remainder(const Array<T_numtype1, N_rank1>& d1, IndexPlaceholder<N_index2> d2)
3911{
3912    return _bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, IndexPlaceholder<N_index2>,
3913    _bz_remainder<T_numtype1,int> >(d1.begin(), d2);
3914}
3915
3916template<class T_numtype1, int N_rank1>
3917inline
3918_bz_ArrayExpr<_bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExprConstant<float>,
3919    _bz_remainder<T_numtype1,float> > >
3920remainder(const Array<T_numtype1, N_rank1>& d1, float d2)
3921{
3922    return _bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExprConstant<float>,
3923    _bz_remainder<T_numtype1,float> >(d1.begin(), _bz_ArrayExprConstant<float>(d2));
3924}
3925
3926template<class T_numtype1, int N_rank1>
3927inline
3928_bz_ArrayExpr<_bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExprConstant<double>,
3929    _bz_remainder<T_numtype1,double> > >
3930remainder(const Array<T_numtype1, N_rank1>& d1, double d2)
3931{
3932    return _bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExprConstant<double>,
3933    _bz_remainder<T_numtype1,double> >(d1.begin(), _bz_ArrayExprConstant<double>(d2));
3934}
3935
3936template<class T_numtype1, int N_rank1>
3937inline
3938_bz_ArrayExpr<_bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExprConstant<long double>,
3939    _bz_remainder<T_numtype1,long double> > >
3940remainder(const Array<T_numtype1, N_rank1>& d1, long double d2)
3941{
3942    return _bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExprConstant<long double>,
3943    _bz_remainder<T_numtype1,long double> >(d1.begin(), _bz_ArrayExprConstant<long double>(d2));
3944}
3945
3946#ifdef BZ_HAVE_COMPLEX
3947template<class T_numtype1, int N_rank1, class T2>
3948inline
3949_bz_ArrayExpr<_bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExprConstant<complex<T2> > ,
3950    _bz_remainder<T_numtype1,complex<T2> > > >
3951remainder(const Array<T_numtype1, N_rank1>& d1, complex<T2> d2)
3952{
3953    return _bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExprConstant<complex<T2> > ,
3954    _bz_remainder<T_numtype1,complex<T2> > >(d1.begin(), _bz_ArrayExprConstant<complex<T2> > (d2));
3955}
3956
3957#endif // BZ_HAVE_COMPLEX
3958
3959template<class P_expr1, class T_numtype2, int N_rank2>
3960inline
3961_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, ArrayIterator<T_numtype2, N_rank2>,
3962    _bz_remainder<typename P_expr1::T_numtype,T_numtype2> > >
3963remainder(_bz_ArrayExpr<P_expr1> d1, const Array<T_numtype2, N_rank2>& d2)
3964{
3965    return _bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, ArrayIterator<T_numtype2, N_rank2>,
3966    _bz_remainder<typename P_expr1::T_numtype,T_numtype2> >(d1, d2.begin());
3967}
3968
3969template<class P_expr1, class P_expr2>
3970inline
3971_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExpr<P_expr2>,
3972    _bz_remainder<typename P_expr1::T_numtype,typename P_expr2::T_numtype> > >
3973remainder(_bz_ArrayExpr<P_expr1> d1, _bz_ArrayExpr<P_expr2> d2)
3974{
3975    return _bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExpr<P_expr2>,
3976    _bz_remainder<typename P_expr1::T_numtype,typename P_expr2::T_numtype> >(d1, d2);
3977}
3978
3979template<class P_expr1, int N_index2>
3980inline
3981_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, IndexPlaceholder<N_index2>,
3982    _bz_remainder<typename P_expr1::T_numtype,int> > >
3983remainder(_bz_ArrayExpr<P_expr1> d1, IndexPlaceholder<N_index2> d2)
3984{
3985    return _bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, IndexPlaceholder<N_index2>,
3986    _bz_remainder<typename P_expr1::T_numtype,int> >(d1, d2);
3987}
3988
3989template<class P_expr1>
3990inline
3991_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExprConstant<float>,
3992    _bz_remainder<typename P_expr1::T_numtype,float> > >
3993remainder(_bz_ArrayExpr<P_expr1> d1, float d2)
3994{
3995    return _bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExprConstant<float>,
3996    _bz_remainder<typename P_expr1::T_numtype,float> >(d1, _bz_ArrayExprConstant<float>(d2));
3997}
3998
3999template<class P_expr1>
4000inline
4001_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExprConstant<double>,
4002    _bz_remainder<typename P_expr1::T_numtype,double> > >
4003remainder(_bz_ArrayExpr<P_expr1> d1, double d2)
4004{
4005    return _bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExprConstant<double>,
4006    _bz_remainder<typename P_expr1::T_numtype,double> >(d1, _bz_ArrayExprConstant<double>(d2));
4007}
4008
4009template<class P_expr1>
4010inline
4011_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExprConstant<long double>,
4012    _bz_remainder<typename P_expr1::T_numtype,long double> > >
4013remainder(_bz_ArrayExpr<P_expr1> d1, long double d2)
4014{
4015    return _bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExprConstant<long double>,
4016    _bz_remainder<typename P_expr1::T_numtype,long double> >(d1, _bz_ArrayExprConstant<long double>(d2));
4017}
4018
4019#ifdef BZ_HAVE_COMPLEX
4020template<class P_expr1, class T2>
4021inline
4022_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExprConstant<complex<T2> > ,
4023    _bz_remainder<typename P_expr1::T_numtype,complex<T2> > > >
4024remainder(_bz_ArrayExpr<P_expr1> d1, complex<T2> d2)
4025{
4026    return _bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExprConstant<complex<T2> > ,
4027    _bz_remainder<typename P_expr1::T_numtype,complex<T2> > >(d1, _bz_ArrayExprConstant<complex<T2> > (d2));
4028}
4029
4030#endif // BZ_HAVE_COMPLEX
4031
4032template<int N_index1, class T_numtype2, int N_rank2>
4033inline
4034_bz_ArrayExpr<_bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, ArrayIterator<T_numtype2, N_rank2>,
4035    _bz_remainder<int,T_numtype2> > >
4036remainder(IndexPlaceholder<N_index1> d1, const Array<T_numtype2, N_rank2>& d2)
4037{
4038    return _bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, ArrayIterator<T_numtype2, N_rank2>,
4039    _bz_remainder<int,T_numtype2> >(d1, d2.begin());
4040}
4041
4042template<int N_index1, class P_expr2>
4043inline
4044_bz_ArrayExpr<_bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExpr<P_expr2>,
4045    _bz_remainder<int,typename P_expr2::T_numtype> > >
4046remainder(IndexPlaceholder<N_index1> d1, _bz_ArrayExpr<P_expr2> d2)
4047{
4048    return _bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExpr<P_expr2>,
4049    _bz_remainder<int,typename P_expr2::T_numtype> >(d1, d2);
4050}
4051
4052template<int N_index1, int N_index2>
4053inline
4054_bz_ArrayExpr<_bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, IndexPlaceholder<N_index2>,
4055    _bz_remainder<int,int> > >
4056remainder(IndexPlaceholder<N_index1> d1, IndexPlaceholder<N_index2> d2)
4057{
4058    return _bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, IndexPlaceholder<N_index2>,
4059    _bz_remainder<int,int> >(d1, d2);
4060}
4061
4062template<int N_index1>
4063inline
4064_bz_ArrayExpr<_bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExprConstant<float>,
4065    _bz_remainder<int,float> > >
4066remainder(IndexPlaceholder<N_index1> d1, float d2)
4067{
4068    return _bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExprConstant<float>,
4069    _bz_remainder<int,float> >(d1, _bz_ArrayExprConstant<float>(d2));
4070}
4071
4072template<int N_index1>
4073inline
4074_bz_ArrayExpr<_bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExprConstant<double>,
4075    _bz_remainder<int,double> > >
4076remainder(IndexPlaceholder<N_index1> d1, double d2)
4077{
4078    return _bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExprConstant<double>,
4079    _bz_remainder<int,double> >(d1, _bz_ArrayExprConstant<double>(d2));
4080}
4081
4082template<int N_index1>
4083inline
4084_bz_ArrayExpr<_bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExprConstant<long double>,
4085    _bz_remainder<int,long double> > >
4086remainder(IndexPlaceholder<N_index1> d1, long double d2)
4087{
4088    return _bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExprConstant<long double>,
4089    _bz_remainder<int,long double> >(d1, _bz_ArrayExprConstant<long double>(d2));
4090}
4091
4092#ifdef BZ_HAVE_COMPLEX
4093template<int N_index1, class T2>
4094inline
4095_bz_ArrayExpr<_bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExprConstant<complex<T2> > ,
4096    _bz_remainder<int,complex<T2> > > >
4097remainder(IndexPlaceholder<N_index1> d1, complex<T2> d2)
4098{
4099    return _bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExprConstant<complex<T2> > ,
4100    _bz_remainder<int,complex<T2> > >(d1, _bz_ArrayExprConstant<complex<T2> > (d2));
4101}
4102
4103#endif // BZ_HAVE_COMPLEX
4104
4105template<class T_numtype2, int N_rank2>
4106inline
4107_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<float>, ArrayIterator<T_numtype2, N_rank2>,
4108    _bz_remainder<float,T_numtype2> > >
4109remainder(float d1, const Array<T_numtype2, N_rank2>& d2)
4110{
4111    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<float>, ArrayIterator<T_numtype2, N_rank2>,
4112    _bz_remainder<float,T_numtype2> >(_bz_ArrayExprConstant<float>(d1), d2.begin());
4113}
4114
4115template<class P_expr2>
4116inline
4117_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<float>, _bz_ArrayExpr<P_expr2>,
4118    _bz_remainder<float,typename P_expr2::T_numtype> > >
4119remainder(float d1, _bz_ArrayExpr<P_expr2> d2)
4120{
4121    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<float>, _bz_ArrayExpr<P_expr2>,
4122    _bz_remainder<float,typename P_expr2::T_numtype> >(_bz_ArrayExprConstant<float>(d1), d2);
4123}
4124
4125template<int N_index2>
4126inline
4127_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<float>, IndexPlaceholder<N_index2>,
4128    _bz_remainder<float,int> > >
4129remainder(float d1, IndexPlaceholder<N_index2> d2)
4130{
4131    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<float>, IndexPlaceholder<N_index2>,
4132    _bz_remainder<float,int> >(_bz_ArrayExprConstant<float>(d1), d2);
4133}
4134
4135template<class T_numtype2, int N_rank2>
4136inline
4137_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<double>, ArrayIterator<T_numtype2, N_rank2>,
4138    _bz_remainder<double,T_numtype2> > >
4139remainder(double d1, const Array<T_numtype2, N_rank2>& d2)
4140{
4141    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<double>, ArrayIterator<T_numtype2, N_rank2>,
4142    _bz_remainder<double,T_numtype2> >(_bz_ArrayExprConstant<double>(d1), d2.begin());
4143}
4144
4145template<class P_expr2>
4146inline
4147_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<double>, _bz_ArrayExpr<P_expr2>,
4148    _bz_remainder<double,typename P_expr2::T_numtype> > >
4149remainder(double d1, _bz_ArrayExpr<P_expr2> d2)
4150{
4151    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<double>, _bz_ArrayExpr<P_expr2>,
4152    _bz_remainder<double,typename P_expr2::T_numtype> >(_bz_ArrayExprConstant<double>(d1), d2);
4153}
4154
4155template<int N_index2>
4156inline
4157_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<double>, IndexPlaceholder<N_index2>,
4158    _bz_remainder<double,int> > >
4159remainder(double d1, IndexPlaceholder<N_index2> d2)
4160{
4161    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<double>, IndexPlaceholder<N_index2>,
4162    _bz_remainder<double,int> >(_bz_ArrayExprConstant<double>(d1), d2);
4163}
4164
4165template<class T_numtype2, int N_rank2>
4166inline
4167_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<long double>, ArrayIterator<T_numtype2, N_rank2>,
4168    _bz_remainder<long double,T_numtype2> > >
4169remainder(long double d1, const Array<T_numtype2, N_rank2>& d2)
4170{
4171    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<long double>, ArrayIterator<T_numtype2, N_rank2>,
4172    _bz_remainder<long double,T_numtype2> >(_bz_ArrayExprConstant<long double>(d1), d2.begin());
4173}
4174
4175template<class P_expr2>
4176inline
4177_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<long double>, _bz_ArrayExpr<P_expr2>,
4178    _bz_remainder<long double,typename P_expr2::T_numtype> > >
4179remainder(long double d1, _bz_ArrayExpr<P_expr2> d2)
4180{
4181    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<long double>, _bz_ArrayExpr<P_expr2>,
4182    _bz_remainder<long double,typename P_expr2::T_numtype> >(_bz_ArrayExprConstant<long double>(d1), d2);
4183}
4184
4185template<int N_index2>
4186inline
4187_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<long double>, IndexPlaceholder<N_index2>,
4188    _bz_remainder<long double,int> > >
4189remainder(long double d1, IndexPlaceholder<N_index2> d2)
4190{
4191    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<long double>, IndexPlaceholder<N_index2>,
4192    _bz_remainder<long double,int> >(_bz_ArrayExprConstant<long double>(d1), d2);
4193}
4194
4195#ifdef BZ_HAVE_COMPLEX
4196template<class T1, class T_numtype2, int N_rank2>
4197inline
4198_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<complex<T1> > , ArrayIterator<T_numtype2, N_rank2>,
4199    _bz_remainder<complex<T1> ,T_numtype2> > >
4200remainder(complex<T1> d1, const Array<T_numtype2, N_rank2>& d2)
4201{
4202    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<complex<T1> > , ArrayIterator<T_numtype2, N_rank2>,
4203    _bz_remainder<complex<T1> ,T_numtype2> >(_bz_ArrayExprConstant<complex<T1> > (d1), d2.begin());
4204}
4205
4206#endif // BZ_HAVE_COMPLEX
4207
4208#ifdef BZ_HAVE_COMPLEX
4209template<class T1, class P_expr2>
4210inline
4211_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<complex<T1> > , _bz_ArrayExpr<P_expr2>,
4212    _bz_remainder<complex<T1> ,typename P_expr2::T_numtype> > >
4213remainder(complex<T1> d1, _bz_ArrayExpr<P_expr2> d2)
4214{
4215    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<complex<T1> > , _bz_ArrayExpr<P_expr2>,
4216    _bz_remainder<complex<T1> ,typename P_expr2::T_numtype> >(_bz_ArrayExprConstant<complex<T1> > (d1), d2);
4217}
4218
4219#endif // BZ_HAVE_COMPLEX
4220
4221#ifdef BZ_HAVE_COMPLEX
4222template<class T1, int N_index2>
4223inline
4224_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<complex<T1> > , IndexPlaceholder<N_index2>,
4225    _bz_remainder<complex<T1> ,int> > >
4226remainder(complex<T1> d1, IndexPlaceholder<N_index2> d2)
4227{
4228    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<complex<T1> > , IndexPlaceholder<N_index2>,
4229    _bz_remainder<complex<T1> ,int> >(_bz_ArrayExprConstant<complex<T1> > (d1), d2);
4230}
4231
4232#endif // BZ_HAVE_COMPLEX
4233
4234#endif
4235
4236/****************************************************************************
4237 * rint
4238 ****************************************************************************/
4239
4240#ifdef BZ_HAVE_IEEE_MATH
4241template<class T_numtype1, int N_rank1>
4242inline
4243_bz_ArrayExpr<_bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
4244    _bz_rint<T_numtype1> > >
4245rint(const Array<T_numtype1, N_rank1>& d1)
4246{
4247    return _bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
4248    _bz_rint<T_numtype1> >(d1.begin());
4249}
4250
4251template<class P_expr1>
4252inline
4253_bz_ArrayExpr<_bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
4254    _bz_rint<typename P_expr1::T_numtype> > >
4255rint(_bz_ArrayExpr<P_expr1> d1)
4256{
4257    return _bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
4258    _bz_rint<typename P_expr1::T_numtype> >(d1);
4259}
4260
4261template<int N_index1>
4262inline
4263_bz_ArrayExpr<_bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
4264    _bz_rint<int> > >
4265rint(IndexPlaceholder<N_index1> d1)
4266{
4267    return _bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
4268    _bz_rint<int> >(d1);
4269}
4270
4271#endif
4272
4273/****************************************************************************
4274 * rsqrt
4275 ****************************************************************************/
4276
4277#ifdef BZ_HAVE_SYSTEM_V_MATH
4278template<class T_numtype1, int N_rank1>
4279inline
4280_bz_ArrayExpr<_bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
4281    _bz_rsqrt<T_numtype1> > >
4282rsqrt(const Array<T_numtype1, N_rank1>& d1)
4283{
4284    return _bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
4285    _bz_rsqrt<T_numtype1> >(d1.begin());
4286}
4287
4288template<class P_expr1>
4289inline
4290_bz_ArrayExpr<_bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
4291    _bz_rsqrt<typename P_expr1::T_numtype> > >
4292rsqrt(_bz_ArrayExpr<P_expr1> d1)
4293{
4294    return _bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
4295    _bz_rsqrt<typename P_expr1::T_numtype> >(d1);
4296}
4297
4298template<int N_index1>
4299inline
4300_bz_ArrayExpr<_bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
4301    _bz_rsqrt<int> > >
4302rsqrt(IndexPlaceholder<N_index1> d1)
4303{
4304    return _bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
4305    _bz_rsqrt<int> >(d1);
4306}
4307
4308#endif
4309
4310/****************************************************************************
4311 * scalb
4312 ****************************************************************************/
4313
4314#ifdef BZ_HAVE_SYSTEM_V_MATH
4315template<class T_numtype1, int N_rank1, class T_numtype2, int N_rank2>
4316inline
4317_bz_ArrayExpr<_bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, ArrayIterator<T_numtype2, N_rank2>,
4318    _bz_scalb<T_numtype1,T_numtype2> > >
4319scalb(const Array<T_numtype1, N_rank1>& d1, const Array<T_numtype2, N_rank2>& d2)
4320{
4321    return _bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, ArrayIterator<T_numtype2, N_rank2>,
4322    _bz_scalb<T_numtype1,T_numtype2> >(d1.begin(), d2.begin());
4323}
4324
4325template<class T_numtype1, int N_rank1, class P_expr2>
4326inline
4327_bz_ArrayExpr<_bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExpr<P_expr2>,
4328    _bz_scalb<T_numtype1,typename P_expr2::T_numtype> > >
4329scalb(const Array<T_numtype1, N_rank1>& d1, _bz_ArrayExpr<P_expr2> d2)
4330{
4331    return _bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExpr<P_expr2>,
4332    _bz_scalb<T_numtype1,typename P_expr2::T_numtype> >(d1.begin(), d2);
4333}
4334
4335template<class T_numtype1, int N_rank1, int N_index2>
4336inline
4337_bz_ArrayExpr<_bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, IndexPlaceholder<N_index2>,
4338    _bz_scalb<T_numtype1,int> > >
4339scalb(const Array<T_numtype1, N_rank1>& d1, IndexPlaceholder<N_index2> d2)
4340{
4341    return _bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, IndexPlaceholder<N_index2>,
4342    _bz_scalb<T_numtype1,int> >(d1.begin(), d2);
4343}
4344
4345template<class T_numtype1, int N_rank1>
4346inline
4347_bz_ArrayExpr<_bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExprConstant<float>,
4348    _bz_scalb<T_numtype1,float> > >
4349scalb(const Array<T_numtype1, N_rank1>& d1, float d2)
4350{
4351    return _bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExprConstant<float>,
4352    _bz_scalb<T_numtype1,float> >(d1.begin(), _bz_ArrayExprConstant<float>(d2));
4353}
4354
4355template<class T_numtype1, int N_rank1>
4356inline
4357_bz_ArrayExpr<_bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExprConstant<double>,
4358    _bz_scalb<T_numtype1,double> > >
4359scalb(const Array<T_numtype1, N_rank1>& d1, double d2)
4360{
4361    return _bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExprConstant<double>,
4362    _bz_scalb<T_numtype1,double> >(d1.begin(), _bz_ArrayExprConstant<double>(d2));
4363}
4364
4365template<class T_numtype1, int N_rank1>
4366inline
4367_bz_ArrayExpr<_bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExprConstant<long double>,
4368    _bz_scalb<T_numtype1,long double> > >
4369scalb(const Array<T_numtype1, N_rank1>& d1, long double d2)
4370{
4371    return _bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExprConstant<long double>,
4372    _bz_scalb<T_numtype1,long double> >(d1.begin(), _bz_ArrayExprConstant<long double>(d2));
4373}
4374
4375#ifdef BZ_HAVE_COMPLEX
4376template<class T_numtype1, int N_rank1, class T2>
4377inline
4378_bz_ArrayExpr<_bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExprConstant<complex<T2> > ,
4379    _bz_scalb<T_numtype1,complex<T2> > > >
4380scalb(const Array<T_numtype1, N_rank1>& d1, complex<T2> d2)
4381{
4382    return _bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExprConstant<complex<T2> > ,
4383    _bz_scalb<T_numtype1,complex<T2> > >(d1.begin(), _bz_ArrayExprConstant<complex<T2> > (d2));
4384}
4385
4386#endif // BZ_HAVE_COMPLEX
4387
4388template<class P_expr1, class T_numtype2, int N_rank2>
4389inline
4390_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, ArrayIterator<T_numtype2, N_rank2>,
4391    _bz_scalb<typename P_expr1::T_numtype,T_numtype2> > >
4392scalb(_bz_ArrayExpr<P_expr1> d1, const Array<T_numtype2, N_rank2>& d2)
4393{
4394    return _bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, ArrayIterator<T_numtype2, N_rank2>,
4395    _bz_scalb<typename P_expr1::T_numtype,T_numtype2> >(d1, d2.begin());
4396}
4397
4398template<class P_expr1, class P_expr2>
4399inline
4400_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExpr<P_expr2>,
4401    _bz_scalb<typename P_expr1::T_numtype,typename P_expr2::T_numtype> > >
4402scalb(_bz_ArrayExpr<P_expr1> d1, _bz_ArrayExpr<P_expr2> d2)
4403{
4404    return _bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExpr<P_expr2>,
4405    _bz_scalb<typename P_expr1::T_numtype,typename P_expr2::T_numtype> >(d1, d2);
4406}
4407
4408template<class P_expr1, int N_index2>
4409inline
4410_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, IndexPlaceholder<N_index2>,
4411    _bz_scalb<typename P_expr1::T_numtype,int> > >
4412scalb(_bz_ArrayExpr<P_expr1> d1, IndexPlaceholder<N_index2> d2)
4413{
4414    return _bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, IndexPlaceholder<N_index2>,
4415    _bz_scalb<typename P_expr1::T_numtype,int> >(d1, d2);
4416}
4417
4418template<class P_expr1>
4419inline
4420_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExprConstant<float>,
4421    _bz_scalb<typename P_expr1::T_numtype,float> > >
4422scalb(_bz_ArrayExpr<P_expr1> d1, float d2)
4423{
4424    return _bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExprConstant<float>,
4425    _bz_scalb<typename P_expr1::T_numtype,float> >(d1, _bz_ArrayExprConstant<float>(d2));
4426}
4427
4428template<class P_expr1>
4429inline
4430_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExprConstant<double>,
4431    _bz_scalb<typename P_expr1::T_numtype,double> > >
4432scalb(_bz_ArrayExpr<P_expr1> d1, double d2)
4433{
4434    return _bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExprConstant<double>,
4435    _bz_scalb<typename P_expr1::T_numtype,double> >(d1, _bz_ArrayExprConstant<double>(d2));
4436}
4437
4438template<class P_expr1>
4439inline
4440_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExprConstant<long double>,
4441    _bz_scalb<typename P_expr1::T_numtype,long double> > >
4442scalb(_bz_ArrayExpr<P_expr1> d1, long double d2)
4443{
4444    return _bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExprConstant<long double>,
4445    _bz_scalb<typename P_expr1::T_numtype,long double> >(d1, _bz_ArrayExprConstant<long double>(d2));
4446}
4447
4448#ifdef BZ_HAVE_COMPLEX
4449template<class P_expr1, class T2>
4450inline
4451_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExprConstant<complex<T2> > ,
4452    _bz_scalb<typename P_expr1::T_numtype,complex<T2> > > >
4453scalb(_bz_ArrayExpr<P_expr1> d1, complex<T2> d2)
4454{
4455    return _bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExprConstant<complex<T2> > ,
4456    _bz_scalb<typename P_expr1::T_numtype,complex<T2> > >(d1, _bz_ArrayExprConstant<complex<T2> > (d2));
4457}
4458
4459#endif // BZ_HAVE_COMPLEX
4460
4461template<int N_index1, class T_numtype2, int N_rank2>
4462inline
4463_bz_ArrayExpr<_bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, ArrayIterator<T_numtype2, N_rank2>,
4464    _bz_scalb<int,T_numtype2> > >
4465scalb(IndexPlaceholder<N_index1> d1, const Array<T_numtype2, N_rank2>& d2)
4466{
4467    return _bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, ArrayIterator<T_numtype2, N_rank2>,
4468    _bz_scalb<int,T_numtype2> >(d1, d2.begin());
4469}
4470
4471template<int N_index1, class P_expr2>
4472inline
4473_bz_ArrayExpr<_bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExpr<P_expr2>,
4474    _bz_scalb<int,typename P_expr2::T_numtype> > >
4475scalb(IndexPlaceholder<N_index1> d1, _bz_ArrayExpr<P_expr2> d2)
4476{
4477    return _bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExpr<P_expr2>,
4478    _bz_scalb<int,typename P_expr2::T_numtype> >(d1, d2);
4479}
4480
4481template<int N_index1, int N_index2>
4482inline
4483_bz_ArrayExpr<_bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, IndexPlaceholder<N_index2>,
4484    _bz_scalb<int,int> > >
4485scalb(IndexPlaceholder<N_index1> d1, IndexPlaceholder<N_index2> d2)
4486{
4487    return _bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, IndexPlaceholder<N_index2>,
4488    _bz_scalb<int,int> >(d1, d2);
4489}
4490
4491template<int N_index1>
4492inline
4493_bz_ArrayExpr<_bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExprConstant<float>,
4494    _bz_scalb<int,float> > >
4495scalb(IndexPlaceholder<N_index1> d1, float d2)
4496{
4497    return _bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExprConstant<float>,
4498    _bz_scalb<int,float> >(d1, _bz_ArrayExprConstant<float>(d2));
4499}
4500
4501template<int N_index1>
4502inline
4503_bz_ArrayExpr<_bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExprConstant<double>,
4504    _bz_scalb<int,double> > >
4505scalb(IndexPlaceholder<N_index1> d1, double d2)
4506{
4507    return _bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExprConstant<double>,
4508    _bz_scalb<int,double> >(d1, _bz_ArrayExprConstant<double>(d2));
4509}
4510
4511template<int N_index1>
4512inline
4513_bz_ArrayExpr<_bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExprConstant<long double>,
4514    _bz_scalb<int,long double> > >
4515scalb(IndexPlaceholder<N_index1> d1, long double d2)
4516{
4517    return _bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExprConstant<long double>,
4518    _bz_scalb<int,long double> >(d1, _bz_ArrayExprConstant<long double>(d2));
4519}
4520
4521#ifdef BZ_HAVE_COMPLEX
4522template<int N_index1, class T2>
4523inline
4524_bz_ArrayExpr<_bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExprConstant<complex<T2> > ,
4525    _bz_scalb<int,complex<T2> > > >
4526scalb(IndexPlaceholder<N_index1> d1, complex<T2> d2)
4527{
4528    return _bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExprConstant<complex<T2> > ,
4529    _bz_scalb<int,complex<T2> > >(d1, _bz_ArrayExprConstant<complex<T2> > (d2));
4530}
4531
4532#endif // BZ_HAVE_COMPLEX
4533
4534template<class T_numtype2, int N_rank2>
4535inline
4536_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<float>, ArrayIterator<T_numtype2, N_rank2>,
4537    _bz_scalb<float,T_numtype2> > >
4538scalb(float d1, const Array<T_numtype2, N_rank2>& d2)
4539{
4540    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<float>, ArrayIterator<T_numtype2, N_rank2>,
4541    _bz_scalb<float,T_numtype2> >(_bz_ArrayExprConstant<float>(d1), d2.begin());
4542}
4543
4544template<class P_expr2>
4545inline
4546_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<float>, _bz_ArrayExpr<P_expr2>,
4547    _bz_scalb<float,typename P_expr2::T_numtype> > >
4548scalb(float d1, _bz_ArrayExpr<P_expr2> d2)
4549{
4550    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<float>, _bz_ArrayExpr<P_expr2>,
4551    _bz_scalb<float,typename P_expr2::T_numtype> >(_bz_ArrayExprConstant<float>(d1), d2);
4552}
4553
4554template<int N_index2>
4555inline
4556_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<float>, IndexPlaceholder<N_index2>,
4557    _bz_scalb<float,int> > >
4558scalb(float d1, IndexPlaceholder<N_index2> d2)
4559{
4560    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<float>, IndexPlaceholder<N_index2>,
4561    _bz_scalb<float,int> >(_bz_ArrayExprConstant<float>(d1), d2);
4562}
4563
4564template<class T_numtype2, int N_rank2>
4565inline
4566_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<double>, ArrayIterator<T_numtype2, N_rank2>,
4567    _bz_scalb<double,T_numtype2> > >
4568scalb(double d1, const Array<T_numtype2, N_rank2>& d2)
4569{
4570    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<double>, ArrayIterator<T_numtype2, N_rank2>,
4571    _bz_scalb<double,T_numtype2> >(_bz_ArrayExprConstant<double>(d1), d2.begin());
4572}
4573
4574template<class P_expr2>
4575inline
4576_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<double>, _bz_ArrayExpr<P_expr2>,
4577    _bz_scalb<double,typename P_expr2::T_numtype> > >
4578scalb(double d1, _bz_ArrayExpr<P_expr2> d2)
4579{
4580    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<double>, _bz_ArrayExpr<P_expr2>,
4581    _bz_scalb<double,typename P_expr2::T_numtype> >(_bz_ArrayExprConstant<double>(d1), d2);
4582}
4583
4584template<int N_index2>
4585inline
4586_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<double>, IndexPlaceholder<N_index2>,
4587    _bz_scalb<double,int> > >
4588scalb(double d1, IndexPlaceholder<N_index2> d2)
4589{
4590    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<double>, IndexPlaceholder<N_index2>,
4591    _bz_scalb<double,int> >(_bz_ArrayExprConstant<double>(d1), d2);
4592}
4593
4594template<class T_numtype2, int N_rank2>
4595inline
4596_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<long double>, ArrayIterator<T_numtype2, N_rank2>,
4597    _bz_scalb<long double,T_numtype2> > >
4598scalb(long double d1, const Array<T_numtype2, N_rank2>& d2)
4599{
4600    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<long double>, ArrayIterator<T_numtype2, N_rank2>,
4601    _bz_scalb<long double,T_numtype2> >(_bz_ArrayExprConstant<long double>(d1), d2.begin());
4602}
4603
4604template<class P_expr2>
4605inline
4606_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<long double>, _bz_ArrayExpr<P_expr2>,
4607    _bz_scalb<long double,typename P_expr2::T_numtype> > >
4608scalb(long double d1, _bz_ArrayExpr<P_expr2> d2)
4609{
4610    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<long double>, _bz_ArrayExpr<P_expr2>,
4611    _bz_scalb<long double,typename P_expr2::T_numtype> >(_bz_ArrayExprConstant<long double>(d1), d2);
4612}
4613
4614template<int N_index2>
4615inline
4616_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<long double>, IndexPlaceholder<N_index2>,
4617    _bz_scalb<long double,int> > >
4618scalb(long double d1, IndexPlaceholder<N_index2> d2)
4619{
4620    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<long double>, IndexPlaceholder<N_index2>,
4621    _bz_scalb<long double,int> >(_bz_ArrayExprConstant<long double>(d1), d2);
4622}
4623
4624#ifdef BZ_HAVE_COMPLEX
4625template<class T1, class T_numtype2, int N_rank2>
4626inline
4627_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<complex<T1> > , ArrayIterator<T_numtype2, N_rank2>,
4628    _bz_scalb<complex<T1> ,T_numtype2> > >
4629scalb(complex<T1> d1, const Array<T_numtype2, N_rank2>& d2)
4630{
4631    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<complex<T1> > , ArrayIterator<T_numtype2, N_rank2>,
4632    _bz_scalb<complex<T1> ,T_numtype2> >(_bz_ArrayExprConstant<complex<T1> > (d1), d2.begin());
4633}
4634
4635#endif // BZ_HAVE_COMPLEX
4636
4637#ifdef BZ_HAVE_COMPLEX
4638template<class T1, class P_expr2>
4639inline
4640_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<complex<T1> > , _bz_ArrayExpr<P_expr2>,
4641    _bz_scalb<complex<T1> ,typename P_expr2::T_numtype> > >
4642scalb(complex<T1> d1, _bz_ArrayExpr<P_expr2> d2)
4643{
4644    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<complex<T1> > , _bz_ArrayExpr<P_expr2>,
4645    _bz_scalb<complex<T1> ,typename P_expr2::T_numtype> >(_bz_ArrayExprConstant<complex<T1> > (d1), d2);
4646}
4647
4648#endif // BZ_HAVE_COMPLEX
4649
4650#ifdef BZ_HAVE_COMPLEX
4651template<class T1, int N_index2>
4652inline
4653_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<complex<T1> > , IndexPlaceholder<N_index2>,
4654    _bz_scalb<complex<T1> ,int> > >
4655scalb(complex<T1> d1, IndexPlaceholder<N_index2> d2)
4656{
4657    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<complex<T1> > , IndexPlaceholder<N_index2>,
4658    _bz_scalb<complex<T1> ,int> >(_bz_ArrayExprConstant<complex<T1> > (d1), d2);
4659}
4660
4661#endif // BZ_HAVE_COMPLEX
4662
4663#endif
4664
4665/****************************************************************************
4666 * sin
4667 ****************************************************************************/
4668
4669template<class T_numtype1, int N_rank1>
4670inline
4671_bz_ArrayExpr<_bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
4672    _bz_sin<T_numtype1> > >
4673sin(const Array<T_numtype1, N_rank1>& d1)
4674{
4675    return _bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
4676    _bz_sin<T_numtype1> >(d1.begin());
4677}
4678
4679template<class P_expr1>
4680inline
4681_bz_ArrayExpr<_bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
4682    _bz_sin<typename P_expr1::T_numtype> > >
4683sin(_bz_ArrayExpr<P_expr1> d1)
4684{
4685    return _bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
4686    _bz_sin<typename P_expr1::T_numtype> >(d1);
4687}
4688
4689template<int N_index1>
4690inline
4691_bz_ArrayExpr<_bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
4692    _bz_sin<int> > >
4693sin(IndexPlaceholder<N_index1> d1)
4694{
4695    return _bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
4696    _bz_sin<int> >(d1);
4697}
4698
4699
4700/****************************************************************************
4701 * sinh
4702 ****************************************************************************/
4703
4704template<class T_numtype1, int N_rank1>
4705inline
4706_bz_ArrayExpr<_bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
4707    _bz_sinh<T_numtype1> > >
4708sinh(const Array<T_numtype1, N_rank1>& d1)
4709{
4710    return _bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
4711    _bz_sinh<T_numtype1> >(d1.begin());
4712}
4713
4714template<class P_expr1>
4715inline
4716_bz_ArrayExpr<_bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
4717    _bz_sinh<typename P_expr1::T_numtype> > >
4718sinh(_bz_ArrayExpr<P_expr1> d1)
4719{
4720    return _bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
4721    _bz_sinh<typename P_expr1::T_numtype> >(d1);
4722}
4723
4724template<int N_index1>
4725inline
4726_bz_ArrayExpr<_bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
4727    _bz_sinh<int> > >
4728sinh(IndexPlaceholder<N_index1> d1)
4729{
4730    return _bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
4731    _bz_sinh<int> >(d1);
4732}
4733
4734
4735/****************************************************************************
4736 * sqr
4737 ****************************************************************************/
4738
4739template<class T_numtype1, int N_rank1>
4740inline
4741_bz_ArrayExpr<_bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
4742    _bz_sqr<T_numtype1> > >
4743sqr(const Array<T_numtype1, N_rank1>& d1)
4744{
4745    return _bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
4746    _bz_sqr<T_numtype1> >(d1.begin());
4747}
4748
4749template<class P_expr1>
4750inline
4751_bz_ArrayExpr<_bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
4752    _bz_sqr<typename P_expr1::T_numtype> > >
4753sqr(_bz_ArrayExpr<P_expr1> d1)
4754{
4755    return _bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
4756    _bz_sqr<typename P_expr1::T_numtype> >(d1);
4757}
4758
4759template<int N_index1>
4760inline
4761_bz_ArrayExpr<_bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
4762    _bz_sqr<int> > >
4763sqr(IndexPlaceholder<N_index1> d1)
4764{
4765    return _bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
4766    _bz_sqr<int> >(d1);
4767}
4768
4769
4770/****************************************************************************
4771 * sqrt
4772 ****************************************************************************/
4773
4774template<class T_numtype1, int N_rank1>
4775inline
4776_bz_ArrayExpr<_bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
4777    _bz_sqrt<T_numtype1> > >
4778sqrt(const Array<T_numtype1, N_rank1>& d1)
4779{
4780    return _bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
4781    _bz_sqrt<T_numtype1> >(d1.begin());
4782}
4783
4784template<class P_expr1>
4785inline
4786_bz_ArrayExpr<_bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
4787    _bz_sqrt<typename P_expr1::T_numtype> > >
4788sqrt(_bz_ArrayExpr<P_expr1> d1)
4789{
4790    return _bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
4791    _bz_sqrt<typename P_expr1::T_numtype> >(d1);
4792}
4793
4794template<int N_index1>
4795inline
4796_bz_ArrayExpr<_bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
4797    _bz_sqrt<int> > >
4798sqrt(IndexPlaceholder<N_index1> d1)
4799{
4800    return _bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
4801    _bz_sqrt<int> >(d1);
4802}
4803
4804
4805/****************************************************************************
4806 * tan
4807 ****************************************************************************/
4808
4809template<class T_numtype1, int N_rank1>
4810inline
4811_bz_ArrayExpr<_bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
4812    _bz_tan<T_numtype1> > >
4813tan(const Array<T_numtype1, N_rank1>& d1)
4814{
4815    return _bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
4816    _bz_tan<T_numtype1> >(d1.begin());
4817}
4818
4819template<class P_expr1>
4820inline
4821_bz_ArrayExpr<_bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
4822    _bz_tan<typename P_expr1::T_numtype> > >
4823tan(_bz_ArrayExpr<P_expr1> d1)
4824{
4825    return _bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
4826    _bz_tan<typename P_expr1::T_numtype> >(d1);
4827}
4828
4829template<int N_index1>
4830inline
4831_bz_ArrayExpr<_bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
4832    _bz_tan<int> > >
4833tan(IndexPlaceholder<N_index1> d1)
4834{
4835    return _bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
4836    _bz_tan<int> >(d1);
4837}
4838
4839
4840/****************************************************************************
4841 * tanh
4842 ****************************************************************************/
4843
4844template<class T_numtype1, int N_rank1>
4845inline
4846_bz_ArrayExpr<_bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
4847    _bz_tanh<T_numtype1> > >
4848tanh(const Array<T_numtype1, N_rank1>& d1)
4849{
4850    return _bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
4851    _bz_tanh<T_numtype1> >(d1.begin());
4852}
4853
4854template<class P_expr1>
4855inline
4856_bz_ArrayExpr<_bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
4857    _bz_tanh<typename P_expr1::T_numtype> > >
4858tanh(_bz_ArrayExpr<P_expr1> d1)
4859{
4860    return _bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
4861    _bz_tanh<typename P_expr1::T_numtype> >(d1);
4862}
4863
4864template<int N_index1>
4865inline
4866_bz_ArrayExpr<_bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
4867    _bz_tanh<int> > >
4868tanh(IndexPlaceholder<N_index1> d1)
4869{
4870    return _bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
4871    _bz_tanh<int> >(d1);
4872}
4873
4874
4875/****************************************************************************
4876 * uitrunc
4877 ****************************************************************************/
4878
4879#ifdef BZ_HAVE_SYSTEM_V_MATH
4880template<class T_numtype1, int N_rank1>
4881inline
4882_bz_ArrayExpr<_bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
4883    _bz_uitrunc<T_numtype1> > >
4884uitrunc(const Array<T_numtype1, N_rank1>& d1)
4885{
4886    return _bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
4887    _bz_uitrunc<T_numtype1> >(d1.begin());
4888}
4889
4890template<class P_expr1>
4891inline
4892_bz_ArrayExpr<_bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
4893    _bz_uitrunc<typename P_expr1::T_numtype> > >
4894uitrunc(_bz_ArrayExpr<P_expr1> d1)
4895{
4896    return _bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
4897    _bz_uitrunc<typename P_expr1::T_numtype> >(d1);
4898}
4899
4900template<int N_index1>
4901inline
4902_bz_ArrayExpr<_bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
4903    _bz_uitrunc<int> > >
4904uitrunc(IndexPlaceholder<N_index1> d1)
4905{
4906    return _bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
4907    _bz_uitrunc<int> >(d1);
4908}
4909
4910#endif
4911
4912/****************************************************************************
4913 * unordered
4914 ****************************************************************************/
4915
4916#ifdef BZ_HAVE_SYSTEM_V_MATH
4917template<class T_numtype1, int N_rank1, class T_numtype2, int N_rank2>
4918inline
4919_bz_ArrayExpr<_bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, ArrayIterator<T_numtype2, N_rank2>,
4920    _bz_unordered<T_numtype1,T_numtype2> > >
4921unordered(const Array<T_numtype1, N_rank1>& d1, const Array<T_numtype2, N_rank2>& d2)
4922{
4923    return _bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, ArrayIterator<T_numtype2, N_rank2>,
4924    _bz_unordered<T_numtype1,T_numtype2> >(d1.begin(), d2.begin());
4925}
4926
4927template<class T_numtype1, int N_rank1, class P_expr2>
4928inline
4929_bz_ArrayExpr<_bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExpr<P_expr2>,
4930    _bz_unordered<T_numtype1,typename P_expr2::T_numtype> > >
4931unordered(const Array<T_numtype1, N_rank1>& d1, _bz_ArrayExpr<P_expr2> d2)
4932{
4933    return _bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExpr<P_expr2>,
4934    _bz_unordered<T_numtype1,typename P_expr2::T_numtype> >(d1.begin(), d2);
4935}
4936
4937template<class T_numtype1, int N_rank1, int N_index2>
4938inline
4939_bz_ArrayExpr<_bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, IndexPlaceholder<N_index2>,
4940    _bz_unordered<T_numtype1,int> > >
4941unordered(const Array<T_numtype1, N_rank1>& d1, IndexPlaceholder<N_index2> d2)
4942{
4943    return _bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, IndexPlaceholder<N_index2>,
4944    _bz_unordered<T_numtype1,int> >(d1.begin(), d2);
4945}
4946
4947template<class T_numtype1, int N_rank1>
4948inline
4949_bz_ArrayExpr<_bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExprConstant<float>,
4950    _bz_unordered<T_numtype1,float> > >
4951unordered(const Array<T_numtype1, N_rank1>& d1, float d2)
4952{
4953    return _bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExprConstant<float>,
4954    _bz_unordered<T_numtype1,float> >(d1.begin(), _bz_ArrayExprConstant<float>(d2));
4955}
4956
4957template<class T_numtype1, int N_rank1>
4958inline
4959_bz_ArrayExpr<_bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExprConstant<double>,
4960    _bz_unordered<T_numtype1,double> > >
4961unordered(const Array<T_numtype1, N_rank1>& d1, double d2)
4962{
4963    return _bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExprConstant<double>,
4964    _bz_unordered<T_numtype1,double> >(d1.begin(), _bz_ArrayExprConstant<double>(d2));
4965}
4966
4967template<class T_numtype1, int N_rank1>
4968inline
4969_bz_ArrayExpr<_bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExprConstant<long double>,
4970    _bz_unordered<T_numtype1,long double> > >
4971unordered(const Array<T_numtype1, N_rank1>& d1, long double d2)
4972{
4973    return _bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExprConstant<long double>,
4974    _bz_unordered<T_numtype1,long double> >(d1.begin(), _bz_ArrayExprConstant<long double>(d2));
4975}
4976
4977#ifdef BZ_HAVE_COMPLEX
4978template<class T_numtype1, int N_rank1, class T2>
4979inline
4980_bz_ArrayExpr<_bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExprConstant<complex<T2> > ,
4981    _bz_unordered<T_numtype1,complex<T2> > > >
4982unordered(const Array<T_numtype1, N_rank1>& d1, complex<T2> d2)
4983{
4984    return _bz_ArrayExprBinaryOp<ArrayIterator<T_numtype1, N_rank1>, _bz_ArrayExprConstant<complex<T2> > ,
4985    _bz_unordered<T_numtype1,complex<T2> > >(d1.begin(), _bz_ArrayExprConstant<complex<T2> > (d2));
4986}
4987
4988#endif // BZ_HAVE_COMPLEX
4989
4990template<class P_expr1, class T_numtype2, int N_rank2>
4991inline
4992_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, ArrayIterator<T_numtype2, N_rank2>,
4993    _bz_unordered<typename P_expr1::T_numtype,T_numtype2> > >
4994unordered(_bz_ArrayExpr<P_expr1> d1, const Array<T_numtype2, N_rank2>& d2)
4995{
4996    return _bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, ArrayIterator<T_numtype2, N_rank2>,
4997    _bz_unordered<typename P_expr1::T_numtype,T_numtype2> >(d1, d2.begin());
4998}
4999
5000template<class P_expr1, class P_expr2>
5001inline
5002_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExpr<P_expr2>,
5003    _bz_unordered<typename P_expr1::T_numtype,typename P_expr2::T_numtype> > >
5004unordered(_bz_ArrayExpr<P_expr1> d1, _bz_ArrayExpr<P_expr2> d2)
5005{
5006    return _bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExpr<P_expr2>,
5007    _bz_unordered<typename P_expr1::T_numtype,typename P_expr2::T_numtype> >(d1, d2);
5008}
5009
5010template<class P_expr1, int N_index2>
5011inline
5012_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, IndexPlaceholder<N_index2>,
5013    _bz_unordered<typename P_expr1::T_numtype,int> > >
5014unordered(_bz_ArrayExpr<P_expr1> d1, IndexPlaceholder<N_index2> d2)
5015{
5016    return _bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, IndexPlaceholder<N_index2>,
5017    _bz_unordered<typename P_expr1::T_numtype,int> >(d1, d2);
5018}
5019
5020template<class P_expr1>
5021inline
5022_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExprConstant<float>,
5023    _bz_unordered<typename P_expr1::T_numtype,float> > >
5024unordered(_bz_ArrayExpr<P_expr1> d1, float d2)
5025{
5026    return _bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExprConstant<float>,
5027    _bz_unordered<typename P_expr1::T_numtype,float> >(d1, _bz_ArrayExprConstant<float>(d2));
5028}
5029
5030template<class P_expr1>
5031inline
5032_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExprConstant<double>,
5033    _bz_unordered<typename P_expr1::T_numtype,double> > >
5034unordered(_bz_ArrayExpr<P_expr1> d1, double d2)
5035{
5036    return _bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExprConstant<double>,
5037    _bz_unordered<typename P_expr1::T_numtype,double> >(d1, _bz_ArrayExprConstant<double>(d2));
5038}
5039
5040template<class P_expr1>
5041inline
5042_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExprConstant<long double>,
5043    _bz_unordered<typename P_expr1::T_numtype,long double> > >
5044unordered(_bz_ArrayExpr<P_expr1> d1, long double d2)
5045{
5046    return _bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExprConstant<long double>,
5047    _bz_unordered<typename P_expr1::T_numtype,long double> >(d1, _bz_ArrayExprConstant<long double>(d2));
5048}
5049
5050#ifdef BZ_HAVE_COMPLEX
5051template<class P_expr1, class T2>
5052inline
5053_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExprConstant<complex<T2> > ,
5054    _bz_unordered<typename P_expr1::T_numtype,complex<T2> > > >
5055unordered(_bz_ArrayExpr<P_expr1> d1, complex<T2> d2)
5056{
5057    return _bz_ArrayExprBinaryOp<_bz_ArrayExpr<P_expr1>, _bz_ArrayExprConstant<complex<T2> > ,
5058    _bz_unordered<typename P_expr1::T_numtype,complex<T2> > >(d1, _bz_ArrayExprConstant<complex<T2> > (d2));
5059}
5060
5061#endif // BZ_HAVE_COMPLEX
5062
5063template<int N_index1, class T_numtype2, int N_rank2>
5064inline
5065_bz_ArrayExpr<_bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, ArrayIterator<T_numtype2, N_rank2>,
5066    _bz_unordered<int,T_numtype2> > >
5067unordered(IndexPlaceholder<N_index1> d1, const Array<T_numtype2, N_rank2>& d2)
5068{
5069    return _bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, ArrayIterator<T_numtype2, N_rank2>,
5070    _bz_unordered<int,T_numtype2> >(d1, d2.begin());
5071}
5072
5073template<int N_index1, class P_expr2>
5074inline
5075_bz_ArrayExpr<_bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExpr<P_expr2>,
5076    _bz_unordered<int,typename P_expr2::T_numtype> > >
5077unordered(IndexPlaceholder<N_index1> d1, _bz_ArrayExpr<P_expr2> d2)
5078{
5079    return _bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExpr<P_expr2>,
5080    _bz_unordered<int,typename P_expr2::T_numtype> >(d1, d2);
5081}
5082
5083template<int N_index1, int N_index2>
5084inline
5085_bz_ArrayExpr<_bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, IndexPlaceholder<N_index2>,
5086    _bz_unordered<int,int> > >
5087unordered(IndexPlaceholder<N_index1> d1, IndexPlaceholder<N_index2> d2)
5088{
5089    return _bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, IndexPlaceholder<N_index2>,
5090    _bz_unordered<int,int> >(d1, d2);
5091}
5092
5093template<int N_index1>
5094inline
5095_bz_ArrayExpr<_bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExprConstant<float>,
5096    _bz_unordered<int,float> > >
5097unordered(IndexPlaceholder<N_index1> d1, float d2)
5098{
5099    return _bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExprConstant<float>,
5100    _bz_unordered<int,float> >(d1, _bz_ArrayExprConstant<float>(d2));
5101}
5102
5103template<int N_index1>
5104inline
5105_bz_ArrayExpr<_bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExprConstant<double>,
5106    _bz_unordered<int,double> > >
5107unordered(IndexPlaceholder<N_index1> d1, double d2)
5108{
5109    return _bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExprConstant<double>,
5110    _bz_unordered<int,double> >(d1, _bz_ArrayExprConstant<double>(d2));
5111}
5112
5113template<int N_index1>
5114inline
5115_bz_ArrayExpr<_bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExprConstant<long double>,
5116    _bz_unordered<int,long double> > >
5117unordered(IndexPlaceholder<N_index1> d1, long double d2)
5118{
5119    return _bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExprConstant<long double>,
5120    _bz_unordered<int,long double> >(d1, _bz_ArrayExprConstant<long double>(d2));
5121}
5122
5123#ifdef BZ_HAVE_COMPLEX
5124template<int N_index1, class T2>
5125inline
5126_bz_ArrayExpr<_bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExprConstant<complex<T2> > ,
5127    _bz_unordered<int,complex<T2> > > >
5128unordered(IndexPlaceholder<N_index1> d1, complex<T2> d2)
5129{
5130    return _bz_ArrayExprBinaryOp<IndexPlaceholder<N_index1>, _bz_ArrayExprConstant<complex<T2> > ,
5131    _bz_unordered<int,complex<T2> > >(d1, _bz_ArrayExprConstant<complex<T2> > (d2));
5132}
5133
5134#endif // BZ_HAVE_COMPLEX
5135
5136template<class T_numtype2, int N_rank2>
5137inline
5138_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<float>, ArrayIterator<T_numtype2, N_rank2>,
5139    _bz_unordered<float,T_numtype2> > >
5140unordered(float d1, const Array<T_numtype2, N_rank2>& d2)
5141{
5142    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<float>, ArrayIterator<T_numtype2, N_rank2>,
5143    _bz_unordered<float,T_numtype2> >(_bz_ArrayExprConstant<float>(d1), d2.begin());
5144}
5145
5146template<class P_expr2>
5147inline
5148_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<float>, _bz_ArrayExpr<P_expr2>,
5149    _bz_unordered<float,typename P_expr2::T_numtype> > >
5150unordered(float d1, _bz_ArrayExpr<P_expr2> d2)
5151{
5152    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<float>, _bz_ArrayExpr<P_expr2>,
5153    _bz_unordered<float,typename P_expr2::T_numtype> >(_bz_ArrayExprConstant<float>(d1), d2);
5154}
5155
5156template<int N_index2>
5157inline
5158_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<float>, IndexPlaceholder<N_index2>,
5159    _bz_unordered<float,int> > >
5160unordered(float d1, IndexPlaceholder<N_index2> d2)
5161{
5162    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<float>, IndexPlaceholder<N_index2>,
5163    _bz_unordered<float,int> >(_bz_ArrayExprConstant<float>(d1), d2);
5164}
5165
5166template<class T_numtype2, int N_rank2>
5167inline
5168_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<double>, ArrayIterator<T_numtype2, N_rank2>,
5169    _bz_unordered<double,T_numtype2> > >
5170unordered(double d1, const Array<T_numtype2, N_rank2>& d2)
5171{
5172    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<double>, ArrayIterator<T_numtype2, N_rank2>,
5173    _bz_unordered<double,T_numtype2> >(_bz_ArrayExprConstant<double>(d1), d2.begin());
5174}
5175
5176template<class P_expr2>
5177inline
5178_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<double>, _bz_ArrayExpr<P_expr2>,
5179    _bz_unordered<double,typename P_expr2::T_numtype> > >
5180unordered(double d1, _bz_ArrayExpr<P_expr2> d2)
5181{
5182    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<double>, _bz_ArrayExpr<P_expr2>,
5183    _bz_unordered<double,typename P_expr2::T_numtype> >(_bz_ArrayExprConstant<double>(d1), d2);
5184}
5185
5186template<int N_index2>
5187inline
5188_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<double>, IndexPlaceholder<N_index2>,
5189    _bz_unordered<double,int> > >
5190unordered(double d1, IndexPlaceholder<N_index2> d2)
5191{
5192    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<double>, IndexPlaceholder<N_index2>,
5193    _bz_unordered<double,int> >(_bz_ArrayExprConstant<double>(d1), d2);
5194}
5195
5196template<class T_numtype2, int N_rank2>
5197inline
5198_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<long double>, ArrayIterator<T_numtype2, N_rank2>,
5199    _bz_unordered<long double,T_numtype2> > >
5200unordered(long double d1, const Array<T_numtype2, N_rank2>& d2)
5201{
5202    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<long double>, ArrayIterator<T_numtype2, N_rank2>,
5203    _bz_unordered<long double,T_numtype2> >(_bz_ArrayExprConstant<long double>(d1), d2.begin());
5204}
5205
5206template<class P_expr2>
5207inline
5208_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<long double>, _bz_ArrayExpr<P_expr2>,
5209    _bz_unordered<long double,typename P_expr2::T_numtype> > >
5210unordered(long double d1, _bz_ArrayExpr<P_expr2> d2)
5211{
5212    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<long double>, _bz_ArrayExpr<P_expr2>,
5213    _bz_unordered<long double,typename P_expr2::T_numtype> >(_bz_ArrayExprConstant<long double>(d1), d2);
5214}
5215
5216template<int N_index2>
5217inline
5218_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<long double>, IndexPlaceholder<N_index2>,
5219    _bz_unordered<long double,int> > >
5220unordered(long double d1, IndexPlaceholder<N_index2> d2)
5221{
5222    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<long double>, IndexPlaceholder<N_index2>,
5223    _bz_unordered<long double,int> >(_bz_ArrayExprConstant<long double>(d1), d2);
5224}
5225
5226#ifdef BZ_HAVE_COMPLEX
5227template<class T1, class T_numtype2, int N_rank2>
5228inline
5229_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<complex<T1> > , ArrayIterator<T_numtype2, N_rank2>,
5230    _bz_unordered<complex<T1> ,T_numtype2> > >
5231unordered(complex<T1> d1, const Array<T_numtype2, N_rank2>& d2)
5232{
5233    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<complex<T1> > , ArrayIterator<T_numtype2, N_rank2>,
5234    _bz_unordered<complex<T1> ,T_numtype2> >(_bz_ArrayExprConstant<complex<T1> > (d1), d2.begin());
5235}
5236
5237#endif // BZ_HAVE_COMPLEX
5238
5239#ifdef BZ_HAVE_COMPLEX
5240template<class T1, class P_expr2>
5241inline
5242_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<complex<T1> > , _bz_ArrayExpr<P_expr2>,
5243    _bz_unordered<complex<T1> ,typename P_expr2::T_numtype> > >
5244unordered(complex<T1> d1, _bz_ArrayExpr<P_expr2> d2)
5245{
5246    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<complex<T1> > , _bz_ArrayExpr<P_expr2>,
5247    _bz_unordered<complex<T1> ,typename P_expr2::T_numtype> >(_bz_ArrayExprConstant<complex<T1> > (d1), d2);
5248}
5249
5250#endif // BZ_HAVE_COMPLEX
5251
5252#ifdef BZ_HAVE_COMPLEX
5253template<class T1, int N_index2>
5254inline
5255_bz_ArrayExpr<_bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<complex<T1> > , IndexPlaceholder<N_index2>,
5256    _bz_unordered<complex<T1> ,int> > >
5257unordered(complex<T1> d1, IndexPlaceholder<N_index2> d2)
5258{
5259    return _bz_ArrayExprBinaryOp<_bz_ArrayExprConstant<complex<T1> > , IndexPlaceholder<N_index2>,
5260    _bz_unordered<complex<T1> ,int> >(_bz_ArrayExprConstant<complex<T1> > (d1), d2);
5261}
5262
5263#endif // BZ_HAVE_COMPLEX
5264
5265#endif
5266
5267/****************************************************************************
5268 * y0
5269 ****************************************************************************/
5270
5271#ifdef BZ_HAVE_IEEE_MATH
5272template<class T_numtype1, int N_rank1>
5273inline
5274_bz_ArrayExpr<_bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
5275    _bz_y0<T_numtype1> > >
5276y0(const Array<T_numtype1, N_rank1>& d1)
5277{
5278    return _bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
5279    _bz_y0<T_numtype1> >(d1.begin());
5280}
5281
5282template<class P_expr1>
5283inline
5284_bz_ArrayExpr<_bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
5285    _bz_y0<typename P_expr1::T_numtype> > >
5286y0(_bz_ArrayExpr<P_expr1> d1)
5287{
5288    return _bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
5289    _bz_y0<typename P_expr1::T_numtype> >(d1);
5290}
5291
5292template<int N_index1>
5293inline
5294_bz_ArrayExpr<_bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
5295    _bz_y0<int> > >
5296y0(IndexPlaceholder<N_index1> d1)
5297{
5298    return _bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
5299    _bz_y0<int> >(d1);
5300}
5301
5302#endif
5303
5304/****************************************************************************
5305 * y1
5306 ****************************************************************************/
5307
5308#ifdef BZ_HAVE_IEEE_MATH
5309template<class T_numtype1, int N_rank1>
5310inline
5311_bz_ArrayExpr<_bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
5312    _bz_y1<T_numtype1> > >
5313y1(const Array<T_numtype1, N_rank1>& d1)
5314{
5315    return _bz_ArrayExprUnaryOp<ArrayIterator<T_numtype1, N_rank1>,
5316    _bz_y1<T_numtype1> >(d1.begin());
5317}
5318
5319template<class P_expr1>
5320inline
5321_bz_ArrayExpr<_bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
5322    _bz_y1<typename P_expr1::T_numtype> > >
5323y1(_bz_ArrayExpr<P_expr1> d1)
5324{
5325    return _bz_ArrayExprUnaryOp<_bz_ArrayExpr<P_expr1>,
5326    _bz_y1<typename P_expr1::T_numtype> >(d1);
5327}
5328
5329template<int N_index1>
5330inline
5331_bz_ArrayExpr<_bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
5332    _bz_y1<int> > >
5333y1(IndexPlaceholder<N_index1> d1)
5334{
5335    return _bz_ArrayExprUnaryOp<IndexPlaceholder<N_index1>,
5336    _bz_y1<int> >(d1);
5337}
5338
5339#endif
5340
5341BZ_NAMESPACE_END
5342
5343#endif
Note: See TracBrowser for help on using the repository browser.