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_before.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_BEFORE_H 34*e4b17023SJohn Marino #define _VALARRAY_BEFORE_H 1 35*e4b17023SJohn Marino 36*e4b17023SJohn Marino #pragma GCC system_header 37*e4b17023SJohn Marino 38*e4b17023SJohn Marino #include <bits/slice_array.h> 39*e4b17023SJohn Marino 40*e4b17023SJohn Marino namespace std _GLIBCXX_VISIBILITY(default) 41*e4b17023SJohn Marino { 42*e4b17023SJohn Marino _GLIBCXX_BEGIN_NAMESPACE_VERSION 43*e4b17023SJohn Marino 44*e4b17023SJohn Marino // 45*e4b17023SJohn Marino // Implementing a loosened valarray return value is tricky. 46*e4b17023SJohn Marino // First we need to meet 26.3.1/3: we should not add more than 47*e4b17023SJohn Marino // two levels of template nesting. Therefore we resort to template 48*e4b17023SJohn Marino // template to "flatten" loosened return value types. 49*e4b17023SJohn Marino // At some point we use partial specialization to remove one level 50*e4b17023SJohn Marino // template nesting due to _Expr<> 51*e4b17023SJohn Marino // 52*e4b17023SJohn Marino 53*e4b17023SJohn Marino // This class is NOT defined. It doesn't need to. 54*e4b17023SJohn Marino template<typename _Tp1, typename _Tp2> class _Constant; 55*e4b17023SJohn Marino 56*e4b17023SJohn Marino // Implementations of unary functions applied to valarray<>s. 57*e4b17023SJohn Marino // I use hard-coded object functions here instead of a generic 58*e4b17023SJohn Marino // approach like pointers to function: 59*e4b17023SJohn Marino // 1) correctness: some functions take references, others values. 60*e4b17023SJohn Marino // we can't deduce the correct type afterwards. 61*e4b17023SJohn Marino // 2) efficiency -- object functions can be easily inlined 62*e4b17023SJohn Marino // 3) be Koenig-lookup-friendly 63*e4b17023SJohn Marino 64*e4b17023SJohn Marino struct _Abs 65*e4b17023SJohn Marino { 66*e4b17023SJohn Marino template<typename _Tp> 67*e4b17023SJohn Marino _Tp operator()(const _Tp& __t) const 68*e4b17023SJohn Marino { return abs(__t); } 69*e4b17023SJohn Marino }; 70*e4b17023SJohn Marino 71*e4b17023SJohn Marino struct _Cos 72*e4b17023SJohn Marino { 73*e4b17023SJohn Marino template<typename _Tp> 74*e4b17023SJohn Marino _Tp operator()(const _Tp& __t) const 75*e4b17023SJohn Marino { return cos(__t); } 76*e4b17023SJohn Marino }; 77*e4b17023SJohn Marino 78*e4b17023SJohn Marino struct _Acos 79*e4b17023SJohn Marino { 80*e4b17023SJohn Marino template<typename _Tp> 81*e4b17023SJohn Marino _Tp operator()(const _Tp& __t) const 82*e4b17023SJohn Marino { return acos(__t); } 83*e4b17023SJohn Marino }; 84*e4b17023SJohn Marino 85*e4b17023SJohn Marino struct _Cosh 86*e4b17023SJohn Marino { 87*e4b17023SJohn Marino template<typename _Tp> 88*e4b17023SJohn Marino _Tp operator()(const _Tp& __t) const 89*e4b17023SJohn Marino { return cosh(__t); } 90*e4b17023SJohn Marino }; 91*e4b17023SJohn Marino 92*e4b17023SJohn Marino struct _Sin 93*e4b17023SJohn Marino { 94*e4b17023SJohn Marino template<typename _Tp> 95*e4b17023SJohn Marino _Tp operator()(const _Tp& __t) const 96*e4b17023SJohn Marino { return sin(__t); } 97*e4b17023SJohn Marino }; 98*e4b17023SJohn Marino 99*e4b17023SJohn Marino struct _Asin 100*e4b17023SJohn Marino { 101*e4b17023SJohn Marino template<typename _Tp> 102*e4b17023SJohn Marino _Tp operator()(const _Tp& __t) const 103*e4b17023SJohn Marino { return asin(__t); } 104*e4b17023SJohn Marino }; 105*e4b17023SJohn Marino 106*e4b17023SJohn Marino struct _Sinh 107*e4b17023SJohn Marino { 108*e4b17023SJohn Marino template<typename _Tp> 109*e4b17023SJohn Marino _Tp operator()(const _Tp& __t) const 110*e4b17023SJohn Marino { return sinh(__t); } 111*e4b17023SJohn Marino }; 112*e4b17023SJohn Marino 113*e4b17023SJohn Marino struct _Tan 114*e4b17023SJohn Marino { 115*e4b17023SJohn Marino template<typename _Tp> 116*e4b17023SJohn Marino _Tp operator()(const _Tp& __t) const 117*e4b17023SJohn Marino { return tan(__t); } 118*e4b17023SJohn Marino }; 119*e4b17023SJohn Marino 120*e4b17023SJohn Marino struct _Atan 121*e4b17023SJohn Marino { 122*e4b17023SJohn Marino template<typename _Tp> 123*e4b17023SJohn Marino _Tp operator()(const _Tp& __t) const 124*e4b17023SJohn Marino { return atan(__t); } 125*e4b17023SJohn Marino }; 126*e4b17023SJohn Marino 127*e4b17023SJohn Marino struct _Tanh 128*e4b17023SJohn Marino { 129*e4b17023SJohn Marino template<typename _Tp> 130*e4b17023SJohn Marino _Tp operator()(const _Tp& __t) const 131*e4b17023SJohn Marino { return tanh(__t); } 132*e4b17023SJohn Marino }; 133*e4b17023SJohn Marino 134*e4b17023SJohn Marino struct _Exp 135*e4b17023SJohn Marino { 136*e4b17023SJohn Marino template<typename _Tp> 137*e4b17023SJohn Marino _Tp operator()(const _Tp& __t) const 138*e4b17023SJohn Marino { return exp(__t); } 139*e4b17023SJohn Marino }; 140*e4b17023SJohn Marino 141*e4b17023SJohn Marino struct _Log 142*e4b17023SJohn Marino { 143*e4b17023SJohn Marino template<typename _Tp> 144*e4b17023SJohn Marino _Tp operator()(const _Tp& __t) const 145*e4b17023SJohn Marino { return log(__t); } 146*e4b17023SJohn Marino }; 147*e4b17023SJohn Marino 148*e4b17023SJohn Marino struct _Log10 149*e4b17023SJohn Marino { 150*e4b17023SJohn Marino template<typename _Tp> 151*e4b17023SJohn Marino _Tp operator()(const _Tp& __t) const 152*e4b17023SJohn Marino { return log10(__t); } 153*e4b17023SJohn Marino }; 154*e4b17023SJohn Marino 155*e4b17023SJohn Marino struct _Sqrt 156*e4b17023SJohn Marino { 157*e4b17023SJohn Marino template<typename _Tp> 158*e4b17023SJohn Marino _Tp operator()(const _Tp& __t) const 159*e4b17023SJohn Marino { return sqrt(__t); } 160*e4b17023SJohn Marino }; 161*e4b17023SJohn Marino 162*e4b17023SJohn Marino // In the past, we used to tailor operator applications semantics 163*e4b17023SJohn Marino // to the specialization of standard function objects (i.e. plus<>, etc.) 164*e4b17023SJohn Marino // That is incorrect. Therefore we provide our own surrogates. 165*e4b17023SJohn Marino 166*e4b17023SJohn Marino struct __unary_plus 167*e4b17023SJohn Marino { 168*e4b17023SJohn Marino template<typename _Tp> 169*e4b17023SJohn Marino _Tp operator()(const _Tp& __t) const 170*e4b17023SJohn Marino { return +__t; } 171*e4b17023SJohn Marino }; 172*e4b17023SJohn Marino 173*e4b17023SJohn Marino struct __negate 174*e4b17023SJohn Marino { 175*e4b17023SJohn Marino template<typename _Tp> 176*e4b17023SJohn Marino _Tp operator()(const _Tp& __t) const 177*e4b17023SJohn Marino { return -__t; } 178*e4b17023SJohn Marino }; 179*e4b17023SJohn Marino 180*e4b17023SJohn Marino struct __bitwise_not 181*e4b17023SJohn Marino { 182*e4b17023SJohn Marino template<typename _Tp> 183*e4b17023SJohn Marino _Tp operator()(const _Tp& __t) const 184*e4b17023SJohn Marino { return ~__t; } 185*e4b17023SJohn Marino }; 186*e4b17023SJohn Marino 187*e4b17023SJohn Marino struct __plus 188*e4b17023SJohn Marino { 189*e4b17023SJohn Marino template<typename _Tp> 190*e4b17023SJohn Marino _Tp operator()(const _Tp& __x, const _Tp& __y) const 191*e4b17023SJohn Marino { return __x + __y; } 192*e4b17023SJohn Marino }; 193*e4b17023SJohn Marino 194*e4b17023SJohn Marino struct __minus 195*e4b17023SJohn Marino { 196*e4b17023SJohn Marino template<typename _Tp> 197*e4b17023SJohn Marino _Tp operator()(const _Tp& __x, const _Tp& __y) const 198*e4b17023SJohn Marino { return __x - __y; } 199*e4b17023SJohn Marino }; 200*e4b17023SJohn Marino 201*e4b17023SJohn Marino struct __multiplies 202*e4b17023SJohn Marino { 203*e4b17023SJohn Marino template<typename _Tp> 204*e4b17023SJohn Marino _Tp operator()(const _Tp& __x, const _Tp& __y) const 205*e4b17023SJohn Marino { return __x * __y; } 206*e4b17023SJohn Marino }; 207*e4b17023SJohn Marino 208*e4b17023SJohn Marino struct __divides 209*e4b17023SJohn Marino { 210*e4b17023SJohn Marino template<typename _Tp> 211*e4b17023SJohn Marino _Tp operator()(const _Tp& __x, const _Tp& __y) const 212*e4b17023SJohn Marino { return __x / __y; } 213*e4b17023SJohn Marino }; 214*e4b17023SJohn Marino 215*e4b17023SJohn Marino struct __modulus 216*e4b17023SJohn Marino { 217*e4b17023SJohn Marino template<typename _Tp> 218*e4b17023SJohn Marino _Tp operator()(const _Tp& __x, const _Tp& __y) const 219*e4b17023SJohn Marino { return __x % __y; } 220*e4b17023SJohn Marino }; 221*e4b17023SJohn Marino 222*e4b17023SJohn Marino struct __bitwise_xor 223*e4b17023SJohn Marino { 224*e4b17023SJohn Marino template<typename _Tp> 225*e4b17023SJohn Marino _Tp operator()(const _Tp& __x, const _Tp& __y) const 226*e4b17023SJohn Marino { return __x ^ __y; } 227*e4b17023SJohn Marino }; 228*e4b17023SJohn Marino 229*e4b17023SJohn Marino struct __bitwise_and 230*e4b17023SJohn Marino { 231*e4b17023SJohn Marino template<typename _Tp> 232*e4b17023SJohn Marino _Tp operator()(const _Tp& __x, const _Tp& __y) const 233*e4b17023SJohn Marino { return __x & __y; } 234*e4b17023SJohn Marino }; 235*e4b17023SJohn Marino 236*e4b17023SJohn Marino struct __bitwise_or 237*e4b17023SJohn Marino { 238*e4b17023SJohn Marino template<typename _Tp> 239*e4b17023SJohn Marino _Tp operator()(const _Tp& __x, const _Tp& __y) const 240*e4b17023SJohn Marino { return __x | __y; } 241*e4b17023SJohn Marino }; 242*e4b17023SJohn Marino 243*e4b17023SJohn Marino struct __shift_left 244*e4b17023SJohn Marino { 245*e4b17023SJohn Marino template<typename _Tp> 246*e4b17023SJohn Marino _Tp operator()(const _Tp& __x, const _Tp& __y) const 247*e4b17023SJohn Marino { return __x << __y; } 248*e4b17023SJohn Marino }; 249*e4b17023SJohn Marino 250*e4b17023SJohn Marino struct __shift_right 251*e4b17023SJohn Marino { 252*e4b17023SJohn Marino template<typename _Tp> 253*e4b17023SJohn Marino _Tp operator()(const _Tp& __x, const _Tp& __y) const 254*e4b17023SJohn Marino { return __x >> __y; } 255*e4b17023SJohn Marino }; 256*e4b17023SJohn Marino 257*e4b17023SJohn Marino struct __logical_and 258*e4b17023SJohn Marino { 259*e4b17023SJohn Marino template<typename _Tp> 260*e4b17023SJohn Marino bool operator()(const _Tp& __x, const _Tp& __y) const 261*e4b17023SJohn Marino { return __x && __y; } 262*e4b17023SJohn Marino }; 263*e4b17023SJohn Marino 264*e4b17023SJohn Marino struct __logical_or 265*e4b17023SJohn Marino { 266*e4b17023SJohn Marino template<typename _Tp> 267*e4b17023SJohn Marino bool operator()(const _Tp& __x, const _Tp& __y) const 268*e4b17023SJohn Marino { return __x || __y; } 269*e4b17023SJohn Marino }; 270*e4b17023SJohn Marino 271*e4b17023SJohn Marino struct __logical_not 272*e4b17023SJohn Marino { 273*e4b17023SJohn Marino template<typename _Tp> 274*e4b17023SJohn Marino bool operator()(const _Tp& __x) const 275*e4b17023SJohn Marino { return !__x; } 276*e4b17023SJohn Marino }; 277*e4b17023SJohn Marino 278*e4b17023SJohn Marino struct __equal_to 279*e4b17023SJohn Marino { 280*e4b17023SJohn Marino template<typename _Tp> 281*e4b17023SJohn Marino bool operator()(const _Tp& __x, const _Tp& __y) const 282*e4b17023SJohn Marino { return __x == __y; } 283*e4b17023SJohn Marino }; 284*e4b17023SJohn Marino 285*e4b17023SJohn Marino struct __not_equal_to 286*e4b17023SJohn Marino { 287*e4b17023SJohn Marino template<typename _Tp> 288*e4b17023SJohn Marino bool operator()(const _Tp& __x, const _Tp& __y) const 289*e4b17023SJohn Marino { return __x != __y; } 290*e4b17023SJohn Marino }; 291*e4b17023SJohn Marino 292*e4b17023SJohn Marino struct __less 293*e4b17023SJohn Marino { 294*e4b17023SJohn Marino template<typename _Tp> 295*e4b17023SJohn Marino bool operator()(const _Tp& __x, const _Tp& __y) const 296*e4b17023SJohn Marino { return __x < __y; } 297*e4b17023SJohn Marino }; 298*e4b17023SJohn Marino 299*e4b17023SJohn Marino struct __greater 300*e4b17023SJohn Marino { 301*e4b17023SJohn Marino template<typename _Tp> 302*e4b17023SJohn Marino bool operator()(const _Tp& __x, const _Tp& __y) const 303*e4b17023SJohn Marino { return __x > __y; } 304*e4b17023SJohn Marino }; 305*e4b17023SJohn Marino 306*e4b17023SJohn Marino struct __less_equal 307*e4b17023SJohn Marino { 308*e4b17023SJohn Marino template<typename _Tp> 309*e4b17023SJohn Marino bool operator()(const _Tp& __x, const _Tp& __y) const 310*e4b17023SJohn Marino { return __x <= __y; } 311*e4b17023SJohn Marino }; 312*e4b17023SJohn Marino 313*e4b17023SJohn Marino struct __greater_equal 314*e4b17023SJohn Marino { 315*e4b17023SJohn Marino template<typename _Tp> 316*e4b17023SJohn Marino bool operator()(const _Tp& __x, const _Tp& __y) const 317*e4b17023SJohn Marino { return __x >= __y; } 318*e4b17023SJohn Marino }; 319*e4b17023SJohn Marino 320*e4b17023SJohn Marino // The few binary functions we miss. 321*e4b17023SJohn Marino struct _Atan2 322*e4b17023SJohn Marino { 323*e4b17023SJohn Marino template<typename _Tp> 324*e4b17023SJohn Marino _Tp operator()(const _Tp& __x, const _Tp& __y) const 325*e4b17023SJohn Marino { return atan2(__x, __y); } 326*e4b17023SJohn Marino }; 327*e4b17023SJohn Marino 328*e4b17023SJohn Marino struct _Pow 329*e4b17023SJohn Marino { 330*e4b17023SJohn Marino template<typename _Tp> 331*e4b17023SJohn Marino _Tp operator()(const _Tp& __x, const _Tp& __y) const 332*e4b17023SJohn Marino { return pow(__x, __y); } 333*e4b17023SJohn Marino }; 334*e4b17023SJohn Marino 335*e4b17023SJohn Marino 336*e4b17023SJohn Marino // We need these bits in order to recover the return type of 337*e4b17023SJohn Marino // some functions/operators now that we're no longer using 338*e4b17023SJohn Marino // function templates. 339*e4b17023SJohn Marino template<typename, typename _Tp> 340*e4b17023SJohn Marino struct __fun 341*e4b17023SJohn Marino { 342*e4b17023SJohn Marino typedef _Tp result_type; 343*e4b17023SJohn Marino }; 344*e4b17023SJohn Marino 345*e4b17023SJohn Marino // several specializations for relational operators. 346*e4b17023SJohn Marino template<typename _Tp> 347*e4b17023SJohn Marino struct __fun<__logical_not, _Tp> 348*e4b17023SJohn Marino { 349*e4b17023SJohn Marino typedef bool result_type; 350*e4b17023SJohn Marino }; 351*e4b17023SJohn Marino 352*e4b17023SJohn Marino template<typename _Tp> 353*e4b17023SJohn Marino struct __fun<__logical_and, _Tp> 354*e4b17023SJohn Marino { 355*e4b17023SJohn Marino typedef bool result_type; 356*e4b17023SJohn Marino }; 357*e4b17023SJohn Marino 358*e4b17023SJohn Marino template<typename _Tp> 359*e4b17023SJohn Marino struct __fun<__logical_or, _Tp> 360*e4b17023SJohn Marino { 361*e4b17023SJohn Marino typedef bool result_type; 362*e4b17023SJohn Marino }; 363*e4b17023SJohn Marino 364*e4b17023SJohn Marino template<typename _Tp> 365*e4b17023SJohn Marino struct __fun<__less, _Tp> 366*e4b17023SJohn Marino { 367*e4b17023SJohn Marino typedef bool result_type; 368*e4b17023SJohn Marino }; 369*e4b17023SJohn Marino 370*e4b17023SJohn Marino template<typename _Tp> 371*e4b17023SJohn Marino struct __fun<__greater, _Tp> 372*e4b17023SJohn Marino { 373*e4b17023SJohn Marino typedef bool result_type; 374*e4b17023SJohn Marino }; 375*e4b17023SJohn Marino 376*e4b17023SJohn Marino template<typename _Tp> 377*e4b17023SJohn Marino struct __fun<__less_equal, _Tp> 378*e4b17023SJohn Marino { 379*e4b17023SJohn Marino typedef bool result_type; 380*e4b17023SJohn Marino }; 381*e4b17023SJohn Marino 382*e4b17023SJohn Marino template<typename _Tp> 383*e4b17023SJohn Marino struct __fun<__greater_equal, _Tp> 384*e4b17023SJohn Marino { 385*e4b17023SJohn Marino typedef bool result_type; 386*e4b17023SJohn Marino }; 387*e4b17023SJohn Marino 388*e4b17023SJohn Marino template<typename _Tp> 389*e4b17023SJohn Marino struct __fun<__equal_to, _Tp> 390*e4b17023SJohn Marino { 391*e4b17023SJohn Marino typedef bool result_type; 392*e4b17023SJohn Marino }; 393*e4b17023SJohn Marino 394*e4b17023SJohn Marino template<typename _Tp> 395*e4b17023SJohn Marino struct __fun<__not_equal_to, _Tp> 396*e4b17023SJohn Marino { 397*e4b17023SJohn Marino typedef bool result_type; 398*e4b17023SJohn Marino }; 399*e4b17023SJohn Marino 400*e4b17023SJohn Marino // 401*e4b17023SJohn Marino // Apply function taking a value/const reference closure 402*e4b17023SJohn Marino // 403*e4b17023SJohn Marino 404*e4b17023SJohn Marino template<typename _Dom, typename _Arg> 405*e4b17023SJohn Marino class _FunBase 406*e4b17023SJohn Marino { 407*e4b17023SJohn Marino public: 408*e4b17023SJohn Marino typedef typename _Dom::value_type value_type; 409*e4b17023SJohn Marino 410*e4b17023SJohn Marino _FunBase(const _Dom& __e, value_type __f(_Arg)) 411*e4b17023SJohn Marino : _M_expr(__e), _M_func(__f) {} 412*e4b17023SJohn Marino 413*e4b17023SJohn Marino value_type operator[](size_t __i) const 414*e4b17023SJohn Marino { return _M_func (_M_expr[__i]); } 415*e4b17023SJohn Marino 416*e4b17023SJohn Marino size_t size() const { return _M_expr.size ();} 417*e4b17023SJohn Marino 418*e4b17023SJohn Marino private: 419*e4b17023SJohn Marino const _Dom& _M_expr; 420*e4b17023SJohn Marino value_type (*_M_func)(_Arg); 421*e4b17023SJohn Marino }; 422*e4b17023SJohn Marino 423*e4b17023SJohn Marino template<class _Dom> 424*e4b17023SJohn Marino struct _ValFunClos<_Expr,_Dom> : _FunBase<_Dom, typename _Dom::value_type> 425*e4b17023SJohn Marino { 426*e4b17023SJohn Marino typedef _FunBase<_Dom, typename _Dom::value_type> _Base; 427*e4b17023SJohn Marino typedef typename _Base::value_type value_type; 428*e4b17023SJohn Marino typedef value_type _Tp; 429*e4b17023SJohn Marino 430*e4b17023SJohn Marino _ValFunClos(const _Dom& __e, _Tp __f(_Tp)) : _Base(__e, __f) {} 431*e4b17023SJohn Marino }; 432*e4b17023SJohn Marino 433*e4b17023SJohn Marino template<typename _Tp> 434*e4b17023SJohn Marino struct _ValFunClos<_ValArray,_Tp> : _FunBase<valarray<_Tp>, _Tp> 435*e4b17023SJohn Marino { 436*e4b17023SJohn Marino typedef _FunBase<valarray<_Tp>, _Tp> _Base; 437*e4b17023SJohn Marino typedef _Tp value_type; 438*e4b17023SJohn Marino 439*e4b17023SJohn Marino _ValFunClos(const valarray<_Tp>& __v, _Tp __f(_Tp)) : _Base(__v, __f) {} 440*e4b17023SJohn Marino }; 441*e4b17023SJohn Marino 442*e4b17023SJohn Marino template<class _Dom> 443*e4b17023SJohn Marino struct _RefFunClos<_Expr, _Dom> 444*e4b17023SJohn Marino : _FunBase<_Dom, const typename _Dom::value_type&> 445*e4b17023SJohn Marino { 446*e4b17023SJohn Marino typedef _FunBase<_Dom, const typename _Dom::value_type&> _Base; 447*e4b17023SJohn Marino typedef typename _Base::value_type value_type; 448*e4b17023SJohn Marino typedef value_type _Tp; 449*e4b17023SJohn Marino 450*e4b17023SJohn Marino _RefFunClos(const _Dom& __e, _Tp __f(const _Tp&)) 451*e4b17023SJohn Marino : _Base(__e, __f) {} 452*e4b17023SJohn Marino }; 453*e4b17023SJohn Marino 454*e4b17023SJohn Marino template<typename _Tp> 455*e4b17023SJohn Marino struct _RefFunClos<_ValArray, _Tp> 456*e4b17023SJohn Marino : _FunBase<valarray<_Tp>, const _Tp&> 457*e4b17023SJohn Marino { 458*e4b17023SJohn Marino typedef _FunBase<valarray<_Tp>, const _Tp&> _Base; 459*e4b17023SJohn Marino typedef _Tp value_type; 460*e4b17023SJohn Marino 461*e4b17023SJohn Marino _RefFunClos(const valarray<_Tp>& __v, _Tp __f(const _Tp&)) 462*e4b17023SJohn Marino : _Base(__v, __f) {} 463*e4b17023SJohn Marino }; 464*e4b17023SJohn Marino 465*e4b17023SJohn Marino // 466*e4b17023SJohn Marino // Unary expression closure. 467*e4b17023SJohn Marino // 468*e4b17023SJohn Marino 469*e4b17023SJohn Marino template<class _Oper, class _Arg> 470*e4b17023SJohn Marino class _UnBase 471*e4b17023SJohn Marino { 472*e4b17023SJohn Marino public: 473*e4b17023SJohn Marino typedef typename _Arg::value_type _Vt; 474*e4b17023SJohn Marino typedef typename __fun<_Oper, _Vt>::result_type value_type; 475*e4b17023SJohn Marino 476*e4b17023SJohn Marino _UnBase(const _Arg& __e) : _M_expr(__e) {} 477*e4b17023SJohn Marino 478*e4b17023SJohn Marino value_type operator[](size_t __i) const 479*e4b17023SJohn Marino { return _Oper()(_M_expr[__i]); } 480*e4b17023SJohn Marino 481*e4b17023SJohn Marino size_t size() const { return _M_expr.size(); } 482*e4b17023SJohn Marino 483*e4b17023SJohn Marino private: 484*e4b17023SJohn Marino const _Arg& _M_expr; 485*e4b17023SJohn Marino }; 486*e4b17023SJohn Marino 487*e4b17023SJohn Marino template<class _Oper, class _Dom> 488*e4b17023SJohn Marino struct _UnClos<_Oper, _Expr, _Dom> 489*e4b17023SJohn Marino : _UnBase<_Oper, _Dom> 490*e4b17023SJohn Marino { 491*e4b17023SJohn Marino typedef _Dom _Arg; 492*e4b17023SJohn Marino typedef _UnBase<_Oper, _Dom> _Base; 493*e4b17023SJohn Marino typedef typename _Base::value_type value_type; 494*e4b17023SJohn Marino 495*e4b17023SJohn Marino _UnClos(const _Arg& __e) : _Base(__e) {} 496*e4b17023SJohn Marino }; 497*e4b17023SJohn Marino 498*e4b17023SJohn Marino template<class _Oper, typename _Tp> 499*e4b17023SJohn Marino struct _UnClos<_Oper, _ValArray, _Tp> 500*e4b17023SJohn Marino : _UnBase<_Oper, valarray<_Tp> > 501*e4b17023SJohn Marino { 502*e4b17023SJohn Marino typedef valarray<_Tp> _Arg; 503*e4b17023SJohn Marino typedef _UnBase<_Oper, valarray<_Tp> > _Base; 504*e4b17023SJohn Marino typedef typename _Base::value_type value_type; 505*e4b17023SJohn Marino 506*e4b17023SJohn Marino _UnClos(const _Arg& __e) : _Base(__e) {} 507*e4b17023SJohn Marino }; 508*e4b17023SJohn Marino 509*e4b17023SJohn Marino 510*e4b17023SJohn Marino // 511*e4b17023SJohn Marino // Binary expression closure. 512*e4b17023SJohn Marino // 513*e4b17023SJohn Marino 514*e4b17023SJohn Marino template<class _Oper, class _FirstArg, class _SecondArg> 515*e4b17023SJohn Marino class _BinBase 516*e4b17023SJohn Marino { 517*e4b17023SJohn Marino public: 518*e4b17023SJohn Marino typedef typename _FirstArg::value_type _Vt; 519*e4b17023SJohn Marino typedef typename __fun<_Oper, _Vt>::result_type value_type; 520*e4b17023SJohn Marino 521*e4b17023SJohn Marino _BinBase(const _FirstArg& __e1, const _SecondArg& __e2) 522*e4b17023SJohn Marino : _M_expr1(__e1), _M_expr2(__e2) {} 523*e4b17023SJohn Marino 524*e4b17023SJohn Marino value_type operator[](size_t __i) const 525*e4b17023SJohn Marino { return _Oper()(_M_expr1[__i], _M_expr2[__i]); } 526*e4b17023SJohn Marino 527*e4b17023SJohn Marino size_t size() const { return _M_expr1.size(); } 528*e4b17023SJohn Marino 529*e4b17023SJohn Marino private: 530*e4b17023SJohn Marino const _FirstArg& _M_expr1; 531*e4b17023SJohn Marino const _SecondArg& _M_expr2; 532*e4b17023SJohn Marino }; 533*e4b17023SJohn Marino 534*e4b17023SJohn Marino 535*e4b17023SJohn Marino template<class _Oper, class _Clos> 536*e4b17023SJohn Marino class _BinBase2 537*e4b17023SJohn Marino { 538*e4b17023SJohn Marino public: 539*e4b17023SJohn Marino typedef typename _Clos::value_type _Vt; 540*e4b17023SJohn Marino typedef typename __fun<_Oper, _Vt>::result_type value_type; 541*e4b17023SJohn Marino 542*e4b17023SJohn Marino _BinBase2(const _Clos& __e, const _Vt& __t) 543*e4b17023SJohn Marino : _M_expr1(__e), _M_expr2(__t) {} 544*e4b17023SJohn Marino 545*e4b17023SJohn Marino value_type operator[](size_t __i) const 546*e4b17023SJohn Marino { return _Oper()(_M_expr1[__i], _M_expr2); } 547*e4b17023SJohn Marino 548*e4b17023SJohn Marino size_t size() const { return _M_expr1.size(); } 549*e4b17023SJohn Marino 550*e4b17023SJohn Marino private: 551*e4b17023SJohn Marino const _Clos& _M_expr1; 552*e4b17023SJohn Marino const _Vt& _M_expr2; 553*e4b17023SJohn Marino }; 554*e4b17023SJohn Marino 555*e4b17023SJohn Marino template<class _Oper, class _Clos> 556*e4b17023SJohn Marino class _BinBase1 557*e4b17023SJohn Marino { 558*e4b17023SJohn Marino public: 559*e4b17023SJohn Marino typedef typename _Clos::value_type _Vt; 560*e4b17023SJohn Marino typedef typename __fun<_Oper, _Vt>::result_type value_type; 561*e4b17023SJohn Marino 562*e4b17023SJohn Marino _BinBase1(const _Vt& __t, const _Clos& __e) 563*e4b17023SJohn Marino : _M_expr1(__t), _M_expr2(__e) {} 564*e4b17023SJohn Marino 565*e4b17023SJohn Marino value_type operator[](size_t __i) const 566*e4b17023SJohn Marino { return _Oper()(_M_expr1, _M_expr2[__i]); } 567*e4b17023SJohn Marino 568*e4b17023SJohn Marino size_t size() const { return _M_expr2.size(); } 569*e4b17023SJohn Marino 570*e4b17023SJohn Marino private: 571*e4b17023SJohn Marino const _Vt& _M_expr1; 572*e4b17023SJohn Marino const _Clos& _M_expr2; 573*e4b17023SJohn Marino }; 574*e4b17023SJohn Marino 575*e4b17023SJohn Marino template<class _Oper, class _Dom1, class _Dom2> 576*e4b17023SJohn Marino struct _BinClos<_Oper, _Expr, _Expr, _Dom1, _Dom2> 577*e4b17023SJohn Marino : _BinBase<_Oper, _Dom1, _Dom2> 578*e4b17023SJohn Marino { 579*e4b17023SJohn Marino typedef _BinBase<_Oper, _Dom1, _Dom2> _Base; 580*e4b17023SJohn Marino typedef typename _Base::value_type value_type; 581*e4b17023SJohn Marino 582*e4b17023SJohn Marino _BinClos(const _Dom1& __e1, const _Dom2& __e2) : _Base(__e1, __e2) {} 583*e4b17023SJohn Marino }; 584*e4b17023SJohn Marino 585*e4b17023SJohn Marino template<class _Oper, typename _Tp> 586*e4b17023SJohn Marino struct _BinClos<_Oper,_ValArray, _ValArray, _Tp, _Tp> 587*e4b17023SJohn Marino : _BinBase<_Oper, valarray<_Tp>, valarray<_Tp> > 588*e4b17023SJohn Marino { 589*e4b17023SJohn Marino typedef _BinBase<_Oper, valarray<_Tp>, valarray<_Tp> > _Base; 590*e4b17023SJohn Marino typedef typename _Base::value_type value_type; 591*e4b17023SJohn Marino 592*e4b17023SJohn Marino _BinClos(const valarray<_Tp>& __v, const valarray<_Tp>& __w) 593*e4b17023SJohn Marino : _Base(__v, __w) {} 594*e4b17023SJohn Marino }; 595*e4b17023SJohn Marino 596*e4b17023SJohn Marino template<class _Oper, class _Dom> 597*e4b17023SJohn Marino struct _BinClos<_Oper, _Expr, _ValArray, _Dom, typename _Dom::value_type> 598*e4b17023SJohn Marino : _BinBase<_Oper, _Dom, valarray<typename _Dom::value_type> > 599*e4b17023SJohn Marino { 600*e4b17023SJohn Marino typedef typename _Dom::value_type _Tp; 601*e4b17023SJohn Marino typedef _BinBase<_Oper,_Dom,valarray<_Tp> > _Base; 602*e4b17023SJohn Marino typedef typename _Base::value_type value_type; 603*e4b17023SJohn Marino 604*e4b17023SJohn Marino _BinClos(const _Dom& __e1, const valarray<_Tp>& __e2) 605*e4b17023SJohn Marino : _Base(__e1, __e2) {} 606*e4b17023SJohn Marino }; 607*e4b17023SJohn Marino 608*e4b17023SJohn Marino template<class _Oper, class _Dom> 609*e4b17023SJohn Marino struct _BinClos<_Oper, _ValArray, _Expr, typename _Dom::value_type, _Dom> 610*e4b17023SJohn Marino : _BinBase<_Oper, valarray<typename _Dom::value_type>,_Dom> 611*e4b17023SJohn Marino { 612*e4b17023SJohn Marino typedef typename _Dom::value_type _Tp; 613*e4b17023SJohn Marino typedef _BinBase<_Oper, valarray<_Tp>, _Dom> _Base; 614*e4b17023SJohn Marino typedef typename _Base::value_type value_type; 615*e4b17023SJohn Marino 616*e4b17023SJohn Marino _BinClos(const valarray<_Tp>& __e1, const _Dom& __e2) 617*e4b17023SJohn Marino : _Base(__e1, __e2) {} 618*e4b17023SJohn Marino }; 619*e4b17023SJohn Marino 620*e4b17023SJohn Marino template<class _Oper, class _Dom> 621*e4b17023SJohn Marino struct _BinClos<_Oper, _Expr, _Constant, _Dom, typename _Dom::value_type> 622*e4b17023SJohn Marino : _BinBase2<_Oper, _Dom> 623*e4b17023SJohn Marino { 624*e4b17023SJohn Marino typedef typename _Dom::value_type _Tp; 625*e4b17023SJohn Marino typedef _BinBase2<_Oper,_Dom> _Base; 626*e4b17023SJohn Marino typedef typename _Base::value_type value_type; 627*e4b17023SJohn Marino 628*e4b17023SJohn Marino _BinClos(const _Dom& __e1, const _Tp& __e2) : _Base(__e1, __e2) {} 629*e4b17023SJohn Marino }; 630*e4b17023SJohn Marino 631*e4b17023SJohn Marino template<class _Oper, class _Dom> 632*e4b17023SJohn Marino struct _BinClos<_Oper, _Constant, _Expr, typename _Dom::value_type, _Dom> 633*e4b17023SJohn Marino : _BinBase1<_Oper, _Dom> 634*e4b17023SJohn Marino { 635*e4b17023SJohn Marino typedef typename _Dom::value_type _Tp; 636*e4b17023SJohn Marino typedef _BinBase1<_Oper, _Dom> _Base; 637*e4b17023SJohn Marino typedef typename _Base::value_type value_type; 638*e4b17023SJohn Marino 639*e4b17023SJohn Marino _BinClos(const _Tp& __e1, const _Dom& __e2) : _Base(__e1, __e2) {} 640*e4b17023SJohn Marino }; 641*e4b17023SJohn Marino 642*e4b17023SJohn Marino template<class _Oper, typename _Tp> 643*e4b17023SJohn Marino struct _BinClos<_Oper, _ValArray, _Constant, _Tp, _Tp> 644*e4b17023SJohn Marino : _BinBase2<_Oper, valarray<_Tp> > 645*e4b17023SJohn Marino { 646*e4b17023SJohn Marino typedef _BinBase2<_Oper,valarray<_Tp> > _Base; 647*e4b17023SJohn Marino typedef typename _Base::value_type value_type; 648*e4b17023SJohn Marino 649*e4b17023SJohn Marino _BinClos(const valarray<_Tp>& __v, const _Tp& __t) : _Base(__v, __t) {} 650*e4b17023SJohn Marino }; 651*e4b17023SJohn Marino 652*e4b17023SJohn Marino template<class _Oper, typename _Tp> 653*e4b17023SJohn Marino struct _BinClos<_Oper, _Constant, _ValArray, _Tp, _Tp> 654*e4b17023SJohn Marino : _BinBase1<_Oper, valarray<_Tp> > 655*e4b17023SJohn Marino { 656*e4b17023SJohn Marino typedef _BinBase1<_Oper, valarray<_Tp> > _Base; 657*e4b17023SJohn Marino typedef typename _Base::value_type value_type; 658*e4b17023SJohn Marino 659*e4b17023SJohn Marino _BinClos(const _Tp& __t, const valarray<_Tp>& __v) : _Base(__t, __v) {} 660*e4b17023SJohn Marino }; 661*e4b17023SJohn Marino 662*e4b17023SJohn Marino // 663*e4b17023SJohn Marino // slice_array closure. 664*e4b17023SJohn Marino // 665*e4b17023SJohn Marino template<typename _Dom> 666*e4b17023SJohn Marino class _SBase 667*e4b17023SJohn Marino { 668*e4b17023SJohn Marino public: 669*e4b17023SJohn Marino typedef typename _Dom::value_type value_type; 670*e4b17023SJohn Marino 671*e4b17023SJohn Marino _SBase (const _Dom& __e, const slice& __s) 672*e4b17023SJohn Marino : _M_expr (__e), _M_slice (__s) {} 673*e4b17023SJohn Marino 674*e4b17023SJohn Marino value_type 675*e4b17023SJohn Marino operator[] (size_t __i) const 676*e4b17023SJohn Marino { return _M_expr[_M_slice.start () + __i * _M_slice.stride ()]; } 677*e4b17023SJohn Marino 678*e4b17023SJohn Marino size_t 679*e4b17023SJohn Marino size() const 680*e4b17023SJohn Marino { return _M_slice.size (); } 681*e4b17023SJohn Marino 682*e4b17023SJohn Marino private: 683*e4b17023SJohn Marino const _Dom& _M_expr; 684*e4b17023SJohn Marino const slice& _M_slice; 685*e4b17023SJohn Marino }; 686*e4b17023SJohn Marino 687*e4b17023SJohn Marino template<typename _Tp> 688*e4b17023SJohn Marino class _SBase<_Array<_Tp> > 689*e4b17023SJohn Marino { 690*e4b17023SJohn Marino public: 691*e4b17023SJohn Marino typedef _Tp value_type; 692*e4b17023SJohn Marino 693*e4b17023SJohn Marino _SBase (_Array<_Tp> __a, const slice& __s) 694*e4b17023SJohn Marino : _M_array (__a._M_data+__s.start()), _M_size (__s.size()), 695*e4b17023SJohn Marino _M_stride (__s.stride()) {} 696*e4b17023SJohn Marino 697*e4b17023SJohn Marino value_type 698*e4b17023SJohn Marino operator[] (size_t __i) const 699*e4b17023SJohn Marino { return _M_array._M_data[__i * _M_stride]; } 700*e4b17023SJohn Marino 701*e4b17023SJohn Marino size_t 702*e4b17023SJohn Marino size() const 703*e4b17023SJohn Marino { return _M_size; } 704*e4b17023SJohn Marino 705*e4b17023SJohn Marino private: 706*e4b17023SJohn Marino const _Array<_Tp> _M_array; 707*e4b17023SJohn Marino const size_t _M_size; 708*e4b17023SJohn Marino const size_t _M_stride; 709*e4b17023SJohn Marino }; 710*e4b17023SJohn Marino 711*e4b17023SJohn Marino template<class _Dom> 712*e4b17023SJohn Marino struct _SClos<_Expr, _Dom> 713*e4b17023SJohn Marino : _SBase<_Dom> 714*e4b17023SJohn Marino { 715*e4b17023SJohn Marino typedef _SBase<_Dom> _Base; 716*e4b17023SJohn Marino typedef typename _Base::value_type value_type; 717*e4b17023SJohn Marino 718*e4b17023SJohn Marino _SClos (const _Dom& __e, const slice& __s) : _Base (__e, __s) {} 719*e4b17023SJohn Marino }; 720*e4b17023SJohn Marino 721*e4b17023SJohn Marino template<typename _Tp> 722*e4b17023SJohn Marino struct _SClos<_ValArray, _Tp> 723*e4b17023SJohn Marino : _SBase<_Array<_Tp> > 724*e4b17023SJohn Marino { 725*e4b17023SJohn Marino typedef _SBase<_Array<_Tp> > _Base; 726*e4b17023SJohn Marino typedef _Tp value_type; 727*e4b17023SJohn Marino 728*e4b17023SJohn Marino _SClos (_Array<_Tp> __a, const slice& __s) : _Base (__a, __s) {} 729*e4b17023SJohn Marino }; 730*e4b17023SJohn Marino 731*e4b17023SJohn Marino _GLIBCXX_END_NAMESPACE_VERSION 732*e4b17023SJohn Marino } // namespace 733*e4b17023SJohn Marino 734*e4b17023SJohn Marino #endif /* _CPP_VALARRAY_BEFORE_H */ 735