[658] | 1 | #ifndef BZ_ARRAYMISC_CC
|
---|
| 2 | #define BZ_ARRAYMISC_CC
|
---|
| 3 |
|
---|
| 4 | #ifndef BZ_ARRAY_H
|
---|
| 5 | #error <blitz/array/misc.cc> must be included via <blitz/array.h>
|
---|
| 6 | #endif
|
---|
| 7 |
|
---|
| 8 | BZ_NAMESPACE(blitz)
|
---|
| 9 |
|
---|
| 10 | #define BZ_ARRAY_DECLARE_UOP(fn, fnobj) \
|
---|
| 11 | template<class T_numtype, int N_rank> \
|
---|
| 12 | inline \
|
---|
| 13 | _bz_ArrayExpr<_bz_ArrayExprUnaryOp<ArrayIterator<T_numtype,N_rank>, \
|
---|
| 14 | fnobj<T_numtype> > > \
|
---|
| 15 | fn(const Array<T_numtype,N_rank>& array) \
|
---|
| 16 | { \
|
---|
| 17 | return _bz_ArrayExprUnaryOp<ArrayIterator<T_numtype,N_rank>, \
|
---|
| 18 | fnobj<T_numtype> >(array.begin()); \
|
---|
| 19 | } \
|
---|
| 20 | \
|
---|
| 21 | template<class T_expr> \
|
---|
| 22 | inline \
|
---|
| 23 | _bz_ArrayExpr<_bz_ArrayExprUnaryOp<_bz_ArrayExpr<T_expr>, \
|
---|
| 24 | fnobj<_bz_typename T_expr::T_numtype> > > \
|
---|
| 25 | fn(_bz_ArrayExpr<T_expr> expr) \
|
---|
| 26 | { \
|
---|
| 27 | return _bz_ArrayExprUnaryOp<_bz_ArrayExpr<T_expr>, \
|
---|
| 28 | fnobj<_bz_typename T_expr::T_numtype> >(expr); \
|
---|
| 29 | } \
|
---|
| 30 | \
|
---|
| 31 | template<int N_index> \
|
---|
| 32 | inline \
|
---|
| 33 | _bz_ArrayExpr<_bz_ArrayExprUnaryOp<IndexPlaceholder<N_index>, \
|
---|
| 34 | fnobj<int> > > \
|
---|
| 35 | fn(IndexPlaceholder<N_index> index) \
|
---|
| 36 | { \
|
---|
| 37 | return _bz_ArrayExprUnaryOp<IndexPlaceholder<N_index>, \
|
---|
| 38 | fnobj<int> >(index); \
|
---|
| 39 | }
|
---|
| 40 |
|
---|
| 41 | BZ_ARRAY_DECLARE_UOP(operator!, LogicalNot)
|
---|
| 42 | BZ_ARRAY_DECLARE_UOP(operator~, BitwiseNot)
|
---|
| 43 | BZ_ARRAY_DECLARE_UOP(operator-, Negate)
|
---|
| 44 |
|
---|
| 45 | /*
|
---|
| 46 | * cast() functions, for explicit type casting
|
---|
| 47 | */
|
---|
| 48 |
|
---|
| 49 | template<class T_numtype, int N_rank, class T_cast>
|
---|
| 50 | inline
|
---|
| 51 | _bz_ArrayExpr<_bz_ArrayExprUnaryOp<ArrayIterator<T_numtype,N_rank>,
|
---|
| 52 | Cast<T_numtype, T_cast> > >
|
---|
| 53 | cast(const Array<T_numtype,N_rank>& array, T_cast)
|
---|
| 54 | {
|
---|
| 55 | return _bz_ArrayExprUnaryOp<ArrayIterator<T_numtype,N_rank>,
|
---|
| 56 | Cast<T_numtype,T_cast> >(array.begin());
|
---|
| 57 | }
|
---|
| 58 |
|
---|
| 59 | template<class T_expr, class T_cast>
|
---|
| 60 | inline
|
---|
| 61 | _bz_ArrayExpr<_bz_ArrayExprUnaryOp<_bz_ArrayExpr<T_expr>,
|
---|
| 62 | Cast<_bz_typename T_expr::T_numtype,T_cast> > >
|
---|
| 63 | cast(_bz_ArrayExpr<T_expr> expr, T_cast)
|
---|
| 64 | {
|
---|
| 65 | return _bz_ArrayExprUnaryOp<_bz_ArrayExpr<T_expr>,
|
---|
| 66 | Cast<_bz_typename T_expr::T_numtype,T_cast> >(expr);
|
---|
| 67 | }
|
---|
| 68 |
|
---|
| 69 | template<int N_index, class T_cast>
|
---|
| 70 | inline
|
---|
| 71 | _bz_ArrayExpr<_bz_ArrayExprUnaryOp<IndexPlaceholder<N_index>,
|
---|
| 72 | Cast<int,T_cast> > >
|
---|
| 73 | cast(IndexPlaceholder<N_index> index, T_cast)
|
---|
| 74 | {
|
---|
| 75 | return _bz_ArrayExprUnaryOp<IndexPlaceholder<N_index>,
|
---|
| 76 | Cast<int,T_cast> >(index);
|
---|
| 77 | }
|
---|
| 78 |
|
---|
| 79 | BZ_NAMESPACE_END
|
---|
| 80 |
|
---|
| 81 | #endif // BZ_ARRAYMISC_CC
|
---|
| 82 |
|
---|