1*e4b17023SJohn Marino // The template and inlines for the -*- C++ -*- internal _Meta class. 2*e4b17023SJohn Marino 3*e4b17023SJohn Marino // Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 4*e4b17023SJohn Marino // 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. 5*e4b17023SJohn Marino // 6*e4b17023SJohn Marino // This file is part of the GNU ISO C++ Library. This library is free 7*e4b17023SJohn Marino // software; you can redistribute it and/or modify it under the 8*e4b17023SJohn Marino // terms of the GNU General Public License as published by the 9*e4b17023SJohn Marino // Free Software Foundation; either version 3, or (at your option) 10*e4b17023SJohn Marino // any later version. 11*e4b17023SJohn Marino 12*e4b17023SJohn Marino // This library is distributed in the hope that it will be useful, 13*e4b17023SJohn Marino // but WITHOUT ANY WARRANTY; without even the implied warranty of 14*e4b17023SJohn Marino // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15*e4b17023SJohn Marino // GNU General Public License for more details. 16*e4b17023SJohn Marino 17*e4b17023SJohn Marino // Under Section 7 of GPL version 3, you are granted additional 18*e4b17023SJohn Marino // permissions described in the GCC Runtime Library Exception, version 19*e4b17023SJohn Marino // 3.1, as published by the Free Software Foundation. 20*e4b17023SJohn Marino 21*e4b17023SJohn Marino // You should have received a copy of the GNU General Public License and 22*e4b17023SJohn Marino // a copy of the GCC Runtime Library Exception along with this program; 23*e4b17023SJohn Marino // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 24*e4b17023SJohn Marino // <http://www.gnu.org/licenses/>. 25*e4b17023SJohn Marino 26*e4b17023SJohn Marino /** @file bits/valarray_after.h 27*e4b17023SJohn Marino * This is an internal header file, included by other library headers. 28*e4b17023SJohn Marino * Do not attempt to use it directly. @headername{valarray} 29*e4b17023SJohn Marino */ 30*e4b17023SJohn Marino 31*e4b17023SJohn Marino // Written by Gabriel Dos Reis <Gabriel.Dos-Reis@cmla.ens-cachan.fr> 32*e4b17023SJohn Marino 33*e4b17023SJohn Marino #ifndef _VALARRAY_AFTER_H 34*e4b17023SJohn Marino #define _VALARRAY_AFTER_H 1 35*e4b17023SJohn Marino 36*e4b17023SJohn Marino #pragma GCC system_header 37*e4b17023SJohn Marino 38*e4b17023SJohn Marino namespace std _GLIBCXX_VISIBILITY(default) 39*e4b17023SJohn Marino { 40*e4b17023SJohn Marino _GLIBCXX_BEGIN_NAMESPACE_VERSION 41*e4b17023SJohn Marino 42*e4b17023SJohn Marino // 43*e4b17023SJohn Marino // gslice_array closure. 44*e4b17023SJohn Marino // 45*e4b17023SJohn Marino template<class _Dom> 46*e4b17023SJohn Marino class _GBase 47*e4b17023SJohn Marino { 48*e4b17023SJohn Marino public: 49*e4b17023SJohn Marino typedef typename _Dom::value_type value_type; 50*e4b17023SJohn Marino 51*e4b17023SJohn Marino _GBase (const _Dom& __e, const valarray<size_t>& __i) 52*e4b17023SJohn Marino : _M_expr (__e), _M_index(__i) {} 53*e4b17023SJohn Marino 54*e4b17023SJohn Marino value_type 55*e4b17023SJohn Marino operator[] (size_t __i) const 56*e4b17023SJohn Marino { return _M_expr[_M_index[__i]]; } 57*e4b17023SJohn Marino 58*e4b17023SJohn Marino size_t 59*e4b17023SJohn Marino size () const 60*e4b17023SJohn Marino { return _M_index.size(); } 61*e4b17023SJohn Marino 62*e4b17023SJohn Marino private: 63*e4b17023SJohn Marino const _Dom& _M_expr; 64*e4b17023SJohn Marino const valarray<size_t>& _M_index; 65*e4b17023SJohn Marino }; 66*e4b17023SJohn Marino 67*e4b17023SJohn Marino template<typename _Tp> 68*e4b17023SJohn Marino class _GBase<_Array<_Tp> > 69*e4b17023SJohn Marino { 70*e4b17023SJohn Marino public: 71*e4b17023SJohn Marino typedef _Tp value_type; 72*e4b17023SJohn Marino 73*e4b17023SJohn Marino _GBase (_Array<_Tp> __a, const valarray<size_t>& __i) 74*e4b17023SJohn Marino : _M_array (__a), _M_index(__i) {} 75*e4b17023SJohn Marino 76*e4b17023SJohn Marino value_type 77*e4b17023SJohn Marino operator[] (size_t __i) const 78*e4b17023SJohn Marino { return _M_array._M_data[_M_index[__i]]; } 79*e4b17023SJohn Marino 80*e4b17023SJohn Marino size_t 81*e4b17023SJohn Marino size () const 82*e4b17023SJohn Marino { return _M_index.size(); } 83*e4b17023SJohn Marino 84*e4b17023SJohn Marino private: 85*e4b17023SJohn Marino const _Array<_Tp> _M_array; 86*e4b17023SJohn Marino const valarray<size_t>& _M_index; 87*e4b17023SJohn Marino }; 88*e4b17023SJohn Marino 89*e4b17023SJohn Marino template<class _Dom> 90*e4b17023SJohn Marino struct _GClos<_Expr, _Dom> 91*e4b17023SJohn Marino : _GBase<_Dom> 92*e4b17023SJohn Marino { 93*e4b17023SJohn Marino typedef _GBase<_Dom> _Base; 94*e4b17023SJohn Marino typedef typename _Base::value_type value_type; 95*e4b17023SJohn Marino 96*e4b17023SJohn Marino _GClos (const _Dom& __e, const valarray<size_t>& __i) 97*e4b17023SJohn Marino : _Base (__e, __i) {} 98*e4b17023SJohn Marino }; 99*e4b17023SJohn Marino 100*e4b17023SJohn Marino template<typename _Tp> 101*e4b17023SJohn Marino struct _GClos<_ValArray, _Tp> 102*e4b17023SJohn Marino : _GBase<_Array<_Tp> > 103*e4b17023SJohn Marino { 104*e4b17023SJohn Marino typedef _GBase<_Array<_Tp> > _Base; 105*e4b17023SJohn Marino typedef typename _Base::value_type value_type; 106*e4b17023SJohn Marino 107*e4b17023SJohn Marino _GClos (_Array<_Tp> __a, const valarray<size_t>& __i) 108*e4b17023SJohn Marino : _Base (__a, __i) {} 109*e4b17023SJohn Marino }; 110*e4b17023SJohn Marino 111*e4b17023SJohn Marino // 112*e4b17023SJohn Marino // indirect_array closure 113*e4b17023SJohn Marino // 114*e4b17023SJohn Marino template<class _Dom> 115*e4b17023SJohn Marino class _IBase 116*e4b17023SJohn Marino { 117*e4b17023SJohn Marino public: 118*e4b17023SJohn Marino typedef typename _Dom::value_type value_type; 119*e4b17023SJohn Marino 120*e4b17023SJohn Marino _IBase (const _Dom& __e, const valarray<size_t>& __i) 121*e4b17023SJohn Marino : _M_expr (__e), _M_index (__i) {} 122*e4b17023SJohn Marino 123*e4b17023SJohn Marino value_type 124*e4b17023SJohn Marino operator[] (size_t __i) const 125*e4b17023SJohn Marino { return _M_expr[_M_index[__i]]; } 126*e4b17023SJohn Marino 127*e4b17023SJohn Marino size_t 128*e4b17023SJohn Marino size() const 129*e4b17023SJohn Marino { return _M_index.size(); } 130*e4b17023SJohn Marino 131*e4b17023SJohn Marino private: 132*e4b17023SJohn Marino const _Dom& _M_expr; 133*e4b17023SJohn Marino const valarray<size_t>& _M_index; 134*e4b17023SJohn Marino }; 135*e4b17023SJohn Marino 136*e4b17023SJohn Marino template<class _Dom> 137*e4b17023SJohn Marino struct _IClos<_Expr, _Dom> 138*e4b17023SJohn Marino : _IBase<_Dom> 139*e4b17023SJohn Marino { 140*e4b17023SJohn Marino typedef _IBase<_Dom> _Base; 141*e4b17023SJohn Marino typedef typename _Base::value_type value_type; 142*e4b17023SJohn Marino 143*e4b17023SJohn Marino _IClos (const _Dom& __e, const valarray<size_t>& __i) 144*e4b17023SJohn Marino : _Base (__e, __i) {} 145*e4b17023SJohn Marino }; 146*e4b17023SJohn Marino 147*e4b17023SJohn Marino template<typename _Tp> 148*e4b17023SJohn Marino struct _IClos<_ValArray, _Tp> 149*e4b17023SJohn Marino : _IBase<valarray<_Tp> > 150*e4b17023SJohn Marino { 151*e4b17023SJohn Marino typedef _IBase<valarray<_Tp> > _Base; 152*e4b17023SJohn Marino typedef _Tp value_type; 153*e4b17023SJohn Marino 154*e4b17023SJohn Marino _IClos (const valarray<_Tp>& __a, const valarray<size_t>& __i) 155*e4b17023SJohn Marino : _Base (__a, __i) {} 156*e4b17023SJohn Marino }; 157*e4b17023SJohn Marino 158*e4b17023SJohn Marino // 159*e4b17023SJohn Marino // class _Expr 160*e4b17023SJohn Marino // 161*e4b17023SJohn Marino template<class _Clos, typename _Tp> 162*e4b17023SJohn Marino class _Expr 163*e4b17023SJohn Marino { 164*e4b17023SJohn Marino public: 165*e4b17023SJohn Marino typedef _Tp value_type; 166*e4b17023SJohn Marino 167*e4b17023SJohn Marino _Expr(const _Clos&); 168*e4b17023SJohn Marino 169*e4b17023SJohn Marino const _Clos& operator()() const; 170*e4b17023SJohn Marino 171*e4b17023SJohn Marino value_type operator[](size_t) const; 172*e4b17023SJohn Marino valarray<value_type> operator[](slice) const; 173*e4b17023SJohn Marino valarray<value_type> operator[](const gslice&) const; 174*e4b17023SJohn Marino valarray<value_type> operator[](const valarray<bool>&) const; 175*e4b17023SJohn Marino valarray<value_type> operator[](const valarray<size_t>&) const; 176*e4b17023SJohn Marino 177*e4b17023SJohn Marino _Expr<_UnClos<__unary_plus, std::_Expr, _Clos>, value_type> 178*e4b17023SJohn Marino operator+() const; 179*e4b17023SJohn Marino 180*e4b17023SJohn Marino _Expr<_UnClos<__negate, std::_Expr, _Clos>, value_type> 181*e4b17023SJohn Marino operator-() const; 182*e4b17023SJohn Marino 183*e4b17023SJohn Marino _Expr<_UnClos<__bitwise_not, std::_Expr, _Clos>, value_type> 184*e4b17023SJohn Marino operator~() const; 185*e4b17023SJohn Marino 186*e4b17023SJohn Marino _Expr<_UnClos<__logical_not, std::_Expr, _Clos>, bool> 187*e4b17023SJohn Marino operator!() const; 188*e4b17023SJohn Marino 189*e4b17023SJohn Marino size_t size() const; 190*e4b17023SJohn Marino value_type sum() const; 191*e4b17023SJohn Marino 192*e4b17023SJohn Marino valarray<value_type> shift(int) const; 193*e4b17023SJohn Marino valarray<value_type> cshift(int) const; 194*e4b17023SJohn Marino 195*e4b17023SJohn Marino value_type min() const; 196*e4b17023SJohn Marino value_type max() const; 197*e4b17023SJohn Marino 198*e4b17023SJohn Marino valarray<value_type> apply(value_type (*)(const value_type&)) const; 199*e4b17023SJohn Marino valarray<value_type> apply(value_type (*)(value_type)) const; 200*e4b17023SJohn Marino 201*e4b17023SJohn Marino private: 202*e4b17023SJohn Marino const _Clos _M_closure; 203*e4b17023SJohn Marino }; 204*e4b17023SJohn Marino 205*e4b17023SJohn Marino template<class _Clos, typename _Tp> 206*e4b17023SJohn Marino inline 207*e4b17023SJohn Marino _Expr<_Clos, _Tp>::_Expr(const _Clos& __c) : _M_closure(__c) {} 208*e4b17023SJohn Marino 209*e4b17023SJohn Marino template<class _Clos, typename _Tp> 210*e4b17023SJohn Marino inline const _Clos& 211*e4b17023SJohn Marino _Expr<_Clos, _Tp>::operator()() const 212*e4b17023SJohn Marino { return _M_closure; } 213*e4b17023SJohn Marino 214*e4b17023SJohn Marino template<class _Clos, typename _Tp> 215*e4b17023SJohn Marino inline _Tp 216*e4b17023SJohn Marino _Expr<_Clos, _Tp>::operator[](size_t __i) const 217*e4b17023SJohn Marino { return _M_closure[__i]; } 218*e4b17023SJohn Marino 219*e4b17023SJohn Marino template<class _Clos, typename _Tp> 220*e4b17023SJohn Marino inline valarray<_Tp> 221*e4b17023SJohn Marino _Expr<_Clos, _Tp>::operator[](slice __s) const 222*e4b17023SJohn Marino { 223*e4b17023SJohn Marino valarray<_Tp> __v = valarray<_Tp>(*this)[__s]; 224*e4b17023SJohn Marino return __v; 225*e4b17023SJohn Marino } 226*e4b17023SJohn Marino 227*e4b17023SJohn Marino template<class _Clos, typename _Tp> 228*e4b17023SJohn Marino inline valarray<_Tp> 229*e4b17023SJohn Marino _Expr<_Clos, _Tp>::operator[](const gslice& __gs) const 230*e4b17023SJohn Marino { 231*e4b17023SJohn Marino valarray<_Tp> __v = valarray<_Tp>(*this)[__gs]; 232*e4b17023SJohn Marino return __v; 233*e4b17023SJohn Marino } 234*e4b17023SJohn Marino 235*e4b17023SJohn Marino template<class _Clos, typename _Tp> 236*e4b17023SJohn Marino inline valarray<_Tp> 237*e4b17023SJohn Marino _Expr<_Clos, _Tp>::operator[](const valarray<bool>& __m) const 238*e4b17023SJohn Marino { 239*e4b17023SJohn Marino valarray<_Tp> __v = valarray<_Tp>(*this)[__m]; 240*e4b17023SJohn Marino return __v; 241*e4b17023SJohn Marino } 242*e4b17023SJohn Marino 243*e4b17023SJohn Marino template<class _Clos, typename _Tp> 244*e4b17023SJohn Marino inline valarray<_Tp> 245*e4b17023SJohn Marino _Expr<_Clos, _Tp>::operator[](const valarray<size_t>& __i) const 246*e4b17023SJohn Marino { 247*e4b17023SJohn Marino valarray<_Tp> __v = valarray<_Tp>(*this)[__i]; 248*e4b17023SJohn Marino return __v; 249*e4b17023SJohn Marino } 250*e4b17023SJohn Marino 251*e4b17023SJohn Marino template<class _Clos, typename _Tp> 252*e4b17023SJohn Marino inline size_t 253*e4b17023SJohn Marino _Expr<_Clos, _Tp>::size() const 254*e4b17023SJohn Marino { return _M_closure.size(); } 255*e4b17023SJohn Marino 256*e4b17023SJohn Marino template<class _Clos, typename _Tp> 257*e4b17023SJohn Marino inline valarray<_Tp> 258*e4b17023SJohn Marino _Expr<_Clos, _Tp>::shift(int __n) const 259*e4b17023SJohn Marino { 260*e4b17023SJohn Marino valarray<_Tp> __v = valarray<_Tp>(*this).shift(__n); 261*e4b17023SJohn Marino return __v; 262*e4b17023SJohn Marino } 263*e4b17023SJohn Marino 264*e4b17023SJohn Marino template<class _Clos, typename _Tp> 265*e4b17023SJohn Marino inline valarray<_Tp> 266*e4b17023SJohn Marino _Expr<_Clos, _Tp>::cshift(int __n) const 267*e4b17023SJohn Marino { 268*e4b17023SJohn Marino valarray<_Tp> __v = valarray<_Tp>(*this).cshift(__n); 269*e4b17023SJohn Marino return __v; 270*e4b17023SJohn Marino } 271*e4b17023SJohn Marino 272*e4b17023SJohn Marino template<class _Clos, typename _Tp> 273*e4b17023SJohn Marino inline valarray<_Tp> 274*e4b17023SJohn Marino _Expr<_Clos, _Tp>::apply(_Tp __f(const _Tp&)) const 275*e4b17023SJohn Marino { 276*e4b17023SJohn Marino valarray<_Tp> __v = valarray<_Tp>(*this).apply(__f); 277*e4b17023SJohn Marino return __v; 278*e4b17023SJohn Marino } 279*e4b17023SJohn Marino 280*e4b17023SJohn Marino template<class _Clos, typename _Tp> 281*e4b17023SJohn Marino inline valarray<_Tp> 282*e4b17023SJohn Marino _Expr<_Clos, _Tp>::apply(_Tp __f(_Tp)) const 283*e4b17023SJohn Marino { 284*e4b17023SJohn Marino valarray<_Tp> __v = valarray<_Tp>(*this).apply(__f); 285*e4b17023SJohn Marino return __v; 286*e4b17023SJohn Marino } 287*e4b17023SJohn Marino 288*e4b17023SJohn Marino // XXX: replace this with a more robust summation algorithm. 289*e4b17023SJohn Marino template<class _Clos, typename _Tp> 290*e4b17023SJohn Marino inline _Tp 291*e4b17023SJohn Marino _Expr<_Clos, _Tp>::sum() const 292*e4b17023SJohn Marino { 293*e4b17023SJohn Marino size_t __n = _M_closure.size(); 294*e4b17023SJohn Marino if (__n == 0) 295*e4b17023SJohn Marino return _Tp(); 296*e4b17023SJohn Marino else 297*e4b17023SJohn Marino { 298*e4b17023SJohn Marino _Tp __s = _M_closure[--__n]; 299*e4b17023SJohn Marino while (__n != 0) 300*e4b17023SJohn Marino __s += _M_closure[--__n]; 301*e4b17023SJohn Marino return __s; 302*e4b17023SJohn Marino } 303*e4b17023SJohn Marino } 304*e4b17023SJohn Marino 305*e4b17023SJohn Marino template<class _Clos, typename _Tp> 306*e4b17023SJohn Marino inline _Tp 307*e4b17023SJohn Marino _Expr<_Clos, _Tp>::min() const 308*e4b17023SJohn Marino { return __valarray_min(_M_closure); } 309*e4b17023SJohn Marino 310*e4b17023SJohn Marino template<class _Clos, typename _Tp> 311*e4b17023SJohn Marino inline _Tp 312*e4b17023SJohn Marino _Expr<_Clos, _Tp>::max() const 313*e4b17023SJohn Marino { return __valarray_max(_M_closure); } 314*e4b17023SJohn Marino 315*e4b17023SJohn Marino template<class _Dom, typename _Tp> 316*e4b17023SJohn Marino inline _Expr<_UnClos<__logical_not, _Expr, _Dom>, bool> 317*e4b17023SJohn Marino _Expr<_Dom, _Tp>::operator!() const 318*e4b17023SJohn Marino { 319*e4b17023SJohn Marino typedef _UnClos<__logical_not, std::_Expr, _Dom> _Closure; 320*e4b17023SJohn Marino return _Expr<_Closure, bool>(_Closure(this->_M_closure)); 321*e4b17023SJohn Marino } 322*e4b17023SJohn Marino 323*e4b17023SJohn Marino #define _DEFINE_EXPR_UNARY_OPERATOR(_Op, _Name) \ 324*e4b17023SJohn Marino template<class _Dom, typename _Tp> \ 325*e4b17023SJohn Marino inline _Expr<_UnClos<_Name, std::_Expr, _Dom>, _Tp> \ 326*e4b17023SJohn Marino _Expr<_Dom, _Tp>::operator _Op() const \ 327*e4b17023SJohn Marino { \ 328*e4b17023SJohn Marino typedef _UnClos<_Name, std::_Expr, _Dom> _Closure; \ 329*e4b17023SJohn Marino return _Expr<_Closure, _Tp>(_Closure(this->_M_closure)); \ 330*e4b17023SJohn Marino } 331*e4b17023SJohn Marino 332*e4b17023SJohn Marino _DEFINE_EXPR_UNARY_OPERATOR(+, __unary_plus) 333*e4b17023SJohn Marino _DEFINE_EXPR_UNARY_OPERATOR(-, __negate) 334*e4b17023SJohn Marino _DEFINE_EXPR_UNARY_OPERATOR(~, __bitwise_not) 335*e4b17023SJohn Marino 336*e4b17023SJohn Marino #undef _DEFINE_EXPR_UNARY_OPERATOR 337*e4b17023SJohn Marino 338*e4b17023SJohn Marino #define _DEFINE_EXPR_BINARY_OPERATOR(_Op, _Name) \ 339*e4b17023SJohn Marino template<class _Dom1, class _Dom2> \ 340*e4b17023SJohn Marino inline _Expr<_BinClos<_Name, _Expr, _Expr, _Dom1, _Dom2>, \ 341*e4b17023SJohn Marino typename __fun<_Name, typename _Dom1::value_type>::result_type> \ 342*e4b17023SJohn Marino operator _Op(const _Expr<_Dom1, typename _Dom1::value_type>& __v, \ 343*e4b17023SJohn Marino const _Expr<_Dom2, typename _Dom2::value_type>& __w) \ 344*e4b17023SJohn Marino { \ 345*e4b17023SJohn Marino typedef typename _Dom1::value_type _Arg; \ 346*e4b17023SJohn Marino typedef typename __fun<_Name, _Arg>::result_type _Value; \ 347*e4b17023SJohn Marino typedef _BinClos<_Name, _Expr, _Expr, _Dom1, _Dom2> _Closure; \ 348*e4b17023SJohn Marino return _Expr<_Closure, _Value>(_Closure(__v(), __w())); \ 349*e4b17023SJohn Marino } \ 350*e4b17023SJohn Marino \ 351*e4b17023SJohn Marino template<class _Dom> \ 352*e4b17023SJohn Marino inline _Expr<_BinClos<_Name, _Expr, _Constant, _Dom, \ 353*e4b17023SJohn Marino typename _Dom::value_type>, \ 354*e4b17023SJohn Marino typename __fun<_Name, typename _Dom::value_type>::result_type> \ 355*e4b17023SJohn Marino operator _Op(const _Expr<_Dom, typename _Dom::value_type>& __v, \ 356*e4b17023SJohn Marino const typename _Dom::value_type& __t) \ 357*e4b17023SJohn Marino { \ 358*e4b17023SJohn Marino typedef typename _Dom::value_type _Arg; \ 359*e4b17023SJohn Marino typedef typename __fun<_Name, _Arg>::result_type _Value; \ 360*e4b17023SJohn Marino typedef _BinClos<_Name, _Expr, _Constant, _Dom, _Arg> _Closure; \ 361*e4b17023SJohn Marino return _Expr<_Closure, _Value>(_Closure(__v(), __t)); \ 362*e4b17023SJohn Marino } \ 363*e4b17023SJohn Marino \ 364*e4b17023SJohn Marino template<class _Dom> \ 365*e4b17023SJohn Marino inline _Expr<_BinClos<_Name, _Constant, _Expr, \ 366*e4b17023SJohn Marino typename _Dom::value_type, _Dom>, \ 367*e4b17023SJohn Marino typename __fun<_Name, typename _Dom::value_type>::result_type> \ 368*e4b17023SJohn Marino operator _Op(const typename _Dom::value_type& __t, \ 369*e4b17023SJohn Marino const _Expr<_Dom, typename _Dom::value_type>& __v) \ 370*e4b17023SJohn Marino { \ 371*e4b17023SJohn Marino typedef typename _Dom::value_type _Arg; \ 372*e4b17023SJohn Marino typedef typename __fun<_Name, _Arg>::result_type _Value; \ 373*e4b17023SJohn Marino typedef _BinClos<_Name, _Constant, _Expr, _Arg, _Dom> _Closure; \ 374*e4b17023SJohn Marino return _Expr<_Closure, _Value>(_Closure(__t, __v())); \ 375*e4b17023SJohn Marino } \ 376*e4b17023SJohn Marino \ 377*e4b17023SJohn Marino template<class _Dom> \ 378*e4b17023SJohn Marino inline _Expr<_BinClos<_Name, _Expr, _ValArray, \ 379*e4b17023SJohn Marino _Dom, typename _Dom::value_type>, \ 380*e4b17023SJohn Marino typename __fun<_Name, typename _Dom::value_type>::result_type> \ 381*e4b17023SJohn Marino operator _Op(const _Expr<_Dom,typename _Dom::value_type>& __e, \ 382*e4b17023SJohn Marino const valarray<typename _Dom::value_type>& __v) \ 383*e4b17023SJohn Marino { \ 384*e4b17023SJohn Marino typedef typename _Dom::value_type _Arg; \ 385*e4b17023SJohn Marino typedef typename __fun<_Name, _Arg>::result_type _Value; \ 386*e4b17023SJohn Marino typedef _BinClos<_Name, _Expr, _ValArray, _Dom, _Arg> _Closure; \ 387*e4b17023SJohn Marino return _Expr<_Closure, _Value>(_Closure(__e(), __v)); \ 388*e4b17023SJohn Marino } \ 389*e4b17023SJohn Marino \ 390*e4b17023SJohn Marino template<class _Dom> \ 391*e4b17023SJohn Marino inline _Expr<_BinClos<_Name, _ValArray, _Expr, \ 392*e4b17023SJohn Marino typename _Dom::value_type, _Dom>, \ 393*e4b17023SJohn Marino typename __fun<_Name, typename _Dom::value_type>::result_type> \ 394*e4b17023SJohn Marino operator _Op(const valarray<typename _Dom::value_type>& __v, \ 395*e4b17023SJohn Marino const _Expr<_Dom, typename _Dom::value_type>& __e) \ 396*e4b17023SJohn Marino { \ 397*e4b17023SJohn Marino typedef typename _Dom::value_type _Tp; \ 398*e4b17023SJohn Marino typedef typename __fun<_Name, _Tp>::result_type _Value; \ 399*e4b17023SJohn Marino typedef _BinClos<_Name, _ValArray, _Expr, _Tp, _Dom> _Closure; \ 400*e4b17023SJohn Marino return _Expr<_Closure, _Value>(_Closure(__v, __e ())); \ 401*e4b17023SJohn Marino } 402*e4b17023SJohn Marino 403*e4b17023SJohn Marino _DEFINE_EXPR_BINARY_OPERATOR(+, __plus) 404*e4b17023SJohn Marino _DEFINE_EXPR_BINARY_OPERATOR(-, __minus) 405*e4b17023SJohn Marino _DEFINE_EXPR_BINARY_OPERATOR(*, __multiplies) 406*e4b17023SJohn Marino _DEFINE_EXPR_BINARY_OPERATOR(/, __divides) 407*e4b17023SJohn Marino _DEFINE_EXPR_BINARY_OPERATOR(%, __modulus) 408*e4b17023SJohn Marino _DEFINE_EXPR_BINARY_OPERATOR(^, __bitwise_xor) 409*e4b17023SJohn Marino _DEFINE_EXPR_BINARY_OPERATOR(&, __bitwise_and) 410*e4b17023SJohn Marino _DEFINE_EXPR_BINARY_OPERATOR(|, __bitwise_or) 411*e4b17023SJohn Marino _DEFINE_EXPR_BINARY_OPERATOR(<<, __shift_left) 412*e4b17023SJohn Marino _DEFINE_EXPR_BINARY_OPERATOR(>>, __shift_right) 413*e4b17023SJohn Marino _DEFINE_EXPR_BINARY_OPERATOR(&&, __logical_and) 414*e4b17023SJohn Marino _DEFINE_EXPR_BINARY_OPERATOR(||, __logical_or) 415*e4b17023SJohn Marino _DEFINE_EXPR_BINARY_OPERATOR(==, __equal_to) 416*e4b17023SJohn Marino _DEFINE_EXPR_BINARY_OPERATOR(!=, __not_equal_to) 417*e4b17023SJohn Marino _DEFINE_EXPR_BINARY_OPERATOR(<, __less) 418*e4b17023SJohn Marino _DEFINE_EXPR_BINARY_OPERATOR(>, __greater) 419*e4b17023SJohn Marino _DEFINE_EXPR_BINARY_OPERATOR(<=, __less_equal) 420*e4b17023SJohn Marino _DEFINE_EXPR_BINARY_OPERATOR(>=, __greater_equal) 421*e4b17023SJohn Marino 422*e4b17023SJohn Marino #undef _DEFINE_EXPR_BINARY_OPERATOR 423*e4b17023SJohn Marino 424*e4b17023SJohn Marino #define _DEFINE_EXPR_UNARY_FUNCTION(_Name, _UName) \ 425*e4b17023SJohn Marino template<class _Dom> \ 426*e4b17023SJohn Marino inline _Expr<_UnClos<_UName, _Expr, _Dom>, \ 427*e4b17023SJohn Marino typename _Dom::value_type> \ 428*e4b17023SJohn Marino _Name(const _Expr<_Dom, typename _Dom::value_type>& __e) \ 429*e4b17023SJohn Marino { \ 430*e4b17023SJohn Marino typedef typename _Dom::value_type _Tp; \ 431*e4b17023SJohn Marino typedef _UnClos<_UName, _Expr, _Dom> _Closure; \ 432*e4b17023SJohn Marino return _Expr<_Closure, _Tp>(_Closure(__e())); \ 433*e4b17023SJohn Marino } \ 434*e4b17023SJohn Marino \ 435*e4b17023SJohn Marino template<typename _Tp> \ 436*e4b17023SJohn Marino inline _Expr<_UnClos<_UName, _ValArray, _Tp>, _Tp> \ 437*e4b17023SJohn Marino _Name(const valarray<_Tp>& __v) \ 438*e4b17023SJohn Marino { \ 439*e4b17023SJohn Marino typedef _UnClos<_UName, _ValArray, _Tp> _Closure; \ 440*e4b17023SJohn Marino return _Expr<_Closure, _Tp>(_Closure(__v)); \ 441*e4b17023SJohn Marino } 442*e4b17023SJohn Marino 443*e4b17023SJohn Marino _DEFINE_EXPR_UNARY_FUNCTION(abs, _Abs) 444*e4b17023SJohn Marino _DEFINE_EXPR_UNARY_FUNCTION(cos, _Cos) 445*e4b17023SJohn Marino _DEFINE_EXPR_UNARY_FUNCTION(acos, _Acos) 446*e4b17023SJohn Marino _DEFINE_EXPR_UNARY_FUNCTION(cosh, _Cosh) 447*e4b17023SJohn Marino _DEFINE_EXPR_UNARY_FUNCTION(sin, _Sin) 448*e4b17023SJohn Marino _DEFINE_EXPR_UNARY_FUNCTION(asin, _Asin) 449*e4b17023SJohn Marino _DEFINE_EXPR_UNARY_FUNCTION(sinh, _Sinh) 450*e4b17023SJohn Marino _DEFINE_EXPR_UNARY_FUNCTION(tan, _Tan) 451*e4b17023SJohn Marino _DEFINE_EXPR_UNARY_FUNCTION(tanh, _Tanh) 452*e4b17023SJohn Marino _DEFINE_EXPR_UNARY_FUNCTION(atan, _Atan) 453*e4b17023SJohn Marino _DEFINE_EXPR_UNARY_FUNCTION(exp, _Exp) 454*e4b17023SJohn Marino _DEFINE_EXPR_UNARY_FUNCTION(log, _Log) 455*e4b17023SJohn Marino _DEFINE_EXPR_UNARY_FUNCTION(log10, _Log10) 456*e4b17023SJohn Marino _DEFINE_EXPR_UNARY_FUNCTION(sqrt, _Sqrt) 457*e4b17023SJohn Marino 458*e4b17023SJohn Marino #undef _DEFINE_EXPR_UNARY_FUNCTION 459*e4b17023SJohn Marino 460*e4b17023SJohn Marino #define _DEFINE_EXPR_BINARY_FUNCTION(_Fun, _UFun) \ 461*e4b17023SJohn Marino template<class _Dom1, class _Dom2> \ 462*e4b17023SJohn Marino inline _Expr<_BinClos<_UFun, _Expr, _Expr, _Dom1, _Dom2>, \ 463*e4b17023SJohn Marino typename _Dom1::value_type> \ 464*e4b17023SJohn Marino _Fun(const _Expr<_Dom1, typename _Dom1::value_type>& __e1, \ 465*e4b17023SJohn Marino const _Expr<_Dom2, typename _Dom2::value_type>& __e2) \ 466*e4b17023SJohn Marino { \ 467*e4b17023SJohn Marino typedef typename _Dom1::value_type _Tp; \ 468*e4b17023SJohn Marino typedef _BinClos<_UFun, _Expr, _Expr, _Dom1, _Dom2> _Closure; \ 469*e4b17023SJohn Marino return _Expr<_Closure, _Tp>(_Closure(__e1(), __e2())); \ 470*e4b17023SJohn Marino } \ 471*e4b17023SJohn Marino \ 472*e4b17023SJohn Marino template<class _Dom> \ 473*e4b17023SJohn Marino inline _Expr<_BinClos<_UFun, _Expr, _ValArray, _Dom, \ 474*e4b17023SJohn Marino typename _Dom::value_type>, \ 475*e4b17023SJohn Marino typename _Dom::value_type> \ 476*e4b17023SJohn Marino _Fun(const _Expr<_Dom, typename _Dom::value_type>& __e, \ 477*e4b17023SJohn Marino const valarray<typename _Dom::value_type>& __v) \ 478*e4b17023SJohn Marino { \ 479*e4b17023SJohn Marino typedef typename _Dom::value_type _Tp; \ 480*e4b17023SJohn Marino typedef _BinClos<_UFun, _Expr, _ValArray, _Dom, _Tp> _Closure; \ 481*e4b17023SJohn Marino return _Expr<_Closure, _Tp>(_Closure(__e(), __v)); \ 482*e4b17023SJohn Marino } \ 483*e4b17023SJohn Marino \ 484*e4b17023SJohn Marino template<class _Dom> \ 485*e4b17023SJohn Marino inline _Expr<_BinClos<_UFun, _ValArray, _Expr, \ 486*e4b17023SJohn Marino typename _Dom::value_type, _Dom>, \ 487*e4b17023SJohn Marino typename _Dom::value_type> \ 488*e4b17023SJohn Marino _Fun(const valarray<typename _Dom::valarray>& __v, \ 489*e4b17023SJohn Marino const _Expr<_Dom, typename _Dom::value_type>& __e) \ 490*e4b17023SJohn Marino { \ 491*e4b17023SJohn Marino typedef typename _Dom::value_type _Tp; \ 492*e4b17023SJohn Marino typedef _BinClos<_UFun, _ValArray, _Expr, _Tp, _Dom> _Closure; \ 493*e4b17023SJohn Marino return _Expr<_Closure, _Tp>(_Closure(__v, __e())); \ 494*e4b17023SJohn Marino } \ 495*e4b17023SJohn Marino \ 496*e4b17023SJohn Marino template<class _Dom> \ 497*e4b17023SJohn Marino inline _Expr<_BinClos<_UFun, _Expr, _Constant, _Dom, \ 498*e4b17023SJohn Marino typename _Dom::value_type>, \ 499*e4b17023SJohn Marino typename _Dom::value_type> \ 500*e4b17023SJohn Marino _Fun(const _Expr<_Dom, typename _Dom::value_type>& __e, \ 501*e4b17023SJohn Marino const typename _Dom::value_type& __t) \ 502*e4b17023SJohn Marino { \ 503*e4b17023SJohn Marino typedef typename _Dom::value_type _Tp; \ 504*e4b17023SJohn Marino typedef _BinClos<_UFun, _Expr, _Constant, _Dom, _Tp> _Closure; \ 505*e4b17023SJohn Marino return _Expr<_Closure, _Tp>(_Closure(__e(), __t)); \ 506*e4b17023SJohn Marino } \ 507*e4b17023SJohn Marino \ 508*e4b17023SJohn Marino template<class _Dom> \ 509*e4b17023SJohn Marino inline _Expr<_BinClos<_UFun, _Constant, _Expr, \ 510*e4b17023SJohn Marino typename _Dom::value_type, _Dom>, \ 511*e4b17023SJohn Marino typename _Dom::value_type> \ 512*e4b17023SJohn Marino _Fun(const typename _Dom::value_type& __t, \ 513*e4b17023SJohn Marino const _Expr<_Dom, typename _Dom::value_type>& __e) \ 514*e4b17023SJohn Marino { \ 515*e4b17023SJohn Marino typedef typename _Dom::value_type _Tp; \ 516*e4b17023SJohn Marino typedef _BinClos<_UFun, _Constant, _Expr, _Tp, _Dom> _Closure; \ 517*e4b17023SJohn Marino return _Expr<_Closure, _Tp>(_Closure(__t, __e())); \ 518*e4b17023SJohn Marino } \ 519*e4b17023SJohn Marino \ 520*e4b17023SJohn Marino template<typename _Tp> \ 521*e4b17023SJohn Marino inline _Expr<_BinClos<_UFun, _ValArray, _ValArray, _Tp, _Tp>, _Tp> \ 522*e4b17023SJohn Marino _Fun(const valarray<_Tp>& __v, const valarray<_Tp>& __w) \ 523*e4b17023SJohn Marino { \ 524*e4b17023SJohn Marino typedef _BinClos<_UFun, _ValArray, _ValArray, _Tp, _Tp> _Closure;\ 525*e4b17023SJohn Marino return _Expr<_Closure, _Tp>(_Closure(__v, __w)); \ 526*e4b17023SJohn Marino } \ 527*e4b17023SJohn Marino \ 528*e4b17023SJohn Marino template<typename _Tp> \ 529*e4b17023SJohn Marino inline _Expr<_BinClos<_UFun, _ValArray, _Constant, _Tp, _Tp>, _Tp> \ 530*e4b17023SJohn Marino _Fun(const valarray<_Tp>& __v, const _Tp& __t) \ 531*e4b17023SJohn Marino { \ 532*e4b17023SJohn Marino typedef _BinClos<_UFun, _ValArray, _Constant, _Tp, _Tp> _Closure;\ 533*e4b17023SJohn Marino return _Expr<_Closure, _Tp>(_Closure(__v, __t)); \ 534*e4b17023SJohn Marino } \ 535*e4b17023SJohn Marino \ 536*e4b17023SJohn Marino template<typename _Tp> \ 537*e4b17023SJohn Marino inline _Expr<_BinClos<_UFun, _Constant, _ValArray, _Tp, _Tp>, _Tp> \ 538*e4b17023SJohn Marino _Fun(const _Tp& __t, const valarray<_Tp>& __v) \ 539*e4b17023SJohn Marino { \ 540*e4b17023SJohn Marino typedef _BinClos<_UFun, _Constant, _ValArray, _Tp, _Tp> _Closure;\ 541*e4b17023SJohn Marino return _Expr<_Closure, _Tp>(_Closure(__t, __v)); \ 542*e4b17023SJohn Marino } 543*e4b17023SJohn Marino 544*e4b17023SJohn Marino _DEFINE_EXPR_BINARY_FUNCTION(atan2, _Atan2) 545*e4b17023SJohn Marino _DEFINE_EXPR_BINARY_FUNCTION(pow, _Pow) 546*e4b17023SJohn Marino 547*e4b17023SJohn Marino #undef _DEFINE_EXPR_BINARY_FUNCTION 548*e4b17023SJohn Marino 549*e4b17023SJohn Marino _GLIBCXX_END_NAMESPACE_VERSION 550*e4b17023SJohn Marino } // namespace 551*e4b17023SJohn Marino 552*e4b17023SJohn Marino #endif /* _CPP_VALARRAY_AFTER_H */ 553