newet-macros.h   newet-macros.h 
// -*- C++ -*- // -*- C++ -*-
/************************************************************************** * /************************************************************************** *
* blitz/array/newet-macros.h Macros for new e.t. implementation * blitz/array/newet-macros.h Macros for new e.t. implementation
* *
* Copyright (C) 1997-2001 Todd Veldhuizen <tveldhui@oonumerics.org> * $Id$
* *
* This program is free software; you can redistribute it and/or * Copyright (C) 1997-2011 Todd Veldhuizen <tveldhui@acm.org>
* modify it under the terms of the GNU General Public License *
* as published by the Free Software Foundation; either version 2 * This file is a part of Blitz.
*
* Blitz is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation, either version 3
* of the License, or (at your option) any later version. * of the License, or (at your option) any later version.
* *
* This program is distributed in the hope that it will be useful, * Blitz is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU Lesser General Public License for more details.
* *
* Suggestions: blitz-dev@oonumerics.org * You should have received a copy of the GNU Lesser General Public
* Bugs: blitz-bugs@oonumerics.org * License along with Blitz. If not, see <http://www.gnu.org/licenses/>.
*
* Suggestions: blitz-devel@lists.sourceforge.net
* Bugs: blitz-support@lists.sourceforge.net
* *
* For more information, please see the Blitz++ Home Page: * For more information, please see the Blitz++ Home Page:
* http://oonumerics.org/blitz/ * https://sourceforge.net/projects/blitz/
* *
************************************************************************** **/ ************************************************************************** **/
#ifndef BZ_NEWET_MACROS_H #ifndef BZ_NEWET_MACROS_H
#define BZ_NEWET_MACROS_H #define BZ_NEWET_MACROS_H
#include <blitz/array/asexpr.h> #include <blitz/array/asexpr.h>
BZ_NAMESPACE(blitz) BZ_NAMESPACE(blitz)
#ifdef BZ_HAVE_TEMPLATES_AS_TEMPLATE_ARGUMENTS #ifdef BZ_HAVE_TEMPLATES_AS_TEMPLATE_ARGUMENTS
/* /*
* Unary functions and operators * Unary functions and operators
*/ */
#define BZ_DECLARE_ARRAY_ET_UNARY(name,functor) \ #define BZ_DECLARE_ARRAY_ET_UNARY(name,functor)
\ \
template <typename T1> \
_bz_inline_et \ \
typename BzUnaryExprResult<functor,T1>::T_result \ template <typename T1>
name(const ETBase<T1>& d1) \ \
{ \ _bz_inline_et
typedef typename BzUnaryExprResult<functor,T1>::T_result result; \ \
return result(asExpr<T1>::getExpr(d1.unwrap())); \ typename BZ_BLITZ_SCOPE(BzUnaryExprResult)<functor,T1>::T_result
\
name(const BZ_BLITZ_SCOPE(ETBase)<T1>& d1)
\
{ \
typedef typename
\
BZ_BLITZ_SCOPE(BzUnaryExprResult)<functor,T1>::T_result result;
\
return result(BZ_BLITZ_SCOPE(asExpr)<T1>::getExpr(d1.unwrap()));
\
} }
/* /*
* Array expression templates: the macro BZ_DECLARE_ARRAY_ET_BINARY(X,Y) * Array expression templates: the macro BZ_DECLARE_ARRAY_ET_BINARY(X,Y)
* declares a function or operator which takes two operands. * declares a function or operator which takes two operands.
* X is the function name (or operator), and Y is the functor object * X is the function name (or operator), and Y is the functor object
* which implements the operation. * which implements the operation.
*/ */
#define BZ_DECLARE_ARRAY_ET_BINARY(name, applic) \ #define BZ_DECLARE_ARRAY_ET_BINARY(name, applic)
\ \
template <typename T1,typename T2> \
_bz_inline_et \ \
typename BzBinaryExprResult<applic,T1,T2>::T_result \ template <typename T1,typename T2>
name(const ETBase<T1>& d1,const ETBase<T2>& d2) \ \
{ \ _bz_inline_et
typedef typename BzBinaryExprResult<applic,T1,T2>::T_result result; \ \
return result(asExpr<T1>::getExpr(d1.unwrap()), \ typename BZ_BLITZ_SCOPE(BzBinaryExprResult)<applic,T1,T2>::T_result
asExpr<T2>::getExpr(d2.unwrap())); \ \
} name(const BZ_BLITZ_SCOPE(ETBase)<T1>& d1,
\
#define BZ_DECLARE_ARRAY_ET_BINARY_TINYVEC(name, applic) \ const BZ_BLITZ_SCOPE(ETBase)<T2>& d2)
\ \
template <typename T1, typename T2, int N> \ {
_bz_inline_et \ \
typename BzBinaryExprResult<applic,TinyVector<T2,N>,T1>::T_result \ typedef typename
name(const TinyVector<T2,N> d1, const ETBase<T1>& d2) \ \
{ \ BZ_BLITZ_SCOPE(BzBinaryExprResult)<applic,T1,T2>::T_result result;
typedef typename \ \
BzBinaryExprResult<applic,TinyVector<T2,N>,T1>::T_result result; \ return result(BZ_BLITZ_SCOPE(asExpr)<T1>::getExpr(d1.unwrap()),
return result(asExpr<TinyVector<T2,N> >::getExpr(d1), \ \
asExpr<T1>::getExpr(d2.unwrap())); \ BZ_BLITZ_SCOPE(asExpr)<T2>::getExpr(d2.unwrap()));
} \ \
\ }
template <typename T1, typename T2, int N> \
_bz_inline_et \ #define BZ_DECLARE_ARRAY_ET_BINARY_TINYVEC(name, applic)
typename BzBinaryExprResult<applic,T1,TinyVector<T2,N> >::T_result \ \
name(const ETBase<T1>& d1, const TinyVector<T2,N> d2) \
{ \ \
typedef typename \ template <typename T1, typename T2, int N>
BzBinaryExprResult<applic,T1,TinyVector<T2,N> >::T_result result; \ \
return result(asExpr<T1>::getExpr(d1.unwrap()), \ _bz_inline_et
asExpr<TinyVector<T2,N> >::getExpr(d2)); \ \
} typename BZ_BLITZ_SCOPE(BzBinaryExprResult)<applic,
\
#define BZ_DECLARE_ARRAY_ET_BINARY_SCALAR(name, applic, sca) \ BZ_BLITZ_SCOPE(TinyVector)<T2,N>,T1>::T_result
\ \
template<typename T> \ name(const BZ_BLITZ_SCOPE(TinyVector)<T2,N> d1,
_bz_inline_et \ \
typename BzBinaryExprResult<applic,sca,T>::T_result \ const BZ_BLITZ_SCOPE(ETBase)<T1>& d2)
name(const sca d1, const ETBase<T>& d2) \ \
{ \ {
typedef typename BzBinaryExprResult<applic,sca,T>::T_result result; \ \
return result(asExpr<sca >::getExpr(d1), \ typedef typename
asExpr<T>::getExpr(d2.unwrap())); \ \
} \ BZ_BLITZ_SCOPE(BzBinaryExprResult)<applic,
\ \
template<typename T> \ BZ_BLITZ_SCOPE(TinyVector)<T2,N>,T1>::T_result result;
_bz_inline_et \ \
typename BzBinaryExprResult<applic,T,sca >::T_result \ return result(BZ_BLITZ_SCOPE(asExpr)<
name(const ETBase<T>& d1, const sca d2) \ \
{ \ BZ_BLITZ_SCOPE(TinyVector)<T2,N> >::getExpr(d1),
typedef typename BzBinaryExprResult<applic,T,sca >::T_result result; \ \
return result(asExpr<T>::getExpr(d1.unwrap()), \ BZ_BLITZ_SCOPE(asExpr)<T1>::getExpr(d2.unwrap()));
asExpr<sca >::getExpr(d2)); \ \
}
\
\
template <typename T1, typename T2, int N>
\
_bz_inline_et
\
typename BZ_BLITZ_SCOPE(BzBinaryExprResult)<applic,T1,
\
BZ_BLITZ_SCOPE(TinyVector)<T2,N> >::T_result
\
name(const BZ_BLITZ_SCOPE(ETBase)<T1>& d1,
\
const BZ_BLITZ_SCOPE(TinyVector)<T2,N> d2)
\
{
\
typedef typename
\
BZ_BLITZ_SCOPE(BzBinaryExprResult)<applic,T1,
\
BZ_BLITZ_SCOPE(TinyVector)<T2,N> >::T_result result;
\
return result(BZ_BLITZ_SCOPE(asExpr)<T1>::getExpr(d1.unwrap()),
\
BZ_BLITZ_SCOPE(asExpr)<
\
BZ_BLITZ_SCOPE(TinyVector)<T2,N> >::getExpr(d2));
\
}
#define BZ_DECLARE_ARRAY_ET_BINARY_SCALAR(name, applic, sca)
\
\
template<typename T>
\
_bz_inline_et
\
typename BZ_BLITZ_SCOPE(BzBinaryExprResult)<applic,sca,T>::T_result
\
name(const sca d1, const BZ_BLITZ_SCOPE(ETBase)<T>& d2)
\
{
\
typedef typename
\
BZ_BLITZ_SCOPE(BzBinaryExprResult)<applic,sca,T>::T_result result;
\
return result(BZ_BLITZ_SCOPE(asExpr)<sca >::getExpr(d1),
\
BZ_BLITZ_SCOPE(asExpr)<T>::getExpr(d2.unwrap()));
\
}
\
\
template<typename T>
\
_bz_inline_et
\
typename BZ_BLITZ_SCOPE(BzBinaryExprResult)<applic,T,sca >::T_result
\
name(const BZ_BLITZ_SCOPE(ETBase)<T>& d1, const sca d2)
\
{
\
typedef typename
\
BZ_BLITZ_SCOPE(BzBinaryExprResult)<applic,T,sca >::T_result result;
\
return result(BZ_BLITZ_SCOPE(asExpr)<T>::getExpr(d1.unwrap()),
\
BZ_BLITZ_SCOPE(asExpr)<sca >::getExpr(d2));
\
} }
/* /*
* Array expression templates: the macro BZ_DECLARE_ARRAY_ET_TERNARY(X,Y) * Array expression templates: the macro BZ_DECLARE_ARRAY_ET_TERNARY(X,Y)
* declares a function or operator which takes three operands. * declares a function or operator which takes three operands.
* X is the function name (or operator), and Y is the functor object * X is the function name (or operator), and Y is the functor object
* which implements the operation. * which implements the operation.
*/ */
#define BZ_DECLARE_ARRAY_ET_TERNARY(name, applic) #define BZ_DECLARE_ARRAY_ET_TERNARY(name, applic)
\ \
\ \
template <typename T1, typename T2, typename T3> template <typename T1, typename T2, typename T3>
\ \
_bz_inline_et _bz_inline_et
\ \
typename BzTernaryExprResult<applic, T1, T2, T3>::T_result typename BZ_BLITZ_SCOPE(BzTernaryExprResult)<applic, T1, T2, T3>::T_result
\ \
name(const ETBase<T1>& d1, const ETBase<T2>& d2, const ETBase<T3>& d3) name(const BZ_BLITZ_SCOPE(ETBase)<T1>& d1,
\ \
{ const BZ_BLITZ_SCOPE(ETBase)<T2>& d2,
\ \
typedef typename BzTernaryExprResult<applic,T1,T2,T3>::T_result result; const BZ_BLITZ_SCOPE(ETBase)<T3>& d3)
\ \
return result(asExpr<T1>::getExpr(d1.unwrap()), {
\ \
asExpr<T2>::getExpr(d2.unwrap()), typedef typename
\ \
asExpr<T3>::getExpr(d3.unwrap())); BZ_BLITZ_SCOPE(BzTernaryExprResult)<applic,T1,T2,T3>::T_result
\ \
result;
\
return result(BZ_BLITZ_SCOPE(asExpr)<T1>::getExpr(d1.unwrap()),
\
BZ_BLITZ_SCOPE(asExpr)<T2>::getExpr(d2.unwrap()),
\
BZ_BLITZ_SCOPE(asExpr)<T3>::getExpr(d3.unwrap()));
\
}
/*
* Array expression templates: the macro BZ_DECLARE_ARRAY_ET_QUATERNARY(X,Y
)
* declares a function or operator which takes four operands.
* X is the function name (or operator), and Y is the functor object
* which implements the operation.
*/
#define BZ_DECLARE_ARRAY_ET_QUATERNARY(name, applic) \
\
template <typename T1, typename T2, typename T3, typename T4>
\
_bz_inline_et
\
typename BZ_BLITZ_SCOPE(BzQuaternaryExprResult)<applic, T1, T2, T3, T4>::
T_result \
name(const BZ_BLITZ_SCOPE(ETBase)<T1>& d1, \
const BZ_BLITZ_SCOPE(ETBase)<T2>& d2, \
const BZ_BLITZ_SCOPE(ETBase)<T3>& d3, \
const BZ_BLITZ_SCOPE(ETBase)<T4>& d4) \
{ \
typedef typename \
BZ_BLITZ_SCOPE(BzQuaternaryExprResult)<applic,T1,T2,T3, T4>::T_result
\
result; \
return result(BZ_BLITZ_SCOPE(asExpr)<T1>::getExpr(d1.unwrap()), \
BZ_BLITZ_SCOPE(asExpr)<T2>::getExpr(d2.unwrap()), \
BZ_BLITZ_SCOPE(asExpr)<T3>::getExpr(d3.unwrap()), \
BZ_BLITZ_SCOPE(asExpr)<T4>::getExpr(d4.unwrap())); \
} }
#else /* !BZ_HAVE_TEMPLATES_AS_TEMPLATE_ARGUMENTS */ #else /* !BZ_HAVE_TEMPLATES_AS_TEMPLATE_ARGUMENTS */
/* /*
* Unary functions and operators * Unary functions and operators
*/ */
#define BZ_DECLARE_ARRAY_ET_UNARY(name, functor) \ #define BZ_DECLARE_ARRAY_ET_UNARY(name, functor)
\ \
template<typename T1> \
_bz_inline_et \ \
_bz_ArrayExpr<_bz_ArrayExprUnaryOp< \ template<typename T1>
_bz_typename asExpr<T1>::T_expr, \ \
functor<_bz_typename asExpr<T1>::T_expr::T_numtype> > > \ _bz_inline_et
name(const ETBase<T1>& d1) \ \
{ \ BZ_BLITZ_SCOPE(_bz_ArrayExpr)<BZ_BLITZ_SCOPE(_bz_ArrayExprUnaryOp)<
return _bz_ArrayExpr<_bz_ArrayExprUnaryOp< \ \
_bz_typename asExpr<T1>::T_expr, \ _bz_typename BZ_BLITZ_SCOPE(asExpr)<T1>::T_expr,
functor<_bz_typename asExpr<T1>::T_expr::T_numtype> > > \ \
(asExpr<T1>::getExpr(d1.unwrap())); \ functor<_bz_typename BZ_BLITZ_SCOPE(asExpr)<T1>::T_expr::T_numtype> > >
\
name(const BZ_BLITZ_SCOPE(ETBase)<T1>& d1)
\
{
\
return BZ_BLITZ_SCOPE(_bz_ArrayExpr)<
\
BZ_BLITZ_SCOPE(_bz_ArrayExprUnaryOp)<
\
_bz_typename BZ_BLITZ_SCOPE(asExpr)<T1>::T_expr,
\
functor<_bz_typename
\
BZ_BLITZ_SCOPE(asExpr)<T1>::T_expr::T_numtype> > >(
\
BZ_BLITZ_SCOPE(asExpr)<T1>::getExpr(d1.unwrap()));
\
} }
/* /*
* Array expression templates: the macro BZ_DECLARE_ARRAY_ET_BINARY(X,Y) * Array expression templates: the macro BZ_DECLARE_ARRAY_ET_BINARY(X,Y)
* declares a function or operator which takes two operands. * declares a function or operator which takes two operands.
* X is the function name (or operator), and Y is the functor object * X is the function name (or operator), and Y is the functor object
* which implements the operation. * which implements the operation.
*/ */
#define BZ_DECLARE_ARRAY_ET_BINARY(name, applic) \ #define BZ_DECLARE_ARRAY_ET_BINARY(name, applic)
\ \
template<typename T1, typename T2> \
_bz_inline_et \ \
_bz_ArrayExpr<_bz_ArrayExprBinaryOp< \ template<typename T1, typename T2>
_bz_typename asExpr<T1>::T_expr, \ \
_bz_typename asExpr<T2>::T_expr, \ _bz_inline_et
applic<_bz_typename asExpr<T1>::T_expr::T_numtype, \ \
_bz_typename asExpr<T2>::T_expr::T_numtype> > > \ BZ_BLITZ_SCOPE(_bz_ArrayExpr)<BZ_BLITZ_SCOPE(_bz_ArrayExprBinaryOp)<
name(const ETBase<T1>& d1, const ETBase<T2>& d2) \ \
{ \ _bz_typename BZ_BLITZ_SCOPE(asExpr)<T1>::T_expr,
return _bz_ArrayExpr<_bz_ArrayExprBinaryOp< \ \
_bz_typename asExpr<T1>::T_expr, \ _bz_typename BZ_BLITZ_SCOPE(asExpr)<T2>::T_expr,
_bz_typename asExpr<T2>::T_expr, \ \
applic<_bz_typename asExpr<T1>::T_expr::T_numtype, \ applic<_bz_typename BZ_BLITZ_SCOPE(asExpr)<T1>::T_expr::T_numtype,
_bz_typename asExpr<T2>::T_expr::T_numtype> > > \ \
(asExpr<T1>::getExpr(d1.unwrap()), \ _bz_typename BZ_BLITZ_SCOPE(asExpr)<T2>::T_expr::T_numtype> > >
asExpr<T2>::getExpr(d2.unwrap())); \ \
} name(const BZ_BLITZ_SCOPE(ETBase)<T1>& d1,
\
#define BZ_DECLARE_ARRAY_ET_BINARY_TINYVEC(name, applic) \ const BZ_BLITZ_SCOPE(ETBase)<T2>& d2)
\ \
template <typename T1, typename T2, int N> \ {
_bz_inline_et \ \
_bz_ArrayExprBinaryOp< \ return BZ_BLITZ_SCOPE(_bz_ArrayExpr)<
_bz_typename asExpr<TinyVector<T2,N> >::T_expr, \ \
_bz_typename asExpr<T1>::T_expr, \ BZ_BLITZ_SCOPE(_bz_ArrayExprBinaryOp)<
applic<TinyVector<T2,N>, \ \
_bz_typename asExpr<T1>::T_expr::T_numtype> > \ _bz_typename BZ_BLITZ_SCOPE(asExpr)<T1>::T_expr,
name(const TinyVector<T2,N> d1, const ETBase<T1>& d2) \ \
{ \ _bz_typename BZ_BLITZ_SCOPE(asExpr)<T2>::T_expr,
return _bz_ArrayExprBinaryOp< \ \
_bz_typename asExpr<TinyVector<T2,N> >::T_expr, \ applic<_bz_typename BZ_BLITZ_SCOPE(asExpr)<T1>::T_expr::T_numtype,
_bz_typename asExpr<T1>::T_expr, \ \
applic<TinyVector<T2,N>, \ _bz_typename BZ_BLITZ_SCOPE(asExpr)<T2>::T_expr::T_numtype> > >(
_bz_typename asExpr<T1>::T_expr::T_numtype> > \ \
(asExpr<TinyVector<T2,N> >::getExpr(d1), \ BZ_BLITZ_SCOPE(asExpr)<T1>::getExpr(d1.unwrap()),
asExpr<T1>::getExpr(d2.unwrap())); \ \
} \ BZ_BLITZ_SCOPE(asExpr)<T2>::getExpr(d2.unwrap()));
\ \
template <typename T1, typename T2, int N> \ }
_bz_inline_et \
_bz_ArrayExprBinaryOp< \ #define BZ_DECLARE_ARRAY_ET_BINARY_TINYVEC(name, applic)
_bz_typename asExpr<T1>::T_expr, \ \
_bz_typename asExpr<TinyVector<T2,N> >::T_expr, \
applic<_bz_typename asExpr<T1>::T_expr::T_numtype, \ \
TinyVector<T2,N> > > \ template <typename T1, typename T2, int N>
name(const ETBase<T1>& d1, const TinyVector<T2,N> d2) \ \
{ \ _bz_inline_et
return _bz_ArrayExprBinaryOp< \ \
_bz_typename asExpr<T1>::T_expr, \ BZ_BLITZ_SCOPE(_bz_ArrayExprBinaryOp)<
_bz_typename asExpr<TinyVector<T2,N> >::T_expr, \ \
applic<_bz_typename asExpr<T1>::T_expr::T_numtype, \ _bz_typename BZ_BLITZ_SCOPE(asExpr)<
TinyVector<T2,N> > > \ \
(asExpr<T1>::getExpr(d1.unwrap()), \ BZ_BLITZ_SCOPE(TinyVector)<T2,N> >::T_expr,
asExpr<TinyVector<T2,N> >::getExpr(d2)); \ \
} _bz_typename BZ_BLITZ_SCOPE(asExpr)<T1>::T_expr,
\
#define BZ_DECLARE_ARRAY_ET_BINARY_SCALAR(name, applic, sca) \ applic<BZ_BLITZ_SCOPE(TinyVector)<T2,N>,
\ \
template<typename T> \ _bz_typename BZ_BLITZ_SCOPE(asExpr)<T1>::T_expr::T_numtype> >
_bz_inline_et \ \
_bz_ArrayExprBinaryOp< \ name(const BZ_BLITZ_SCOPE(TinyVector)<T2,N> d1,
asExpr<sca >::T_expr, \ \
_bz_typename asExpr<T>::T_expr, \ const BZ_BLITZ_SCOPE(ETBase)<T1>& d2)
applic<sca,_bz_typename asExpr<T>::T_expr::T_numtype> > \ \
name(const sca d1, const ETBase<T>& d2) \ {
{ \ \
return _bz_ArrayExprBinaryOp< \ return BZ_BLITZ_SCOPE(_bz_ArrayExprBinaryOp)<
asExpr<sca >::T_expr, \ \
_bz_typename asExpr<T>::T_expr, \ _bz_typename BZ_BLITZ_SCOPE(asExpr)<
applic<sca,_bz_typename asExpr<T>::T_expr::T_numtype> > \ \
(asExpr<sca >::getExpr(d1), \ BZ_BLITZ_SCOPE(TinyVector)<T2,N> >::T_expr,
asExpr<T>::getExpr(d2.unwrap())); \ \
} \ _bz_typename BZ_BLITZ_SCOPE(asExpr)<T1>::T_expr,
\ \
template<typename T> \ applic<BZ_BLITZ_SCOPE(TinyVector)<T2,N>,
_bz_inline_et \ \
_bz_ArrayExprBinaryOp< \ _bz_typename BZ_BLITZ_SCOPE(asExpr)<T1>::T_expr::T_numtype> >(
_bz_typename asExpr<T>::T_expr, \ \
asExpr<sca >::T_expr, \ BZ_BLITZ_SCOPE(asExpr)<
applic<_bz_typename asExpr<T>::T_expr::T_numtype,sca > > \ \
name(const ETBase<T>& d1, const sca d2) \ BZ_BLITZ_SCOPE(TinyVector)<T2,N> >::getExpr(d1),
{ \ \
return _bz_ArrayExprBinaryOp< \ BZ_BLITZ_SCOPE(asExpr)<T1>::getExpr(d2.unwrap()));
_bz_typename asExpr<T>::T_expr, \ \
asExpr<sca >::T_expr, \ }
applic<_bz_typename asExpr<T>::T_expr::T_numtype,sca > > \ \
(asExpr<T>::getExpr(d1.unwrap()), \
asExpr<sca >::getExpr(d2)); \ \
template <typename T1, typename T2, int N>
\
_bz_inline_et
\
BZ_BLITZ_SCOPE(_bz_ArrayExprBinaryOp)<
\
_bz_typename BZ_BLITZ_SCOPE(asExpr)<T1>::T_expr,
\
_bz_typename BZ_BLITZ_SCOPE(asExpr)<
\
BZ_BLITZ_SCOPE(TinyVector)<T2,N> >::T_expr,
\
applic<_bz_typename BZ_BLITZ_SCOPE(asExpr)<T1>::T_expr::T_numtype,
\
BZ_BLITZ_SCOPE(TinyVector)<T2,N> > >
\
name(const BZ_BLITZ_SCOPE(ETBase)<T1>& d1,
\
const BZ_BLITZ_SCOPE(TinyVector)<T2,N> d2)
\
{
\
return BZ_BLITZ_SCOPE(_bz_ArrayExprBinaryOp)<
\
_bz_typename BZ_BLITZ_SCOPE(asExpr)<T1>::T_expr,
\
_bz_typename BZ_BLITZ_SCOPE(asExpr)<
\
BZ_BLITZ_SCOPE(TinyVector)<T2,N> >::T_expr,
\
applic<_bz_typename BZ_BLITZ_SCOPE(asExpr)<T1>::T_expr::T_numtype,
\
BZ_BLITZ_SCOPE(TinyVector)<T2,N> > >(
\
BZ_BLITZ_SCOPE(asExpr)<T1>::getExpr(d1.unwrap()),
\
BZ_BLITZ_SCOPE(asExpr)<
\
BZ_BLITZ_SCOPE(TinyVector)<T2,N> >::getExpr(d2));
\
}
#define BZ_DECLARE_ARRAY_ET_BINARY_SCALAR(name, applic, sca)
\
\
template<typename T>
\
_bz_inline_et
\
BZ_BLITZ_SCOPE(_bz_ArrayExprBinaryOp)<
\
BZ_BLITZ_SCOPE(asExpr)<sca >::T_expr,
\
_bz_typename BZ_BLITZ_SCOPE(asExpr)<T>::T_expr,
\
applic<sca,_bz_typename BZ_BLITZ_SCOPE(asExpr)<T>::T_expr::T_numtype> >
\
name(const sca d1, const BZ_BLITZ_SCOPE(ETBase)<T>& d2)
\
{
\
return BZ_BLITZ_SCOPE(_bz_ArrayExprBinaryOp)<
\
BZ_BLITZ_SCOPE(asExpr)<sca >::T_expr,
\
_bz_typename BZ_BLITZ_SCOPE(asExpr)<T>::T_expr,
\
applic<sca,
\
_bz_typename BZ_BLITZ_SCOPE(asExpr)<T>::T_expr::T_numtype> >(
\
BZ_BLITZ_SCOPE(asExpr)<sca >::getExpr(d1),
\
BZ_BLITZ_SCOPE(asExpr)<T>::getExpr(d2.unwrap()));
\
}
\
\
template<typename T>
\
_bz_inline_et
\
BZ_BLITZ_SCOPE(_bz_ArrayExprBinaryOp)<
\
_bz_typename BZ_BLITZ_SCOPE(asExpr)<T>::T_expr,
\
BZ_BLITZ_SCOPE(asExpr)<sca >::T_expr,
\
applic<_bz_typename BZ_BLITZ_SCOPE(asExpr)<T>::T_expr::T_numtype,
\
sca > >
\
name(const BZ_BLITZ_SCOPE(ETBase)<T>& d1, const sca d2)
\
{
\
return BZ_BLITZ_SCOPE(_bz_ArrayExprBinaryOp)<
\
_bz_typename BZ_BLITZ_SCOPE(asExpr)<T>::T_expr,
\
BZ_BLITZ_SCOPE(asExpr)<sca >::T_expr,
\
applic<_bz_typename BZ_BLITZ_SCOPE(asExpr)<T>::T_expr::T_numtype,
\
sca > >(
\
BZ_BLITZ_SCOPE(asExpr)<T>::getExpr(d1.unwrap()),
\
BZ_BLITZ_SCOPE(asExpr)<sca >::getExpr(d2));
\
} }
/* /*
* Array expression templates: the macro BZ_DECLARE_ARRAY_ET_TERNARY(X,Y) * Array expression templates: the macro BZ_DECLARE_ARRAY_ET_TERNARY(X,Y)
* declares a function or operator which takes three operands. * declares a function or operator which takes three operands.
* X is the function name (or operator), and Y is the functor object * X is the function name (or operator), and Y is the functor object
* which implements the operation. * which implements the operation.
*/ */
#define BZ_DECLARE_ARRAY_ET_TERNARY(name, applic) \ #define BZ_DECLARE_ARRAY_ET_TERNARY(name, applic)
\ \
template<typename T1, typename T2, typename T3> \
_bz_inline_et \ \
_bz_ArrayExpr<_bz_ArrayExprTernaryOp< \ template<typename T1, typename T2, typename T3>
_bz_typename asExpr<T1>::T_expr, \ \
_bz_typename asExpr<T2>::T_expr, \ _bz_inline_et
_bz_typename asExpr<T3>::T_expr, \ \
applic<_bz_typename asExpr<T1>::T_expr::T_numtype, \ BZ_BLITZ_SCOPE(_bz_ArrayExpr)<BZ_BLITZ_SCOPE(_bz_ArrayExprTernaryOp)<
_bz_typename asExpr<T2>::T_expr::T_numtype, \ \
_bz_typename asExpr<T3>::T_expr::T_numtype> > > \ _bz_typename BZ_BLITZ_SCOPE(asExpr)<T1>::T_expr,
name(const ETBase<T1>& d1, const ETBase<T2>& d2, const ETBase<T3>& d3) \ \
{ \ _bz_typename BZ_BLITZ_SCOPE(asExpr)<T2>::T_expr,
return _bz_ArrayExpr<_bz_ArrayExprTernaryOp< \ \
_bz_typename asExpr<T1>::T_expr, \ _bz_typename BZ_BLITZ_SCOPE(asExpr)<T3>::T_expr,
_bz_typename asExpr<T2>::T_expr, \ \
_bz_typename asExpr<T3>::T_expr, \ applic<_bz_typename BZ_BLITZ_SCOPE(asExpr)<T1>::T_expr::T_numtype,
applic<_bz_typename asExpr<T1>::T_expr::T_numtype, \ \
_bz_typename asExpr<T2>::T_expr::T_numtype, \ _bz_typename BZ_BLITZ_SCOPE(asExpr)<T2>::T_expr::T_numtype,
_bz_typename asExpr<T3>::T_expr::T_numtype> > > \ \
(asExpr<T1>::getExpr(d1.unwrap()), \ _bz_typename BZ_BLITZ_SCOPE(asExpr)<T3>::T_expr::T_numtype> > >
asExpr<T2>::getExpr(d2.unwrap()), \ \
asExpr<T3>::getExpr(d3.unwrap())); \ name(const BZ_BLITZ_SCOPE(ETBase)<T1>& d1,
\
const BZ_BLITZ_SCOPE(ETBase)<T2>& d2,
\
const BZ_BLITZ_SCOPE(ETBase)<T3>& d3)
\
{
\
return BZ_BLITZ_SCOPE(_bz_ArrayExpr)<
\
BZ_BLITZ_SCOPE(_bz_ArrayExprTernaryOp)<
\
_bz_typename BZ_BLITZ_SCOPE(asExpr)<T1>::T_expr,
\
_bz_typename BZ_BLITZ_SCOPE(asExpr)<T2>::T_expr,
\
_bz_typename BZ_BLITZ_SCOPE(asExpr)<T3>::T_expr,
\
applic<_bz_typename BZ_BLITZ_SCOPE(asExpr)<T1>::T_expr::T_numtype,
\
_bz_typename BZ_BLITZ_SCOPE(asExpr)<T2>::T_expr::T_numtype,
\
_bz_typename BZ_BLITZ_SCOPE(asExpr)<T3>::T_expr::T_numtype> > >(
\
BZ_BLITZ_SCOPE(asExpr)<T1>::getExpr(d1.unwrap()),
\
BZ_BLITZ_SCOPE(asExpr)<T2>::getExpr(d2.unwrap()),
\
BZ_BLITZ_SCOPE(asExpr)<T3>::getExpr(d3.unwrap()));
\
}
/*
* Array expression templates: the macro BZ_DECLARE_ARRAY_ET_BINARY(X,Y)
* declares a function or operator which takes two operands.
* X is the function name (or operator), and Y is the functor object
* which implements the operation.
*/
#define BZ_DECLARE_ARRAY_ET_QUATERNARY(name, functor) \
\
template<typename T1, typename T2, typename T3,typename T4> \
_bz_inline_et
\
BZ_BLITZ_SCOPE(_bz_ArrayExpr)
\
< \
BZ_BLITZ_SCOPE(_bz_ArrayExprQuaternaryOp) \
< \
_bz_typename BZ_BLITZ_SCOPE(asExpr)<T1>::T_expr, \
_bz_typename BZ_BLITZ_SCOPE(asExpr)<T2>::T_expr, \
_bz_typename BZ_BLITZ_SCOPE(asExpr)<T3>::T_expr, \
_bz_typename BZ_BLITZ_SCOPE(asExpr)<T4>::T_expr, \
functor< \
_bz_typename BZ_BLITZ_SCOPE(asExpr)<T1>::T_expr::T_numtype,
\
_bz_typename BZ_BLITZ_SCOPE(asExpr)<T2>::T_expr::T_numtype,
\
_bz_typename BZ_BLITZ_SCOPE(asExpr)<T3>::T_expr::T_numtype,
\
_bz_typename BZ_BLITZ_SCOPE(asExpr)<T4>::T_expr::T_numtype \
> > > \
\
name(const BZ_BLITZ_SCOPE(ETBase)<T1>& d1, \
const BZ_BLITZ_SCOPE(ETBase)<T2>& d2, \
const BZ_BLITZ_SCOPE(ETBase)<T3>& d3, \
const BZ_BLITZ_SCOPE(ETBase)<T4>& d4) \
{ \
return BZ_BLITZ_SCOPE(_bz_ArrayExpr) \
<
\
BZ_BLITZ_SCOPE(_bz_ArrayExprBinaryOp) \
<
\
_bz_typename BZ_BLITZ_SCOPE(asExpr)<T1>::T_expr, \
_bz_typename BZ_BLITZ_SCOPE(asExpr)<T2>::T_expr, \
functor \
<
\
_bz_typename BZ_BLITZ_SCOPE(asExpr)<T1>::T_expr::T_numtype, \
_bz_typename BZ_BLITZ_SCOPE(asExpr)<T2>::T_expr::T_numtype, \
_bz_typename BZ_BLITZ_SCOPE(asExpr)<T3>::T_expr::T_numtype, \
_bz_typename BZ_BLITZ_SCOPE(asExpr)<T4>::T_expr::T_numtype \
> > > \
(
\
BZ_BLITZ_SCOPE(asExpr)<T1>::getExpr(d1.unwrap()), \
BZ_BLITZ_SCOPE(asExpr)<T2>::getExpr(d2.unwrap()), \
BZ_BLITZ_SCOPE(asExpr)<T2>::getExpr(d3.unwrap()), \
BZ_BLITZ_SCOPE(asExpr)<T2>::getExpr(d4.unwrap())); \
} }
#endif /* BZ_HAVE_TEMPLATES_AS_TEMPLATE_ARGUMENTS */ #endif /* BZ_HAVE_TEMPLATES_AS_TEMPLATE_ARGUMENTS */
/* /*
* User-defined expression template routines * User-defined expression template routines
*/ */
#define BZ_DECLARE_FUNCTION(name) \ #define BZ_DECLARE_FUNCTION(name)
BZ_DEFINE_UNARY_FUNC(name ## _impl,name) \ \
BZ_DEFINE_UNARY_FUNC(name ## _impl,name,true) \
BZ_DECLARE_ARRAY_ET_UNARY(name,name ## _impl) BZ_DECLARE_ARRAY_ET_UNARY(name,name ## _impl)
#define BZ_DECLARE_FUNCTION_RET(name,return_type) \ #define BZ_DECLARE_FUNCTION_RET(name,return_type)
BZ_DEFINE_UNARY_FUNC_RET(name ## _impl,name,return_type) \ \
BZ_DEFINE_UNARY_FUNC_RET(name ## _impl,name,return_type)
\
BZ_DECLARE_ARRAY_ET_UNARY(name,name ## _impl) BZ_DECLARE_ARRAY_ET_UNARY(name,name ## _impl)
#define BZ_DECLARE_FUNCTION2(name) \ #define BZ_DECLARE_FUNCTION2(name)
BZ_DEFINE_BINARY_FUNC(name ## _impl,name) \ \
BZ_DEFINE_BINARY_FUNC(name ## _impl,name)
\
BZ_DECLARE_ARRAY_ET_BINARY(name, name ## _impl) BZ_DECLARE_ARRAY_ET_BINARY(name, name ## _impl)
#define BZ_DECLARE_FUNCTION2_RET(name,return_type) \ #define BZ_DECLARE_FUNCTION2_RET(name,return_type)
BZ_DEFINE_BINARY_FUNC_RET(name ## _impl,name,return_type) \ \
BZ_DEFINE_BINARY_FUNC_RET(name ## _impl,name,return_type)
\
BZ_DECLARE_ARRAY_ET_BINARY(name, name ## _impl) BZ_DECLARE_ARRAY_ET_BINARY(name, name ## _impl)
#define BZ_DECLARE_FUNCTION2_SCALAR(name, sca) \ #define BZ_DECLARE_FUNCTION2_SCALAR(name, sca) \
BZ_DECLARE_ARRAY_ET_BINARY_SCALAR(name, name ## _impl, sca) BZ_DECLARE_ARRAY_ET_BINARY_SCALAR(name, name ## _impl, sca)
#define BZ_DECLARE_FUNCTION3(name) \ #define BZ_DECLARE_FUNCTION3(name)
BZ_DEFINE_TERNARY_FUNC(name ## _impl,name) \ \
BZ_DEFINE_TERNARY_FUNC(name ## _impl,name)
\
BZ_DECLARE_ARRAY_ET_TERNARY(name, name ## _impl) BZ_DECLARE_ARRAY_ET_TERNARY(name, name ## _impl)
#define BZ_DECLARE_FUNCTION3_RET(name,return_type) \ #define BZ_DECLARE_FUNCTION3_RET(name,return_type)
BZ_DEFINE_TERNARY_FUNC_RET(name ## _impl,name,return_type) \ \
BZ_DEFINE_TERNARY_FUNC_RET(name ## _impl,name,return_type)
\
BZ_DECLARE_ARRAY_ET_TERNARY(name, name ## _impl) BZ_DECLARE_ARRAY_ET_TERNARY(name, name ## _impl)
#define BZ_DECLARE_FUNCTION4(name) \
BZ_DEFINE_QUATERNARY_FUNC(name ## _impl,name)
\
BZ_DECLARE_ARRAY_ET_QUATERNARY(name, name ## _impl)
BZ_NAMESPACE_END BZ_NAMESPACE_END
#endif #endif
 End of changes. 20 change blocks. 
235 lines changed or deleted 601 lines changed or added

This html diff was produced by rfcdiff 1.41. The latest version is available from http://tools.ietf.org/tools/rfcdiff/