namespace std
{
-
- //
- // Implementing a loosened valarray return value is tricky.
- // First we need to meet 26.3.1/3: we should not add more than
- // two levels of template nesting. Therefore we resort to template
- // template to "flatten" loosened return value types.
- // At some point we use partial specialization to remove one level
- // template nesting due to _Expr<>
- //
-
-
- // This class is NOT defined. It doesn't need to.
- template<typename _Tp1, typename _Tp2> class _Constant;
-
- //
- // Unary function application closure.
- //
- template<class _Dom, typename _Op> class _UnFunBase
- {
- public:
- typedef typename _Dom::value_type value_type;
- typedef value_type _Vt;
-
- explicit _UnFunBase (const _Dom& __e) : _M_expr(__e) {}
-
- _Vt operator[] (size_t __i) const { return _Op()(_M_expr[__i]); }
- size_t size () const { return _M_expr.size(); }
-
- private:
- const _Dom& _M_expr;
- };
+ //
+ // Implementing a loosened valarray return value is tricky.
+ // First we need to meet 26.3.1/3: we should not add more than
+ // two levels of template nesting. Therefore we resort to template
+ // template to "flatten" loosened return value types.
+ // At some point we use partial specialization to remove one level
+ // template nesting due to _Expr<>
+ //
+
+
+ // This class is NOT defined. It doesn't need to.
+ template<typename _Tp1, typename _Tp2> class _Constant;
// Implementations of unary functions applied to valarray<>s.
// I use hard-coded object functions here instead of a generic
typedef bool result_type;
};
- template<template<class, class> class _Meta, class _Dom, typename _Op>
- class _UnFunClos;
-
- template<class _Dom, typename _Op>
- struct _UnFunClos<_Expr,_Dom, _Op> : _UnFunBase<_Dom, _Op>
- {
- typedef _UnFunBase<_Dom, _Op> _Base;
- typedef typename _Base::value_type value_type;
-
- explicit _UnFunClos (const _Dom& __e) : _Base (__e) {}
- };
-
- template<typename _Tp, typename _Op>
- struct _UnFunClos<_ValArray,_Tp, _Op> : _UnFunBase<valarray<_Tp>, _Op>
- {
- typedef _UnFunBase<valarray<_Tp>, _Op> _Base;
- typedef typename _Base::value_type value_type;
-
- explicit _UnFunClos (const valarray<_Tp>& __v) : _Base (__v) {}
- };
-
//
// Binary function application closure.
//
// Unary expression closure.
//
- template<template<class> class _Oper, typename _Arg>
- class _UnBase {
+ template<class _Oper, class _Arg>
+ class _UnBase
+ {
public:
- typedef _Oper<typename _Arg::value_type> _Op;
- typedef typename _Op::result_type value_type;
+ typedef typename _Arg::value_type _Vt;
+ typedef typename __fun<_Oper, _Vt>::result_type value_type;
- _UnBase (const _Arg& __e) : _M_expr(__e) {}
- value_type operator[] (size_t) const;
- size_t size () const { return _M_expr.size (); }
+ _UnBase(const _Arg& __e) : _M_expr(__e) {}
+
+ value_type operator[](size_t __i) const
+ { return _M_expr[__i]; }
+
+ size_t size() const { return _M_expr.size(); }
private:
- const _Arg& _M_expr;
+ const _Arg& _M_expr;
};
- template<template<class> class _Oper, typename _Arg>
- inline typename _UnBase<_Oper, _Arg>::value_type
- _UnBase<_Oper, _Arg>::operator[] (size_t __i) const
- { return _Op() (_M_expr[__i]); }
-
- template<template<class> class _Oper, class _Dom>
- struct _UnClos<_Oper, _Expr, _Dom> : _UnBase<_Oper, _Dom> {
- typedef _Dom _Arg;
- typedef _UnBase<_Oper, _Dom> _Base;
- typedef typename _Base::value_type value_type;
-
- _UnClos (const _Arg& __e) : _Base(__e) {}
+ template<class _Oper, class _Dom>
+ struct _UnClos<_Oper, _Expr, _Dom> : _UnBase<_Oper, _Dom>
+ {
+ typedef _Dom _Arg;
+ typedef _UnBase<_Oper, _Dom> _Base;
+ typedef typename _Base::value_type value_type;
+
+ _UnClos(const _Arg& __e) : _Base(__e) {}
};
- template<template<class> class _Oper, typename _Tp>
- struct _UnClos<_Oper, _ValArray, _Tp> : _UnBase<_Oper, valarray<_Tp> > {
- typedef valarray<_Tp> _Arg;
- typedef _UnBase<_Oper, valarray<_Tp> > _Base;
- typedef typename _Base::value_type value_type;
-
- _UnClos (const _Arg& __e) : _Base(__e) {}
+ template<class _Oper, typename _Tp>
+ struct _UnClos<_Oper, _ValArray, _Tp> : _UnBase<_Oper, valarray<_Tp> >
+ {
+ typedef valarray<_Tp> _Arg;
+ typedef _UnBase<_Oper, valarray<_Tp> > _Base;
+ typedef typename _Base::value_type value_type;
+
+ _UnClos(const _Arg& __e) : _Base(__e) {}
};
: _Base (__a, __i) {}
};
- //
- // class _Expr
- //
- template<class _Clos, typename _Tp> class _Expr {
+ //
+ // class _Expr
+ //
+ template<class _Clos, typename _Tp>
+ class _Expr
+ {
public:
- typedef _Tp value_type;
-
- _Expr (const _Clos&);
-
- const _Clos& operator() () const;
+ typedef _Tp value_type;
+
+ _Expr(const _Clos&);
+
+ const _Clos& operator()() const;
- value_type operator[] (size_t) const;
- valarray<value_type> operator[] (slice) const;
- valarray<value_type> operator[] (const gslice&) const;
- valarray<value_type> operator[] (const valarray<bool>&) const;
- valarray<value_type> operator[] (const valarray<size_t>&) const;
+ value_type operator[](size_t) const;
+ valarray<value_type> operator[](slice) const;
+ valarray<value_type> operator[](const gslice&) const;
+ valarray<value_type> operator[](const valarray<bool>&) const;
+ valarray<value_type> operator[](const valarray<size_t>&) const;
- _Expr<_UnClos<_Unary_plus,std::_Expr,_Clos>, value_type>
- operator+ () const;
+ _Expr<_UnClos<__unary_plus,std::_Expr,_Clos>, value_type>
+ operator+() const;
- _Expr<_UnClos<negate,std::_Expr,_Clos>, value_type>
- operator- () const;
+ _Expr<_UnClos<__negate,std::_Expr,_Clos>, value_type>
+ operator-() const;
- _Expr<_UnClos<_Bitwise_not,std::_Expr,_Clos>, value_type>
- operator~ () const;
+ _Expr<_UnClos<__bitwise_not,std::_Expr,_Clos>, value_type>
+ operator~() const;
- _Expr<_UnClos<logical_not,std::_Expr,_Clos>, bool>
- operator! () const;
+ _Expr<_UnClos<__logical_not,std::_Expr,_Clos>, bool>
+ operator!() const;
- size_t size () const;
- value_type sum () const;
+ size_t size() const;
+ value_type sum() const;
- valarray<value_type> shift (int) const;
- valarray<value_type> cshift (int) const;
+ valarray<value_type> shift(int) const;
+ valarray<value_type> cshift(int) const;
value_type min() const;
value_type max() const;
- valarray<value_type> apply(value_type (*) (const value_type&)) const;
- valarray<value_type> apply(value_type (*) (value_type)) const;
+ valarray<value_type> apply(value_type (*)(const value_type&)) const;
+ valarray<value_type> apply(value_type (*)(value_type)) const;
private:
- const _Clos _M_closure;
+ const _Clos _M_closure;
};
- template<class _Clos, typename _Tp>
+ template<class _Clos, typename _Tp>
inline
- _Expr<_Clos,_Tp>::_Expr (const _Clos& __c) : _M_closure(__c) {}
+ _Expr<_Clos,_Tp>::_Expr(const _Clos& __c) : _M_closure(__c) {}
- template<class _Clos, typename _Tp>
+ template<class _Clos, typename _Tp>
inline const _Clos&
- _Expr<_Clos,_Tp>::operator() () const
+ _Expr<_Clos,_Tp>::operator()() const
{ return _M_closure; }
- template<class _Clos, typename _Tp>
+ template<class _Clos, typename _Tp>
inline _Tp
- _Expr<_Clos,_Tp>::operator[] (size_t __i) const
+ _Expr<_Clos,_Tp>::operator[](size_t __i) const
{ return _M_closure[__i]; }
- template<class _Clos, typename _Tp>
+ template<class _Clos, typename _Tp>
inline valarray<_Tp>
- _Expr<_Clos,_Tp>::operator[] (slice __s) const
+ _Expr<_Clos,_Tp>::operator[](slice __s) const
{ return _M_closure[__s]; }
- template<class _Clos, typename _Tp>
+ template<class _Clos, typename _Tp>
inline valarray<_Tp>
- _Expr<_Clos,_Tp>::operator[] (const gslice& __gs) const
+ _Expr<_Clos,_Tp>::operator[](const gslice& __gs) const
{ return _M_closure[__gs]; }
- template<class _Clos, typename _Tp>
+ template<class _Clos, typename _Tp>
inline valarray<_Tp>
- _Expr<_Clos,_Tp>::operator[] (const valarray<bool>& __m) const
+ _Expr<_Clos,_Tp>::operator[](const valarray<bool>& __m) const
{ return _M_closure[__m]; }
- template<class _Clos, typename _Tp>
+ template<class _Clos, typename _Tp>
inline valarray<_Tp>
- _Expr<_Clos,_Tp>::operator[] (const valarray<size_t>& __i) const
+ _Expr<_Clos,_Tp>::operator[](const valarray<size_t>& __i) const
{ return _M_closure[__i]; }
- template<class _Clos, typename _Tp>
+ template<class _Clos, typename _Tp>
inline size_t
- _Expr<_Clos,_Tp>::size () const { return _M_closure.size (); }
+ _Expr<_Clos,_Tp>::size() const { return _M_closure.size (); }
template<class _Clos, typename _Tp>
- inline valarray<_Tp>
- _Expr<_Clos, _Tp>::shift(int __n) const
- { return valarray<_Tp>(_M_closure).shift(__n); }
+ inline valarray<_Tp>
+ _Expr<_Clos, _Tp>::shift(int __n) const
+ { return valarray<_Tp>(_M_closure).shift(__n); }
template<class _Clos, typename _Tp>
- inline valarray<_Tp>
- _Expr<_Clos, _Tp>::cshift(int __n) const
- { return valarray<_Tp>(_M_closure).cshift(__n); }
+ inline valarray<_Tp>
+ _Expr<_Clos, _Tp>::cshift(int __n) const
+ { return valarray<_Tp>(_M_closure).cshift(__n); }
template<class _Clos, typename _Tp>
- inline valarray<_Tp>
- _Expr<_Clos, _Tp>::apply(_Tp __f(const _Tp&)) const
- { return valarray<_Tp>(_M_closure).apply(__f); }
+ inline valarray<_Tp>
+ _Expr<_Clos, _Tp>::apply(_Tp __f(const _Tp&)) const
+ { return valarray<_Tp>(_M_closure).apply(__f); }
template<class _Clos, typename _Tp>
- inline valarray<_Tp>
- _Expr<_Clos, _Tp>::apply(_Tp __f(_Tp)) const
- { return valarray<_Tp>(_M_closure).apply(__f); }
+ inline valarray<_Tp>
+ _Expr<_Clos, _Tp>::apply(_Tp __f(_Tp)) const
+ { return valarray<_Tp>(_M_closure).apply(__f); }
- // XXX: replace this with a more robust summation algorithm.
- template<class _Clos, typename _Tp>
+ // XXX: replace this with a more robust summation algorithm.
+ template<class _Clos, typename _Tp>
inline _Tp
- _Expr<_Clos,_Tp>::sum () const
+ _Expr<_Clos,_Tp>::sum() const
{
- size_t __n = _M_closure.size();
- if (__n == 0) return _Tp();
- else {
- _Tp __s = _M_closure[--__n];
- while (__n != 0) __s += _M_closure[--__n];
- return __s;
+ size_t __n = _M_closure.size();
+ if (__n == 0)
+ return _Tp();
+ else
+ {
+ _Tp __s = _M_closure[--__n];
+ while (__n != 0)
+ __s += _M_closure[--__n];
+ return __s;
}
}
template<class _Clos, typename _Tp>
- inline _Tp
- _Expr<_Clos, _Tp>::min() const
- { return __valarray_min(_M_closure); }
+ inline _Tp
+ _Expr<_Clos, _Tp>::min() const
+ { return __valarray_min(_M_closure); }
template<class _Clos, typename _Tp>
- inline _Tp
- _Expr<_Clos, _Tp>::max() const
- { return __valarray_max(_M_closure); }
+ inline _Tp
+ _Expr<_Clos, _Tp>::max() const
+ { return __valarray_max(_M_closure); }
- template<class _Dom, typename _Tp>
- inline _Expr<_UnClos<logical_not,_Expr,_Dom>, bool>
- _Expr<_Dom,_Tp>::operator! () const
+ template<class _Dom, typename _Tp>
+ inline _Expr<_UnClos<__logical_not,_Expr,_Dom>, bool>
+ _Expr<_Dom,_Tp>::operator!() const
{
- typedef _UnClos<logical_not,std::_Expr,_Dom> _Closure;
- return _Expr<_Closure,_Tp> (_Closure(this->_M_closure));
+ typedef _UnClos<__logical_not,std::_Expr,_Dom> _Closure;
+ return _Expr<_Closure,_Tp>(_Closure(this->_M_closure));
}
#define _DEFINE_EXPR_UNARY_OPERATOR(_Op, _Name) \
template<class _Dom, typename _Tp> \
inline _Expr<_UnClos<_Name,std::_Expr,_Dom>,_Tp> \
-_Expr<_Dom,_Tp>::operator _Op () const \
+_Expr<_Dom,_Tp>::operator _Op() const \
{ \
typedef _UnClos<_Name,std::_Expr,_Dom> _Closure; \
- return _Expr<_Closure,_Tp> (_Closure (this->_M_closure)); \
+ return _Expr<_Closure,_Tp>(_Closure(this->_M_closure)); \
}
- _DEFINE_EXPR_UNARY_OPERATOR(+, _Unary_plus)
- _DEFINE_EXPR_UNARY_OPERATOR(-, negate)
- _DEFINE_EXPR_UNARY_OPERATOR(~, _Bitwise_not)
+ _DEFINE_EXPR_UNARY_OPERATOR(+, __unary_plus)
+ _DEFINE_EXPR_UNARY_OPERATOR(-, __negate)
+ _DEFINE_EXPR_UNARY_OPERATOR(~, __bitwise_not)
#undef _DEFINE_EXPR_UNARY_OPERATOR
#define _DEFINE_EXPR_UNARY_FUNCTION(_Name) \
template<class _Dom> \
-inline _Expr<_UnFunClos<_Expr,_Dom,__##_Name>,typename _Dom::value_type>\
+inline _Expr<_UnClos<__##_Name,_Expr,_Dom>,typename _Dom::value_type> \
_Name(const _Expr<_Dom,typename _Dom::value_type>& __e) \
{ \
typedef typename _Dom::value_type _Tp; \
- typedef _UnFunClos<_Expr,_Dom,__##_Name> _Closure; \
+ typedef _UnClos<__##_Name,_Expr,_Dom> _Closure; \
return _Expr<_Closure,_Tp>(_Closure(__e())); \
} \
\
template<typename _Tp> \
-inline _Expr<_UnFunClos<_ValArray,_Tp,__##_Name>,_Tp> \
+inline _Expr<_UnClos<__##_Name,_ValArray,_Tp>,_Tp> \
_Name(const valarray<_Tp>& __v) \
{ \
- typedef _UnFunClos<_ValArray,_Tp,__##_Name> _Closure; \
+ typedef _UnClos<__##_Name,_ValArray,_Tp> _Closure; \
return _Expr<_Closure,_Tp>(_Closure (__v)); \
}
namespace std
{
- template<class _Clos, typename _Tp> class _Expr;
+ template<class _Clos, typename _Tp>
+ class _Expr;
- template<typename _Tp1, typename _Tp2> class _ValArray;
+ template<typename _Tp1, typename _Tp2>
+ class _ValArray;
- template<template<class> class _Oper,
- template<class, class> class _Meta, class _Dom> struct _UnClos;
+ template<class _Oper, template<class, class> class _Meta, class _Dom>
+ struct _UnClos;
- template<template<class> class _Oper,
+ template<template<class> class _Oper,
template<class, class> class _Meta1,
template<class, class> class _Meta2,
- class _Dom1, class _Dom2> class _BinClos;
+ class _Dom1, class _Dom2>
+ class _BinClos;
- template<template<class, class> class _Meta, class _Dom> class _SClos;
+ template<template<class, class> class _Meta, class _Dom>
+ class _SClos;
- template<template<class, class> class _Meta, class _Dom> class _GClos;
+ template<template<class, class> class _Meta, class _Dom>
+ class _GClos;
- template<template<class, class> class _Meta, class _Dom> class _IClos;
+ template<template<class, class> class _Meta, class _Dom>
+ class _IClos;
- template<template<class, class> class _Meta, class _Dom> class _ValFunClos;
-
- template<template<class, class> class _Meta, class _Dom> class _RefFunClos;
-
- template<class _Tp> struct _Unary_plus;
- template<class _Tp> struct _Bitwise_and;
- template<class _Tp> struct _Bitwise_or;
- template<class _Tp> struct _Bitwise_xor;
- template<class _Tp> struct _Bitwise_not;
- template<class _Tp> struct _Shift_left;
- template<class _Tp> struct _Shift_right;
+ template<template<class, class> class _Meta, class _Dom>
+ class _ValFunClos;
- template<class _Tp> class valarray; // An array of type _Tp
- class slice; // BLAS-like slice out of an array
- template<class _Tp> class slice_array;
- class gslice; // generalized slice out of an array
- template<class _Tp> class gslice_array;
- template<class _Tp> class mask_array; // masked array
- template<class _Tp> class indirect_array; // indirected array
+ template<template<class, class> class _Meta, class _Dom>
+ class _RefFunClos;
+
+ template<class _Tp> struct _Bitwise_and;
+ template<class _Tp> struct _Bitwise_or;
+ template<class _Tp> struct _Bitwise_xor;
+ template<class _Tp> struct _Shift_left;
+ template<class _Tp> struct _Shift_right;
+
+ template<class _Tp> class valarray; // An array of type _Tp
+ class slice; // BLAS-like slice out of an array
+ template<class _Tp> class slice_array;
+ class gslice; // generalized slice out of an array
+ template<class _Tp> class gslice_array;
+ template<class _Tp> class mask_array; // masked array
+ template<class _Tp> class indirect_array; // indirected array
} // namespace std
namespace std
{
- template<class _Tp> class valarray
- {
- public:
+ template<class _Tp>
+ class valarray
+ {
+ template<class _Op>
+ struct _UnaryOp
+ {
+ typedef typename __fun<_Op, _Tp>::result_type __rt;
+ typedef _Expr<_UnClos<_Op, _ValArray, _Tp>, __rt> _Rt;
+ };
+ public:
typedef _Tp value_type;
-
- // _lib.valarray.cons_ construct/destroy:
+
+ // _lib.valarray.cons_ construct/destroy:
valarray();
explicit valarray(size_t);
valarray(const _Tp&, size_t);
valarray(const mask_array<_Tp>&);
valarray(const indirect_array<_Tp>&);
template<class _Dom>
- valarray(const _Expr<_Dom,_Tp>& __e);
- ~valarray();
+ valarray(const _Expr<_Dom,_Tp>& __e);
+ ~valarray();
// _lib.valarray.assign_ assignment:
valarray<_Tp>& operator=(const valarray<_Tp>&);
valarray<_Tp>& operator=(const indirect_array<_Tp>&);
template<class _Dom> valarray<_Tp>&
- operator= (const _Expr<_Dom,_Tp>&);
+ operator= (const _Expr<_Dom,_Tp>&);
// _lib.valarray.access_ element access:
// XXX: LWG to be resolved.
valarray<_Tp> operator[](const valarray<bool>&) const;
mask_array<_Tp> operator[](const valarray<bool>&);
_Expr<_IClos<_ValArray, _Tp>, _Tp>
- operator[](const valarray<size_t>&) const;
+ operator[](const valarray<size_t>&) const;
indirect_array<_Tp> operator[](const valarray<size_t>&);
// _lib.valarray.unary_ unary operators:
- _Expr<_UnClos<_Unary_plus,_ValArray,_Tp>,_Tp> operator+ () const;
- _Expr<_UnClos<negate,_ValArray,_Tp>,_Tp> operator- () const;
- _Expr<_UnClos<_Bitwise_not,_ValArray,_Tp>,_Tp> operator~ () const;
- _Expr<_UnClos<logical_not,_ValArray,_Tp>,bool> operator! () const;
-
+ typename _UnaryOp<__unary_plus>::_Rt operator+() const;
+ typename _UnaryOp<__negate>::_Rt operator-() const;
+ typename _UnaryOp<__bitwise_not>::_Rt operator~() const;
+ typename _UnaryOp<__logical_not>::_Rt operator!() const;
+
// _lib.valarray.cassign_ computed assignment:
- valarray<_Tp>& operator*= (const _Tp&);
- valarray<_Tp>& operator/= (const _Tp&);
- valarray<_Tp>& operator%= (const _Tp&);
- valarray<_Tp>& operator+= (const _Tp&);
- valarray<_Tp>& operator-= (const _Tp&);
- valarray<_Tp>& operator^= (const _Tp&);
- valarray<_Tp>& operator&= (const _Tp&);
- valarray<_Tp>& operator|= (const _Tp&);
+ valarray<_Tp>& operator*=(const _Tp&);
+ valarray<_Tp>& operator/=(const _Tp&);
+ valarray<_Tp>& operator%=(const _Tp&);
+ valarray<_Tp>& operator+=(const _Tp&);
+ valarray<_Tp>& operator-=(const _Tp&);
+ valarray<_Tp>& operator^=(const _Tp&);
+ valarray<_Tp>& operator&=(const _Tp&);
+ valarray<_Tp>& operator|=(const _Tp&);
valarray<_Tp>& operator<<=(const _Tp&);
valarray<_Tp>& operator>>=(const _Tp&);
- valarray<_Tp>& operator*= (const valarray<_Tp>&);
- valarray<_Tp>& operator/= (const valarray<_Tp>&);
- valarray<_Tp>& operator%= (const valarray<_Tp>&);
- valarray<_Tp>& operator+= (const valarray<_Tp>&);
- valarray<_Tp>& operator-= (const valarray<_Tp>&);
- valarray<_Tp>& operator^= (const valarray<_Tp>&);
- valarray<_Tp>& operator|= (const valarray<_Tp>&);
- valarray<_Tp>& operator&= (const valarray<_Tp>&);
+ valarray<_Tp>& operator*=(const valarray<_Tp>&);
+ valarray<_Tp>& operator/=(const valarray<_Tp>&);
+ valarray<_Tp>& operator%=(const valarray<_Tp>&);
+ valarray<_Tp>& operator+=(const valarray<_Tp>&);
+ valarray<_Tp>& operator-=(const valarray<_Tp>&);
+ valarray<_Tp>& operator^=(const valarray<_Tp>&);
+ valarray<_Tp>& operator|=(const valarray<_Tp>&);
+ valarray<_Tp>& operator&=(const valarray<_Tp>&);
valarray<_Tp>& operator<<=(const valarray<_Tp>&);
valarray<_Tp>& operator>>=(const valarray<_Tp>&);
template<class _Dom>
- valarray<_Tp>& operator*= (const _Expr<_Dom,_Tp>&);
+ valarray<_Tp>& operator*=(const _Expr<_Dom,_Tp>&);
template<class _Dom>
- valarray<_Tp>& operator/= (const _Expr<_Dom,_Tp>&);
+ valarray<_Tp>& operator/=(const _Expr<_Dom,_Tp>&);
template<class _Dom>
- valarray<_Tp>& operator%= (const _Expr<_Dom,_Tp>&);
+ valarray<_Tp>& operator%=(const _Expr<_Dom,_Tp>&);
template<class _Dom>
- valarray<_Tp>& operator+= (const _Expr<_Dom,_Tp>&);
+ valarray<_Tp>& operator+=(const _Expr<_Dom,_Tp>&);
template<class _Dom>
- valarray<_Tp>& operator-= (const _Expr<_Dom,_Tp>&);
+ valarray<_Tp>& operator-=(const _Expr<_Dom,_Tp>&);
template<class _Dom>
- valarray<_Tp>& operator^= (const _Expr<_Dom,_Tp>&);
+ valarray<_Tp>& operator^=(const _Expr<_Dom,_Tp>&);
template<class _Dom>
- valarray<_Tp>& operator|= (const _Expr<_Dom,_Tp>&);
+ valarray<_Tp>& operator|=(const _Expr<_Dom,_Tp>&);
template<class _Dom>
- valarray<_Tp>& operator&= (const _Expr<_Dom,_Tp>&);
+ valarray<_Tp>& operator&=(const _Expr<_Dom,_Tp>&);
template<class _Dom>
- valarray<_Tp>& operator<<=(const _Expr<_Dom,_Tp>&);
+ valarray<_Tp>& operator<<=(const _Expr<_Dom,_Tp>&);
template<class _Dom>
- valarray<_Tp>& operator>>=(const _Expr<_Dom,_Tp>&);
+ valarray<_Tp>& operator>>=(const _Expr<_Dom,_Tp>&);
+
-
// _lib.valarray.members_ member functions:
size_t size() const;
_Tp sum() const;
_Tp min() const;
_Tp max() const;
-// // FIXME: Extension
-// _Tp product () const;
+ // // FIXME: Extension
+ // _Tp product () const;
valarray<_Tp> shift (int) const;
valarray<_Tp> cshift(int) const;
_Expr<_RefFunClos<_ValArray,_Tp>,_Tp> apply(_Tp func(const _Tp&)) const;
void resize(size_t __size, _Tp __c = _Tp());
- private:
+ private:
size_t _M_size;
_Tp* __restrict__ _M_data;
-
+
friend class _Array<_Tp>;
- };
-
-
- template<typename _Tp> struct _Unary_plus : unary_function<_Tp,_Tp> {
- _Tp operator() (const _Tp& __t) const { return __t; }
- };
+ };
template<typename _Tp> struct _Bitwise_and : binary_function<_Tp,_Tp,_Tp> {
_Tp operator() (_Tp __x, _Tp __y) const { return __x & __y; }
_Tp operator() (_Tp __x, _Tp __y) const { return __x ^ __y; }
};
- template<typename _Tp> struct _Bitwise_not : unary_function<_Tp,_Tp> {
- _Tp operator() (_Tp __t) const { return ~__t; }
- };
-
template<typename _Tp> struct _Shift_left : unary_function<_Tp,_Tp> {
_Tp operator() (_Tp __x, _Tp __y) const { return __x << __y; }
};
template<typename _Tp>
- inline const _Tp&
- valarray<_Tp>::operator[] (size_t __i) const
- { return _M_data[__i]; }
+ inline const _Tp&
+ valarray<_Tp>::operator[](size_t __i) const
+ { return _M_data[__i]; }
template<typename _Tp>
- inline _Tp&
- valarray<_Tp>::operator[] (size_t __i)
- { return _M_data[__i]; }
+ inline _Tp&
+ valarray<_Tp>::operator[](size_t __i)
+ { return _M_data[__i]; }
} // std::
namespace std
{
template<typename _Tp>
- inline valarray<_Tp>::valarray () : _M_size (0), _M_data (0) {}
+ inline
+ valarray<_Tp>::valarray() : _M_size(0), _M_data(0) {}
template<typename _Tp>
- inline valarray<_Tp>::valarray (size_t __n)
- : _M_size(__n), _M_data(__valarray_get_storage<_Tp>(__n))
- { __valarray_default_construct(_M_data, _M_data + __n); }
+ inline
+ valarray<_Tp>::valarray(size_t __n)
+ : _M_size(__n), _M_data(__valarray_get_storage<_Tp>(__n))
+ { __valarray_default_construct(_M_data, _M_data + __n); }
template<typename _Tp>
- inline valarray<_Tp>::valarray (const _Tp& __t, size_t __n)
- : _M_size(__n), _M_data(__valarray_get_storage<_Tp>(__n))
- { __valarray_fill_construct (_M_data, _M_data + __n, __t); }
+ inline
+ valarray<_Tp>::valarray(const _Tp& __t, size_t __n)
+ : _M_size(__n), _M_data(__valarray_get_storage<_Tp>(__n))
+ { __valarray_fill_construct(_M_data, _M_data + __n, __t); }
template<typename _Tp>
- inline valarray<_Tp>::valarray (const _Tp* __restrict__ __p, size_t __n)
- : _M_size(__n), _M_data(__valarray_get_storage<_Tp>(__n))
- { __valarray_copy_construct (__p, __p + __n, _M_data); }
+ inline
+ valarray<_Tp>::valarray(const _Tp* __restrict__ __p, size_t __n)
+ : _M_size(__n), _M_data(__valarray_get_storage<_Tp>(__n))
+ { __valarray_copy_construct(__p, __p + __n, _M_data); }
template<typename _Tp>
- inline valarray<_Tp>::valarray (const valarray<_Tp>& __v)
- : _M_size(__v._M_size), _M_data(__valarray_get_storage<_Tp>(__v._M_size))
- { __valarray_copy_construct (__v._M_data, __v._M_data + _M_size, _M_data); }
+ inline
+ valarray<_Tp>::valarray(const valarray<_Tp>& __v)
+ : _M_size(__v._M_size), _M_data(__valarray_get_storage<_Tp>(__v._M_size))
+ { __valarray_copy_construct(__v._M_data, __v._M_data + _M_size, _M_data); }
template<typename _Tp>
- inline valarray<_Tp>::valarray (const slice_array<_Tp>& __sa)
- : _M_size(__sa._M_sz), _M_data(__valarray_get_storage<_Tp>(__sa._M_sz))
- {
- __valarray_copy
- (__sa._M_array, __sa._M_sz, __sa._M_stride, _Array<_Tp>(_M_data));
- }
+ inline
+ valarray<_Tp>::valarray(const slice_array<_Tp>& __sa)
+ : _M_size(__sa._M_sz), _M_data(__valarray_get_storage<_Tp>(__sa._M_sz))
+ {
+ __valarray_copy
+ (__sa._M_array, __sa._M_sz, __sa._M_stride, _Array<_Tp>(_M_data));
+ }
template<typename _Tp>
- inline valarray<_Tp>::valarray (const gslice_array<_Tp>& __ga)
- : _M_size(__ga._M_index.size()),
- _M_data(__valarray_get_storage<_Tp>(_M_size))
- {
- __valarray_copy
- (__ga._M_array, _Array<size_t>(__ga._M_index),
- _Array<_Tp>(_M_data), _M_size);
- }
+ inline
+ valarray<_Tp>::valarray(const gslice_array<_Tp>& __ga)
+ : _M_size(__ga._M_index.size()),
+ _M_data(__valarray_get_storage<_Tp>(_M_size))
+ {
+ __valarray_copy
+ (__ga._M_array, _Array<size_t>(__ga._M_index),
+ _Array<_Tp>(_M_data), _M_size);
+ }
template<typename _Tp>
- inline valarray<_Tp>::valarray (const mask_array<_Tp>& __ma)
- : _M_size(__ma._M_sz), _M_data(__valarray_get_storage<_Tp>(__ma._M_sz))
- {
- __valarray_copy
- (__ma._M_array, __ma._M_mask, _Array<_Tp>(_M_data), _M_size);
- }
+ inline
+ valarray<_Tp>::valarray(const mask_array<_Tp>& __ma)
+ : _M_size(__ma._M_sz), _M_data(__valarray_get_storage<_Tp>(__ma._M_sz))
+ {
+ __valarray_copy
+ (__ma._M_array, __ma._M_mask, _Array<_Tp>(_M_data), _M_size);
+ }
template<typename _Tp>
- inline valarray<_Tp>::valarray (const indirect_array<_Tp>& __ia)
- : _M_size(__ia._M_sz), _M_data(__valarray_get_storage<_Tp>(__ia._M_sz))
- {
- __valarray_copy
- (__ia._M_array, __ia._M_index, _Array<_Tp>(_M_data), _M_size);
- }
+ inline
+ valarray<_Tp>::valarray(const indirect_array<_Tp>& __ia)
+ : _M_size(__ia._M_sz), _M_data(__valarray_get_storage<_Tp>(__ia._M_sz))
+ {
+ __valarray_copy
+ (__ia._M_array, __ia._M_index, _Array<_Tp>(_M_data), _M_size);
+ }
template<typename _Tp> template<class _Dom>
- inline valarray<_Tp>::valarray (const _Expr<_Dom, _Tp>& __e)
- : _M_size(__e.size ()), _M_data(__valarray_get_storage<_Tp>(_M_size))
- { __valarray_copy (__e, _M_size, _Array<_Tp>(_M_data)); }
+ inline
+ valarray<_Tp>::valarray(const _Expr<_Dom, _Tp>& __e)
+ : _M_size(__e.size()), _M_data(__valarray_get_storage<_Tp>(_M_size))
+ { __valarray_copy(__e, _M_size, _Array<_Tp>(_M_data)); }
template<typename _Tp>
- inline valarray<_Tp>::~valarray ()
- {
+ inline
+ valarray<_Tp>::~valarray()
+ {
__valarray_destroy_elements(_M_data, _M_data + _M_size);
__valarray_release_memory(_M_data);
- }
+ }
template<typename _Tp>
- inline valarray<_Tp>&
- valarray<_Tp>::operator= (const valarray<_Tp>& __v)
- {
+ inline valarray<_Tp>&
+ valarray<_Tp>::operator=(const valarray<_Tp>& __v)
+ {
__valarray_copy(__v._M_data, _M_size, _M_data);
return *this;
- }
+ }
template<typename _Tp>
- inline valarray<_Tp>&
- valarray<_Tp>::operator= (const _Tp& __t)
- {
- __valarray_fill (_M_data, _M_size, __t);
+ inline valarray<_Tp>&
+ valarray<_Tp>::operator=(const _Tp& __t)
+ {
+ __valarray_fill(_M_data, _M_size, __t);
return *this;
- }
+ }
template<typename _Tp>
- inline valarray<_Tp>&
- valarray<_Tp>::operator= (const slice_array<_Tp>& __sa)
- {
- __valarray_copy (__sa._M_array, __sa._M_sz,
- __sa._M_stride, _Array<_Tp>(_M_data));
+ inline valarray<_Tp>&
+ valarray<_Tp>::operator=(const slice_array<_Tp>& __sa)
+ {
+ __valarray_copy(__sa._M_array, __sa._M_sz,
+ __sa._M_stride, _Array<_Tp>(_M_data));
return *this;
- }
+ }
template<typename _Tp>
- inline valarray<_Tp>&
- valarray<_Tp>::operator= (const gslice_array<_Tp>& __ga)
- {
- __valarray_copy (__ga._M_array, _Array<size_t>(__ga._M_index),
- _Array<_Tp>(_M_data), _M_size);
+ inline valarray<_Tp>&
+ valarray<_Tp>::operator=(const gslice_array<_Tp>& __ga)
+ {
+ __valarray_copy(__ga._M_array, _Array<size_t>(__ga._M_index),
+ _Array<_Tp>(_M_data), _M_size);
return *this;
- }
+ }
template<typename _Tp>
- inline valarray<_Tp>&
- valarray<_Tp>::operator= (const mask_array<_Tp>& __ma)
- {
- __valarray_copy (__ma._M_array, __ma._M_mask,
- _Array<_Tp>(_M_data), _M_size);
+ inline valarray<_Tp>&
+ valarray<_Tp>::operator=(const mask_array<_Tp>& __ma)
+ {
+ __valarray_copy(__ma._M_array, __ma._M_mask,
+ _Array<_Tp>(_M_data), _M_size);
return *this;
- }
+ }
template<typename _Tp>
- inline valarray<_Tp>&
- valarray<_Tp>::operator= (const indirect_array<_Tp>& __ia)
- {
- __valarray_copy (__ia._M_array, __ia._M_index,
- _Array<_Tp>(_M_data), _M_size);
+ inline valarray<_Tp>&
+ valarray<_Tp>::operator=(const indirect_array<_Tp>& __ia)
+ {
+ __valarray_copy(__ia._M_array, __ia._M_index,
+ _Array<_Tp>(_M_data), _M_size);
return *this;
- }
+ }
template<typename _Tp> template<class _Dom>
- inline valarray<_Tp>&
- valarray<_Tp>::operator= (const _Expr<_Dom, _Tp>& __e)
- {
- __valarray_copy (__e, _M_size, _Array<_Tp>(_M_data));
- return *this;
- }
+ inline valarray<_Tp>&
+ valarray<_Tp>::operator=(const _Expr<_Dom, _Tp>& __e)
+ {
+ __valarray_copy(__e, _M_size, _Array<_Tp>(_M_data));
+ return *this;
+ }
template<typename _Tp>
- inline _Expr<_SClos<_ValArray,_Tp>, _Tp>
- valarray<_Tp>::operator[] (slice __s) const
- {
+ inline _Expr<_SClos<_ValArray,_Tp>, _Tp>
+ valarray<_Tp>::operator[](slice __s) const
+ {
typedef _SClos<_ValArray,_Tp> _Closure;
- return _Expr<_Closure, _Tp> (_Closure (_Array<_Tp>(_M_data), __s));
- }
+ return _Expr<_Closure, _Tp>(_Closure (_Array<_Tp>(_M_data), __s));
+ }
template<typename _Tp>
- inline slice_array<_Tp>
- valarray<_Tp>::operator[] (slice __s)
- {
- return slice_array<_Tp> (_Array<_Tp>(_M_data), __s);
- }
+ inline slice_array<_Tp>
+ valarray<_Tp>::operator[](slice __s)
+ {
+ return slice_array<_Tp>(_Array<_Tp>(_M_data), __s);
+ }
template<typename _Tp>
- inline _Expr<_GClos<_ValArray,_Tp>, _Tp>
- valarray<_Tp>::operator[] (const gslice& __gs) const
- {
+ inline _Expr<_GClos<_ValArray,_Tp>, _Tp>
+ valarray<_Tp>::operator[](const gslice& __gs) const
+ {
typedef _GClos<_ValArray,_Tp> _Closure;
return _Expr<_Closure, _Tp>
- (_Closure (_Array<_Tp>(_M_data), __gs._M_index->_M_index));
- }
+ (_Closure(_Array<_Tp>(_M_data), __gs._M_index->_M_index));
+ }
template<typename _Tp>
- inline gslice_array<_Tp>
- valarray<_Tp>::operator[] (const gslice& __gs)
- {
+ inline gslice_array<_Tp>
+ valarray<_Tp>::operator[](const gslice& __gs)
+ {
return gslice_array<_Tp>
- (_Array<_Tp>(_M_data), __gs._M_index->_M_index);
- }
+ (_Array<_Tp>(_M_data), __gs._M_index->_M_index);
+ }
template<typename _Tp>
- inline valarray<_Tp>
- valarray<_Tp>::operator[] (const valarray<bool>& __m) const
- {
- size_t __s (0);
- size_t __e (__m.size ());
+ inline valarray<_Tp>
+ valarray<_Tp>::operator[](const valarray<bool>& __m) const
+ {
+ size_t __s = 0;
+ size_t __e = __m.size();
for (size_t __i=0; __i<__e; ++__i)
- if (__m[__i]) ++__s;
- return valarray<_Tp> (mask_array<_Tp> (_Array<_Tp>(_M_data), __s,
- _Array<bool> (__m)));
- }
+ if (__m[__i]) ++__s;
+ return valarray<_Tp>(mask_array<_Tp>(_Array<_Tp>(_M_data), __s,
+ _Array<bool> (__m)));
+ }
template<typename _Tp>
- inline mask_array<_Tp>
- valarray<_Tp>::operator[] (const valarray<bool>& __m)
- {
- size_t __s (0);
- size_t __e (__m.size ());
+ inline mask_array<_Tp>
+ valarray<_Tp>::operator[](const valarray<bool>& __m)
+ {
+ size_t __s = 0;
+ size_t __e = __m.size();
for (size_t __i=0; __i<__e; ++__i)
- if (__m[__i]) ++__s;
- return mask_array<_Tp> (_Array<_Tp>(_M_data), __s, _Array<bool> (__m));
- }
+ if (__m[__i]) ++__s;
+ return mask_array<_Tp>(_Array<_Tp>(_M_data), __s, _Array<bool>(__m));
+ }
template<typename _Tp>
- inline _Expr<_IClos<_ValArray,_Tp>, _Tp>
- valarray<_Tp>::operator[] (const valarray<size_t>& __i) const
- {
+ inline _Expr<_IClos<_ValArray,_Tp>, _Tp>
+ valarray<_Tp>::operator[](const valarray<size_t>& __i) const
+ {
typedef _IClos<_ValArray,_Tp> _Closure;
- return _Expr<_Closure, _Tp> (_Closure (*this, __i));
- }
+ return _Expr<_Closure, _Tp>(_Closure(*this, __i));
+ }
template<typename _Tp>
- inline indirect_array<_Tp>
- valarray<_Tp>::operator[] (const valarray<size_t>& __i)
- {
- return indirect_array<_Tp> (_Array<_Tp>(_M_data), __i.size(),
- _Array<size_t> (__i));
- }
+ inline indirect_array<_Tp>
+ valarray<_Tp>::operator[](const valarray<size_t>& __i)
+ {
+ return indirect_array<_Tp>(_Array<_Tp>(_M_data), __i.size(),
+ _Array<size_t>(__i));
+ }
template<class _Tp>
- inline size_t valarray<_Tp>::size () const { return _M_size; }
+ inline size_t
+ valarray<_Tp>::size() const
+ { return _M_size; }
template<class _Tp>
- inline _Tp
- valarray<_Tp>::sum () const
- {
- return __valarray_sum(_M_data, _M_data + _M_size);
- }
+ inline _Tp
+ valarray<_Tp>::sum() const
+ {
+ return __valarray_sum(_M_data, _M_data + _M_size);
+ }
// template<typename _Tp>
// inline _Tp
}
template <class _Tp>
- inline void
- valarray<_Tp>::resize (size_t __n, _Tp __c)
- {
- // This complication is so to make valarray<valarray<T> > work
- // even though it is not required by the standard. Nobody should
- // be saying valarray<valarray<T> > anyway. See the specs.
- __valarray_destroy_elements(_M_data, _M_data + _M_size);
- if (_M_size != __n)
- {
- __valarray_release_memory(_M_data);
- _M_size = __n;
- _M_data = __valarray_get_storage<_Tp>(__n);
- }
- __valarray_fill_construct(_M_data, _M_data + __n, __c);
- }
+ inline void
+ valarray<_Tp>::resize (size_t __n, _Tp __c)
+ {
+ // This complication is so to make valarray<valarray<T> > work
+ // even though it is not required by the standard. Nobody should
+ // be saying valarray<valarray<T> > anyway. See the specs.
+ __valarray_destroy_elements(_M_data, _M_data + _M_size);
+ if (_M_size != __n)
+ {
+ __valarray_release_memory(_M_data);
+ _M_size = __n;
+ _M_data = __valarray_get_storage<_Tp>(__n);
+ }
+ __valarray_fill_construct(_M_data, _M_data + __n, __c);
+ }
template<typename _Tp>
- inline _Tp
- valarray<_Tp>::min() const
- {
+ inline _Tp
+ valarray<_Tp>::min() const
+ {
return *min_element (_M_data, _M_data+_M_size);
- }
+ }
template<typename _Tp>
- inline _Tp
- valarray<_Tp>::max() const
- {
+ inline _Tp
+ valarray<_Tp>::max() const
+ {
return *max_element (_M_data, _M_data+_M_size);
- }
+ }
template<class _Tp>
- inline _Expr<_ValFunClos<_ValArray,_Tp>,_Tp>
- valarray<_Tp>::apply (_Tp func (_Tp)) const
- {
+ inline _Expr<_ValFunClos<_ValArray,_Tp>,_Tp>
+ valarray<_Tp>::apply(_Tp func(_Tp)) const
+ {
typedef _ValFunClos<_ValArray,_Tp> _Closure;
- return _Expr<_Closure,_Tp> (_Closure (*this, func));
- }
+ return _Expr<_Closure,_Tp>(_Closure(*this, func));
+ }
template<class _Tp>
- inline _Expr<_RefFunClos<_ValArray,_Tp>,_Tp>
- valarray<_Tp>::apply (_Tp func (const _Tp &)) const
- {
+ inline _Expr<_RefFunClos<_ValArray,_Tp>,_Tp>
+ valarray<_Tp>::apply(_Tp func(const _Tp &)) const
+ {
typedef _RefFunClos<_ValArray,_Tp> _Closure;
- return _Expr<_Closure,_Tp> (_Closure (*this, func));
- }
+ return _Expr<_Closure,_Tp>(_Closure(*this, func));
+ }
#define _DEFINE_VALARRAY_UNARY_OPERATOR(_Op, _Name) \
template<typename _Tp> \
- inline _Expr<_UnClos<_Name,_ValArray,_Tp>, _Tp> \
+ inline typename valarray<_Tp>::template _UnaryOp<_Name>::_Rt \
valarray<_Tp>::operator _Op() const \
{ \
- typedef _UnClos<_Name,_ValArray,_Tp> _Closure; \
- return _Expr<_Closure, _Tp> (_Closure (*this)); \
+ typedef _UnClos<_Name,_ValArray,_Tp> _Closure; \
+ typedef typename __fun<_Name, _Tp>::result_type _Rt; \
+ return _Expr<_Closure, _Rt>(_Closure(*this)); \
}
- _DEFINE_VALARRAY_UNARY_OPERATOR(+, _Unary_plus)
- _DEFINE_VALARRAY_UNARY_OPERATOR(-, negate)
- _DEFINE_VALARRAY_UNARY_OPERATOR(~, _Bitwise_not)
+ _DEFINE_VALARRAY_UNARY_OPERATOR(+, __unary_plus)
+ _DEFINE_VALARRAY_UNARY_OPERATOR(-, __negate)
+ _DEFINE_VALARRAY_UNARY_OPERATOR(~, __bitwise_not)
+ _DEFINE_VALARRAY_UNARY_OPERATOR (!, __logical_not)
#undef _DEFINE_VALARRAY_UNARY_OPERATOR
-
- template<typename _Tp>
- inline _Expr<_UnClos<logical_not,_ValArray,_Tp>, bool>
- valarray<_Tp>::operator!() const
- {
- typedef _UnClos<logical_not,_ValArray,_Tp> _Closure;
- return _Expr<_Closure, bool> (_Closure (*this));
- }
#define _DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(_Op, _Name) \
template<class _Tp> \