source: XIOS/dev/dev_olga/src/extern/blitz/include/blitz/array/newet-macros.h @ 1022

Last change on this file since 1022 was 1022, checked in by mhnguyen, 7 years ago
File size: 24.4 KB
Line 
1// -*- C++ -*-
2/***************************************************************************
3 * blitz/array/newet-macros.h  Macros for new e.t. implementation
4 *
5 * $Id$
6 *
7 * Copyright (C) 1997-2011 Todd Veldhuizen <tveldhui@acm.org>
8 *
9 * This file is a part of Blitz.
10 *
11 * Blitz is free software: you can redistribute it and/or modify
12 * it under the terms of the GNU Lesser General Public License
13 * as published by the Free Software Foundation, either version 3
14 * of the License, or (at your option) any later version.
15 *
16 * Blitz is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19 * GNU Lesser General Public License for more details.
20 *
21 * You should have received a copy of the GNU Lesser General Public
22 * License along with Blitz.  If not, see <http://www.gnu.org/licenses/>.
23 *
24 * Suggestions:          blitz-devel@lists.sourceforge.net
25 * Bugs:                 blitz-support@lists.sourceforge.net   
26 *
27 * For more information, please see the Blitz++ Home Page:
28 *    https://sourceforge.net/projects/blitz/
29 *
30 ****************************************************************************/
31#ifndef BZ_NEWET_MACROS_H
32#define BZ_NEWET_MACROS_H
33
34#include <blitz/array/asexpr.h>
35
36BZ_NAMESPACE(blitz)
37
38#ifdef BZ_HAVE_TEMPLATES_AS_TEMPLATE_ARGUMENTS
39
40/*
41 * Unary functions and operators
42 */
43
44#define BZ_DECLARE_ARRAY_ET_UNARY(name,functor)                            \
45                                                                           \
46template <typename T1>                                                     \
47_bz_inline_et                                                              \
48typename BZ_BLITZ_SCOPE(BzUnaryExprResult)<functor,T1>::T_result           \
49name(const BZ_BLITZ_SCOPE(ETBase)<T1>& d1)                                 \
50{                                                                       \
51    typedef typename                                                       \
52        BZ_BLITZ_SCOPE(BzUnaryExprResult)<functor,T1>::T_result result;    \
53    return result(BZ_BLITZ_SCOPE(asExpr)<T1>::getExpr(d1.unwrap()));       \
54}
55
56/*
57 * Array expression templates: the macro BZ_DECLARE_ARRAY_ET_BINARY(X,Y)
58 * declares a function or operator which takes two operands.
59 * X is the function name (or operator), and Y is the functor object
60 * which implements the operation.
61 */
62
63#define BZ_DECLARE_ARRAY_ET_BINARY(name, applic)                           \
64                                                                           \
65template <typename T1,typename T2>                                         \
66_bz_inline_et                                                              \
67typename BZ_BLITZ_SCOPE(BzBinaryExprResult)<applic,T1,T2>::T_result        \
68name(const BZ_BLITZ_SCOPE(ETBase)<T1>& d1,                                 \
69     const BZ_BLITZ_SCOPE(ETBase)<T2>& d2)                                 \
70{                                                                          \
71    typedef typename                                                       \
72        BZ_BLITZ_SCOPE(BzBinaryExprResult)<applic,T1,T2>::T_result result; \
73    return result(BZ_BLITZ_SCOPE(asExpr)<T1>::getExpr(d1.unwrap()),        \
74                  BZ_BLITZ_SCOPE(asExpr)<T2>::getExpr(d2.unwrap()));       \
75}
76
77#define BZ_DECLARE_ARRAY_ET_BINARY_TINYVEC(name, applic)                   \
78                                                                           \
79template <typename T1, typename T2, int N>                                 \
80_bz_inline_et                                                              \
81typename BZ_BLITZ_SCOPE(BzBinaryExprResult)<applic,                        \
82    BZ_BLITZ_SCOPE(TinyVector)<T2,N>,T1>::T_result                         \
83name(const BZ_BLITZ_SCOPE(TinyVector)<T2,N> d1,                            \
84     const BZ_BLITZ_SCOPE(ETBase)<T1>& d2)                                 \
85{                                                                          \
86    typedef typename                                                       \
87        BZ_BLITZ_SCOPE(BzBinaryExprResult)<applic,                         \
88        BZ_BLITZ_SCOPE(TinyVector)<T2,N>,T1>::T_result result;             \
89    return result(BZ_BLITZ_SCOPE(asExpr)<                                  \
90                  BZ_BLITZ_SCOPE(TinyVector)<T2,N> >::getExpr(d1),         \
91                  BZ_BLITZ_SCOPE(asExpr)<T1>::getExpr(d2.unwrap()));       \
92}                                                                          \
93                                                                           \
94template <typename T1, typename T2, int N>                                 \
95_bz_inline_et                                                              \
96typename BZ_BLITZ_SCOPE(BzBinaryExprResult)<applic,T1,                     \
97    BZ_BLITZ_SCOPE(TinyVector)<T2,N> >::T_result                           \
98name(const BZ_BLITZ_SCOPE(ETBase)<T1>& d1,                                 \
99     const BZ_BLITZ_SCOPE(TinyVector)<T2,N> d2)                            \
100{                                                                          \
101    typedef typename                                                       \
102        BZ_BLITZ_SCOPE(BzBinaryExprResult)<applic,T1,                      \
103        BZ_BLITZ_SCOPE(TinyVector)<T2,N> >::T_result result;               \
104    return result(BZ_BLITZ_SCOPE(asExpr)<T1>::getExpr(d1.unwrap()),        \
105                  BZ_BLITZ_SCOPE(asExpr)<                                  \
106                  BZ_BLITZ_SCOPE(TinyVector)<T2,N> >::getExpr(d2));        \
107}
108
109#define BZ_DECLARE_ARRAY_ET_BINARY_SCALAR(name, applic, sca)               \
110                                                                           \
111template<typename T>                                                       \
112_bz_inline_et                                                              \
113typename BZ_BLITZ_SCOPE(BzBinaryExprResult)<applic,sca,T>::T_result        \
114name(const sca d1, const BZ_BLITZ_SCOPE(ETBase)<T>& d2)                    \
115{                                                                          \
116    typedef typename                                                       \
117        BZ_BLITZ_SCOPE(BzBinaryExprResult)<applic,sca,T>::T_result result; \
118    return result(BZ_BLITZ_SCOPE(asExpr)<sca >::getExpr(d1),               \
119                  BZ_BLITZ_SCOPE(asExpr)<T>::getExpr(d2.unwrap()));        \
120}                                                                          \
121                                                                           \
122template<typename T>                                                       \
123_bz_inline_et                                                              \
124typename BZ_BLITZ_SCOPE(BzBinaryExprResult)<applic,T,sca >::T_result       \
125name(const BZ_BLITZ_SCOPE(ETBase)<T>& d1, const sca d2)                    \
126{                                                                          \
127    typedef typename                                                       \
128        BZ_BLITZ_SCOPE(BzBinaryExprResult)<applic,T,sca >::T_result result;\
129    return result(BZ_BLITZ_SCOPE(asExpr)<T>::getExpr(d1.unwrap()),         \
130                  BZ_BLITZ_SCOPE(asExpr)<sca >::getExpr(d2));              \
131}
132
133/*
134 * Array expression templates: the macro BZ_DECLARE_ARRAY_ET_TERNARY(X,Y)
135 * declares a function or operator which takes three operands.
136 * X is the function name (or operator), and Y is the functor object
137 * which implements the operation.
138 */
139
140#define BZ_DECLARE_ARRAY_ET_TERNARY(name, applic)                          \
141                                                                           \
142template <typename T1, typename T2, typename T3>                           \
143_bz_inline_et                                                              \
144typename BZ_BLITZ_SCOPE(BzTernaryExprResult)<applic, T1, T2, T3>::T_result \
145name(const BZ_BLITZ_SCOPE(ETBase)<T1>& d1,                                 \
146     const BZ_BLITZ_SCOPE(ETBase)<T2>& d2,                                 \
147     const BZ_BLITZ_SCOPE(ETBase)<T3>& d3)                                 \
148{                                                                          \
149    typedef typename                                                       \
150        BZ_BLITZ_SCOPE(BzTernaryExprResult)<applic,T1,T2,T3>::T_result     \
151        result;                                                            \
152    return result(BZ_BLITZ_SCOPE(asExpr)<T1>::getExpr(d1.unwrap()),        \
153                  BZ_BLITZ_SCOPE(asExpr)<T2>::getExpr(d2.unwrap()),        \
154                  BZ_BLITZ_SCOPE(asExpr)<T3>::getExpr(d3.unwrap()));       \
155}
156
157
158/*
159 * Array expression templates: the macro BZ_DECLARE_ARRAY_ET_QUATERNARY(X,Y)
160 * declares a function or operator which takes four operands.
161 * X is the function name (or operator), and Y is the functor object
162 * which implements the operation.
163 */
164
165#define BZ_DECLARE_ARRAY_ET_QUATERNARY(name, applic)                    \
166                                                                        \
167  template <typename T1, typename T2, typename T3, typename T4>         \
168  _bz_inline_et                                                         \
169  typename BZ_BLITZ_SCOPE(BzQuaternaryExprResult)<applic, T1, T2, T3, T4>::T_result \
170    name(const BZ_BLITZ_SCOPE(ETBase)<T1>& d1,                          \
171     const BZ_BLITZ_SCOPE(ETBase)<T2>& d2,                              \
172     const BZ_BLITZ_SCOPE(ETBase)<T3>& d3,                              \
173     const BZ_BLITZ_SCOPE(ETBase)<T4>& d4)                              \
174  {                                                                     \
175  typedef typename                                                      \
176      BZ_BLITZ_SCOPE(BzQuaternaryExprResult)<applic,T1,T2,T3, T4>::T_result \
177      result;                                                           \
178    return result(BZ_BLITZ_SCOPE(asExpr)<T1>::getExpr(d1.unwrap()),     \
179                  BZ_BLITZ_SCOPE(asExpr)<T2>::getExpr(d2.unwrap()),     \
180                  BZ_BLITZ_SCOPE(asExpr)<T3>::getExpr(d3.unwrap()),     \
181                  BZ_BLITZ_SCOPE(asExpr)<T4>::getExpr(d4.unwrap()));    \
182}
183   
184
185 
186#else /* !BZ_HAVE_TEMPLATES_AS_TEMPLATE_ARGUMENTS */
187
188/*
189 * Unary functions and operators
190 */
191
192#define BZ_DECLARE_ARRAY_ET_UNARY(name, functor)                           \
193                                                                           \
194template<typename T1>                                                      \
195_bz_inline_et                                                              \
196BZ_BLITZ_SCOPE(_bz_ArrayExpr)<BZ_BLITZ_SCOPE(_bz_ArrayExprUnaryOp)<        \
197    _bz_typename BZ_BLITZ_SCOPE(asExpr)<T1>::T_expr,                       \
198    functor<_bz_typename BZ_BLITZ_SCOPE(asExpr)<T1>::T_expr::T_numtype> > >\
199name(const BZ_BLITZ_SCOPE(ETBase)<T1>& d1)                                 \
200{                                                                          \
201    return BZ_BLITZ_SCOPE(_bz_ArrayExpr)<                                  \
202        BZ_BLITZ_SCOPE(_bz_ArrayExprUnaryOp)<                              \
203        _bz_typename BZ_BLITZ_SCOPE(asExpr)<T1>::T_expr,                   \
204        functor<_bz_typename                                               \
205        BZ_BLITZ_SCOPE(asExpr)<T1>::T_expr::T_numtype> > >(                \
206        BZ_BLITZ_SCOPE(asExpr)<T1>::getExpr(d1.unwrap()));                 \
207}
208
209/*
210 * Array expression templates: the macro BZ_DECLARE_ARRAY_ET_BINARY(X,Y)
211 * declares a function or operator which takes two operands.
212 * X is the function name (or operator), and Y is the functor object
213 * which implements the operation.
214 */
215
216#define BZ_DECLARE_ARRAY_ET_BINARY(name, applic)                           \
217                                                                           \
218template<typename T1, typename T2>                                         \
219_bz_inline_et                                                              \
220BZ_BLITZ_SCOPE(_bz_ArrayExpr)<BZ_BLITZ_SCOPE(_bz_ArrayExprBinaryOp)<       \
221    _bz_typename BZ_BLITZ_SCOPE(asExpr)<T1>::T_expr,                       \
222    _bz_typename BZ_BLITZ_SCOPE(asExpr)<T2>::T_expr,                       \
223    applic<_bz_typename BZ_BLITZ_SCOPE(asExpr)<T1>::T_expr::T_numtype,     \
224    _bz_typename BZ_BLITZ_SCOPE(asExpr)<T2>::T_expr::T_numtype> > >        \
225name(const BZ_BLITZ_SCOPE(ETBase)<T1>& d1,                                 \
226     const BZ_BLITZ_SCOPE(ETBase)<T2>& d2)                                 \
227{                                                                          \
228    return BZ_BLITZ_SCOPE(_bz_ArrayExpr)<                                  \
229        BZ_BLITZ_SCOPE(_bz_ArrayExprBinaryOp)<                             \
230        _bz_typename BZ_BLITZ_SCOPE(asExpr)<T1>::T_expr,                   \
231        _bz_typename BZ_BLITZ_SCOPE(asExpr)<T2>::T_expr,                   \
232        applic<_bz_typename BZ_BLITZ_SCOPE(asExpr)<T1>::T_expr::T_numtype, \
233        _bz_typename BZ_BLITZ_SCOPE(asExpr)<T2>::T_expr::T_numtype> > >(   \
234        BZ_BLITZ_SCOPE(asExpr)<T1>::getExpr(d1.unwrap()),                  \
235        BZ_BLITZ_SCOPE(asExpr)<T2>::getExpr(d2.unwrap()));                 \
236}
237
238#define BZ_DECLARE_ARRAY_ET_BINARY_TINYVEC(name, applic)                   \
239                                                                           \
240template <typename T1, typename T2, int N>                                 \
241_bz_inline_et                                                              \
242BZ_BLITZ_SCOPE(_bz_ArrayExprBinaryOp)<                                     \
243    _bz_typename BZ_BLITZ_SCOPE(asExpr)<                                   \
244    BZ_BLITZ_SCOPE(TinyVector)<T2,N> >::T_expr,                            \
245    _bz_typename BZ_BLITZ_SCOPE(asExpr)<T1>::T_expr,                       \
246    applic<BZ_BLITZ_SCOPE(TinyVector)<T2,N>,                               \
247    _bz_typename BZ_BLITZ_SCOPE(asExpr)<T1>::T_expr::T_numtype> >          \
248name(const BZ_BLITZ_SCOPE(TinyVector)<T2,N> d1,                            \
249     const BZ_BLITZ_SCOPE(ETBase)<T1>& d2)                                 \
250{                                                                          \
251    return BZ_BLITZ_SCOPE(_bz_ArrayExprBinaryOp)<                          \
252        _bz_typename BZ_BLITZ_SCOPE(asExpr)<                               \
253        BZ_BLITZ_SCOPE(TinyVector)<T2,N> >::T_expr,                        \
254        _bz_typename BZ_BLITZ_SCOPE(asExpr)<T1>::T_expr,                   \
255        applic<BZ_BLITZ_SCOPE(TinyVector)<T2,N>,                           \
256        _bz_typename BZ_BLITZ_SCOPE(asExpr)<T1>::T_expr::T_numtype> >(     \
257        BZ_BLITZ_SCOPE(asExpr)<                                            \
258        BZ_BLITZ_SCOPE(TinyVector)<T2,N> >::getExpr(d1),                   \
259        BZ_BLITZ_SCOPE(asExpr)<T1>::getExpr(d2.unwrap()));                 \
260}                                                                          \
261                                                                           \
262template <typename T1, typename T2, int N>                                 \
263_bz_inline_et                                                              \
264BZ_BLITZ_SCOPE(_bz_ArrayExprBinaryOp)<                                     \
265    _bz_typename BZ_BLITZ_SCOPE(asExpr)<T1>::T_expr,                       \
266    _bz_typename BZ_BLITZ_SCOPE(asExpr)<                                   \
267    BZ_BLITZ_SCOPE(TinyVector)<T2,N> >::T_expr,                            \
268    applic<_bz_typename BZ_BLITZ_SCOPE(asExpr)<T1>::T_expr::T_numtype,     \
269    BZ_BLITZ_SCOPE(TinyVector)<T2,N> > >                                   \
270name(const BZ_BLITZ_SCOPE(ETBase)<T1>& d1,                                 \
271     const BZ_BLITZ_SCOPE(TinyVector)<T2,N> d2)                            \
272{                                                                          \
273    return BZ_BLITZ_SCOPE(_bz_ArrayExprBinaryOp)<                          \
274        _bz_typename BZ_BLITZ_SCOPE(asExpr)<T1>::T_expr,                   \
275        _bz_typename BZ_BLITZ_SCOPE(asExpr)<                               \
276        BZ_BLITZ_SCOPE(TinyVector)<T2,N> >::T_expr,                        \
277        applic<_bz_typename BZ_BLITZ_SCOPE(asExpr)<T1>::T_expr::T_numtype, \
278        BZ_BLITZ_SCOPE(TinyVector)<T2,N> > >(                              \
279        BZ_BLITZ_SCOPE(asExpr)<T1>::getExpr(d1.unwrap()),                  \
280        BZ_BLITZ_SCOPE(asExpr)<                                            \
281        BZ_BLITZ_SCOPE(TinyVector)<T2,N> >::getExpr(d2));                  \
282}
283
284#define BZ_DECLARE_ARRAY_ET_BINARY_SCALAR(name, applic, sca)               \
285                                                                           \
286template<typename T>                                                       \
287_bz_inline_et                                                              \
288BZ_BLITZ_SCOPE(_bz_ArrayExprBinaryOp)<                                     \
289    BZ_BLITZ_SCOPE(asExpr)<sca >::T_expr,                                  \
290    _bz_typename BZ_BLITZ_SCOPE(asExpr)<T>::T_expr,                        \
291    applic<sca,_bz_typename BZ_BLITZ_SCOPE(asExpr)<T>::T_expr::T_numtype> >\
292name(const sca d1, const BZ_BLITZ_SCOPE(ETBase)<T>& d2)                    \
293{                                                                          \
294    return BZ_BLITZ_SCOPE(_bz_ArrayExprBinaryOp)<                          \
295        BZ_BLITZ_SCOPE(asExpr)<sca >::T_expr,                              \
296        _bz_typename BZ_BLITZ_SCOPE(asExpr)<T>::T_expr,                    \
297        applic<sca,                                                        \
298        _bz_typename BZ_BLITZ_SCOPE(asExpr)<T>::T_expr::T_numtype> >(      \
299        BZ_BLITZ_SCOPE(asExpr)<sca >::getExpr(d1),                         \
300        BZ_BLITZ_SCOPE(asExpr)<T>::getExpr(d2.unwrap()));                  \
301}                                                                          \
302                                                                           \
303template<typename T>                                                       \
304_bz_inline_et                                                              \
305BZ_BLITZ_SCOPE(_bz_ArrayExprBinaryOp)<                                     \
306    _bz_typename BZ_BLITZ_SCOPE(asExpr)<T>::T_expr,                        \
307    BZ_BLITZ_SCOPE(asExpr)<sca >::T_expr,                                  \
308    applic<_bz_typename BZ_BLITZ_SCOPE(asExpr)<T>::T_expr::T_numtype,      \
309           sca > >                                                         \
310name(const BZ_BLITZ_SCOPE(ETBase)<T>& d1, const sca d2)                    \
311{                                                                          \
312    return BZ_BLITZ_SCOPE(_bz_ArrayExprBinaryOp)<                          \
313        _bz_typename BZ_BLITZ_SCOPE(asExpr)<T>::T_expr,                    \
314        BZ_BLITZ_SCOPE(asExpr)<sca >::T_expr,                              \
315        applic<_bz_typename BZ_BLITZ_SCOPE(asExpr)<T>::T_expr::T_numtype,  \
316               sca > >(                                                    \
317        BZ_BLITZ_SCOPE(asExpr)<T>::getExpr(d1.unwrap()),                   \
318        BZ_BLITZ_SCOPE(asExpr)<sca >::getExpr(d2));                        \
319}
320
321/*
322 * Array expression templates: the macro BZ_DECLARE_ARRAY_ET_TERNARY(X,Y)
323 * declares a function or operator which takes three operands.
324 * X is the function name (or operator), and Y is the functor object
325 * which implements the operation.
326 */
327
328#define BZ_DECLARE_ARRAY_ET_TERNARY(name, applic)                          \
329                                                                           \
330template<typename T1, typename T2, typename T3>                            \
331_bz_inline_et                                                              \
332BZ_BLITZ_SCOPE(_bz_ArrayExpr)<BZ_BLITZ_SCOPE(_bz_ArrayExprTernaryOp)<      \
333    _bz_typename BZ_BLITZ_SCOPE(asExpr)<T1>::T_expr,                       \
334    _bz_typename BZ_BLITZ_SCOPE(asExpr)<T2>::T_expr,                       \
335    _bz_typename BZ_BLITZ_SCOPE(asExpr)<T3>::T_expr,                       \
336    applic<_bz_typename BZ_BLITZ_SCOPE(asExpr)<T1>::T_expr::T_numtype,     \
337           _bz_typename BZ_BLITZ_SCOPE(asExpr)<T2>::T_expr::T_numtype,     \
338           _bz_typename BZ_BLITZ_SCOPE(asExpr)<T3>::T_expr::T_numtype> > > \
339name(const BZ_BLITZ_SCOPE(ETBase)<T1>& d1,                                 \
340     const BZ_BLITZ_SCOPE(ETBase)<T2>& d2,                                 \
341     const BZ_BLITZ_SCOPE(ETBase)<T3>& d3)                                 \
342{                                                                          \
343    return BZ_BLITZ_SCOPE(_bz_ArrayExpr)<                                  \
344        BZ_BLITZ_SCOPE(_bz_ArrayExprTernaryOp)<                            \
345        _bz_typename BZ_BLITZ_SCOPE(asExpr)<T1>::T_expr,                   \
346        _bz_typename BZ_BLITZ_SCOPE(asExpr)<T2>::T_expr,                   \
347        _bz_typename BZ_BLITZ_SCOPE(asExpr)<T3>::T_expr,                   \
348        applic<_bz_typename BZ_BLITZ_SCOPE(asExpr)<T1>::T_expr::T_numtype, \
349        _bz_typename BZ_BLITZ_SCOPE(asExpr)<T2>::T_expr::T_numtype,        \
350        _bz_typename BZ_BLITZ_SCOPE(asExpr)<T3>::T_expr::T_numtype> > >(   \
351        BZ_BLITZ_SCOPE(asExpr)<T1>::getExpr(d1.unwrap()),                  \
352        BZ_BLITZ_SCOPE(asExpr)<T2>::getExpr(d2.unwrap()),                  \
353        BZ_BLITZ_SCOPE(asExpr)<T3>::getExpr(d3.unwrap()));                 \
354}
355
356
357/*
358 * Array expression templates: the macro BZ_DECLARE_ARRAY_ET_BINARY(X,Y)
359 * declares a function or operator which takes two operands.
360 * X is the function name (or operator), and Y is the functor object
361 * which implements the operation.
362 */
363
364#define BZ_DECLARE_ARRAY_ET_QUATERNARY(name, functor)                   \
365                                                                        \
366  template<typename T1, typename T2, typename T3,typename T4>           \
367  _bz_inline_et                                                         \
368  BZ_BLITZ_SCOPE(_bz_ArrayExpr)                                         \
369    <                                                                   \
370    BZ_BLITZ_SCOPE(_bz_ArrayExprQuaternaryOp)                           \
371    <                                                                   \
372    _bz_typename BZ_BLITZ_SCOPE(asExpr)<T1>::T_expr,                    \
373    _bz_typename BZ_BLITZ_SCOPE(asExpr)<T2>::T_expr,                    \
374    _bz_typename BZ_BLITZ_SCOPE(asExpr)<T3>::T_expr,                    \
375    _bz_typename BZ_BLITZ_SCOPE(asExpr)<T4>::T_expr,                    \
376    functor<                                                            \
377    _bz_typename BZ_BLITZ_SCOPE(asExpr)<T1>::T_expr::T_numtype,         \
378    _bz_typename BZ_BLITZ_SCOPE(asExpr)<T2>::T_expr::T_numtype,         \
379    _bz_typename BZ_BLITZ_SCOPE(asExpr)<T3>::T_expr::T_numtype,         \
380    _bz_typename BZ_BLITZ_SCOPE(asExpr)<T4>::T_expr::T_numtype          \
381    > > >                                                               \
382                                                                        \
383    name(const BZ_BLITZ_SCOPE(ETBase)<T1>& d1,                          \
384         const BZ_BLITZ_SCOPE(ETBase)<T2>& d2,                          \
385         const BZ_BLITZ_SCOPE(ETBase)<T3>& d3,                          \
386         const BZ_BLITZ_SCOPE(ETBase)<T4>& d4)                          \
387  {                                                                     \
388    return BZ_BLITZ_SCOPE(_bz_ArrayExpr)                                \
389      <                                                                 \
390      BZ_BLITZ_SCOPE(_bz_ArrayExprBinaryOp)                             \
391      <                                                                 \
392      _bz_typename BZ_BLITZ_SCOPE(asExpr)<T1>::T_expr,                  \
393      _bz_typename BZ_BLITZ_SCOPE(asExpr)<T2>::T_expr,                  \
394      functor                                                           \
395      <                                                                 \
396      _bz_typename BZ_BLITZ_SCOPE(asExpr)<T1>::T_expr::T_numtype,       \
397      _bz_typename BZ_BLITZ_SCOPE(asExpr)<T2>::T_expr::T_numtype,       \
398      _bz_typename BZ_BLITZ_SCOPE(asExpr)<T3>::T_expr::T_numtype,       \
399      _bz_typename BZ_BLITZ_SCOPE(asExpr)<T4>::T_expr::T_numtype        \
400      > > >                                                             \
401      (                                                                 \
402       BZ_BLITZ_SCOPE(asExpr)<T1>::getExpr(d1.unwrap()),                \
403       BZ_BLITZ_SCOPE(asExpr)<T2>::getExpr(d2.unwrap()),                \
404       BZ_BLITZ_SCOPE(asExpr)<T2>::getExpr(d3.unwrap()),                \
405       BZ_BLITZ_SCOPE(asExpr)<T2>::getExpr(d4.unwrap()));               \
406}
407
408
409#endif /* BZ_HAVE_TEMPLATES_AS_TEMPLATE_ARGUMENTS */
410
411/*
412 * User-defined expression template routines
413 */
414
415#define BZ_DECLARE_FUNCTION(name)                                          \
416BZ_DEFINE_UNARY_FUNC(name ## _impl,name,true)                           \
417BZ_DECLARE_ARRAY_ET_UNARY(name,name ## _impl)
418
419#define BZ_DECLARE_FUNCTION_RET(name,return_type)                          \
420BZ_DEFINE_UNARY_FUNC_RET(name ## _impl,name,return_type)                   \
421BZ_DECLARE_ARRAY_ET_UNARY(name,name ## _impl)
422
423#define BZ_DECLARE_FUNCTION2(name)                                         \
424BZ_DEFINE_BINARY_FUNC(name ## _impl,name)                                  \
425BZ_DECLARE_ARRAY_ET_BINARY(name, name ## _impl)
426
427#define BZ_DECLARE_FUNCTION2_RET(name,return_type)                         \
428BZ_DEFINE_BINARY_FUNC_RET(name ## _impl,name,return_type)                  \
429BZ_DECLARE_ARRAY_ET_BINARY(name, name ## _impl)
430
431#define BZ_DECLARE_FUNCTION2_SCALAR(name, sca)                             \
432BZ_DECLARE_ARRAY_ET_BINARY_SCALAR(name, name ## _impl, sca)
433
434#define BZ_DECLARE_FUNCTION3(name)                                         \
435BZ_DEFINE_TERNARY_FUNC(name ## _impl,name)                                 \
436BZ_DECLARE_ARRAY_ET_TERNARY(name, name ## _impl)
437   
438#define BZ_DECLARE_FUNCTION3_RET(name,return_type)                         \
439BZ_DEFINE_TERNARY_FUNC_RET(name ## _impl,name,return_type)                 \
440BZ_DECLARE_ARRAY_ET_TERNARY(name, name ## _impl)
441
442#define BZ_DECLARE_FUNCTION4(name)                                      \
443  BZ_DEFINE_QUATERNARY_FUNC(name ## _impl,name)                         \
444  BZ_DECLARE_ARRAY_ET_QUATERNARY(name, name ## _impl)
445   
446
447BZ_NAMESPACE_END
448
449#endif
450
451
452
453
454
455
456
457
Note: See TracBrowser for help on using the repository browser.