1*4d6fc14bSjoerg// -*- C++ -*- 2*4d6fc14bSjoerg//===-------------------------- valarray ----------------------------------===// 3*4d6fc14bSjoerg// 4*4d6fc14bSjoerg// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5*4d6fc14bSjoerg// See https://llvm.org/LICENSE.txt for license information. 6*4d6fc14bSjoerg// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7*4d6fc14bSjoerg// 8*4d6fc14bSjoerg//===----------------------------------------------------------------------===// 9*4d6fc14bSjoerg 10*4d6fc14bSjoerg#ifndef _LIBCPP_VALARRAY 11*4d6fc14bSjoerg#define _LIBCPP_VALARRAY 12*4d6fc14bSjoerg 13*4d6fc14bSjoerg/* 14*4d6fc14bSjoerg valarray synopsis 15*4d6fc14bSjoerg 16*4d6fc14bSjoergnamespace std 17*4d6fc14bSjoerg{ 18*4d6fc14bSjoerg 19*4d6fc14bSjoergtemplate<class T> 20*4d6fc14bSjoergclass valarray 21*4d6fc14bSjoerg{ 22*4d6fc14bSjoergpublic: 23*4d6fc14bSjoerg typedef T value_type; 24*4d6fc14bSjoerg 25*4d6fc14bSjoerg // construct/destroy: 26*4d6fc14bSjoerg valarray(); 27*4d6fc14bSjoerg explicit valarray(size_t n); 28*4d6fc14bSjoerg valarray(const value_type& x, size_t n); 29*4d6fc14bSjoerg valarray(const value_type* px, size_t n); 30*4d6fc14bSjoerg valarray(const valarray& v); 31*4d6fc14bSjoerg valarray(valarray&& v) noexcept; 32*4d6fc14bSjoerg valarray(const slice_array<value_type>& sa); 33*4d6fc14bSjoerg valarray(const gslice_array<value_type>& ga); 34*4d6fc14bSjoerg valarray(const mask_array<value_type>& ma); 35*4d6fc14bSjoerg valarray(const indirect_array<value_type>& ia); 36*4d6fc14bSjoerg valarray(initializer_list<value_type> il); 37*4d6fc14bSjoerg ~valarray(); 38*4d6fc14bSjoerg 39*4d6fc14bSjoerg // assignment: 40*4d6fc14bSjoerg valarray& operator=(const valarray& v); 41*4d6fc14bSjoerg valarray& operator=(valarray&& v) noexcept; 42*4d6fc14bSjoerg valarray& operator=(initializer_list<value_type> il); 43*4d6fc14bSjoerg valarray& operator=(const value_type& x); 44*4d6fc14bSjoerg valarray& operator=(const slice_array<value_type>& sa); 45*4d6fc14bSjoerg valarray& operator=(const gslice_array<value_type>& ga); 46*4d6fc14bSjoerg valarray& operator=(const mask_array<value_type>& ma); 47*4d6fc14bSjoerg valarray& operator=(const indirect_array<value_type>& ia); 48*4d6fc14bSjoerg 49*4d6fc14bSjoerg // element access: 50*4d6fc14bSjoerg const value_type& operator[](size_t i) const; 51*4d6fc14bSjoerg value_type& operator[](size_t i); 52*4d6fc14bSjoerg 53*4d6fc14bSjoerg // subset operations: 54*4d6fc14bSjoerg valarray operator[](slice s) const; 55*4d6fc14bSjoerg slice_array<value_type> operator[](slice s); 56*4d6fc14bSjoerg valarray operator[](const gslice& gs) const; 57*4d6fc14bSjoerg gslice_array<value_type> operator[](const gslice& gs); 58*4d6fc14bSjoerg valarray operator[](const valarray<bool>& vb) const; 59*4d6fc14bSjoerg mask_array<value_type> operator[](const valarray<bool>& vb); 60*4d6fc14bSjoerg valarray operator[](const valarray<size_t>& vs) const; 61*4d6fc14bSjoerg indirect_array<value_type> operator[](const valarray<size_t>& vs); 62*4d6fc14bSjoerg 63*4d6fc14bSjoerg // unary operators: 64*4d6fc14bSjoerg valarray operator+() const; 65*4d6fc14bSjoerg valarray operator-() const; 66*4d6fc14bSjoerg valarray operator~() const; 67*4d6fc14bSjoerg valarray<bool> operator!() const; 68*4d6fc14bSjoerg 69*4d6fc14bSjoerg // computed assignment: 70*4d6fc14bSjoerg valarray& operator*= (const value_type& x); 71*4d6fc14bSjoerg valarray& operator/= (const value_type& x); 72*4d6fc14bSjoerg valarray& operator%= (const value_type& x); 73*4d6fc14bSjoerg valarray& operator+= (const value_type& x); 74*4d6fc14bSjoerg valarray& operator-= (const value_type& x); 75*4d6fc14bSjoerg valarray& operator^= (const value_type& x); 76*4d6fc14bSjoerg valarray& operator&= (const value_type& x); 77*4d6fc14bSjoerg valarray& operator|= (const value_type& x); 78*4d6fc14bSjoerg valarray& operator<<=(const value_type& x); 79*4d6fc14bSjoerg valarray& operator>>=(const value_type& x); 80*4d6fc14bSjoerg 81*4d6fc14bSjoerg valarray& operator*= (const valarray& v); 82*4d6fc14bSjoerg valarray& operator/= (const valarray& v); 83*4d6fc14bSjoerg valarray& operator%= (const valarray& v); 84*4d6fc14bSjoerg valarray& operator+= (const valarray& v); 85*4d6fc14bSjoerg valarray& operator-= (const valarray& v); 86*4d6fc14bSjoerg valarray& operator^= (const valarray& v); 87*4d6fc14bSjoerg valarray& operator|= (const valarray& v); 88*4d6fc14bSjoerg valarray& operator&= (const valarray& v); 89*4d6fc14bSjoerg valarray& operator<<=(const valarray& v); 90*4d6fc14bSjoerg valarray& operator>>=(const valarray& v); 91*4d6fc14bSjoerg 92*4d6fc14bSjoerg // member functions: 93*4d6fc14bSjoerg void swap(valarray& v) noexcept; 94*4d6fc14bSjoerg 95*4d6fc14bSjoerg size_t size() const; 96*4d6fc14bSjoerg 97*4d6fc14bSjoerg value_type sum() const; 98*4d6fc14bSjoerg value_type min() const; 99*4d6fc14bSjoerg value_type max() const; 100*4d6fc14bSjoerg 101*4d6fc14bSjoerg valarray shift (int i) const; 102*4d6fc14bSjoerg valarray cshift(int i) const; 103*4d6fc14bSjoerg valarray apply(value_type f(value_type)) const; 104*4d6fc14bSjoerg valarray apply(value_type f(const value_type&)) const; 105*4d6fc14bSjoerg void resize(size_t n, value_type x = value_type()); 106*4d6fc14bSjoerg}; 107*4d6fc14bSjoerg 108*4d6fc14bSjoergclass slice 109*4d6fc14bSjoerg{ 110*4d6fc14bSjoergpublic: 111*4d6fc14bSjoerg slice(); 112*4d6fc14bSjoerg slice(size_t start, size_t size, size_t stride); 113*4d6fc14bSjoerg 114*4d6fc14bSjoerg size_t start() const; 115*4d6fc14bSjoerg size_t size() const; 116*4d6fc14bSjoerg size_t stride() const; 117*4d6fc14bSjoerg}; 118*4d6fc14bSjoerg 119*4d6fc14bSjoergtemplate <class T> 120*4d6fc14bSjoergclass slice_array 121*4d6fc14bSjoerg{ 122*4d6fc14bSjoergpublic: 123*4d6fc14bSjoerg typedef T value_type; 124*4d6fc14bSjoerg 125*4d6fc14bSjoerg const slice_array& operator=(const slice_array& sa) const; 126*4d6fc14bSjoerg void operator= (const valarray<value_type>& v) const; 127*4d6fc14bSjoerg void operator*= (const valarray<value_type>& v) const; 128*4d6fc14bSjoerg void operator/= (const valarray<value_type>& v) const; 129*4d6fc14bSjoerg void operator%= (const valarray<value_type>& v) const; 130*4d6fc14bSjoerg void operator+= (const valarray<value_type>& v) const; 131*4d6fc14bSjoerg void operator-= (const valarray<value_type>& v) const; 132*4d6fc14bSjoerg void operator^= (const valarray<value_type>& v) const; 133*4d6fc14bSjoerg void operator&= (const valarray<value_type>& v) const; 134*4d6fc14bSjoerg void operator|= (const valarray<value_type>& v) const; 135*4d6fc14bSjoerg void operator<<=(const valarray<value_type>& v) const; 136*4d6fc14bSjoerg void operator>>=(const valarray<value_type>& v) const; 137*4d6fc14bSjoerg 138*4d6fc14bSjoerg void operator=(const value_type& x) const; 139*4d6fc14bSjoerg void operator=(const valarray<T>& val_arr) const; 140*4d6fc14bSjoerg 141*4d6fc14bSjoerg slice_array() = delete; 142*4d6fc14bSjoerg}; 143*4d6fc14bSjoerg 144*4d6fc14bSjoergclass gslice 145*4d6fc14bSjoerg{ 146*4d6fc14bSjoergpublic: 147*4d6fc14bSjoerg gslice(); 148*4d6fc14bSjoerg gslice(size_t start, const valarray<size_t>& size, 149*4d6fc14bSjoerg const valarray<size_t>& stride); 150*4d6fc14bSjoerg 151*4d6fc14bSjoerg size_t start() const; 152*4d6fc14bSjoerg valarray<size_t> size() const; 153*4d6fc14bSjoerg valarray<size_t> stride() const; 154*4d6fc14bSjoerg}; 155*4d6fc14bSjoerg 156*4d6fc14bSjoergtemplate <class T> 157*4d6fc14bSjoergclass gslice_array 158*4d6fc14bSjoerg{ 159*4d6fc14bSjoergpublic: 160*4d6fc14bSjoerg typedef T value_type; 161*4d6fc14bSjoerg 162*4d6fc14bSjoerg void operator= (const valarray<value_type>& v) const; 163*4d6fc14bSjoerg void operator*= (const valarray<value_type>& v) const; 164*4d6fc14bSjoerg void operator/= (const valarray<value_type>& v) const; 165*4d6fc14bSjoerg void operator%= (const valarray<value_type>& v) const; 166*4d6fc14bSjoerg void operator+= (const valarray<value_type>& v) const; 167*4d6fc14bSjoerg void operator-= (const valarray<value_type>& v) const; 168*4d6fc14bSjoerg void operator^= (const valarray<value_type>& v) const; 169*4d6fc14bSjoerg void operator&= (const valarray<value_type>& v) const; 170*4d6fc14bSjoerg void operator|= (const valarray<value_type>& v) const; 171*4d6fc14bSjoerg void operator<<=(const valarray<value_type>& v) const; 172*4d6fc14bSjoerg void operator>>=(const valarray<value_type>& v) const; 173*4d6fc14bSjoerg 174*4d6fc14bSjoerg gslice_array(const gslice_array& ga); 175*4d6fc14bSjoerg ~gslice_array(); 176*4d6fc14bSjoerg const gslice_array& operator=(const gslice_array& ga) const; 177*4d6fc14bSjoerg void operator=(const value_type& x) const; 178*4d6fc14bSjoerg 179*4d6fc14bSjoerg gslice_array() = delete; 180*4d6fc14bSjoerg}; 181*4d6fc14bSjoerg 182*4d6fc14bSjoergtemplate <class T> 183*4d6fc14bSjoergclass mask_array 184*4d6fc14bSjoerg{ 185*4d6fc14bSjoergpublic: 186*4d6fc14bSjoerg typedef T value_type; 187*4d6fc14bSjoerg 188*4d6fc14bSjoerg void operator= (const valarray<value_type>& v) const; 189*4d6fc14bSjoerg void operator*= (const valarray<value_type>& v) const; 190*4d6fc14bSjoerg void operator/= (const valarray<value_type>& v) const; 191*4d6fc14bSjoerg void operator%= (const valarray<value_type>& v) const; 192*4d6fc14bSjoerg void operator+= (const valarray<value_type>& v) const; 193*4d6fc14bSjoerg void operator-= (const valarray<value_type>& v) const; 194*4d6fc14bSjoerg void operator^= (const valarray<value_type>& v) const; 195*4d6fc14bSjoerg void operator&= (const valarray<value_type>& v) const; 196*4d6fc14bSjoerg void operator|= (const valarray<value_type>& v) const; 197*4d6fc14bSjoerg void operator<<=(const valarray<value_type>& v) const; 198*4d6fc14bSjoerg void operator>>=(const valarray<value_type>& v) const; 199*4d6fc14bSjoerg 200*4d6fc14bSjoerg mask_array(const mask_array& ma); 201*4d6fc14bSjoerg ~mask_array(); 202*4d6fc14bSjoerg const mask_array& operator=(const mask_array& ma) const; 203*4d6fc14bSjoerg void operator=(const value_type& x) const; 204*4d6fc14bSjoerg 205*4d6fc14bSjoerg mask_array() = delete; 206*4d6fc14bSjoerg}; 207*4d6fc14bSjoerg 208*4d6fc14bSjoergtemplate <class T> 209*4d6fc14bSjoergclass indirect_array 210*4d6fc14bSjoerg{ 211*4d6fc14bSjoergpublic: 212*4d6fc14bSjoerg typedef T value_type; 213*4d6fc14bSjoerg 214*4d6fc14bSjoerg void operator= (const valarray<value_type>& v) const; 215*4d6fc14bSjoerg void operator*= (const valarray<value_type>& v) const; 216*4d6fc14bSjoerg void operator/= (const valarray<value_type>& v) const; 217*4d6fc14bSjoerg void operator%= (const valarray<value_type>& v) const; 218*4d6fc14bSjoerg void operator+= (const valarray<value_type>& v) const; 219*4d6fc14bSjoerg void operator-= (const valarray<value_type>& v) const; 220*4d6fc14bSjoerg void operator^= (const valarray<value_type>& v) const; 221*4d6fc14bSjoerg void operator&= (const valarray<value_type>& v) const; 222*4d6fc14bSjoerg void operator|= (const valarray<value_type>& v) const; 223*4d6fc14bSjoerg void operator<<=(const valarray<value_type>& v) const; 224*4d6fc14bSjoerg void operator>>=(const valarray<value_type>& v) const; 225*4d6fc14bSjoerg 226*4d6fc14bSjoerg indirect_array(const indirect_array& ia); 227*4d6fc14bSjoerg ~indirect_array(); 228*4d6fc14bSjoerg const indirect_array& operator=(const indirect_array& ia) const; 229*4d6fc14bSjoerg void operator=(const value_type& x) const; 230*4d6fc14bSjoerg 231*4d6fc14bSjoerg indirect_array() = delete; 232*4d6fc14bSjoerg}; 233*4d6fc14bSjoerg 234*4d6fc14bSjoergtemplate<class T> void swap(valarray<T>& x, valarray<T>& y) noexcept; 235*4d6fc14bSjoerg 236*4d6fc14bSjoergtemplate<class T> valarray<T> operator* (const valarray<T>& x, const valarray<T>& y); 237*4d6fc14bSjoergtemplate<class T> valarray<T> operator* (const valarray<T>& x, const T& y); 238*4d6fc14bSjoergtemplate<class T> valarray<T> operator* (const T& x, const valarray<T>& y); 239*4d6fc14bSjoerg 240*4d6fc14bSjoergtemplate<class T> valarray<T> operator/ (const valarray<T>& x, const valarray<T>& y); 241*4d6fc14bSjoergtemplate<class T> valarray<T> operator/ (const valarray<T>& x, const T& y); 242*4d6fc14bSjoergtemplate<class T> valarray<T> operator/ (const T& x, const valarray<T>& y); 243*4d6fc14bSjoerg 244*4d6fc14bSjoergtemplate<class T> valarray<T> operator% (const valarray<T>& x, const valarray<T>& y); 245*4d6fc14bSjoergtemplate<class T> valarray<T> operator% (const valarray<T>& x, const T& y); 246*4d6fc14bSjoergtemplate<class T> valarray<T> operator% (const T& x, const valarray<T>& y); 247*4d6fc14bSjoerg 248*4d6fc14bSjoergtemplate<class T> valarray<T> operator+ (const valarray<T>& x, const valarray<T>& y); 249*4d6fc14bSjoergtemplate<class T> valarray<T> operator+ (const valarray<T>& x, const T& y); 250*4d6fc14bSjoergtemplate<class T> valarray<T> operator+ (const T& x, const valarray<T>& y); 251*4d6fc14bSjoerg 252*4d6fc14bSjoergtemplate<class T> valarray<T> operator- (const valarray<T>& x, const valarray<T>& y); 253*4d6fc14bSjoergtemplate<class T> valarray<T> operator- (const valarray<T>& x, const T& y); 254*4d6fc14bSjoergtemplate<class T> valarray<T> operator- (const T& x, const valarray<T>& y); 255*4d6fc14bSjoerg 256*4d6fc14bSjoergtemplate<class T> valarray<T> operator^ (const valarray<T>& x, const valarray<T>& y); 257*4d6fc14bSjoergtemplate<class T> valarray<T> operator^ (const valarray<T>& x, const T& y); 258*4d6fc14bSjoergtemplate<class T> valarray<T> operator^ (const T& x, const valarray<T>& y); 259*4d6fc14bSjoerg 260*4d6fc14bSjoergtemplate<class T> valarray<T> operator& (const valarray<T>& x, const valarray<T>& y); 261*4d6fc14bSjoergtemplate<class T> valarray<T> operator& (const valarray<T>& x, const T& y); 262*4d6fc14bSjoergtemplate<class T> valarray<T> operator& (const T& x, const valarray<T>& y); 263*4d6fc14bSjoerg 264*4d6fc14bSjoergtemplate<class T> valarray<T> operator| (const valarray<T>& x, const valarray<T>& y); 265*4d6fc14bSjoergtemplate<class T> valarray<T> operator| (const valarray<T>& x, const T& y); 266*4d6fc14bSjoergtemplate<class T> valarray<T> operator| (const T& x, const valarray<T>& y); 267*4d6fc14bSjoerg 268*4d6fc14bSjoergtemplate<class T> valarray<T> operator<<(const valarray<T>& x, const valarray<T>& y); 269*4d6fc14bSjoergtemplate<class T> valarray<T> operator<<(const valarray<T>& x, const T& y); 270*4d6fc14bSjoergtemplate<class T> valarray<T> operator<<(const T& x, const valarray<T>& y); 271*4d6fc14bSjoerg 272*4d6fc14bSjoergtemplate<class T> valarray<T> operator>>(const valarray<T>& x, const valarray<T>& y); 273*4d6fc14bSjoergtemplate<class T> valarray<T> operator>>(const valarray<T>& x, const T& y); 274*4d6fc14bSjoergtemplate<class T> valarray<T> operator>>(const T& x, const valarray<T>& y); 275*4d6fc14bSjoerg 276*4d6fc14bSjoergtemplate<class T> valarray<bool> operator&&(const valarray<T>& x, const valarray<T>& y); 277*4d6fc14bSjoergtemplate<class T> valarray<bool> operator&&(const valarray<T>& x, const T& y); 278*4d6fc14bSjoergtemplate<class T> valarray<bool> operator&&(const T& x, const valarray<T>& y); 279*4d6fc14bSjoerg 280*4d6fc14bSjoergtemplate<class T> valarray<bool> operator||(const valarray<T>& x, const valarray<T>& y); 281*4d6fc14bSjoergtemplate<class T> valarray<bool> operator||(const valarray<T>& x, const T& y); 282*4d6fc14bSjoergtemplate<class T> valarray<bool> operator||(const T& x, const valarray<T>& y); 283*4d6fc14bSjoerg 284*4d6fc14bSjoergtemplate<class T> valarray<bool> operator==(const valarray<T>& x, const valarray<T>& y); 285*4d6fc14bSjoergtemplate<class T> valarray<bool> operator==(const valarray<T>& x, const T& y); 286*4d6fc14bSjoergtemplate<class T> valarray<bool> operator==(const T& x, const valarray<T>& y); 287*4d6fc14bSjoerg 288*4d6fc14bSjoergtemplate<class T> valarray<bool> operator!=(const valarray<T>& x, const valarray<T>& y); 289*4d6fc14bSjoergtemplate<class T> valarray<bool> operator!=(const valarray<T>& x, const T& y); 290*4d6fc14bSjoergtemplate<class T> valarray<bool> operator!=(const T& x, const valarray<T>& y); 291*4d6fc14bSjoerg 292*4d6fc14bSjoergtemplate<class T> valarray<bool> operator< (const valarray<T>& x, const valarray<T>& y); 293*4d6fc14bSjoergtemplate<class T> valarray<bool> operator< (const valarray<T>& x, const T& y); 294*4d6fc14bSjoergtemplate<class T> valarray<bool> operator< (const T& x, const valarray<T>& y); 295*4d6fc14bSjoerg 296*4d6fc14bSjoergtemplate<class T> valarray<bool> operator> (const valarray<T>& x, const valarray<T>& y); 297*4d6fc14bSjoergtemplate<class T> valarray<bool> operator> (const valarray<T>& x, const T& y); 298*4d6fc14bSjoergtemplate<class T> valarray<bool> operator> (const T& x, const valarray<T>& y); 299*4d6fc14bSjoerg 300*4d6fc14bSjoergtemplate<class T> valarray<bool> operator<=(const valarray<T>& x, const valarray<T>& y); 301*4d6fc14bSjoergtemplate<class T> valarray<bool> operator<=(const valarray<T>& x, const T& y); 302*4d6fc14bSjoergtemplate<class T> valarray<bool> operator<=(const T& x, const valarray<T>& y); 303*4d6fc14bSjoerg 304*4d6fc14bSjoergtemplate<class T> valarray<bool> operator>=(const valarray<T>& x, const valarray<T>& y); 305*4d6fc14bSjoergtemplate<class T> valarray<bool> operator>=(const valarray<T>& x, const T& y); 306*4d6fc14bSjoergtemplate<class T> valarray<bool> operator>=(const T& x, const valarray<T>& y); 307*4d6fc14bSjoerg 308*4d6fc14bSjoergtemplate<class T> valarray<T> abs (const valarray<T>& x); 309*4d6fc14bSjoergtemplate<class T> valarray<T> acos (const valarray<T>& x); 310*4d6fc14bSjoergtemplate<class T> valarray<T> asin (const valarray<T>& x); 311*4d6fc14bSjoergtemplate<class T> valarray<T> atan (const valarray<T>& x); 312*4d6fc14bSjoerg 313*4d6fc14bSjoergtemplate<class T> valarray<T> atan2(const valarray<T>& x, const valarray<T>& y); 314*4d6fc14bSjoergtemplate<class T> valarray<T> atan2(const valarray<T>& x, const T& y); 315*4d6fc14bSjoergtemplate<class T> valarray<T> atan2(const T& x, const valarray<T>& y); 316*4d6fc14bSjoerg 317*4d6fc14bSjoergtemplate<class T> valarray<T> cos (const valarray<T>& x); 318*4d6fc14bSjoergtemplate<class T> valarray<T> cosh (const valarray<T>& x); 319*4d6fc14bSjoergtemplate<class T> valarray<T> exp (const valarray<T>& x); 320*4d6fc14bSjoergtemplate<class T> valarray<T> log (const valarray<T>& x); 321*4d6fc14bSjoergtemplate<class T> valarray<T> log10(const valarray<T>& x); 322*4d6fc14bSjoerg 323*4d6fc14bSjoergtemplate<class T> valarray<T> pow(const valarray<T>& x, const valarray<T>& y); 324*4d6fc14bSjoergtemplate<class T> valarray<T> pow(const valarray<T>& x, const T& y); 325*4d6fc14bSjoergtemplate<class T> valarray<T> pow(const T& x, const valarray<T>& y); 326*4d6fc14bSjoerg 327*4d6fc14bSjoergtemplate<class T> valarray<T> sin (const valarray<T>& x); 328*4d6fc14bSjoergtemplate<class T> valarray<T> sinh (const valarray<T>& x); 329*4d6fc14bSjoergtemplate<class T> valarray<T> sqrt (const valarray<T>& x); 330*4d6fc14bSjoergtemplate<class T> valarray<T> tan (const valarray<T>& x); 331*4d6fc14bSjoergtemplate<class T> valarray<T> tanh (const valarray<T>& x); 332*4d6fc14bSjoerg 333*4d6fc14bSjoergtemplate <class T> unspecified1 begin(valarray<T>& v); 334*4d6fc14bSjoergtemplate <class T> unspecified2 begin(const valarray<T>& v); 335*4d6fc14bSjoergtemplate <class T> unspecified1 end(valarray<T>& v); 336*4d6fc14bSjoergtemplate <class T> unspecified2 end(const valarray<T>& v); 337*4d6fc14bSjoerg 338*4d6fc14bSjoerg} // std 339*4d6fc14bSjoerg 340*4d6fc14bSjoerg*/ 341*4d6fc14bSjoerg 342*4d6fc14bSjoerg#include <__config> 343*4d6fc14bSjoerg#include <cstddef> 344*4d6fc14bSjoerg#include <cmath> 345*4d6fc14bSjoerg#include <initializer_list> 346*4d6fc14bSjoerg#include <algorithm> 347*4d6fc14bSjoerg#include <functional> 348*4d6fc14bSjoerg#include <new> 349*4d6fc14bSjoerg 350*4d6fc14bSjoerg#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 351*4d6fc14bSjoerg#pragma GCC system_header 352*4d6fc14bSjoerg#endif 353*4d6fc14bSjoerg 354*4d6fc14bSjoerg_LIBCPP_PUSH_MACROS 355*4d6fc14bSjoerg#include <__undef_macros> 356*4d6fc14bSjoerg 357*4d6fc14bSjoerg 358*4d6fc14bSjoerg_LIBCPP_BEGIN_NAMESPACE_STD 359*4d6fc14bSjoerg 360*4d6fc14bSjoergtemplate<class _Tp> class _LIBCPP_TEMPLATE_VIS valarray; 361*4d6fc14bSjoerg 362*4d6fc14bSjoergclass _LIBCPP_TEMPLATE_VIS slice 363*4d6fc14bSjoerg{ 364*4d6fc14bSjoerg size_t __start_; 365*4d6fc14bSjoerg size_t __size_; 366*4d6fc14bSjoerg size_t __stride_; 367*4d6fc14bSjoergpublic: 368*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 369*4d6fc14bSjoerg slice() 370*4d6fc14bSjoerg : __start_(0), 371*4d6fc14bSjoerg __size_(0), 372*4d6fc14bSjoerg __stride_(0) 373*4d6fc14bSjoerg {} 374*4d6fc14bSjoerg 375*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 376*4d6fc14bSjoerg slice(size_t __start, size_t __size, size_t __stride) 377*4d6fc14bSjoerg : __start_(__start), 378*4d6fc14bSjoerg __size_(__size), 379*4d6fc14bSjoerg __stride_(__stride) 380*4d6fc14bSjoerg {} 381*4d6fc14bSjoerg 382*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY size_t start() const {return __start_;} 383*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY size_t size() const {return __size_;} 384*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY size_t stride() const {return __stride_;} 385*4d6fc14bSjoerg}; 386*4d6fc14bSjoerg 387*4d6fc14bSjoergtemplate <class _Tp> class _LIBCPP_TEMPLATE_VIS slice_array; 388*4d6fc14bSjoergclass _LIBCPP_TYPE_VIS gslice; 389*4d6fc14bSjoergtemplate <class _Tp> class _LIBCPP_TEMPLATE_VIS gslice_array; 390*4d6fc14bSjoergtemplate <class _Tp> class _LIBCPP_TEMPLATE_VIS mask_array; 391*4d6fc14bSjoergtemplate <class _Tp> class _LIBCPP_TEMPLATE_VIS indirect_array; 392*4d6fc14bSjoerg 393*4d6fc14bSjoergtemplate <class _Tp> 394*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY 395*4d6fc14bSjoerg_Tp* 396*4d6fc14bSjoergbegin(valarray<_Tp>& __v); 397*4d6fc14bSjoerg 398*4d6fc14bSjoergtemplate <class _Tp> 399*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY 400*4d6fc14bSjoergconst _Tp* 401*4d6fc14bSjoergbegin(const valarray<_Tp>& __v); 402*4d6fc14bSjoerg 403*4d6fc14bSjoergtemplate <class _Tp> 404*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY 405*4d6fc14bSjoerg_Tp* 406*4d6fc14bSjoergend(valarray<_Tp>& __v); 407*4d6fc14bSjoerg 408*4d6fc14bSjoergtemplate <class _Tp> 409*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY 410*4d6fc14bSjoergconst _Tp* 411*4d6fc14bSjoergend(const valarray<_Tp>& __v); 412*4d6fc14bSjoerg 413*4d6fc14bSjoergtemplate <class _Op, class _A0> 414*4d6fc14bSjoergstruct _UnaryOp 415*4d6fc14bSjoerg{ 416*4d6fc14bSjoerg typedef typename _Op::result_type result_type; 417*4d6fc14bSjoerg typedef typename _A0::value_type value_type; 418*4d6fc14bSjoerg 419*4d6fc14bSjoerg _Op __op_; 420*4d6fc14bSjoerg _A0 __a0_; 421*4d6fc14bSjoerg 422*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 423*4d6fc14bSjoerg _UnaryOp(const _Op& __op, const _A0& __a0) : __op_(__op), __a0_(__a0) {} 424*4d6fc14bSjoerg 425*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 426*4d6fc14bSjoerg result_type operator[](size_t __i) const {return __op_(__a0_[__i]);} 427*4d6fc14bSjoerg 428*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 429*4d6fc14bSjoerg size_t size() const {return __a0_.size();} 430*4d6fc14bSjoerg}; 431*4d6fc14bSjoerg 432*4d6fc14bSjoergtemplate <class _Op, class _A0, class _A1> 433*4d6fc14bSjoergstruct _BinaryOp 434*4d6fc14bSjoerg{ 435*4d6fc14bSjoerg typedef typename _Op::result_type result_type; 436*4d6fc14bSjoerg typedef typename _A0::value_type value_type; 437*4d6fc14bSjoerg 438*4d6fc14bSjoerg _Op __op_; 439*4d6fc14bSjoerg _A0 __a0_; 440*4d6fc14bSjoerg _A1 __a1_; 441*4d6fc14bSjoerg 442*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 443*4d6fc14bSjoerg _BinaryOp(const _Op& __op, const _A0& __a0, const _A1& __a1) 444*4d6fc14bSjoerg : __op_(__op), __a0_(__a0), __a1_(__a1) {} 445*4d6fc14bSjoerg 446*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 447*4d6fc14bSjoerg value_type operator[](size_t __i) const {return __op_(__a0_[__i], __a1_[__i]);} 448*4d6fc14bSjoerg 449*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 450*4d6fc14bSjoerg size_t size() const {return __a0_.size();} 451*4d6fc14bSjoerg}; 452*4d6fc14bSjoerg 453*4d6fc14bSjoergtemplate <class _Tp> 454*4d6fc14bSjoergclass __scalar_expr 455*4d6fc14bSjoerg{ 456*4d6fc14bSjoergpublic: 457*4d6fc14bSjoerg typedef _Tp value_type; 458*4d6fc14bSjoerg typedef const _Tp& result_type; 459*4d6fc14bSjoergprivate: 460*4d6fc14bSjoerg const value_type& __t_; 461*4d6fc14bSjoerg size_t __s_; 462*4d6fc14bSjoergpublic: 463*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 464*4d6fc14bSjoerg explicit __scalar_expr(const value_type& __t, size_t __s) : __t_(__t), __s_(__s) {} 465*4d6fc14bSjoerg 466*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 467*4d6fc14bSjoerg result_type operator[](size_t) const {return __t_;} 468*4d6fc14bSjoerg 469*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 470*4d6fc14bSjoerg size_t size() const {return __s_;} 471*4d6fc14bSjoerg}; 472*4d6fc14bSjoerg 473*4d6fc14bSjoergtemplate <class _Tp> 474*4d6fc14bSjoergstruct __unary_plus : unary_function<_Tp, _Tp> 475*4d6fc14bSjoerg{ 476*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 477*4d6fc14bSjoerg _Tp operator()(const _Tp& __x) const 478*4d6fc14bSjoerg {return +__x;} 479*4d6fc14bSjoerg}; 480*4d6fc14bSjoerg 481*4d6fc14bSjoergtemplate <class _Tp> 482*4d6fc14bSjoergstruct __bit_not : unary_function<_Tp, _Tp> 483*4d6fc14bSjoerg{ 484*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 485*4d6fc14bSjoerg _Tp operator()(const _Tp& __x) const 486*4d6fc14bSjoerg {return ~__x;} 487*4d6fc14bSjoerg}; 488*4d6fc14bSjoerg 489*4d6fc14bSjoergtemplate <class _Tp> 490*4d6fc14bSjoergstruct __bit_shift_left : binary_function<_Tp, _Tp, _Tp> 491*4d6fc14bSjoerg{ 492*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 493*4d6fc14bSjoerg _Tp operator()(const _Tp& __x, const _Tp& __y) const 494*4d6fc14bSjoerg {return __x << __y;} 495*4d6fc14bSjoerg}; 496*4d6fc14bSjoerg 497*4d6fc14bSjoergtemplate <class _Tp> 498*4d6fc14bSjoergstruct __bit_shift_right : binary_function<_Tp, _Tp, _Tp> 499*4d6fc14bSjoerg{ 500*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 501*4d6fc14bSjoerg _Tp operator()(const _Tp& __x, const _Tp& __y) const 502*4d6fc14bSjoerg {return __x >> __y;} 503*4d6fc14bSjoerg}; 504*4d6fc14bSjoerg 505*4d6fc14bSjoergtemplate <class _Tp, class _Fp> 506*4d6fc14bSjoergstruct __apply_expr : unary_function<_Tp, _Tp> 507*4d6fc14bSjoerg{ 508*4d6fc14bSjoergprivate: 509*4d6fc14bSjoerg _Fp __f_; 510*4d6fc14bSjoergpublic: 511*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 512*4d6fc14bSjoerg explicit __apply_expr(_Fp __f) : __f_(__f) {} 513*4d6fc14bSjoerg 514*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 515*4d6fc14bSjoerg _Tp operator()(const _Tp& __x) const 516*4d6fc14bSjoerg {return __f_(__x);} 517*4d6fc14bSjoerg}; 518*4d6fc14bSjoerg 519*4d6fc14bSjoergtemplate <class _Tp> 520*4d6fc14bSjoergstruct __abs_expr : unary_function<_Tp, _Tp> 521*4d6fc14bSjoerg{ 522*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 523*4d6fc14bSjoerg _Tp operator()(const _Tp& __x) const 524*4d6fc14bSjoerg {return abs(__x);} 525*4d6fc14bSjoerg}; 526*4d6fc14bSjoerg 527*4d6fc14bSjoergtemplate <class _Tp> 528*4d6fc14bSjoergstruct __acos_expr : unary_function<_Tp, _Tp> 529*4d6fc14bSjoerg{ 530*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 531*4d6fc14bSjoerg _Tp operator()(const _Tp& __x) const 532*4d6fc14bSjoerg {return acos(__x);} 533*4d6fc14bSjoerg}; 534*4d6fc14bSjoerg 535*4d6fc14bSjoergtemplate <class _Tp> 536*4d6fc14bSjoergstruct __asin_expr : unary_function<_Tp, _Tp> 537*4d6fc14bSjoerg{ 538*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 539*4d6fc14bSjoerg _Tp operator()(const _Tp& __x) const 540*4d6fc14bSjoerg {return asin(__x);} 541*4d6fc14bSjoerg}; 542*4d6fc14bSjoerg 543*4d6fc14bSjoergtemplate <class _Tp> 544*4d6fc14bSjoergstruct __atan_expr : unary_function<_Tp, _Tp> 545*4d6fc14bSjoerg{ 546*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 547*4d6fc14bSjoerg _Tp operator()(const _Tp& __x) const 548*4d6fc14bSjoerg {return atan(__x);} 549*4d6fc14bSjoerg}; 550*4d6fc14bSjoerg 551*4d6fc14bSjoergtemplate <class _Tp> 552*4d6fc14bSjoergstruct __atan2_expr : binary_function<_Tp, _Tp, _Tp> 553*4d6fc14bSjoerg{ 554*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 555*4d6fc14bSjoerg _Tp operator()(const _Tp& __x, const _Tp& __y) const 556*4d6fc14bSjoerg {return atan2(__x, __y);} 557*4d6fc14bSjoerg}; 558*4d6fc14bSjoerg 559*4d6fc14bSjoergtemplate <class _Tp> 560*4d6fc14bSjoergstruct __cos_expr : unary_function<_Tp, _Tp> 561*4d6fc14bSjoerg{ 562*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 563*4d6fc14bSjoerg _Tp operator()(const _Tp& __x) const 564*4d6fc14bSjoerg {return cos(__x);} 565*4d6fc14bSjoerg}; 566*4d6fc14bSjoerg 567*4d6fc14bSjoergtemplate <class _Tp> 568*4d6fc14bSjoergstruct __cosh_expr : unary_function<_Tp, _Tp> 569*4d6fc14bSjoerg{ 570*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 571*4d6fc14bSjoerg _Tp operator()(const _Tp& __x) const 572*4d6fc14bSjoerg {return cosh(__x);} 573*4d6fc14bSjoerg}; 574*4d6fc14bSjoerg 575*4d6fc14bSjoergtemplate <class _Tp> 576*4d6fc14bSjoergstruct __exp_expr : unary_function<_Tp, _Tp> 577*4d6fc14bSjoerg{ 578*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 579*4d6fc14bSjoerg _Tp operator()(const _Tp& __x) const 580*4d6fc14bSjoerg {return exp(__x);} 581*4d6fc14bSjoerg}; 582*4d6fc14bSjoerg 583*4d6fc14bSjoergtemplate <class _Tp> 584*4d6fc14bSjoergstruct __log_expr : unary_function<_Tp, _Tp> 585*4d6fc14bSjoerg{ 586*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 587*4d6fc14bSjoerg _Tp operator()(const _Tp& __x) const 588*4d6fc14bSjoerg {return log(__x);} 589*4d6fc14bSjoerg}; 590*4d6fc14bSjoerg 591*4d6fc14bSjoergtemplate <class _Tp> 592*4d6fc14bSjoergstruct __log10_expr : unary_function<_Tp, _Tp> 593*4d6fc14bSjoerg{ 594*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 595*4d6fc14bSjoerg _Tp operator()(const _Tp& __x) const 596*4d6fc14bSjoerg {return log10(__x);} 597*4d6fc14bSjoerg}; 598*4d6fc14bSjoerg 599*4d6fc14bSjoergtemplate <class _Tp> 600*4d6fc14bSjoergstruct __pow_expr : binary_function<_Tp, _Tp, _Tp> 601*4d6fc14bSjoerg{ 602*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 603*4d6fc14bSjoerg _Tp operator()(const _Tp& __x, const _Tp& __y) const 604*4d6fc14bSjoerg {return pow(__x, __y);} 605*4d6fc14bSjoerg}; 606*4d6fc14bSjoerg 607*4d6fc14bSjoergtemplate <class _Tp> 608*4d6fc14bSjoergstruct __sin_expr : unary_function<_Tp, _Tp> 609*4d6fc14bSjoerg{ 610*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 611*4d6fc14bSjoerg _Tp operator()(const _Tp& __x) const 612*4d6fc14bSjoerg {return sin(__x);} 613*4d6fc14bSjoerg}; 614*4d6fc14bSjoerg 615*4d6fc14bSjoergtemplate <class _Tp> 616*4d6fc14bSjoergstruct __sinh_expr : unary_function<_Tp, _Tp> 617*4d6fc14bSjoerg{ 618*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 619*4d6fc14bSjoerg _Tp operator()(const _Tp& __x) const 620*4d6fc14bSjoerg {return sinh(__x);} 621*4d6fc14bSjoerg}; 622*4d6fc14bSjoerg 623*4d6fc14bSjoergtemplate <class _Tp> 624*4d6fc14bSjoergstruct __sqrt_expr : unary_function<_Tp, _Tp> 625*4d6fc14bSjoerg{ 626*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 627*4d6fc14bSjoerg _Tp operator()(const _Tp& __x) const 628*4d6fc14bSjoerg {return sqrt(__x);} 629*4d6fc14bSjoerg}; 630*4d6fc14bSjoerg 631*4d6fc14bSjoergtemplate <class _Tp> 632*4d6fc14bSjoergstruct __tan_expr : unary_function<_Tp, _Tp> 633*4d6fc14bSjoerg{ 634*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 635*4d6fc14bSjoerg _Tp operator()(const _Tp& __x) const 636*4d6fc14bSjoerg {return tan(__x);} 637*4d6fc14bSjoerg}; 638*4d6fc14bSjoerg 639*4d6fc14bSjoergtemplate <class _Tp> 640*4d6fc14bSjoergstruct __tanh_expr : unary_function<_Tp, _Tp> 641*4d6fc14bSjoerg{ 642*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 643*4d6fc14bSjoerg _Tp operator()(const _Tp& __x) const 644*4d6fc14bSjoerg {return tanh(__x);} 645*4d6fc14bSjoerg}; 646*4d6fc14bSjoerg 647*4d6fc14bSjoergtemplate <class _ValExpr> 648*4d6fc14bSjoergclass __slice_expr 649*4d6fc14bSjoerg{ 650*4d6fc14bSjoerg typedef typename remove_reference<_ValExpr>::type _RmExpr; 651*4d6fc14bSjoergpublic: 652*4d6fc14bSjoerg typedef typename _RmExpr::value_type value_type; 653*4d6fc14bSjoerg typedef value_type result_type; 654*4d6fc14bSjoerg 655*4d6fc14bSjoergprivate: 656*4d6fc14bSjoerg _ValExpr __expr_; 657*4d6fc14bSjoerg size_t __start_; 658*4d6fc14bSjoerg size_t __size_; 659*4d6fc14bSjoerg size_t __stride_; 660*4d6fc14bSjoerg 661*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 662*4d6fc14bSjoerg __slice_expr(const slice& __sl, const _RmExpr& __e) 663*4d6fc14bSjoerg : __expr_(__e), 664*4d6fc14bSjoerg __start_(__sl.start()), 665*4d6fc14bSjoerg __size_(__sl.size()), 666*4d6fc14bSjoerg __stride_(__sl.stride()) 667*4d6fc14bSjoerg {} 668*4d6fc14bSjoergpublic: 669*4d6fc14bSjoerg 670*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 671*4d6fc14bSjoerg result_type operator[](size_t __i) const 672*4d6fc14bSjoerg {return __expr_[__start_ + __i * __stride_];} 673*4d6fc14bSjoerg 674*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 675*4d6fc14bSjoerg size_t size() const {return __size_;} 676*4d6fc14bSjoerg 677*4d6fc14bSjoerg template <class> friend class __val_expr; 678*4d6fc14bSjoerg template <class> friend class _LIBCPP_TEMPLATE_VIS valarray; 679*4d6fc14bSjoerg}; 680*4d6fc14bSjoerg 681*4d6fc14bSjoergtemplate <class _ValExpr> 682*4d6fc14bSjoergclass __mask_expr; 683*4d6fc14bSjoerg 684*4d6fc14bSjoergtemplate <class _ValExpr> 685*4d6fc14bSjoergclass __indirect_expr; 686*4d6fc14bSjoerg 687*4d6fc14bSjoergtemplate <class _ValExpr> 688*4d6fc14bSjoergclass __shift_expr 689*4d6fc14bSjoerg{ 690*4d6fc14bSjoerg typedef typename remove_reference<_ValExpr>::type _RmExpr; 691*4d6fc14bSjoergpublic: 692*4d6fc14bSjoerg typedef typename _RmExpr::value_type value_type; 693*4d6fc14bSjoerg typedef value_type result_type; 694*4d6fc14bSjoerg 695*4d6fc14bSjoergprivate: 696*4d6fc14bSjoerg _ValExpr __expr_; 697*4d6fc14bSjoerg size_t __size_; 698*4d6fc14bSjoerg ptrdiff_t __ul_; 699*4d6fc14bSjoerg ptrdiff_t __sn_; 700*4d6fc14bSjoerg ptrdiff_t __n_; 701*4d6fc14bSjoerg static const ptrdiff_t _Np = static_cast<ptrdiff_t>( 702*4d6fc14bSjoerg sizeof(ptrdiff_t) * __CHAR_BIT__ - 1); 703*4d6fc14bSjoerg 704*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 705*4d6fc14bSjoerg __shift_expr(int __n, const _RmExpr& __e) 706*4d6fc14bSjoerg : __expr_(__e), 707*4d6fc14bSjoerg __size_(__e.size()), 708*4d6fc14bSjoerg __n_(__n) 709*4d6fc14bSjoerg { 710*4d6fc14bSjoerg ptrdiff_t __neg_n = static_cast<ptrdiff_t>(__n_ >> _Np); 711*4d6fc14bSjoerg __sn_ = __neg_n | static_cast<ptrdiff_t>(static_cast<size_t>(-__n_) >> _Np); 712*4d6fc14bSjoerg __ul_ = ((__size_ - __n_) & ~__neg_n) | ((__n_ + 1) & __neg_n); 713*4d6fc14bSjoerg } 714*4d6fc14bSjoergpublic: 715*4d6fc14bSjoerg 716*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 717*4d6fc14bSjoerg result_type operator[](size_t __j) const 718*4d6fc14bSjoerg { 719*4d6fc14bSjoerg ptrdiff_t __i = static_cast<ptrdiff_t>(__j); 720*4d6fc14bSjoerg ptrdiff_t __m = (__sn_ * __i - __ul_) >> _Np; 721*4d6fc14bSjoerg return (__expr_[(__i + __n_) & __m] & __m) | (value_type() & ~__m); 722*4d6fc14bSjoerg } 723*4d6fc14bSjoerg 724*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 725*4d6fc14bSjoerg size_t size() const {return __size_;} 726*4d6fc14bSjoerg 727*4d6fc14bSjoerg template <class> friend class __val_expr; 728*4d6fc14bSjoerg}; 729*4d6fc14bSjoerg 730*4d6fc14bSjoergtemplate <class _ValExpr> 731*4d6fc14bSjoergclass __cshift_expr 732*4d6fc14bSjoerg{ 733*4d6fc14bSjoerg typedef typename remove_reference<_ValExpr>::type _RmExpr; 734*4d6fc14bSjoergpublic: 735*4d6fc14bSjoerg typedef typename _RmExpr::value_type value_type; 736*4d6fc14bSjoerg typedef value_type result_type; 737*4d6fc14bSjoerg 738*4d6fc14bSjoergprivate: 739*4d6fc14bSjoerg _ValExpr __expr_; 740*4d6fc14bSjoerg size_t __size_; 741*4d6fc14bSjoerg size_t __m_; 742*4d6fc14bSjoerg size_t __o1_; 743*4d6fc14bSjoerg size_t __o2_; 744*4d6fc14bSjoerg 745*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 746*4d6fc14bSjoerg __cshift_expr(int __n, const _RmExpr& __e) 747*4d6fc14bSjoerg : __expr_(__e), 748*4d6fc14bSjoerg __size_(__e.size()) 749*4d6fc14bSjoerg { 750*4d6fc14bSjoerg __n %= static_cast<int>(__size_); 751*4d6fc14bSjoerg if (__n >= 0) 752*4d6fc14bSjoerg { 753*4d6fc14bSjoerg __m_ = __size_ - __n; 754*4d6fc14bSjoerg __o1_ = __n; 755*4d6fc14bSjoerg __o2_ = __n - __size_; 756*4d6fc14bSjoerg } 757*4d6fc14bSjoerg else 758*4d6fc14bSjoerg { 759*4d6fc14bSjoerg __m_ = -__n; 760*4d6fc14bSjoerg __o1_ = __n + __size_; 761*4d6fc14bSjoerg __o2_ = __n; 762*4d6fc14bSjoerg } 763*4d6fc14bSjoerg } 764*4d6fc14bSjoergpublic: 765*4d6fc14bSjoerg 766*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 767*4d6fc14bSjoerg result_type operator[](size_t __i) const 768*4d6fc14bSjoerg { 769*4d6fc14bSjoerg if (__i < __m_) 770*4d6fc14bSjoerg return __expr_[__i + __o1_]; 771*4d6fc14bSjoerg return __expr_[__i + __o2_]; 772*4d6fc14bSjoerg } 773*4d6fc14bSjoerg 774*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 775*4d6fc14bSjoerg size_t size() const {return __size_;} 776*4d6fc14bSjoerg 777*4d6fc14bSjoerg template <class> friend class __val_expr; 778*4d6fc14bSjoerg}; 779*4d6fc14bSjoerg 780*4d6fc14bSjoergtemplate<class _ValExpr> 781*4d6fc14bSjoergclass __val_expr; 782*4d6fc14bSjoerg 783*4d6fc14bSjoergtemplate<class _ValExpr> 784*4d6fc14bSjoergstruct __is_val_expr : false_type {}; 785*4d6fc14bSjoerg 786*4d6fc14bSjoergtemplate<class _ValExpr> 787*4d6fc14bSjoergstruct __is_val_expr<__val_expr<_ValExpr> > : true_type {}; 788*4d6fc14bSjoerg 789*4d6fc14bSjoergtemplate<class _Tp> 790*4d6fc14bSjoergstruct __is_val_expr<valarray<_Tp> > : true_type {}; 791*4d6fc14bSjoerg 792*4d6fc14bSjoergtemplate<class _Tp> 793*4d6fc14bSjoergclass _LIBCPP_TEMPLATE_VIS valarray 794*4d6fc14bSjoerg{ 795*4d6fc14bSjoergpublic: 796*4d6fc14bSjoerg typedef _Tp value_type; 797*4d6fc14bSjoerg typedef _Tp result_type; 798*4d6fc14bSjoerg 799*4d6fc14bSjoergprivate: 800*4d6fc14bSjoerg value_type* __begin_; 801*4d6fc14bSjoerg value_type* __end_; 802*4d6fc14bSjoerg 803*4d6fc14bSjoergpublic: 804*4d6fc14bSjoerg // construct/destroy: 805*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 806*4d6fc14bSjoerg valarray() : __begin_(nullptr), __end_(nullptr) {} 807*4d6fc14bSjoerg inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 808*4d6fc14bSjoerg explicit valarray(size_t __n); 809*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 810*4d6fc14bSjoerg valarray(const value_type& __x, size_t __n); 811*4d6fc14bSjoerg valarray(const value_type* __p, size_t __n); 812*4d6fc14bSjoerg valarray(const valarray& __v); 813*4d6fc14bSjoerg#ifndef _LIBCPP_CXX03_LANG 814*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 815*4d6fc14bSjoerg valarray(valarray&& __v) _NOEXCEPT; 816*4d6fc14bSjoerg valarray(initializer_list<value_type> __il); 817*4d6fc14bSjoerg#endif // _LIBCPP_CXX03_LANG 818*4d6fc14bSjoerg valarray(const slice_array<value_type>& __sa); 819*4d6fc14bSjoerg valarray(const gslice_array<value_type>& __ga); 820*4d6fc14bSjoerg valarray(const mask_array<value_type>& __ma); 821*4d6fc14bSjoerg valarray(const indirect_array<value_type>& __ia); 822*4d6fc14bSjoerg inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 823*4d6fc14bSjoerg ~valarray(); 824*4d6fc14bSjoerg 825*4d6fc14bSjoerg // assignment: 826*4d6fc14bSjoerg valarray& operator=(const valarray& __v); 827*4d6fc14bSjoerg#ifndef _LIBCPP_CXX03_LANG 828*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 829*4d6fc14bSjoerg valarray& operator=(valarray&& __v) _NOEXCEPT; 830*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 831*4d6fc14bSjoerg valarray& operator=(initializer_list<value_type>); 832*4d6fc14bSjoerg#endif // _LIBCPP_CXX03_LANG 833*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 834*4d6fc14bSjoerg valarray& operator=(const value_type& __x); 835*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 836*4d6fc14bSjoerg valarray& operator=(const slice_array<value_type>& __sa); 837*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 838*4d6fc14bSjoerg valarray& operator=(const gslice_array<value_type>& __ga); 839*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 840*4d6fc14bSjoerg valarray& operator=(const mask_array<value_type>& __ma); 841*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 842*4d6fc14bSjoerg valarray& operator=(const indirect_array<value_type>& __ia); 843*4d6fc14bSjoerg template <class _ValExpr> 844*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 845*4d6fc14bSjoerg valarray& operator=(const __val_expr<_ValExpr>& __v); 846*4d6fc14bSjoerg 847*4d6fc14bSjoerg // element access: 848*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 849*4d6fc14bSjoerg const value_type& operator[](size_t __i) const {return __begin_[__i];} 850*4d6fc14bSjoerg 851*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 852*4d6fc14bSjoerg value_type& operator[](size_t __i) {return __begin_[__i];} 853*4d6fc14bSjoerg 854*4d6fc14bSjoerg // subset operations: 855*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 856*4d6fc14bSjoerg __val_expr<__slice_expr<const valarray&> > operator[](slice __s) const; 857*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 858*4d6fc14bSjoerg slice_array<value_type> operator[](slice __s); 859*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 860*4d6fc14bSjoerg __val_expr<__indirect_expr<const valarray&> > operator[](const gslice& __gs) const; 861*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 862*4d6fc14bSjoerg gslice_array<value_type> operator[](const gslice& __gs); 863*4d6fc14bSjoerg#ifndef _LIBCPP_CXX03_LANG 864*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 865*4d6fc14bSjoerg __val_expr<__indirect_expr<const valarray&> > operator[](gslice&& __gs) const; 866*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 867*4d6fc14bSjoerg gslice_array<value_type> operator[](gslice&& __gs); 868*4d6fc14bSjoerg#endif // _LIBCPP_CXX03_LANG 869*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 870*4d6fc14bSjoerg __val_expr<__mask_expr<const valarray&> > operator[](const valarray<bool>& __vb) const; 871*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 872*4d6fc14bSjoerg mask_array<value_type> operator[](const valarray<bool>& __vb); 873*4d6fc14bSjoerg#ifndef _LIBCPP_CXX03_LANG 874*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 875*4d6fc14bSjoerg __val_expr<__mask_expr<const valarray&> > operator[](valarray<bool>&& __vb) const; 876*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 877*4d6fc14bSjoerg mask_array<value_type> operator[](valarray<bool>&& __vb); 878*4d6fc14bSjoerg#endif // _LIBCPP_CXX03_LANG 879*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 880*4d6fc14bSjoerg __val_expr<__indirect_expr<const valarray&> > operator[](const valarray<size_t>& __vs) const; 881*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 882*4d6fc14bSjoerg indirect_array<value_type> operator[](const valarray<size_t>& __vs); 883*4d6fc14bSjoerg#ifndef _LIBCPP_CXX03_LANG 884*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 885*4d6fc14bSjoerg __val_expr<__indirect_expr<const valarray&> > operator[](valarray<size_t>&& __vs) const; 886*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 887*4d6fc14bSjoerg indirect_array<value_type> operator[](valarray<size_t>&& __vs); 888*4d6fc14bSjoerg#endif // _LIBCPP_CXX03_LANG 889*4d6fc14bSjoerg 890*4d6fc14bSjoerg // unary operators: 891*4d6fc14bSjoerg valarray operator+() const; 892*4d6fc14bSjoerg valarray operator-() const; 893*4d6fc14bSjoerg valarray operator~() const; 894*4d6fc14bSjoerg valarray<bool> operator!() const; 895*4d6fc14bSjoerg 896*4d6fc14bSjoerg // computed assignment: 897*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 898*4d6fc14bSjoerg valarray& operator*= (const value_type& __x); 899*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 900*4d6fc14bSjoerg valarray& operator/= (const value_type& __x); 901*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 902*4d6fc14bSjoerg valarray& operator%= (const value_type& __x); 903*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 904*4d6fc14bSjoerg valarray& operator+= (const value_type& __x); 905*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 906*4d6fc14bSjoerg valarray& operator-= (const value_type& __x); 907*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 908*4d6fc14bSjoerg valarray& operator^= (const value_type& __x); 909*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 910*4d6fc14bSjoerg valarray& operator&= (const value_type& __x); 911*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 912*4d6fc14bSjoerg valarray& operator|= (const value_type& __x); 913*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 914*4d6fc14bSjoerg valarray& operator<<=(const value_type& __x); 915*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 916*4d6fc14bSjoerg valarray& operator>>=(const value_type& __x); 917*4d6fc14bSjoerg 918*4d6fc14bSjoerg template <class _Expr> 919*4d6fc14bSjoerg typename enable_if 920*4d6fc14bSjoerg < 921*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 922*4d6fc14bSjoerg valarray& 923*4d6fc14bSjoerg >::type 924*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 925*4d6fc14bSjoerg operator*= (const _Expr& __v); 926*4d6fc14bSjoerg 927*4d6fc14bSjoerg template <class _Expr> 928*4d6fc14bSjoerg typename enable_if 929*4d6fc14bSjoerg < 930*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 931*4d6fc14bSjoerg valarray& 932*4d6fc14bSjoerg >::type 933*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 934*4d6fc14bSjoerg operator/= (const _Expr& __v); 935*4d6fc14bSjoerg 936*4d6fc14bSjoerg template <class _Expr> 937*4d6fc14bSjoerg typename enable_if 938*4d6fc14bSjoerg < 939*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 940*4d6fc14bSjoerg valarray& 941*4d6fc14bSjoerg >::type 942*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 943*4d6fc14bSjoerg operator%= (const _Expr& __v); 944*4d6fc14bSjoerg 945*4d6fc14bSjoerg template <class _Expr> 946*4d6fc14bSjoerg typename enable_if 947*4d6fc14bSjoerg < 948*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 949*4d6fc14bSjoerg valarray& 950*4d6fc14bSjoerg >::type 951*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 952*4d6fc14bSjoerg operator+= (const _Expr& __v); 953*4d6fc14bSjoerg 954*4d6fc14bSjoerg template <class _Expr> 955*4d6fc14bSjoerg typename enable_if 956*4d6fc14bSjoerg < 957*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 958*4d6fc14bSjoerg valarray& 959*4d6fc14bSjoerg >::type 960*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 961*4d6fc14bSjoerg operator-= (const _Expr& __v); 962*4d6fc14bSjoerg 963*4d6fc14bSjoerg template <class _Expr> 964*4d6fc14bSjoerg typename enable_if 965*4d6fc14bSjoerg < 966*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 967*4d6fc14bSjoerg valarray& 968*4d6fc14bSjoerg >::type 969*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 970*4d6fc14bSjoerg operator^= (const _Expr& __v); 971*4d6fc14bSjoerg 972*4d6fc14bSjoerg template <class _Expr> 973*4d6fc14bSjoerg typename enable_if 974*4d6fc14bSjoerg < 975*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 976*4d6fc14bSjoerg valarray& 977*4d6fc14bSjoerg >::type 978*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 979*4d6fc14bSjoerg operator|= (const _Expr& __v); 980*4d6fc14bSjoerg 981*4d6fc14bSjoerg template <class _Expr> 982*4d6fc14bSjoerg typename enable_if 983*4d6fc14bSjoerg < 984*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 985*4d6fc14bSjoerg valarray& 986*4d6fc14bSjoerg >::type 987*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 988*4d6fc14bSjoerg operator&= (const _Expr& __v); 989*4d6fc14bSjoerg 990*4d6fc14bSjoerg template <class _Expr> 991*4d6fc14bSjoerg typename enable_if 992*4d6fc14bSjoerg < 993*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 994*4d6fc14bSjoerg valarray& 995*4d6fc14bSjoerg >::type 996*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 997*4d6fc14bSjoerg operator<<= (const _Expr& __v); 998*4d6fc14bSjoerg 999*4d6fc14bSjoerg template <class _Expr> 1000*4d6fc14bSjoerg typename enable_if 1001*4d6fc14bSjoerg < 1002*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 1003*4d6fc14bSjoerg valarray& 1004*4d6fc14bSjoerg >::type 1005*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1006*4d6fc14bSjoerg operator>>= (const _Expr& __v); 1007*4d6fc14bSjoerg 1008*4d6fc14bSjoerg // member functions: 1009*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1010*4d6fc14bSjoerg void swap(valarray& __v) _NOEXCEPT; 1011*4d6fc14bSjoerg 1012*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1013*4d6fc14bSjoerg size_t size() const {return static_cast<size_t>(__end_ - __begin_);} 1014*4d6fc14bSjoerg 1015*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1016*4d6fc14bSjoerg value_type sum() const; 1017*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1018*4d6fc14bSjoerg value_type min() const; 1019*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1020*4d6fc14bSjoerg value_type max() const; 1021*4d6fc14bSjoerg 1022*4d6fc14bSjoerg valarray shift (int __i) const; 1023*4d6fc14bSjoerg valarray cshift(int __i) const; 1024*4d6fc14bSjoerg valarray apply(value_type __f(value_type)) const; 1025*4d6fc14bSjoerg valarray apply(value_type __f(const value_type&)) const; 1026*4d6fc14bSjoerg void resize(size_t __n, value_type __x = value_type()); 1027*4d6fc14bSjoerg 1028*4d6fc14bSjoergprivate: 1029*4d6fc14bSjoerg template <class> friend class _LIBCPP_TEMPLATE_VIS valarray; 1030*4d6fc14bSjoerg template <class> friend class _LIBCPP_TEMPLATE_VIS slice_array; 1031*4d6fc14bSjoerg template <class> friend class _LIBCPP_TEMPLATE_VIS gslice_array; 1032*4d6fc14bSjoerg template <class> friend class _LIBCPP_TEMPLATE_VIS mask_array; 1033*4d6fc14bSjoerg template <class> friend class __mask_expr; 1034*4d6fc14bSjoerg template <class> friend class _LIBCPP_TEMPLATE_VIS indirect_array; 1035*4d6fc14bSjoerg template <class> friend class __indirect_expr; 1036*4d6fc14bSjoerg template <class> friend class __val_expr; 1037*4d6fc14bSjoerg 1038*4d6fc14bSjoerg template <class _Up> 1039*4d6fc14bSjoerg friend 1040*4d6fc14bSjoerg _Up* 1041*4d6fc14bSjoerg begin(valarray<_Up>& __v); 1042*4d6fc14bSjoerg 1043*4d6fc14bSjoerg template <class _Up> 1044*4d6fc14bSjoerg friend 1045*4d6fc14bSjoerg const _Up* 1046*4d6fc14bSjoerg begin(const valarray<_Up>& __v); 1047*4d6fc14bSjoerg 1048*4d6fc14bSjoerg template <class _Up> 1049*4d6fc14bSjoerg friend 1050*4d6fc14bSjoerg _Up* 1051*4d6fc14bSjoerg end(valarray<_Up>& __v); 1052*4d6fc14bSjoerg 1053*4d6fc14bSjoerg template <class _Up> 1054*4d6fc14bSjoerg friend 1055*4d6fc14bSjoerg const _Up* 1056*4d6fc14bSjoerg end(const valarray<_Up>& __v); 1057*4d6fc14bSjoerg 1058*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1059*4d6fc14bSjoerg void __clear(size_t __capacity); 1060*4d6fc14bSjoerg valarray& __assign_range(const value_type* __f, const value_type* __l); 1061*4d6fc14bSjoerg}; 1062*4d6fc14bSjoerg 1063*4d6fc14bSjoerg_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void valarray<size_t>::resize(size_t, size_t)) 1064*4d6fc14bSjoerg 1065*4d6fc14bSjoergtemplate <class _Op, class _Tp> 1066*4d6fc14bSjoergstruct _UnaryOp<_Op, valarray<_Tp> > 1067*4d6fc14bSjoerg{ 1068*4d6fc14bSjoerg typedef typename _Op::result_type result_type; 1069*4d6fc14bSjoerg typedef _Tp value_type; 1070*4d6fc14bSjoerg 1071*4d6fc14bSjoerg _Op __op_; 1072*4d6fc14bSjoerg const valarray<_Tp>& __a0_; 1073*4d6fc14bSjoerg 1074*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1075*4d6fc14bSjoerg _UnaryOp(const _Op& __op, const valarray<_Tp>& __a0) : __op_(__op), __a0_(__a0) {} 1076*4d6fc14bSjoerg 1077*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1078*4d6fc14bSjoerg result_type operator[](size_t __i) const {return __op_(__a0_[__i]);} 1079*4d6fc14bSjoerg 1080*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1081*4d6fc14bSjoerg size_t size() const {return __a0_.size();} 1082*4d6fc14bSjoerg}; 1083*4d6fc14bSjoerg 1084*4d6fc14bSjoergtemplate <class _Op, class _Tp, class _A1> 1085*4d6fc14bSjoergstruct _BinaryOp<_Op, valarray<_Tp>, _A1> 1086*4d6fc14bSjoerg{ 1087*4d6fc14bSjoerg typedef typename _Op::result_type result_type; 1088*4d6fc14bSjoerg typedef _Tp value_type; 1089*4d6fc14bSjoerg 1090*4d6fc14bSjoerg _Op __op_; 1091*4d6fc14bSjoerg const valarray<_Tp>& __a0_; 1092*4d6fc14bSjoerg _A1 __a1_; 1093*4d6fc14bSjoerg 1094*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1095*4d6fc14bSjoerg _BinaryOp(const _Op& __op, const valarray<_Tp>& __a0, const _A1& __a1) 1096*4d6fc14bSjoerg : __op_(__op), __a0_(__a0), __a1_(__a1) {} 1097*4d6fc14bSjoerg 1098*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1099*4d6fc14bSjoerg value_type operator[](size_t __i) const {return __op_(__a0_[__i], __a1_[__i]);} 1100*4d6fc14bSjoerg 1101*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1102*4d6fc14bSjoerg size_t size() const {return __a0_.size();} 1103*4d6fc14bSjoerg}; 1104*4d6fc14bSjoerg 1105*4d6fc14bSjoergtemplate <class _Op, class _A0, class _Tp> 1106*4d6fc14bSjoergstruct _BinaryOp<_Op, _A0, valarray<_Tp> > 1107*4d6fc14bSjoerg{ 1108*4d6fc14bSjoerg typedef typename _Op::result_type result_type; 1109*4d6fc14bSjoerg typedef _Tp value_type; 1110*4d6fc14bSjoerg 1111*4d6fc14bSjoerg _Op __op_; 1112*4d6fc14bSjoerg _A0 __a0_; 1113*4d6fc14bSjoerg const valarray<_Tp>& __a1_; 1114*4d6fc14bSjoerg 1115*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1116*4d6fc14bSjoerg _BinaryOp(const _Op& __op, const _A0& __a0, const valarray<_Tp>& __a1) 1117*4d6fc14bSjoerg : __op_(__op), __a0_(__a0), __a1_(__a1) {} 1118*4d6fc14bSjoerg 1119*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1120*4d6fc14bSjoerg value_type operator[](size_t __i) const {return __op_(__a0_[__i], __a1_[__i]);} 1121*4d6fc14bSjoerg 1122*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1123*4d6fc14bSjoerg size_t size() const {return __a0_.size();} 1124*4d6fc14bSjoerg}; 1125*4d6fc14bSjoerg 1126*4d6fc14bSjoergtemplate <class _Op, class _Tp> 1127*4d6fc14bSjoergstruct _BinaryOp<_Op, valarray<_Tp>, valarray<_Tp> > 1128*4d6fc14bSjoerg{ 1129*4d6fc14bSjoerg typedef typename _Op::result_type result_type; 1130*4d6fc14bSjoerg typedef _Tp value_type; 1131*4d6fc14bSjoerg 1132*4d6fc14bSjoerg _Op __op_; 1133*4d6fc14bSjoerg const valarray<_Tp>& __a0_; 1134*4d6fc14bSjoerg const valarray<_Tp>& __a1_; 1135*4d6fc14bSjoerg 1136*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1137*4d6fc14bSjoerg _BinaryOp(const _Op& __op, const valarray<_Tp>& __a0, const valarray<_Tp>& __a1) 1138*4d6fc14bSjoerg : __op_(__op), __a0_(__a0), __a1_(__a1) {} 1139*4d6fc14bSjoerg 1140*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1141*4d6fc14bSjoerg value_type operator[](size_t __i) const {return __op_(__a0_[__i], __a1_[__i]);} 1142*4d6fc14bSjoerg 1143*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1144*4d6fc14bSjoerg size_t size() const {return __a0_.size();} 1145*4d6fc14bSjoerg}; 1146*4d6fc14bSjoerg 1147*4d6fc14bSjoerg// slice_array 1148*4d6fc14bSjoerg 1149*4d6fc14bSjoergtemplate <class _Tp> 1150*4d6fc14bSjoergclass _LIBCPP_TEMPLATE_VIS slice_array 1151*4d6fc14bSjoerg{ 1152*4d6fc14bSjoergpublic: 1153*4d6fc14bSjoerg typedef _Tp value_type; 1154*4d6fc14bSjoerg 1155*4d6fc14bSjoergprivate: 1156*4d6fc14bSjoerg value_type* __vp_; 1157*4d6fc14bSjoerg size_t __size_; 1158*4d6fc14bSjoerg size_t __stride_; 1159*4d6fc14bSjoerg 1160*4d6fc14bSjoergpublic: 1161*4d6fc14bSjoerg template <class _Expr> 1162*4d6fc14bSjoerg typename enable_if 1163*4d6fc14bSjoerg < 1164*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 1165*4d6fc14bSjoerg void 1166*4d6fc14bSjoerg >::type 1167*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1168*4d6fc14bSjoerg operator=(const _Expr& __v) const; 1169*4d6fc14bSjoerg 1170*4d6fc14bSjoerg template <class _Expr> 1171*4d6fc14bSjoerg typename enable_if 1172*4d6fc14bSjoerg < 1173*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 1174*4d6fc14bSjoerg void 1175*4d6fc14bSjoerg >::type 1176*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1177*4d6fc14bSjoerg operator*=(const _Expr& __v) const; 1178*4d6fc14bSjoerg 1179*4d6fc14bSjoerg template <class _Expr> 1180*4d6fc14bSjoerg typename enable_if 1181*4d6fc14bSjoerg < 1182*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 1183*4d6fc14bSjoerg void 1184*4d6fc14bSjoerg >::type 1185*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1186*4d6fc14bSjoerg operator/=(const _Expr& __v) const; 1187*4d6fc14bSjoerg 1188*4d6fc14bSjoerg template <class _Expr> 1189*4d6fc14bSjoerg typename enable_if 1190*4d6fc14bSjoerg < 1191*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 1192*4d6fc14bSjoerg void 1193*4d6fc14bSjoerg >::type 1194*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1195*4d6fc14bSjoerg operator%=(const _Expr& __v) const; 1196*4d6fc14bSjoerg 1197*4d6fc14bSjoerg template <class _Expr> 1198*4d6fc14bSjoerg typename enable_if 1199*4d6fc14bSjoerg < 1200*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 1201*4d6fc14bSjoerg void 1202*4d6fc14bSjoerg >::type 1203*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1204*4d6fc14bSjoerg operator+=(const _Expr& __v) const; 1205*4d6fc14bSjoerg 1206*4d6fc14bSjoerg template <class _Expr> 1207*4d6fc14bSjoerg typename enable_if 1208*4d6fc14bSjoerg < 1209*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 1210*4d6fc14bSjoerg void 1211*4d6fc14bSjoerg >::type 1212*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1213*4d6fc14bSjoerg operator-=(const _Expr& __v) const; 1214*4d6fc14bSjoerg 1215*4d6fc14bSjoerg template <class _Expr> 1216*4d6fc14bSjoerg typename enable_if 1217*4d6fc14bSjoerg < 1218*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 1219*4d6fc14bSjoerg void 1220*4d6fc14bSjoerg >::type 1221*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1222*4d6fc14bSjoerg operator^=(const _Expr& __v) const; 1223*4d6fc14bSjoerg 1224*4d6fc14bSjoerg template <class _Expr> 1225*4d6fc14bSjoerg typename enable_if 1226*4d6fc14bSjoerg < 1227*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 1228*4d6fc14bSjoerg void 1229*4d6fc14bSjoerg >::type 1230*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1231*4d6fc14bSjoerg operator&=(const _Expr& __v) const; 1232*4d6fc14bSjoerg 1233*4d6fc14bSjoerg template <class _Expr> 1234*4d6fc14bSjoerg typename enable_if 1235*4d6fc14bSjoerg < 1236*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 1237*4d6fc14bSjoerg void 1238*4d6fc14bSjoerg >::type 1239*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1240*4d6fc14bSjoerg operator|=(const _Expr& __v) const; 1241*4d6fc14bSjoerg 1242*4d6fc14bSjoerg template <class _Expr> 1243*4d6fc14bSjoerg typename enable_if 1244*4d6fc14bSjoerg < 1245*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 1246*4d6fc14bSjoerg void 1247*4d6fc14bSjoerg >::type 1248*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1249*4d6fc14bSjoerg operator<<=(const _Expr& __v) const; 1250*4d6fc14bSjoerg 1251*4d6fc14bSjoerg template <class _Expr> 1252*4d6fc14bSjoerg typename enable_if 1253*4d6fc14bSjoerg < 1254*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 1255*4d6fc14bSjoerg void 1256*4d6fc14bSjoerg >::type 1257*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1258*4d6fc14bSjoerg operator>>=(const _Expr& __v) const; 1259*4d6fc14bSjoerg 1260*4d6fc14bSjoerg slice_array(slice_array const&) = default; 1261*4d6fc14bSjoerg 1262*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1263*4d6fc14bSjoerg const slice_array& operator=(const slice_array& __sa) const; 1264*4d6fc14bSjoerg 1265*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1266*4d6fc14bSjoerg void operator=(const value_type& __x) const; 1267*4d6fc14bSjoerg 1268*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1269*4d6fc14bSjoerg void operator=(const valarray<value_type>& __va) const; 1270*4d6fc14bSjoerg 1271*4d6fc14bSjoergprivate: 1272*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1273*4d6fc14bSjoerg slice_array(const slice& __sl, const valarray<value_type>& __v) 1274*4d6fc14bSjoerg : __vp_(const_cast<value_type*>(__v.__begin_ + __sl.start())), 1275*4d6fc14bSjoerg __size_(__sl.size()), 1276*4d6fc14bSjoerg __stride_(__sl.stride()) 1277*4d6fc14bSjoerg {} 1278*4d6fc14bSjoerg 1279*4d6fc14bSjoerg template <class> friend class valarray; 1280*4d6fc14bSjoerg template <class> friend class sliceExpr; 1281*4d6fc14bSjoerg}; 1282*4d6fc14bSjoerg 1283*4d6fc14bSjoergtemplate <class _Tp> 1284*4d6fc14bSjoerginline 1285*4d6fc14bSjoergconst slice_array<_Tp>& 1286*4d6fc14bSjoergslice_array<_Tp>::operator=(const slice_array& __sa) const 1287*4d6fc14bSjoerg{ 1288*4d6fc14bSjoerg value_type* __t = __vp_; 1289*4d6fc14bSjoerg const value_type* __s = __sa.__vp_; 1290*4d6fc14bSjoerg for (size_t __n = __size_; __n; --__n, __t += __stride_, __s += __sa.__stride_) 1291*4d6fc14bSjoerg *__t = *__s; 1292*4d6fc14bSjoerg return *this; 1293*4d6fc14bSjoerg} 1294*4d6fc14bSjoerg 1295*4d6fc14bSjoergtemplate <class _Tp> 1296*4d6fc14bSjoergtemplate <class _Expr> 1297*4d6fc14bSjoerginline 1298*4d6fc14bSjoergtypename enable_if 1299*4d6fc14bSjoerg< 1300*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 1301*4d6fc14bSjoerg void 1302*4d6fc14bSjoerg>::type 1303*4d6fc14bSjoergslice_array<_Tp>::operator=(const _Expr& __v) const 1304*4d6fc14bSjoerg{ 1305*4d6fc14bSjoerg value_type* __t = __vp_; 1306*4d6fc14bSjoerg for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_) 1307*4d6fc14bSjoerg *__t = __v[__i]; 1308*4d6fc14bSjoerg} 1309*4d6fc14bSjoerg 1310*4d6fc14bSjoergtemplate <class _Tp> 1311*4d6fc14bSjoerginline void 1312*4d6fc14bSjoergslice_array<_Tp>::operator=(const valarray<value_type>& __va) const 1313*4d6fc14bSjoerg{ 1314*4d6fc14bSjoerg value_type* __t = __vp_; 1315*4d6fc14bSjoerg for (size_t __i = 0; __i < __va.size(); ++__i, __t += __stride_) 1316*4d6fc14bSjoerg *__t = __va[__i]; 1317*4d6fc14bSjoerg} 1318*4d6fc14bSjoerg 1319*4d6fc14bSjoergtemplate <class _Tp> 1320*4d6fc14bSjoergtemplate <class _Expr> 1321*4d6fc14bSjoerginline 1322*4d6fc14bSjoergtypename enable_if 1323*4d6fc14bSjoerg< 1324*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 1325*4d6fc14bSjoerg void 1326*4d6fc14bSjoerg>::type 1327*4d6fc14bSjoergslice_array<_Tp>::operator*=(const _Expr& __v) const 1328*4d6fc14bSjoerg{ 1329*4d6fc14bSjoerg value_type* __t = __vp_; 1330*4d6fc14bSjoerg for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_) 1331*4d6fc14bSjoerg *__t *= __v[__i]; 1332*4d6fc14bSjoerg} 1333*4d6fc14bSjoerg 1334*4d6fc14bSjoergtemplate <class _Tp> 1335*4d6fc14bSjoergtemplate <class _Expr> 1336*4d6fc14bSjoerginline 1337*4d6fc14bSjoergtypename enable_if 1338*4d6fc14bSjoerg< 1339*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 1340*4d6fc14bSjoerg void 1341*4d6fc14bSjoerg>::type 1342*4d6fc14bSjoergslice_array<_Tp>::operator/=(const _Expr& __v) const 1343*4d6fc14bSjoerg{ 1344*4d6fc14bSjoerg value_type* __t = __vp_; 1345*4d6fc14bSjoerg for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_) 1346*4d6fc14bSjoerg *__t /= __v[__i]; 1347*4d6fc14bSjoerg} 1348*4d6fc14bSjoerg 1349*4d6fc14bSjoergtemplate <class _Tp> 1350*4d6fc14bSjoergtemplate <class _Expr> 1351*4d6fc14bSjoerginline 1352*4d6fc14bSjoergtypename enable_if 1353*4d6fc14bSjoerg< 1354*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 1355*4d6fc14bSjoerg void 1356*4d6fc14bSjoerg>::type 1357*4d6fc14bSjoergslice_array<_Tp>::operator%=(const _Expr& __v) const 1358*4d6fc14bSjoerg{ 1359*4d6fc14bSjoerg value_type* __t = __vp_; 1360*4d6fc14bSjoerg for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_) 1361*4d6fc14bSjoerg *__t %= __v[__i]; 1362*4d6fc14bSjoerg} 1363*4d6fc14bSjoerg 1364*4d6fc14bSjoergtemplate <class _Tp> 1365*4d6fc14bSjoergtemplate <class _Expr> 1366*4d6fc14bSjoerginline 1367*4d6fc14bSjoergtypename enable_if 1368*4d6fc14bSjoerg< 1369*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 1370*4d6fc14bSjoerg void 1371*4d6fc14bSjoerg>::type 1372*4d6fc14bSjoergslice_array<_Tp>::operator+=(const _Expr& __v) const 1373*4d6fc14bSjoerg{ 1374*4d6fc14bSjoerg value_type* __t = __vp_; 1375*4d6fc14bSjoerg for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_) 1376*4d6fc14bSjoerg *__t += __v[__i]; 1377*4d6fc14bSjoerg} 1378*4d6fc14bSjoerg 1379*4d6fc14bSjoergtemplate <class _Tp> 1380*4d6fc14bSjoergtemplate <class _Expr> 1381*4d6fc14bSjoerginline 1382*4d6fc14bSjoergtypename enable_if 1383*4d6fc14bSjoerg< 1384*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 1385*4d6fc14bSjoerg void 1386*4d6fc14bSjoerg>::type 1387*4d6fc14bSjoergslice_array<_Tp>::operator-=(const _Expr& __v) const 1388*4d6fc14bSjoerg{ 1389*4d6fc14bSjoerg value_type* __t = __vp_; 1390*4d6fc14bSjoerg for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_) 1391*4d6fc14bSjoerg *__t -= __v[__i]; 1392*4d6fc14bSjoerg} 1393*4d6fc14bSjoerg 1394*4d6fc14bSjoergtemplate <class _Tp> 1395*4d6fc14bSjoergtemplate <class _Expr> 1396*4d6fc14bSjoerginline 1397*4d6fc14bSjoergtypename enable_if 1398*4d6fc14bSjoerg< 1399*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 1400*4d6fc14bSjoerg void 1401*4d6fc14bSjoerg>::type 1402*4d6fc14bSjoergslice_array<_Tp>::operator^=(const _Expr& __v) const 1403*4d6fc14bSjoerg{ 1404*4d6fc14bSjoerg value_type* __t = __vp_; 1405*4d6fc14bSjoerg for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_) 1406*4d6fc14bSjoerg *__t ^= __v[__i]; 1407*4d6fc14bSjoerg} 1408*4d6fc14bSjoerg 1409*4d6fc14bSjoergtemplate <class _Tp> 1410*4d6fc14bSjoergtemplate <class _Expr> 1411*4d6fc14bSjoerginline 1412*4d6fc14bSjoergtypename enable_if 1413*4d6fc14bSjoerg< 1414*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 1415*4d6fc14bSjoerg void 1416*4d6fc14bSjoerg>::type 1417*4d6fc14bSjoergslice_array<_Tp>::operator&=(const _Expr& __v) const 1418*4d6fc14bSjoerg{ 1419*4d6fc14bSjoerg value_type* __t = __vp_; 1420*4d6fc14bSjoerg for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_) 1421*4d6fc14bSjoerg *__t &= __v[__i]; 1422*4d6fc14bSjoerg} 1423*4d6fc14bSjoerg 1424*4d6fc14bSjoergtemplate <class _Tp> 1425*4d6fc14bSjoergtemplate <class _Expr> 1426*4d6fc14bSjoerginline 1427*4d6fc14bSjoergtypename enable_if 1428*4d6fc14bSjoerg< 1429*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 1430*4d6fc14bSjoerg void 1431*4d6fc14bSjoerg>::type 1432*4d6fc14bSjoergslice_array<_Tp>::operator|=(const _Expr& __v) const 1433*4d6fc14bSjoerg{ 1434*4d6fc14bSjoerg value_type* __t = __vp_; 1435*4d6fc14bSjoerg for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_) 1436*4d6fc14bSjoerg *__t |= __v[__i]; 1437*4d6fc14bSjoerg} 1438*4d6fc14bSjoerg 1439*4d6fc14bSjoergtemplate <class _Tp> 1440*4d6fc14bSjoergtemplate <class _Expr> 1441*4d6fc14bSjoerginline 1442*4d6fc14bSjoergtypename enable_if 1443*4d6fc14bSjoerg< 1444*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 1445*4d6fc14bSjoerg void 1446*4d6fc14bSjoerg>::type 1447*4d6fc14bSjoergslice_array<_Tp>::operator<<=(const _Expr& __v) const 1448*4d6fc14bSjoerg{ 1449*4d6fc14bSjoerg value_type* __t = __vp_; 1450*4d6fc14bSjoerg for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_) 1451*4d6fc14bSjoerg *__t <<= __v[__i]; 1452*4d6fc14bSjoerg} 1453*4d6fc14bSjoerg 1454*4d6fc14bSjoergtemplate <class _Tp> 1455*4d6fc14bSjoergtemplate <class _Expr> 1456*4d6fc14bSjoerginline 1457*4d6fc14bSjoergtypename enable_if 1458*4d6fc14bSjoerg< 1459*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 1460*4d6fc14bSjoerg void 1461*4d6fc14bSjoerg>::type 1462*4d6fc14bSjoergslice_array<_Tp>::operator>>=(const _Expr& __v) const 1463*4d6fc14bSjoerg{ 1464*4d6fc14bSjoerg value_type* __t = __vp_; 1465*4d6fc14bSjoerg for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_) 1466*4d6fc14bSjoerg *__t >>= __v[__i]; 1467*4d6fc14bSjoerg} 1468*4d6fc14bSjoerg 1469*4d6fc14bSjoergtemplate <class _Tp> 1470*4d6fc14bSjoerginline 1471*4d6fc14bSjoergvoid 1472*4d6fc14bSjoergslice_array<_Tp>::operator=(const value_type& __x) const 1473*4d6fc14bSjoerg{ 1474*4d6fc14bSjoerg value_type* __t = __vp_; 1475*4d6fc14bSjoerg for (size_t __n = __size_; __n; --__n, __t += __stride_) 1476*4d6fc14bSjoerg *__t = __x; 1477*4d6fc14bSjoerg} 1478*4d6fc14bSjoerg 1479*4d6fc14bSjoerg// gslice 1480*4d6fc14bSjoerg 1481*4d6fc14bSjoergclass _LIBCPP_TYPE_VIS gslice 1482*4d6fc14bSjoerg{ 1483*4d6fc14bSjoerg valarray<size_t> __size_; 1484*4d6fc14bSjoerg valarray<size_t> __stride_; 1485*4d6fc14bSjoerg valarray<size_t> __1d_; 1486*4d6fc14bSjoerg 1487*4d6fc14bSjoergpublic: 1488*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1489*4d6fc14bSjoerg gslice() {} 1490*4d6fc14bSjoerg 1491*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1492*4d6fc14bSjoerg gslice(size_t __start, const valarray<size_t>& __size, 1493*4d6fc14bSjoerg const valarray<size_t>& __stride) 1494*4d6fc14bSjoerg : __size_(__size), 1495*4d6fc14bSjoerg __stride_(__stride) 1496*4d6fc14bSjoerg {__init(__start);} 1497*4d6fc14bSjoerg 1498*4d6fc14bSjoerg#ifndef _LIBCPP_CXX03_LANG 1499*4d6fc14bSjoerg 1500*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1501*4d6fc14bSjoerg gslice(size_t __start, const valarray<size_t>& __size, 1502*4d6fc14bSjoerg valarray<size_t>&& __stride) 1503*4d6fc14bSjoerg : __size_(__size), 1504*4d6fc14bSjoerg __stride_(move(__stride)) 1505*4d6fc14bSjoerg {__init(__start);} 1506*4d6fc14bSjoerg 1507*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1508*4d6fc14bSjoerg gslice(size_t __start, valarray<size_t>&& __size, 1509*4d6fc14bSjoerg const valarray<size_t>& __stride) 1510*4d6fc14bSjoerg : __size_(move(__size)), 1511*4d6fc14bSjoerg __stride_(__stride) 1512*4d6fc14bSjoerg {__init(__start);} 1513*4d6fc14bSjoerg 1514*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1515*4d6fc14bSjoerg gslice(size_t __start, valarray<size_t>&& __size, 1516*4d6fc14bSjoerg valarray<size_t>&& __stride) 1517*4d6fc14bSjoerg : __size_(move(__size)), 1518*4d6fc14bSjoerg __stride_(move(__stride)) 1519*4d6fc14bSjoerg {__init(__start);} 1520*4d6fc14bSjoerg 1521*4d6fc14bSjoerg#endif // _LIBCPP_CXX03_LANG 1522*4d6fc14bSjoerg 1523*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1524*4d6fc14bSjoerg size_t start() const {return __1d_.size() ? __1d_[0] : 0;} 1525*4d6fc14bSjoerg 1526*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1527*4d6fc14bSjoerg valarray<size_t> size() const {return __size_;} 1528*4d6fc14bSjoerg 1529*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1530*4d6fc14bSjoerg valarray<size_t> stride() const {return __stride_;} 1531*4d6fc14bSjoerg 1532*4d6fc14bSjoergprivate: 1533*4d6fc14bSjoerg void __init(size_t __start); 1534*4d6fc14bSjoerg 1535*4d6fc14bSjoerg template <class> friend class gslice_array; 1536*4d6fc14bSjoerg template <class> friend class valarray; 1537*4d6fc14bSjoerg template <class> friend class __val_expr; 1538*4d6fc14bSjoerg}; 1539*4d6fc14bSjoerg 1540*4d6fc14bSjoerg// gslice_array 1541*4d6fc14bSjoerg 1542*4d6fc14bSjoergtemplate <class _Tp> 1543*4d6fc14bSjoergclass _LIBCPP_TEMPLATE_VIS gslice_array 1544*4d6fc14bSjoerg{ 1545*4d6fc14bSjoergpublic: 1546*4d6fc14bSjoerg typedef _Tp value_type; 1547*4d6fc14bSjoerg 1548*4d6fc14bSjoergprivate: 1549*4d6fc14bSjoerg value_type* __vp_; 1550*4d6fc14bSjoerg valarray<size_t> __1d_; 1551*4d6fc14bSjoerg 1552*4d6fc14bSjoergpublic: 1553*4d6fc14bSjoerg template <class _Expr> 1554*4d6fc14bSjoerg typename enable_if 1555*4d6fc14bSjoerg < 1556*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 1557*4d6fc14bSjoerg void 1558*4d6fc14bSjoerg >::type 1559*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1560*4d6fc14bSjoerg operator=(const _Expr& __v) const; 1561*4d6fc14bSjoerg 1562*4d6fc14bSjoerg template <class _Expr> 1563*4d6fc14bSjoerg typename enable_if 1564*4d6fc14bSjoerg < 1565*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 1566*4d6fc14bSjoerg void 1567*4d6fc14bSjoerg >::type 1568*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1569*4d6fc14bSjoerg operator*=(const _Expr& __v) const; 1570*4d6fc14bSjoerg 1571*4d6fc14bSjoerg template <class _Expr> 1572*4d6fc14bSjoerg typename enable_if 1573*4d6fc14bSjoerg < 1574*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 1575*4d6fc14bSjoerg void 1576*4d6fc14bSjoerg >::type 1577*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1578*4d6fc14bSjoerg operator/=(const _Expr& __v) const; 1579*4d6fc14bSjoerg 1580*4d6fc14bSjoerg template <class _Expr> 1581*4d6fc14bSjoerg typename enable_if 1582*4d6fc14bSjoerg < 1583*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 1584*4d6fc14bSjoerg void 1585*4d6fc14bSjoerg >::type 1586*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1587*4d6fc14bSjoerg operator%=(const _Expr& __v) const; 1588*4d6fc14bSjoerg 1589*4d6fc14bSjoerg template <class _Expr> 1590*4d6fc14bSjoerg typename enable_if 1591*4d6fc14bSjoerg < 1592*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 1593*4d6fc14bSjoerg void 1594*4d6fc14bSjoerg >::type 1595*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1596*4d6fc14bSjoerg operator+=(const _Expr& __v) const; 1597*4d6fc14bSjoerg 1598*4d6fc14bSjoerg template <class _Expr> 1599*4d6fc14bSjoerg typename enable_if 1600*4d6fc14bSjoerg < 1601*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 1602*4d6fc14bSjoerg void 1603*4d6fc14bSjoerg >::type 1604*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1605*4d6fc14bSjoerg operator-=(const _Expr& __v) const; 1606*4d6fc14bSjoerg 1607*4d6fc14bSjoerg template <class _Expr> 1608*4d6fc14bSjoerg typename enable_if 1609*4d6fc14bSjoerg < 1610*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 1611*4d6fc14bSjoerg void 1612*4d6fc14bSjoerg >::type 1613*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1614*4d6fc14bSjoerg operator^=(const _Expr& __v) const; 1615*4d6fc14bSjoerg 1616*4d6fc14bSjoerg template <class _Expr> 1617*4d6fc14bSjoerg typename enable_if 1618*4d6fc14bSjoerg < 1619*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 1620*4d6fc14bSjoerg void 1621*4d6fc14bSjoerg >::type 1622*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1623*4d6fc14bSjoerg operator&=(const _Expr& __v) const; 1624*4d6fc14bSjoerg 1625*4d6fc14bSjoerg template <class _Expr> 1626*4d6fc14bSjoerg typename enable_if 1627*4d6fc14bSjoerg < 1628*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 1629*4d6fc14bSjoerg void 1630*4d6fc14bSjoerg >::type 1631*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1632*4d6fc14bSjoerg operator|=(const _Expr& __v) const; 1633*4d6fc14bSjoerg 1634*4d6fc14bSjoerg template <class _Expr> 1635*4d6fc14bSjoerg typename enable_if 1636*4d6fc14bSjoerg < 1637*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 1638*4d6fc14bSjoerg void 1639*4d6fc14bSjoerg >::type 1640*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1641*4d6fc14bSjoerg operator<<=(const _Expr& __v) const; 1642*4d6fc14bSjoerg 1643*4d6fc14bSjoerg template <class _Expr> 1644*4d6fc14bSjoerg typename enable_if 1645*4d6fc14bSjoerg < 1646*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 1647*4d6fc14bSjoerg void 1648*4d6fc14bSjoerg >::type 1649*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1650*4d6fc14bSjoerg operator>>=(const _Expr& __v) const; 1651*4d6fc14bSjoerg 1652*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1653*4d6fc14bSjoerg const gslice_array& operator=(const gslice_array& __ga) const; 1654*4d6fc14bSjoerg 1655*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1656*4d6fc14bSjoerg void operator=(const value_type& __x) const; 1657*4d6fc14bSjoerg 1658*4d6fc14bSjoerg gslice_array(const gslice_array&) = default; 1659*4d6fc14bSjoerg 1660*4d6fc14bSjoergprivate: 1661*4d6fc14bSjoerg gslice_array(const gslice& __gs, const valarray<value_type>& __v) 1662*4d6fc14bSjoerg : __vp_(const_cast<value_type*>(__v.__begin_)), 1663*4d6fc14bSjoerg __1d_(__gs.__1d_) 1664*4d6fc14bSjoerg {} 1665*4d6fc14bSjoerg 1666*4d6fc14bSjoerg#ifndef _LIBCPP_CXX03_LANG 1667*4d6fc14bSjoerg gslice_array(gslice&& __gs, const valarray<value_type>& __v) 1668*4d6fc14bSjoerg : __vp_(const_cast<value_type*>(__v.__begin_)), 1669*4d6fc14bSjoerg __1d_(move(__gs.__1d_)) 1670*4d6fc14bSjoerg {} 1671*4d6fc14bSjoerg#endif // _LIBCPP_CXX03_LANG 1672*4d6fc14bSjoerg 1673*4d6fc14bSjoerg template <class> friend class valarray; 1674*4d6fc14bSjoerg}; 1675*4d6fc14bSjoerg 1676*4d6fc14bSjoergtemplate <class _Tp> 1677*4d6fc14bSjoergtemplate <class _Expr> 1678*4d6fc14bSjoerginline 1679*4d6fc14bSjoergtypename enable_if 1680*4d6fc14bSjoerg< 1681*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 1682*4d6fc14bSjoerg void 1683*4d6fc14bSjoerg>::type 1684*4d6fc14bSjoerggslice_array<_Tp>::operator=(const _Expr& __v) const 1685*4d6fc14bSjoerg{ 1686*4d6fc14bSjoerg typedef const size_t* _Ip; 1687*4d6fc14bSjoerg size_t __j = 0; 1688*4d6fc14bSjoerg for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j) 1689*4d6fc14bSjoerg __vp_[*__i] = __v[__j]; 1690*4d6fc14bSjoerg} 1691*4d6fc14bSjoerg 1692*4d6fc14bSjoergtemplate <class _Tp> 1693*4d6fc14bSjoergtemplate <class _Expr> 1694*4d6fc14bSjoerginline 1695*4d6fc14bSjoergtypename enable_if 1696*4d6fc14bSjoerg< 1697*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 1698*4d6fc14bSjoerg void 1699*4d6fc14bSjoerg>::type 1700*4d6fc14bSjoerggslice_array<_Tp>::operator*=(const _Expr& __v) const 1701*4d6fc14bSjoerg{ 1702*4d6fc14bSjoerg typedef const size_t* _Ip; 1703*4d6fc14bSjoerg size_t __j = 0; 1704*4d6fc14bSjoerg for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j) 1705*4d6fc14bSjoerg __vp_[*__i] *= __v[__j]; 1706*4d6fc14bSjoerg} 1707*4d6fc14bSjoerg 1708*4d6fc14bSjoergtemplate <class _Tp> 1709*4d6fc14bSjoergtemplate <class _Expr> 1710*4d6fc14bSjoerginline 1711*4d6fc14bSjoergtypename enable_if 1712*4d6fc14bSjoerg< 1713*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 1714*4d6fc14bSjoerg void 1715*4d6fc14bSjoerg>::type 1716*4d6fc14bSjoerggslice_array<_Tp>::operator/=(const _Expr& __v) const 1717*4d6fc14bSjoerg{ 1718*4d6fc14bSjoerg typedef const size_t* _Ip; 1719*4d6fc14bSjoerg size_t __j = 0; 1720*4d6fc14bSjoerg for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j) 1721*4d6fc14bSjoerg __vp_[*__i] /= __v[__j]; 1722*4d6fc14bSjoerg} 1723*4d6fc14bSjoerg 1724*4d6fc14bSjoergtemplate <class _Tp> 1725*4d6fc14bSjoergtemplate <class _Expr> 1726*4d6fc14bSjoerginline 1727*4d6fc14bSjoergtypename enable_if 1728*4d6fc14bSjoerg< 1729*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 1730*4d6fc14bSjoerg void 1731*4d6fc14bSjoerg>::type 1732*4d6fc14bSjoerggslice_array<_Tp>::operator%=(const _Expr& __v) const 1733*4d6fc14bSjoerg{ 1734*4d6fc14bSjoerg typedef const size_t* _Ip; 1735*4d6fc14bSjoerg size_t __j = 0; 1736*4d6fc14bSjoerg for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j) 1737*4d6fc14bSjoerg __vp_[*__i] %= __v[__j]; 1738*4d6fc14bSjoerg} 1739*4d6fc14bSjoerg 1740*4d6fc14bSjoergtemplate <class _Tp> 1741*4d6fc14bSjoergtemplate <class _Expr> 1742*4d6fc14bSjoerginline 1743*4d6fc14bSjoergtypename enable_if 1744*4d6fc14bSjoerg< 1745*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 1746*4d6fc14bSjoerg void 1747*4d6fc14bSjoerg>::type 1748*4d6fc14bSjoerggslice_array<_Tp>::operator+=(const _Expr& __v) const 1749*4d6fc14bSjoerg{ 1750*4d6fc14bSjoerg typedef const size_t* _Ip; 1751*4d6fc14bSjoerg size_t __j = 0; 1752*4d6fc14bSjoerg for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j) 1753*4d6fc14bSjoerg __vp_[*__i] += __v[__j]; 1754*4d6fc14bSjoerg} 1755*4d6fc14bSjoerg 1756*4d6fc14bSjoergtemplate <class _Tp> 1757*4d6fc14bSjoergtemplate <class _Expr> 1758*4d6fc14bSjoerginline 1759*4d6fc14bSjoergtypename enable_if 1760*4d6fc14bSjoerg< 1761*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 1762*4d6fc14bSjoerg void 1763*4d6fc14bSjoerg>::type 1764*4d6fc14bSjoerggslice_array<_Tp>::operator-=(const _Expr& __v) const 1765*4d6fc14bSjoerg{ 1766*4d6fc14bSjoerg typedef const size_t* _Ip; 1767*4d6fc14bSjoerg size_t __j = 0; 1768*4d6fc14bSjoerg for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j) 1769*4d6fc14bSjoerg __vp_[*__i] -= __v[__j]; 1770*4d6fc14bSjoerg} 1771*4d6fc14bSjoerg 1772*4d6fc14bSjoergtemplate <class _Tp> 1773*4d6fc14bSjoergtemplate <class _Expr> 1774*4d6fc14bSjoerginline 1775*4d6fc14bSjoergtypename enable_if 1776*4d6fc14bSjoerg< 1777*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 1778*4d6fc14bSjoerg void 1779*4d6fc14bSjoerg>::type 1780*4d6fc14bSjoerggslice_array<_Tp>::operator^=(const _Expr& __v) const 1781*4d6fc14bSjoerg{ 1782*4d6fc14bSjoerg typedef const size_t* _Ip; 1783*4d6fc14bSjoerg size_t __j = 0; 1784*4d6fc14bSjoerg for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j) 1785*4d6fc14bSjoerg __vp_[*__i] ^= __v[__j]; 1786*4d6fc14bSjoerg} 1787*4d6fc14bSjoerg 1788*4d6fc14bSjoergtemplate <class _Tp> 1789*4d6fc14bSjoergtemplate <class _Expr> 1790*4d6fc14bSjoerginline 1791*4d6fc14bSjoergtypename enable_if 1792*4d6fc14bSjoerg< 1793*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 1794*4d6fc14bSjoerg void 1795*4d6fc14bSjoerg>::type 1796*4d6fc14bSjoerggslice_array<_Tp>::operator&=(const _Expr& __v) const 1797*4d6fc14bSjoerg{ 1798*4d6fc14bSjoerg typedef const size_t* _Ip; 1799*4d6fc14bSjoerg size_t __j = 0; 1800*4d6fc14bSjoerg for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j) 1801*4d6fc14bSjoerg __vp_[*__i] &= __v[__j]; 1802*4d6fc14bSjoerg} 1803*4d6fc14bSjoerg 1804*4d6fc14bSjoergtemplate <class _Tp> 1805*4d6fc14bSjoergtemplate <class _Expr> 1806*4d6fc14bSjoerginline 1807*4d6fc14bSjoergtypename enable_if 1808*4d6fc14bSjoerg< 1809*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 1810*4d6fc14bSjoerg void 1811*4d6fc14bSjoerg>::type 1812*4d6fc14bSjoerggslice_array<_Tp>::operator|=(const _Expr& __v) const 1813*4d6fc14bSjoerg{ 1814*4d6fc14bSjoerg typedef const size_t* _Ip; 1815*4d6fc14bSjoerg size_t __j = 0; 1816*4d6fc14bSjoerg for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j) 1817*4d6fc14bSjoerg __vp_[*__i] |= __v[__j]; 1818*4d6fc14bSjoerg} 1819*4d6fc14bSjoerg 1820*4d6fc14bSjoergtemplate <class _Tp> 1821*4d6fc14bSjoergtemplate <class _Expr> 1822*4d6fc14bSjoerginline 1823*4d6fc14bSjoergtypename enable_if 1824*4d6fc14bSjoerg< 1825*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 1826*4d6fc14bSjoerg void 1827*4d6fc14bSjoerg>::type 1828*4d6fc14bSjoerggslice_array<_Tp>::operator<<=(const _Expr& __v) const 1829*4d6fc14bSjoerg{ 1830*4d6fc14bSjoerg typedef const size_t* _Ip; 1831*4d6fc14bSjoerg size_t __j = 0; 1832*4d6fc14bSjoerg for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j) 1833*4d6fc14bSjoerg __vp_[*__i] <<= __v[__j]; 1834*4d6fc14bSjoerg} 1835*4d6fc14bSjoerg 1836*4d6fc14bSjoergtemplate <class _Tp> 1837*4d6fc14bSjoergtemplate <class _Expr> 1838*4d6fc14bSjoerginline 1839*4d6fc14bSjoergtypename enable_if 1840*4d6fc14bSjoerg< 1841*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 1842*4d6fc14bSjoerg void 1843*4d6fc14bSjoerg>::type 1844*4d6fc14bSjoerggslice_array<_Tp>::operator>>=(const _Expr& __v) const 1845*4d6fc14bSjoerg{ 1846*4d6fc14bSjoerg typedef const size_t* _Ip; 1847*4d6fc14bSjoerg size_t __j = 0; 1848*4d6fc14bSjoerg for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j) 1849*4d6fc14bSjoerg __vp_[*__i] >>= __v[__j]; 1850*4d6fc14bSjoerg} 1851*4d6fc14bSjoerg 1852*4d6fc14bSjoergtemplate <class _Tp> 1853*4d6fc14bSjoerginline 1854*4d6fc14bSjoergconst gslice_array<_Tp>& 1855*4d6fc14bSjoerggslice_array<_Tp>::operator=(const gslice_array& __ga) const 1856*4d6fc14bSjoerg{ 1857*4d6fc14bSjoerg typedef const size_t* _Ip; 1858*4d6fc14bSjoerg const value_type* __s = __ga.__vp_; 1859*4d6fc14bSjoerg for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_, __j = __ga.__1d_.__begin_; 1860*4d6fc14bSjoerg __i != __e; ++__i, ++__j) 1861*4d6fc14bSjoerg __vp_[*__i] = __s[*__j]; 1862*4d6fc14bSjoerg return *this; 1863*4d6fc14bSjoerg} 1864*4d6fc14bSjoerg 1865*4d6fc14bSjoergtemplate <class _Tp> 1866*4d6fc14bSjoerginline 1867*4d6fc14bSjoergvoid 1868*4d6fc14bSjoerggslice_array<_Tp>::operator=(const value_type& __x) const 1869*4d6fc14bSjoerg{ 1870*4d6fc14bSjoerg typedef const size_t* _Ip; 1871*4d6fc14bSjoerg for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i) 1872*4d6fc14bSjoerg __vp_[*__i] = __x; 1873*4d6fc14bSjoerg} 1874*4d6fc14bSjoerg 1875*4d6fc14bSjoerg// mask_array 1876*4d6fc14bSjoerg 1877*4d6fc14bSjoergtemplate <class _Tp> 1878*4d6fc14bSjoergclass _LIBCPP_TEMPLATE_VIS mask_array 1879*4d6fc14bSjoerg{ 1880*4d6fc14bSjoergpublic: 1881*4d6fc14bSjoerg typedef _Tp value_type; 1882*4d6fc14bSjoerg 1883*4d6fc14bSjoergprivate: 1884*4d6fc14bSjoerg value_type* __vp_; 1885*4d6fc14bSjoerg valarray<size_t> __1d_; 1886*4d6fc14bSjoerg 1887*4d6fc14bSjoergpublic: 1888*4d6fc14bSjoerg template <class _Expr> 1889*4d6fc14bSjoerg typename enable_if 1890*4d6fc14bSjoerg < 1891*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 1892*4d6fc14bSjoerg void 1893*4d6fc14bSjoerg >::type 1894*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1895*4d6fc14bSjoerg operator=(const _Expr& __v) const; 1896*4d6fc14bSjoerg 1897*4d6fc14bSjoerg template <class _Expr> 1898*4d6fc14bSjoerg typename enable_if 1899*4d6fc14bSjoerg < 1900*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 1901*4d6fc14bSjoerg void 1902*4d6fc14bSjoerg >::type 1903*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1904*4d6fc14bSjoerg operator*=(const _Expr& __v) const; 1905*4d6fc14bSjoerg 1906*4d6fc14bSjoerg template <class _Expr> 1907*4d6fc14bSjoerg typename enable_if 1908*4d6fc14bSjoerg < 1909*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 1910*4d6fc14bSjoerg void 1911*4d6fc14bSjoerg >::type 1912*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1913*4d6fc14bSjoerg operator/=(const _Expr& __v) const; 1914*4d6fc14bSjoerg 1915*4d6fc14bSjoerg template <class _Expr> 1916*4d6fc14bSjoerg typename enable_if 1917*4d6fc14bSjoerg < 1918*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 1919*4d6fc14bSjoerg void 1920*4d6fc14bSjoerg >::type 1921*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1922*4d6fc14bSjoerg operator%=(const _Expr& __v) const; 1923*4d6fc14bSjoerg 1924*4d6fc14bSjoerg template <class _Expr> 1925*4d6fc14bSjoerg typename enable_if 1926*4d6fc14bSjoerg < 1927*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 1928*4d6fc14bSjoerg void 1929*4d6fc14bSjoerg >::type 1930*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1931*4d6fc14bSjoerg operator+=(const _Expr& __v) const; 1932*4d6fc14bSjoerg 1933*4d6fc14bSjoerg template <class _Expr> 1934*4d6fc14bSjoerg typename enable_if 1935*4d6fc14bSjoerg < 1936*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 1937*4d6fc14bSjoerg void 1938*4d6fc14bSjoerg >::type 1939*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1940*4d6fc14bSjoerg operator-=(const _Expr& __v) const; 1941*4d6fc14bSjoerg 1942*4d6fc14bSjoerg template <class _Expr> 1943*4d6fc14bSjoerg typename enable_if 1944*4d6fc14bSjoerg < 1945*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 1946*4d6fc14bSjoerg void 1947*4d6fc14bSjoerg >::type 1948*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1949*4d6fc14bSjoerg operator^=(const _Expr& __v) const; 1950*4d6fc14bSjoerg 1951*4d6fc14bSjoerg template <class _Expr> 1952*4d6fc14bSjoerg typename enable_if 1953*4d6fc14bSjoerg < 1954*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 1955*4d6fc14bSjoerg void 1956*4d6fc14bSjoerg >::type 1957*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1958*4d6fc14bSjoerg operator&=(const _Expr& __v) const; 1959*4d6fc14bSjoerg 1960*4d6fc14bSjoerg template <class _Expr> 1961*4d6fc14bSjoerg typename enable_if 1962*4d6fc14bSjoerg < 1963*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 1964*4d6fc14bSjoerg void 1965*4d6fc14bSjoerg >::type 1966*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1967*4d6fc14bSjoerg operator|=(const _Expr& __v) const; 1968*4d6fc14bSjoerg 1969*4d6fc14bSjoerg template <class _Expr> 1970*4d6fc14bSjoerg typename enable_if 1971*4d6fc14bSjoerg < 1972*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 1973*4d6fc14bSjoerg void 1974*4d6fc14bSjoerg >::type 1975*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1976*4d6fc14bSjoerg operator<<=(const _Expr& __v) const; 1977*4d6fc14bSjoerg 1978*4d6fc14bSjoerg template <class _Expr> 1979*4d6fc14bSjoerg typename enable_if 1980*4d6fc14bSjoerg < 1981*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 1982*4d6fc14bSjoerg void 1983*4d6fc14bSjoerg >::type 1984*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1985*4d6fc14bSjoerg operator>>=(const _Expr& __v) const; 1986*4d6fc14bSjoerg 1987*4d6fc14bSjoerg mask_array(const mask_array&) = default; 1988*4d6fc14bSjoerg 1989*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1990*4d6fc14bSjoerg const mask_array& operator=(const mask_array& __ma) const; 1991*4d6fc14bSjoerg 1992*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1993*4d6fc14bSjoerg void operator=(const value_type& __x) const; 1994*4d6fc14bSjoerg 1995*4d6fc14bSjoergprivate: 1996*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1997*4d6fc14bSjoerg mask_array(const valarray<bool>& __vb, const valarray<value_type>& __v) 1998*4d6fc14bSjoerg : __vp_(const_cast<value_type*>(__v.__begin_)), 1999*4d6fc14bSjoerg __1d_(static_cast<size_t>(count(__vb.__begin_, __vb.__end_, true))) 2000*4d6fc14bSjoerg { 2001*4d6fc14bSjoerg size_t __j = 0; 2002*4d6fc14bSjoerg for (size_t __i = 0; __i < __vb.size(); ++__i) 2003*4d6fc14bSjoerg if (__vb[__i]) 2004*4d6fc14bSjoerg __1d_[__j++] = __i; 2005*4d6fc14bSjoerg } 2006*4d6fc14bSjoerg 2007*4d6fc14bSjoerg template <class> friend class valarray; 2008*4d6fc14bSjoerg}; 2009*4d6fc14bSjoerg 2010*4d6fc14bSjoergtemplate <class _Tp> 2011*4d6fc14bSjoergtemplate <class _Expr> 2012*4d6fc14bSjoerginline 2013*4d6fc14bSjoergtypename enable_if 2014*4d6fc14bSjoerg< 2015*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 2016*4d6fc14bSjoerg void 2017*4d6fc14bSjoerg>::type 2018*4d6fc14bSjoergmask_array<_Tp>::operator=(const _Expr& __v) const 2019*4d6fc14bSjoerg{ 2020*4d6fc14bSjoerg size_t __n = __1d_.size(); 2021*4d6fc14bSjoerg for (size_t __i = 0; __i < __n; ++__i) 2022*4d6fc14bSjoerg __vp_[__1d_[__i]] = __v[__i]; 2023*4d6fc14bSjoerg} 2024*4d6fc14bSjoerg 2025*4d6fc14bSjoergtemplate <class _Tp> 2026*4d6fc14bSjoergtemplate <class _Expr> 2027*4d6fc14bSjoerginline 2028*4d6fc14bSjoergtypename enable_if 2029*4d6fc14bSjoerg< 2030*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 2031*4d6fc14bSjoerg void 2032*4d6fc14bSjoerg>::type 2033*4d6fc14bSjoergmask_array<_Tp>::operator*=(const _Expr& __v) const 2034*4d6fc14bSjoerg{ 2035*4d6fc14bSjoerg size_t __n = __1d_.size(); 2036*4d6fc14bSjoerg for (size_t __i = 0; __i < __n; ++__i) 2037*4d6fc14bSjoerg __vp_[__1d_[__i]] *= __v[__i]; 2038*4d6fc14bSjoerg} 2039*4d6fc14bSjoerg 2040*4d6fc14bSjoergtemplate <class _Tp> 2041*4d6fc14bSjoergtemplate <class _Expr> 2042*4d6fc14bSjoerginline 2043*4d6fc14bSjoergtypename enable_if 2044*4d6fc14bSjoerg< 2045*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 2046*4d6fc14bSjoerg void 2047*4d6fc14bSjoerg>::type 2048*4d6fc14bSjoergmask_array<_Tp>::operator/=(const _Expr& __v) const 2049*4d6fc14bSjoerg{ 2050*4d6fc14bSjoerg size_t __n = __1d_.size(); 2051*4d6fc14bSjoerg for (size_t __i = 0; __i < __n; ++__i) 2052*4d6fc14bSjoerg __vp_[__1d_[__i]] /= __v[__i]; 2053*4d6fc14bSjoerg} 2054*4d6fc14bSjoerg 2055*4d6fc14bSjoergtemplate <class _Tp> 2056*4d6fc14bSjoergtemplate <class _Expr> 2057*4d6fc14bSjoerginline 2058*4d6fc14bSjoergtypename enable_if 2059*4d6fc14bSjoerg< 2060*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 2061*4d6fc14bSjoerg void 2062*4d6fc14bSjoerg>::type 2063*4d6fc14bSjoergmask_array<_Tp>::operator%=(const _Expr& __v) const 2064*4d6fc14bSjoerg{ 2065*4d6fc14bSjoerg size_t __n = __1d_.size(); 2066*4d6fc14bSjoerg for (size_t __i = 0; __i < __n; ++__i) 2067*4d6fc14bSjoerg __vp_[__1d_[__i]] %= __v[__i]; 2068*4d6fc14bSjoerg} 2069*4d6fc14bSjoerg 2070*4d6fc14bSjoergtemplate <class _Tp> 2071*4d6fc14bSjoergtemplate <class _Expr> 2072*4d6fc14bSjoerginline 2073*4d6fc14bSjoergtypename enable_if 2074*4d6fc14bSjoerg< 2075*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 2076*4d6fc14bSjoerg void 2077*4d6fc14bSjoerg>::type 2078*4d6fc14bSjoergmask_array<_Tp>::operator+=(const _Expr& __v) const 2079*4d6fc14bSjoerg{ 2080*4d6fc14bSjoerg size_t __n = __1d_.size(); 2081*4d6fc14bSjoerg for (size_t __i = 0; __i < __n; ++__i) 2082*4d6fc14bSjoerg __vp_[__1d_[__i]] += __v[__i]; 2083*4d6fc14bSjoerg} 2084*4d6fc14bSjoerg 2085*4d6fc14bSjoergtemplate <class _Tp> 2086*4d6fc14bSjoergtemplate <class _Expr> 2087*4d6fc14bSjoerginline 2088*4d6fc14bSjoergtypename enable_if 2089*4d6fc14bSjoerg< 2090*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 2091*4d6fc14bSjoerg void 2092*4d6fc14bSjoerg>::type 2093*4d6fc14bSjoergmask_array<_Tp>::operator-=(const _Expr& __v) const 2094*4d6fc14bSjoerg{ 2095*4d6fc14bSjoerg size_t __n = __1d_.size(); 2096*4d6fc14bSjoerg for (size_t __i = 0; __i < __n; ++__i) 2097*4d6fc14bSjoerg __vp_[__1d_[__i]] -= __v[__i]; 2098*4d6fc14bSjoerg} 2099*4d6fc14bSjoerg 2100*4d6fc14bSjoergtemplate <class _Tp> 2101*4d6fc14bSjoergtemplate <class _Expr> 2102*4d6fc14bSjoerginline 2103*4d6fc14bSjoergtypename enable_if 2104*4d6fc14bSjoerg< 2105*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 2106*4d6fc14bSjoerg void 2107*4d6fc14bSjoerg>::type 2108*4d6fc14bSjoergmask_array<_Tp>::operator^=(const _Expr& __v) const 2109*4d6fc14bSjoerg{ 2110*4d6fc14bSjoerg size_t __n = __1d_.size(); 2111*4d6fc14bSjoerg for (size_t __i = 0; __i < __n; ++__i) 2112*4d6fc14bSjoerg __vp_[__1d_[__i]] ^= __v[__i]; 2113*4d6fc14bSjoerg} 2114*4d6fc14bSjoerg 2115*4d6fc14bSjoergtemplate <class _Tp> 2116*4d6fc14bSjoergtemplate <class _Expr> 2117*4d6fc14bSjoerginline 2118*4d6fc14bSjoergtypename enable_if 2119*4d6fc14bSjoerg< 2120*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 2121*4d6fc14bSjoerg void 2122*4d6fc14bSjoerg>::type 2123*4d6fc14bSjoergmask_array<_Tp>::operator&=(const _Expr& __v) const 2124*4d6fc14bSjoerg{ 2125*4d6fc14bSjoerg size_t __n = __1d_.size(); 2126*4d6fc14bSjoerg for (size_t __i = 0; __i < __n; ++__i) 2127*4d6fc14bSjoerg __vp_[__1d_[__i]] &= __v[__i]; 2128*4d6fc14bSjoerg} 2129*4d6fc14bSjoerg 2130*4d6fc14bSjoergtemplate <class _Tp> 2131*4d6fc14bSjoergtemplate <class _Expr> 2132*4d6fc14bSjoerginline 2133*4d6fc14bSjoergtypename enable_if 2134*4d6fc14bSjoerg< 2135*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 2136*4d6fc14bSjoerg void 2137*4d6fc14bSjoerg>::type 2138*4d6fc14bSjoergmask_array<_Tp>::operator|=(const _Expr& __v) const 2139*4d6fc14bSjoerg{ 2140*4d6fc14bSjoerg size_t __n = __1d_.size(); 2141*4d6fc14bSjoerg for (size_t __i = 0; __i < __n; ++__i) 2142*4d6fc14bSjoerg __vp_[__1d_[__i]] |= __v[__i]; 2143*4d6fc14bSjoerg} 2144*4d6fc14bSjoerg 2145*4d6fc14bSjoergtemplate <class _Tp> 2146*4d6fc14bSjoergtemplate <class _Expr> 2147*4d6fc14bSjoerginline 2148*4d6fc14bSjoergtypename enable_if 2149*4d6fc14bSjoerg< 2150*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 2151*4d6fc14bSjoerg void 2152*4d6fc14bSjoerg>::type 2153*4d6fc14bSjoergmask_array<_Tp>::operator<<=(const _Expr& __v) const 2154*4d6fc14bSjoerg{ 2155*4d6fc14bSjoerg size_t __n = __1d_.size(); 2156*4d6fc14bSjoerg for (size_t __i = 0; __i < __n; ++__i) 2157*4d6fc14bSjoerg __vp_[__1d_[__i]] <<= __v[__i]; 2158*4d6fc14bSjoerg} 2159*4d6fc14bSjoerg 2160*4d6fc14bSjoergtemplate <class _Tp> 2161*4d6fc14bSjoergtemplate <class _Expr> 2162*4d6fc14bSjoerginline 2163*4d6fc14bSjoergtypename enable_if 2164*4d6fc14bSjoerg< 2165*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 2166*4d6fc14bSjoerg void 2167*4d6fc14bSjoerg>::type 2168*4d6fc14bSjoergmask_array<_Tp>::operator>>=(const _Expr& __v) const 2169*4d6fc14bSjoerg{ 2170*4d6fc14bSjoerg size_t __n = __1d_.size(); 2171*4d6fc14bSjoerg for (size_t __i = 0; __i < __n; ++__i) 2172*4d6fc14bSjoerg __vp_[__1d_[__i]] >>= __v[__i]; 2173*4d6fc14bSjoerg} 2174*4d6fc14bSjoerg 2175*4d6fc14bSjoergtemplate <class _Tp> 2176*4d6fc14bSjoerginline 2177*4d6fc14bSjoergconst mask_array<_Tp>& 2178*4d6fc14bSjoergmask_array<_Tp>::operator=(const mask_array& __ma) const 2179*4d6fc14bSjoerg{ 2180*4d6fc14bSjoerg size_t __n = __1d_.size(); 2181*4d6fc14bSjoerg for (size_t __i = 0; __i < __n; ++__i) 2182*4d6fc14bSjoerg __vp_[__1d_[__i]] = __ma.__vp_[__1d_[__i]]; 2183*4d6fc14bSjoerg return *this; 2184*4d6fc14bSjoerg} 2185*4d6fc14bSjoerg 2186*4d6fc14bSjoergtemplate <class _Tp> 2187*4d6fc14bSjoerginline 2188*4d6fc14bSjoergvoid 2189*4d6fc14bSjoergmask_array<_Tp>::operator=(const value_type& __x) const 2190*4d6fc14bSjoerg{ 2191*4d6fc14bSjoerg size_t __n = __1d_.size(); 2192*4d6fc14bSjoerg for (size_t __i = 0; __i < __n; ++__i) 2193*4d6fc14bSjoerg __vp_[__1d_[__i]] = __x; 2194*4d6fc14bSjoerg} 2195*4d6fc14bSjoerg 2196*4d6fc14bSjoergtemplate <class _ValExpr> 2197*4d6fc14bSjoergclass __mask_expr 2198*4d6fc14bSjoerg{ 2199*4d6fc14bSjoerg typedef typename remove_reference<_ValExpr>::type _RmExpr; 2200*4d6fc14bSjoergpublic: 2201*4d6fc14bSjoerg typedef typename _RmExpr::value_type value_type; 2202*4d6fc14bSjoerg typedef value_type result_type; 2203*4d6fc14bSjoerg 2204*4d6fc14bSjoergprivate: 2205*4d6fc14bSjoerg _ValExpr __expr_; 2206*4d6fc14bSjoerg valarray<size_t> __1d_; 2207*4d6fc14bSjoerg 2208*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2209*4d6fc14bSjoerg __mask_expr(const valarray<bool>& __vb, const _RmExpr& __e) 2210*4d6fc14bSjoerg : __expr_(__e), 2211*4d6fc14bSjoerg __1d_(static_cast<size_t>(count(__vb.__begin_, __vb.__end_, true))) 2212*4d6fc14bSjoerg { 2213*4d6fc14bSjoerg size_t __j = 0; 2214*4d6fc14bSjoerg for (size_t __i = 0; __i < __vb.size(); ++__i) 2215*4d6fc14bSjoerg if (__vb[__i]) 2216*4d6fc14bSjoerg __1d_[__j++] = __i; 2217*4d6fc14bSjoerg } 2218*4d6fc14bSjoerg 2219*4d6fc14bSjoergpublic: 2220*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2221*4d6fc14bSjoerg result_type operator[](size_t __i) const 2222*4d6fc14bSjoerg {return __expr_[__1d_[__i]];} 2223*4d6fc14bSjoerg 2224*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2225*4d6fc14bSjoerg size_t size() const {return __1d_.size();} 2226*4d6fc14bSjoerg 2227*4d6fc14bSjoerg template <class> friend class __val_expr; 2228*4d6fc14bSjoerg template <class> friend class valarray; 2229*4d6fc14bSjoerg}; 2230*4d6fc14bSjoerg 2231*4d6fc14bSjoerg// indirect_array 2232*4d6fc14bSjoerg 2233*4d6fc14bSjoergtemplate <class _Tp> 2234*4d6fc14bSjoergclass _LIBCPP_TEMPLATE_VIS indirect_array 2235*4d6fc14bSjoerg{ 2236*4d6fc14bSjoergpublic: 2237*4d6fc14bSjoerg typedef _Tp value_type; 2238*4d6fc14bSjoerg 2239*4d6fc14bSjoergprivate: 2240*4d6fc14bSjoerg value_type* __vp_; 2241*4d6fc14bSjoerg valarray<size_t> __1d_; 2242*4d6fc14bSjoerg 2243*4d6fc14bSjoergpublic: 2244*4d6fc14bSjoerg template <class _Expr> 2245*4d6fc14bSjoerg typename enable_if 2246*4d6fc14bSjoerg < 2247*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 2248*4d6fc14bSjoerg void 2249*4d6fc14bSjoerg >::type 2250*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2251*4d6fc14bSjoerg operator=(const _Expr& __v) const; 2252*4d6fc14bSjoerg 2253*4d6fc14bSjoerg template <class _Expr> 2254*4d6fc14bSjoerg typename enable_if 2255*4d6fc14bSjoerg < 2256*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 2257*4d6fc14bSjoerg void 2258*4d6fc14bSjoerg >::type 2259*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2260*4d6fc14bSjoerg operator*=(const _Expr& __v) const; 2261*4d6fc14bSjoerg 2262*4d6fc14bSjoerg template <class _Expr> 2263*4d6fc14bSjoerg typename enable_if 2264*4d6fc14bSjoerg < 2265*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 2266*4d6fc14bSjoerg void 2267*4d6fc14bSjoerg >::type 2268*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2269*4d6fc14bSjoerg operator/=(const _Expr& __v) const; 2270*4d6fc14bSjoerg 2271*4d6fc14bSjoerg template <class _Expr> 2272*4d6fc14bSjoerg typename enable_if 2273*4d6fc14bSjoerg < 2274*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 2275*4d6fc14bSjoerg void 2276*4d6fc14bSjoerg >::type 2277*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2278*4d6fc14bSjoerg operator%=(const _Expr& __v) const; 2279*4d6fc14bSjoerg 2280*4d6fc14bSjoerg template <class _Expr> 2281*4d6fc14bSjoerg typename enable_if 2282*4d6fc14bSjoerg < 2283*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 2284*4d6fc14bSjoerg void 2285*4d6fc14bSjoerg >::type 2286*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2287*4d6fc14bSjoerg operator+=(const _Expr& __v) const; 2288*4d6fc14bSjoerg 2289*4d6fc14bSjoerg template <class _Expr> 2290*4d6fc14bSjoerg typename enable_if 2291*4d6fc14bSjoerg < 2292*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 2293*4d6fc14bSjoerg void 2294*4d6fc14bSjoerg >::type 2295*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2296*4d6fc14bSjoerg operator-=(const _Expr& __v) const; 2297*4d6fc14bSjoerg 2298*4d6fc14bSjoerg template <class _Expr> 2299*4d6fc14bSjoerg typename enable_if 2300*4d6fc14bSjoerg < 2301*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 2302*4d6fc14bSjoerg void 2303*4d6fc14bSjoerg >::type 2304*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2305*4d6fc14bSjoerg operator^=(const _Expr& __v) const; 2306*4d6fc14bSjoerg 2307*4d6fc14bSjoerg template <class _Expr> 2308*4d6fc14bSjoerg typename enable_if 2309*4d6fc14bSjoerg < 2310*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 2311*4d6fc14bSjoerg void 2312*4d6fc14bSjoerg >::type 2313*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2314*4d6fc14bSjoerg operator&=(const _Expr& __v) const; 2315*4d6fc14bSjoerg 2316*4d6fc14bSjoerg template <class _Expr> 2317*4d6fc14bSjoerg typename enable_if 2318*4d6fc14bSjoerg < 2319*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 2320*4d6fc14bSjoerg void 2321*4d6fc14bSjoerg >::type 2322*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2323*4d6fc14bSjoerg operator|=(const _Expr& __v) const; 2324*4d6fc14bSjoerg 2325*4d6fc14bSjoerg template <class _Expr> 2326*4d6fc14bSjoerg typename enable_if 2327*4d6fc14bSjoerg < 2328*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 2329*4d6fc14bSjoerg void 2330*4d6fc14bSjoerg >::type 2331*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2332*4d6fc14bSjoerg operator<<=(const _Expr& __v) const; 2333*4d6fc14bSjoerg 2334*4d6fc14bSjoerg template <class _Expr> 2335*4d6fc14bSjoerg typename enable_if 2336*4d6fc14bSjoerg < 2337*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 2338*4d6fc14bSjoerg void 2339*4d6fc14bSjoerg >::type 2340*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2341*4d6fc14bSjoerg operator>>=(const _Expr& __v) const; 2342*4d6fc14bSjoerg 2343*4d6fc14bSjoerg indirect_array(const indirect_array&) = default; 2344*4d6fc14bSjoerg 2345*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2346*4d6fc14bSjoerg const indirect_array& operator=(const indirect_array& __ia) const; 2347*4d6fc14bSjoerg 2348*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2349*4d6fc14bSjoerg void operator=(const value_type& __x) const; 2350*4d6fc14bSjoerg 2351*4d6fc14bSjoergprivate: 2352*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2353*4d6fc14bSjoerg indirect_array(const valarray<size_t>& __ia, const valarray<value_type>& __v) 2354*4d6fc14bSjoerg : __vp_(const_cast<value_type*>(__v.__begin_)), 2355*4d6fc14bSjoerg __1d_(__ia) 2356*4d6fc14bSjoerg {} 2357*4d6fc14bSjoerg 2358*4d6fc14bSjoerg#ifndef _LIBCPP_CXX03_LANG 2359*4d6fc14bSjoerg 2360*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2361*4d6fc14bSjoerg indirect_array(valarray<size_t>&& __ia, const valarray<value_type>& __v) 2362*4d6fc14bSjoerg : __vp_(const_cast<value_type*>(__v.__begin_)), 2363*4d6fc14bSjoerg __1d_(move(__ia)) 2364*4d6fc14bSjoerg {} 2365*4d6fc14bSjoerg 2366*4d6fc14bSjoerg#endif // _LIBCPP_CXX03_LANG 2367*4d6fc14bSjoerg 2368*4d6fc14bSjoerg template <class> friend class valarray; 2369*4d6fc14bSjoerg}; 2370*4d6fc14bSjoerg 2371*4d6fc14bSjoergtemplate <class _Tp> 2372*4d6fc14bSjoergtemplate <class _Expr> 2373*4d6fc14bSjoerginline 2374*4d6fc14bSjoergtypename enable_if 2375*4d6fc14bSjoerg< 2376*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 2377*4d6fc14bSjoerg void 2378*4d6fc14bSjoerg>::type 2379*4d6fc14bSjoergindirect_array<_Tp>::operator=(const _Expr& __v) const 2380*4d6fc14bSjoerg{ 2381*4d6fc14bSjoerg size_t __n = __1d_.size(); 2382*4d6fc14bSjoerg for (size_t __i = 0; __i < __n; ++__i) 2383*4d6fc14bSjoerg __vp_[__1d_[__i]] = __v[__i]; 2384*4d6fc14bSjoerg} 2385*4d6fc14bSjoerg 2386*4d6fc14bSjoergtemplate <class _Tp> 2387*4d6fc14bSjoergtemplate <class _Expr> 2388*4d6fc14bSjoerginline 2389*4d6fc14bSjoergtypename enable_if 2390*4d6fc14bSjoerg< 2391*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 2392*4d6fc14bSjoerg void 2393*4d6fc14bSjoerg>::type 2394*4d6fc14bSjoergindirect_array<_Tp>::operator*=(const _Expr& __v) const 2395*4d6fc14bSjoerg{ 2396*4d6fc14bSjoerg size_t __n = __1d_.size(); 2397*4d6fc14bSjoerg for (size_t __i = 0; __i < __n; ++__i) 2398*4d6fc14bSjoerg __vp_[__1d_[__i]] *= __v[__i]; 2399*4d6fc14bSjoerg} 2400*4d6fc14bSjoerg 2401*4d6fc14bSjoergtemplate <class _Tp> 2402*4d6fc14bSjoergtemplate <class _Expr> 2403*4d6fc14bSjoerginline 2404*4d6fc14bSjoergtypename enable_if 2405*4d6fc14bSjoerg< 2406*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 2407*4d6fc14bSjoerg void 2408*4d6fc14bSjoerg>::type 2409*4d6fc14bSjoergindirect_array<_Tp>::operator/=(const _Expr& __v) const 2410*4d6fc14bSjoerg{ 2411*4d6fc14bSjoerg size_t __n = __1d_.size(); 2412*4d6fc14bSjoerg for (size_t __i = 0; __i < __n; ++__i) 2413*4d6fc14bSjoerg __vp_[__1d_[__i]] /= __v[__i]; 2414*4d6fc14bSjoerg} 2415*4d6fc14bSjoerg 2416*4d6fc14bSjoergtemplate <class _Tp> 2417*4d6fc14bSjoergtemplate <class _Expr> 2418*4d6fc14bSjoerginline 2419*4d6fc14bSjoergtypename enable_if 2420*4d6fc14bSjoerg< 2421*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 2422*4d6fc14bSjoerg void 2423*4d6fc14bSjoerg>::type 2424*4d6fc14bSjoergindirect_array<_Tp>::operator%=(const _Expr& __v) const 2425*4d6fc14bSjoerg{ 2426*4d6fc14bSjoerg size_t __n = __1d_.size(); 2427*4d6fc14bSjoerg for (size_t __i = 0; __i < __n; ++__i) 2428*4d6fc14bSjoerg __vp_[__1d_[__i]] %= __v[__i]; 2429*4d6fc14bSjoerg} 2430*4d6fc14bSjoerg 2431*4d6fc14bSjoergtemplate <class _Tp> 2432*4d6fc14bSjoergtemplate <class _Expr> 2433*4d6fc14bSjoerginline 2434*4d6fc14bSjoergtypename enable_if 2435*4d6fc14bSjoerg< 2436*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 2437*4d6fc14bSjoerg void 2438*4d6fc14bSjoerg>::type 2439*4d6fc14bSjoergindirect_array<_Tp>::operator+=(const _Expr& __v) const 2440*4d6fc14bSjoerg{ 2441*4d6fc14bSjoerg size_t __n = __1d_.size(); 2442*4d6fc14bSjoerg for (size_t __i = 0; __i < __n; ++__i) 2443*4d6fc14bSjoerg __vp_[__1d_[__i]] += __v[__i]; 2444*4d6fc14bSjoerg} 2445*4d6fc14bSjoerg 2446*4d6fc14bSjoergtemplate <class _Tp> 2447*4d6fc14bSjoergtemplate <class _Expr> 2448*4d6fc14bSjoerginline 2449*4d6fc14bSjoergtypename enable_if 2450*4d6fc14bSjoerg< 2451*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 2452*4d6fc14bSjoerg void 2453*4d6fc14bSjoerg>::type 2454*4d6fc14bSjoergindirect_array<_Tp>::operator-=(const _Expr& __v) const 2455*4d6fc14bSjoerg{ 2456*4d6fc14bSjoerg size_t __n = __1d_.size(); 2457*4d6fc14bSjoerg for (size_t __i = 0; __i < __n; ++__i) 2458*4d6fc14bSjoerg __vp_[__1d_[__i]] -= __v[__i]; 2459*4d6fc14bSjoerg} 2460*4d6fc14bSjoerg 2461*4d6fc14bSjoergtemplate <class _Tp> 2462*4d6fc14bSjoergtemplate <class _Expr> 2463*4d6fc14bSjoerginline 2464*4d6fc14bSjoergtypename enable_if 2465*4d6fc14bSjoerg< 2466*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 2467*4d6fc14bSjoerg void 2468*4d6fc14bSjoerg>::type 2469*4d6fc14bSjoergindirect_array<_Tp>::operator^=(const _Expr& __v) const 2470*4d6fc14bSjoerg{ 2471*4d6fc14bSjoerg size_t __n = __1d_.size(); 2472*4d6fc14bSjoerg for (size_t __i = 0; __i < __n; ++__i) 2473*4d6fc14bSjoerg __vp_[__1d_[__i]] ^= __v[__i]; 2474*4d6fc14bSjoerg} 2475*4d6fc14bSjoerg 2476*4d6fc14bSjoergtemplate <class _Tp> 2477*4d6fc14bSjoergtemplate <class _Expr> 2478*4d6fc14bSjoerginline 2479*4d6fc14bSjoergtypename enable_if 2480*4d6fc14bSjoerg< 2481*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 2482*4d6fc14bSjoerg void 2483*4d6fc14bSjoerg>::type 2484*4d6fc14bSjoergindirect_array<_Tp>::operator&=(const _Expr& __v) const 2485*4d6fc14bSjoerg{ 2486*4d6fc14bSjoerg size_t __n = __1d_.size(); 2487*4d6fc14bSjoerg for (size_t __i = 0; __i < __n; ++__i) 2488*4d6fc14bSjoerg __vp_[__1d_[__i]] &= __v[__i]; 2489*4d6fc14bSjoerg} 2490*4d6fc14bSjoerg 2491*4d6fc14bSjoergtemplate <class _Tp> 2492*4d6fc14bSjoergtemplate <class _Expr> 2493*4d6fc14bSjoerginline 2494*4d6fc14bSjoergtypename enable_if 2495*4d6fc14bSjoerg< 2496*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 2497*4d6fc14bSjoerg void 2498*4d6fc14bSjoerg>::type 2499*4d6fc14bSjoergindirect_array<_Tp>::operator|=(const _Expr& __v) const 2500*4d6fc14bSjoerg{ 2501*4d6fc14bSjoerg size_t __n = __1d_.size(); 2502*4d6fc14bSjoerg for (size_t __i = 0; __i < __n; ++__i) 2503*4d6fc14bSjoerg __vp_[__1d_[__i]] |= __v[__i]; 2504*4d6fc14bSjoerg} 2505*4d6fc14bSjoerg 2506*4d6fc14bSjoergtemplate <class _Tp> 2507*4d6fc14bSjoergtemplate <class _Expr> 2508*4d6fc14bSjoerginline 2509*4d6fc14bSjoergtypename enable_if 2510*4d6fc14bSjoerg< 2511*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 2512*4d6fc14bSjoerg void 2513*4d6fc14bSjoerg>::type 2514*4d6fc14bSjoergindirect_array<_Tp>::operator<<=(const _Expr& __v) const 2515*4d6fc14bSjoerg{ 2516*4d6fc14bSjoerg size_t __n = __1d_.size(); 2517*4d6fc14bSjoerg for (size_t __i = 0; __i < __n; ++__i) 2518*4d6fc14bSjoerg __vp_[__1d_[__i]] <<= __v[__i]; 2519*4d6fc14bSjoerg} 2520*4d6fc14bSjoerg 2521*4d6fc14bSjoergtemplate <class _Tp> 2522*4d6fc14bSjoergtemplate <class _Expr> 2523*4d6fc14bSjoerginline 2524*4d6fc14bSjoergtypename enable_if 2525*4d6fc14bSjoerg< 2526*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 2527*4d6fc14bSjoerg void 2528*4d6fc14bSjoerg>::type 2529*4d6fc14bSjoergindirect_array<_Tp>::operator>>=(const _Expr& __v) const 2530*4d6fc14bSjoerg{ 2531*4d6fc14bSjoerg size_t __n = __1d_.size(); 2532*4d6fc14bSjoerg for (size_t __i = 0; __i < __n; ++__i) 2533*4d6fc14bSjoerg __vp_[__1d_[__i]] >>= __v[__i]; 2534*4d6fc14bSjoerg} 2535*4d6fc14bSjoerg 2536*4d6fc14bSjoergtemplate <class _Tp> 2537*4d6fc14bSjoerginline 2538*4d6fc14bSjoergconst indirect_array<_Tp>& 2539*4d6fc14bSjoergindirect_array<_Tp>::operator=(const indirect_array& __ia) const 2540*4d6fc14bSjoerg{ 2541*4d6fc14bSjoerg typedef const size_t* _Ip; 2542*4d6fc14bSjoerg const value_type* __s = __ia.__vp_; 2543*4d6fc14bSjoerg for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_, __j = __ia.__1d_.__begin_; 2544*4d6fc14bSjoerg __i != __e; ++__i, ++__j) 2545*4d6fc14bSjoerg __vp_[*__i] = __s[*__j]; 2546*4d6fc14bSjoerg return *this; 2547*4d6fc14bSjoerg} 2548*4d6fc14bSjoerg 2549*4d6fc14bSjoergtemplate <class _Tp> 2550*4d6fc14bSjoerginline 2551*4d6fc14bSjoergvoid 2552*4d6fc14bSjoergindirect_array<_Tp>::operator=(const value_type& __x) const 2553*4d6fc14bSjoerg{ 2554*4d6fc14bSjoerg typedef const size_t* _Ip; 2555*4d6fc14bSjoerg for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i) 2556*4d6fc14bSjoerg __vp_[*__i] = __x; 2557*4d6fc14bSjoerg} 2558*4d6fc14bSjoerg 2559*4d6fc14bSjoergtemplate <class _ValExpr> 2560*4d6fc14bSjoergclass __indirect_expr 2561*4d6fc14bSjoerg{ 2562*4d6fc14bSjoerg typedef typename remove_reference<_ValExpr>::type _RmExpr; 2563*4d6fc14bSjoergpublic: 2564*4d6fc14bSjoerg typedef typename _RmExpr::value_type value_type; 2565*4d6fc14bSjoerg typedef value_type result_type; 2566*4d6fc14bSjoerg 2567*4d6fc14bSjoergprivate: 2568*4d6fc14bSjoerg _ValExpr __expr_; 2569*4d6fc14bSjoerg valarray<size_t> __1d_; 2570*4d6fc14bSjoerg 2571*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2572*4d6fc14bSjoerg __indirect_expr(const valarray<size_t>& __ia, const _RmExpr& __e) 2573*4d6fc14bSjoerg : __expr_(__e), 2574*4d6fc14bSjoerg __1d_(__ia) 2575*4d6fc14bSjoerg {} 2576*4d6fc14bSjoerg 2577*4d6fc14bSjoerg#ifndef _LIBCPP_CXX03_LANG 2578*4d6fc14bSjoerg 2579*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2580*4d6fc14bSjoerg __indirect_expr(valarray<size_t>&& __ia, const _RmExpr& __e) 2581*4d6fc14bSjoerg : __expr_(__e), 2582*4d6fc14bSjoerg __1d_(move(__ia)) 2583*4d6fc14bSjoerg {} 2584*4d6fc14bSjoerg 2585*4d6fc14bSjoerg#endif // _LIBCPP_CXX03_LANG 2586*4d6fc14bSjoerg 2587*4d6fc14bSjoergpublic: 2588*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2589*4d6fc14bSjoerg result_type operator[](size_t __i) const 2590*4d6fc14bSjoerg {return __expr_[__1d_[__i]];} 2591*4d6fc14bSjoerg 2592*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2593*4d6fc14bSjoerg size_t size() const {return __1d_.size();} 2594*4d6fc14bSjoerg 2595*4d6fc14bSjoerg template <class> friend class __val_expr; 2596*4d6fc14bSjoerg template <class> friend class _LIBCPP_TEMPLATE_VIS valarray; 2597*4d6fc14bSjoerg}; 2598*4d6fc14bSjoerg 2599*4d6fc14bSjoergtemplate<class _ValExpr> 2600*4d6fc14bSjoergclass __val_expr 2601*4d6fc14bSjoerg{ 2602*4d6fc14bSjoerg typedef typename remove_reference<_ValExpr>::type _RmExpr; 2603*4d6fc14bSjoerg 2604*4d6fc14bSjoerg _ValExpr __expr_; 2605*4d6fc14bSjoergpublic: 2606*4d6fc14bSjoerg typedef typename _RmExpr::value_type value_type; 2607*4d6fc14bSjoerg typedef typename _RmExpr::result_type result_type; 2608*4d6fc14bSjoerg 2609*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2610*4d6fc14bSjoerg explicit __val_expr(const _RmExpr& __e) : __expr_(__e) {} 2611*4d6fc14bSjoerg 2612*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2613*4d6fc14bSjoerg result_type operator[](size_t __i) const 2614*4d6fc14bSjoerg {return __expr_[__i];} 2615*4d6fc14bSjoerg 2616*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2617*4d6fc14bSjoerg __val_expr<__slice_expr<_ValExpr> > operator[](slice __s) const 2618*4d6fc14bSjoerg { 2619*4d6fc14bSjoerg typedef __slice_expr<_ValExpr> _NewExpr; 2620*4d6fc14bSjoerg return __val_expr< _NewExpr >(_NewExpr(__s, __expr_)); 2621*4d6fc14bSjoerg } 2622*4d6fc14bSjoerg 2623*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2624*4d6fc14bSjoerg __val_expr<__indirect_expr<_ValExpr> > operator[](const gslice& __gs) const 2625*4d6fc14bSjoerg { 2626*4d6fc14bSjoerg typedef __indirect_expr<_ValExpr> _NewExpr; 2627*4d6fc14bSjoerg return __val_expr<_NewExpr >(_NewExpr(__gs.__1d_, __expr_)); 2628*4d6fc14bSjoerg } 2629*4d6fc14bSjoerg 2630*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2631*4d6fc14bSjoerg __val_expr<__mask_expr<_ValExpr> > operator[](const valarray<bool>& __vb) const 2632*4d6fc14bSjoerg { 2633*4d6fc14bSjoerg typedef __mask_expr<_ValExpr> _NewExpr; 2634*4d6fc14bSjoerg return __val_expr< _NewExpr >( _NewExpr(__vb, __expr_)); 2635*4d6fc14bSjoerg } 2636*4d6fc14bSjoerg 2637*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2638*4d6fc14bSjoerg __val_expr<__indirect_expr<_ValExpr> > operator[](const valarray<size_t>& __vs) const 2639*4d6fc14bSjoerg { 2640*4d6fc14bSjoerg typedef __indirect_expr<_ValExpr> _NewExpr; 2641*4d6fc14bSjoerg return __val_expr< _NewExpr >(_NewExpr(__vs, __expr_)); 2642*4d6fc14bSjoerg } 2643*4d6fc14bSjoerg 2644*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2645*4d6fc14bSjoerg __val_expr<_UnaryOp<__unary_plus<value_type>, _ValExpr> > 2646*4d6fc14bSjoerg operator+() const 2647*4d6fc14bSjoerg { 2648*4d6fc14bSjoerg typedef _UnaryOp<__unary_plus<value_type>, _ValExpr> _NewExpr; 2649*4d6fc14bSjoerg return __val_expr<_NewExpr>(_NewExpr(__unary_plus<value_type>(), __expr_)); 2650*4d6fc14bSjoerg } 2651*4d6fc14bSjoerg 2652*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2653*4d6fc14bSjoerg __val_expr<_UnaryOp<negate<value_type>, _ValExpr> > 2654*4d6fc14bSjoerg operator-() const 2655*4d6fc14bSjoerg { 2656*4d6fc14bSjoerg typedef _UnaryOp<negate<value_type>, _ValExpr> _NewExpr; 2657*4d6fc14bSjoerg return __val_expr<_NewExpr>(_NewExpr(negate<value_type>(), __expr_)); 2658*4d6fc14bSjoerg } 2659*4d6fc14bSjoerg 2660*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2661*4d6fc14bSjoerg __val_expr<_UnaryOp<__bit_not<value_type>, _ValExpr> > 2662*4d6fc14bSjoerg operator~() const 2663*4d6fc14bSjoerg { 2664*4d6fc14bSjoerg typedef _UnaryOp<__bit_not<value_type>, _ValExpr> _NewExpr; 2665*4d6fc14bSjoerg return __val_expr<_NewExpr>(_NewExpr(__bit_not<value_type>(), __expr_)); 2666*4d6fc14bSjoerg } 2667*4d6fc14bSjoerg 2668*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2669*4d6fc14bSjoerg __val_expr<_UnaryOp<logical_not<value_type>, _ValExpr> > 2670*4d6fc14bSjoerg operator!() const 2671*4d6fc14bSjoerg { 2672*4d6fc14bSjoerg typedef _UnaryOp<logical_not<value_type>, _ValExpr> _NewExpr; 2673*4d6fc14bSjoerg return __val_expr<_NewExpr>(_NewExpr(logical_not<value_type>(), __expr_)); 2674*4d6fc14bSjoerg } 2675*4d6fc14bSjoerg 2676*4d6fc14bSjoerg operator valarray<result_type>() const; 2677*4d6fc14bSjoerg 2678*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2679*4d6fc14bSjoerg size_t size() const {return __expr_.size();} 2680*4d6fc14bSjoerg 2681*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2682*4d6fc14bSjoerg result_type sum() const 2683*4d6fc14bSjoerg { 2684*4d6fc14bSjoerg size_t __n = __expr_.size(); 2685*4d6fc14bSjoerg result_type __r = __n ? __expr_[0] : result_type(); 2686*4d6fc14bSjoerg for (size_t __i = 1; __i < __n; ++__i) 2687*4d6fc14bSjoerg __r += __expr_[__i]; 2688*4d6fc14bSjoerg return __r; 2689*4d6fc14bSjoerg } 2690*4d6fc14bSjoerg 2691*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2692*4d6fc14bSjoerg result_type min() const 2693*4d6fc14bSjoerg { 2694*4d6fc14bSjoerg size_t __n = size(); 2695*4d6fc14bSjoerg result_type __r = __n ? (*this)[0] : result_type(); 2696*4d6fc14bSjoerg for (size_t __i = 1; __i < __n; ++__i) 2697*4d6fc14bSjoerg { 2698*4d6fc14bSjoerg result_type __x = __expr_[__i]; 2699*4d6fc14bSjoerg if (__x < __r) 2700*4d6fc14bSjoerg __r = __x; 2701*4d6fc14bSjoerg } 2702*4d6fc14bSjoerg return __r; 2703*4d6fc14bSjoerg } 2704*4d6fc14bSjoerg 2705*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2706*4d6fc14bSjoerg result_type max() const 2707*4d6fc14bSjoerg { 2708*4d6fc14bSjoerg size_t __n = size(); 2709*4d6fc14bSjoerg result_type __r = __n ? (*this)[0] : result_type(); 2710*4d6fc14bSjoerg for (size_t __i = 1; __i < __n; ++__i) 2711*4d6fc14bSjoerg { 2712*4d6fc14bSjoerg result_type __x = __expr_[__i]; 2713*4d6fc14bSjoerg if (__r < __x) 2714*4d6fc14bSjoerg __r = __x; 2715*4d6fc14bSjoerg } 2716*4d6fc14bSjoerg return __r; 2717*4d6fc14bSjoerg } 2718*4d6fc14bSjoerg 2719*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2720*4d6fc14bSjoerg __val_expr<__shift_expr<_ValExpr> > shift (int __i) const 2721*4d6fc14bSjoerg {return __val_expr<__shift_expr<_ValExpr> >(__shift_expr<_ValExpr>(__i, __expr_));} 2722*4d6fc14bSjoerg 2723*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2724*4d6fc14bSjoerg __val_expr<__cshift_expr<_ValExpr> > cshift(int __i) const 2725*4d6fc14bSjoerg {return __val_expr<__cshift_expr<_ValExpr> >(__cshift_expr<_ValExpr>(__i, __expr_));} 2726*4d6fc14bSjoerg 2727*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2728*4d6fc14bSjoerg __val_expr<_UnaryOp<__apply_expr<value_type, value_type(*)(value_type)>, _ValExpr> > 2729*4d6fc14bSjoerg apply(value_type __f(value_type)) const 2730*4d6fc14bSjoerg { 2731*4d6fc14bSjoerg typedef __apply_expr<value_type, value_type(*)(value_type)> _Op; 2732*4d6fc14bSjoerg typedef _UnaryOp<_Op, _ValExpr> _NewExpr; 2733*4d6fc14bSjoerg return __val_expr<_NewExpr>(_NewExpr(_Op(__f), __expr_)); 2734*4d6fc14bSjoerg } 2735*4d6fc14bSjoerg 2736*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2737*4d6fc14bSjoerg __val_expr<_UnaryOp<__apply_expr<value_type, value_type(*)(const value_type&)>, _ValExpr> > 2738*4d6fc14bSjoerg apply(value_type __f(const value_type&)) const 2739*4d6fc14bSjoerg { 2740*4d6fc14bSjoerg typedef __apply_expr<value_type, value_type(*)(const value_type&)> _Op; 2741*4d6fc14bSjoerg typedef _UnaryOp<_Op, _ValExpr> _NewExpr; 2742*4d6fc14bSjoerg return __val_expr<_NewExpr>(_NewExpr(_Op(__f), __expr_)); 2743*4d6fc14bSjoerg } 2744*4d6fc14bSjoerg}; 2745*4d6fc14bSjoerg 2746*4d6fc14bSjoergtemplate<class _ValExpr> 2747*4d6fc14bSjoerg__val_expr<_ValExpr>::operator valarray<__val_expr::result_type>() const 2748*4d6fc14bSjoerg{ 2749*4d6fc14bSjoerg valarray<result_type> __r; 2750*4d6fc14bSjoerg size_t __n = __expr_.size(); 2751*4d6fc14bSjoerg if (__n) 2752*4d6fc14bSjoerg { 2753*4d6fc14bSjoerg __r.__begin_ = 2754*4d6fc14bSjoerg __r.__end_ = allocator<result_type>().allocate(__n); 2755*4d6fc14bSjoerg for (size_t __i = 0; __i != __n; ++__r.__end_, ++__i) 2756*4d6fc14bSjoerg ::new ((void*)__r.__end_) result_type(__expr_[__i]); 2757*4d6fc14bSjoerg } 2758*4d6fc14bSjoerg return __r; 2759*4d6fc14bSjoerg} 2760*4d6fc14bSjoerg 2761*4d6fc14bSjoerg// valarray 2762*4d6fc14bSjoerg 2763*4d6fc14bSjoergtemplate <class _Tp> 2764*4d6fc14bSjoerginline 2765*4d6fc14bSjoergvalarray<_Tp>::valarray(size_t __n) 2766*4d6fc14bSjoerg : __begin_(nullptr), 2767*4d6fc14bSjoerg __end_(nullptr) 2768*4d6fc14bSjoerg{ 2769*4d6fc14bSjoerg if (__n) 2770*4d6fc14bSjoerg { 2771*4d6fc14bSjoerg __begin_ = __end_ = allocator<value_type>().allocate(__n); 2772*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS 2773*4d6fc14bSjoerg try 2774*4d6fc14bSjoerg { 2775*4d6fc14bSjoerg#endif // _LIBCPP_NO_EXCEPTIONS 2776*4d6fc14bSjoerg for (size_t __n_left = __n; __n_left; --__n_left, ++__end_) 2777*4d6fc14bSjoerg ::new ((void*)__end_) value_type(); 2778*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS 2779*4d6fc14bSjoerg } 2780*4d6fc14bSjoerg catch (...) 2781*4d6fc14bSjoerg { 2782*4d6fc14bSjoerg __clear(__n); 2783*4d6fc14bSjoerg throw; 2784*4d6fc14bSjoerg } 2785*4d6fc14bSjoerg#endif // _LIBCPP_NO_EXCEPTIONS 2786*4d6fc14bSjoerg } 2787*4d6fc14bSjoerg} 2788*4d6fc14bSjoerg 2789*4d6fc14bSjoergtemplate <class _Tp> 2790*4d6fc14bSjoerginline 2791*4d6fc14bSjoergvalarray<_Tp>::valarray(const value_type& __x, size_t __n) 2792*4d6fc14bSjoerg : __begin_(nullptr), 2793*4d6fc14bSjoerg __end_(nullptr) 2794*4d6fc14bSjoerg{ 2795*4d6fc14bSjoerg resize(__n, __x); 2796*4d6fc14bSjoerg} 2797*4d6fc14bSjoerg 2798*4d6fc14bSjoergtemplate <class _Tp> 2799*4d6fc14bSjoergvalarray<_Tp>::valarray(const value_type* __p, size_t __n) 2800*4d6fc14bSjoerg : __begin_(nullptr), 2801*4d6fc14bSjoerg __end_(nullptr) 2802*4d6fc14bSjoerg{ 2803*4d6fc14bSjoerg if (__n) 2804*4d6fc14bSjoerg { 2805*4d6fc14bSjoerg __begin_ = __end_ = allocator<value_type>().allocate(__n); 2806*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS 2807*4d6fc14bSjoerg try 2808*4d6fc14bSjoerg { 2809*4d6fc14bSjoerg#endif // _LIBCPP_NO_EXCEPTIONS 2810*4d6fc14bSjoerg for (size_t __n_left = __n; __n_left; ++__end_, ++__p, --__n_left) 2811*4d6fc14bSjoerg ::new ((void*)__end_) value_type(*__p); 2812*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS 2813*4d6fc14bSjoerg } 2814*4d6fc14bSjoerg catch (...) 2815*4d6fc14bSjoerg { 2816*4d6fc14bSjoerg __clear(__n); 2817*4d6fc14bSjoerg throw; 2818*4d6fc14bSjoerg } 2819*4d6fc14bSjoerg#endif // _LIBCPP_NO_EXCEPTIONS 2820*4d6fc14bSjoerg } 2821*4d6fc14bSjoerg} 2822*4d6fc14bSjoerg 2823*4d6fc14bSjoergtemplate <class _Tp> 2824*4d6fc14bSjoergvalarray<_Tp>::valarray(const valarray& __v) 2825*4d6fc14bSjoerg : __begin_(nullptr), 2826*4d6fc14bSjoerg __end_(nullptr) 2827*4d6fc14bSjoerg{ 2828*4d6fc14bSjoerg if (__v.size()) 2829*4d6fc14bSjoerg { 2830*4d6fc14bSjoerg __begin_ = __end_ = allocator<value_type>().allocate(__v.size()); 2831*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS 2832*4d6fc14bSjoerg try 2833*4d6fc14bSjoerg { 2834*4d6fc14bSjoerg#endif // _LIBCPP_NO_EXCEPTIONS 2835*4d6fc14bSjoerg for (value_type* __p = __v.__begin_; __p != __v.__end_; ++__end_, ++__p) 2836*4d6fc14bSjoerg ::new ((void*)__end_) value_type(*__p); 2837*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS 2838*4d6fc14bSjoerg } 2839*4d6fc14bSjoerg catch (...) 2840*4d6fc14bSjoerg { 2841*4d6fc14bSjoerg __clear(__v.size()); 2842*4d6fc14bSjoerg throw; 2843*4d6fc14bSjoerg } 2844*4d6fc14bSjoerg#endif // _LIBCPP_NO_EXCEPTIONS 2845*4d6fc14bSjoerg } 2846*4d6fc14bSjoerg} 2847*4d6fc14bSjoerg 2848*4d6fc14bSjoerg#ifndef _LIBCPP_CXX03_LANG 2849*4d6fc14bSjoerg 2850*4d6fc14bSjoergtemplate <class _Tp> 2851*4d6fc14bSjoerginline 2852*4d6fc14bSjoergvalarray<_Tp>::valarray(valarray&& __v) _NOEXCEPT 2853*4d6fc14bSjoerg : __begin_(__v.__begin_), 2854*4d6fc14bSjoerg __end_(__v.__end_) 2855*4d6fc14bSjoerg{ 2856*4d6fc14bSjoerg __v.__begin_ = __v.__end_ = nullptr; 2857*4d6fc14bSjoerg} 2858*4d6fc14bSjoerg 2859*4d6fc14bSjoergtemplate <class _Tp> 2860*4d6fc14bSjoergvalarray<_Tp>::valarray(initializer_list<value_type> __il) 2861*4d6fc14bSjoerg : __begin_(nullptr), 2862*4d6fc14bSjoerg __end_(nullptr) 2863*4d6fc14bSjoerg{ 2864*4d6fc14bSjoerg const size_t __n = __il.size(); 2865*4d6fc14bSjoerg if (__n) 2866*4d6fc14bSjoerg { 2867*4d6fc14bSjoerg __begin_ = __end_ = allocator<value_type>().allocate(__n); 2868*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS 2869*4d6fc14bSjoerg try 2870*4d6fc14bSjoerg { 2871*4d6fc14bSjoerg#endif // _LIBCPP_NO_EXCEPTIONS 2872*4d6fc14bSjoerg size_t __n_left = __n; 2873*4d6fc14bSjoerg for (const value_type* __p = __il.begin(); __n_left; ++__end_, ++__p, --__n_left) 2874*4d6fc14bSjoerg ::new ((void*)__end_) value_type(*__p); 2875*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS 2876*4d6fc14bSjoerg } 2877*4d6fc14bSjoerg catch (...) 2878*4d6fc14bSjoerg { 2879*4d6fc14bSjoerg __clear(__n); 2880*4d6fc14bSjoerg throw; 2881*4d6fc14bSjoerg } 2882*4d6fc14bSjoerg#endif // _LIBCPP_NO_EXCEPTIONS 2883*4d6fc14bSjoerg } 2884*4d6fc14bSjoerg} 2885*4d6fc14bSjoerg 2886*4d6fc14bSjoerg#endif // _LIBCPP_CXX03_LANG 2887*4d6fc14bSjoerg 2888*4d6fc14bSjoergtemplate <class _Tp> 2889*4d6fc14bSjoergvalarray<_Tp>::valarray(const slice_array<value_type>& __sa) 2890*4d6fc14bSjoerg : __begin_(nullptr), 2891*4d6fc14bSjoerg __end_(nullptr) 2892*4d6fc14bSjoerg{ 2893*4d6fc14bSjoerg const size_t __n = __sa.__size_; 2894*4d6fc14bSjoerg if (__n) 2895*4d6fc14bSjoerg { 2896*4d6fc14bSjoerg __begin_ = __end_ = allocator<value_type>().allocate(__n); 2897*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS 2898*4d6fc14bSjoerg try 2899*4d6fc14bSjoerg { 2900*4d6fc14bSjoerg#endif // _LIBCPP_NO_EXCEPTIONS 2901*4d6fc14bSjoerg size_t __n_left = __n; 2902*4d6fc14bSjoerg for (const value_type* __p = __sa.__vp_; __n_left; ++__end_, __p += __sa.__stride_, --__n_left) 2903*4d6fc14bSjoerg ::new ((void*)__end_) value_type(*__p); 2904*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS 2905*4d6fc14bSjoerg } 2906*4d6fc14bSjoerg catch (...) 2907*4d6fc14bSjoerg { 2908*4d6fc14bSjoerg __clear(__n); 2909*4d6fc14bSjoerg throw; 2910*4d6fc14bSjoerg } 2911*4d6fc14bSjoerg#endif // _LIBCPP_NO_EXCEPTIONS 2912*4d6fc14bSjoerg } 2913*4d6fc14bSjoerg} 2914*4d6fc14bSjoerg 2915*4d6fc14bSjoergtemplate <class _Tp> 2916*4d6fc14bSjoergvalarray<_Tp>::valarray(const gslice_array<value_type>& __ga) 2917*4d6fc14bSjoerg : __begin_(nullptr), 2918*4d6fc14bSjoerg __end_(nullptr) 2919*4d6fc14bSjoerg{ 2920*4d6fc14bSjoerg const size_t __n = __ga.__1d_.size(); 2921*4d6fc14bSjoerg if (__n) 2922*4d6fc14bSjoerg { 2923*4d6fc14bSjoerg __begin_ = __end_ = allocator<value_type>().allocate(__n); 2924*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS 2925*4d6fc14bSjoerg try 2926*4d6fc14bSjoerg { 2927*4d6fc14bSjoerg#endif // _LIBCPP_NO_EXCEPTIONS 2928*4d6fc14bSjoerg typedef const size_t* _Ip; 2929*4d6fc14bSjoerg const value_type* __s = __ga.__vp_; 2930*4d6fc14bSjoerg for (_Ip __i = __ga.__1d_.__begin_, __e = __ga.__1d_.__end_; 2931*4d6fc14bSjoerg __i != __e; ++__i, ++__end_) 2932*4d6fc14bSjoerg ::new ((void*)__end_) value_type(__s[*__i]); 2933*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS 2934*4d6fc14bSjoerg } 2935*4d6fc14bSjoerg catch (...) 2936*4d6fc14bSjoerg { 2937*4d6fc14bSjoerg __clear(__n); 2938*4d6fc14bSjoerg throw; 2939*4d6fc14bSjoerg } 2940*4d6fc14bSjoerg#endif // _LIBCPP_NO_EXCEPTIONS 2941*4d6fc14bSjoerg } 2942*4d6fc14bSjoerg} 2943*4d6fc14bSjoerg 2944*4d6fc14bSjoergtemplate <class _Tp> 2945*4d6fc14bSjoergvalarray<_Tp>::valarray(const mask_array<value_type>& __ma) 2946*4d6fc14bSjoerg : __begin_(nullptr), 2947*4d6fc14bSjoerg __end_(nullptr) 2948*4d6fc14bSjoerg{ 2949*4d6fc14bSjoerg const size_t __n = __ma.__1d_.size(); 2950*4d6fc14bSjoerg if (__n) 2951*4d6fc14bSjoerg { 2952*4d6fc14bSjoerg __begin_ = __end_ = allocator<value_type>().allocate(__n); 2953*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS 2954*4d6fc14bSjoerg try 2955*4d6fc14bSjoerg { 2956*4d6fc14bSjoerg#endif // _LIBCPP_NO_EXCEPTIONS 2957*4d6fc14bSjoerg typedef const size_t* _Ip; 2958*4d6fc14bSjoerg const value_type* __s = __ma.__vp_; 2959*4d6fc14bSjoerg for (_Ip __i = __ma.__1d_.__begin_, __e = __ma.__1d_.__end_; 2960*4d6fc14bSjoerg __i != __e; ++__i, ++__end_) 2961*4d6fc14bSjoerg ::new ((void*)__end_) value_type(__s[*__i]); 2962*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS 2963*4d6fc14bSjoerg } 2964*4d6fc14bSjoerg catch (...) 2965*4d6fc14bSjoerg { 2966*4d6fc14bSjoerg __clear(__n); 2967*4d6fc14bSjoerg throw; 2968*4d6fc14bSjoerg } 2969*4d6fc14bSjoerg#endif // _LIBCPP_NO_EXCEPTIONS 2970*4d6fc14bSjoerg } 2971*4d6fc14bSjoerg} 2972*4d6fc14bSjoerg 2973*4d6fc14bSjoergtemplate <class _Tp> 2974*4d6fc14bSjoergvalarray<_Tp>::valarray(const indirect_array<value_type>& __ia) 2975*4d6fc14bSjoerg : __begin_(nullptr), 2976*4d6fc14bSjoerg __end_(nullptr) 2977*4d6fc14bSjoerg{ 2978*4d6fc14bSjoerg const size_t __n = __ia.__1d_.size(); 2979*4d6fc14bSjoerg if (__n) 2980*4d6fc14bSjoerg { 2981*4d6fc14bSjoerg __begin_ = __end_ = allocator<value_type>().allocate(__n); 2982*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS 2983*4d6fc14bSjoerg try 2984*4d6fc14bSjoerg { 2985*4d6fc14bSjoerg#endif // _LIBCPP_NO_EXCEPTIONS 2986*4d6fc14bSjoerg typedef const size_t* _Ip; 2987*4d6fc14bSjoerg const value_type* __s = __ia.__vp_; 2988*4d6fc14bSjoerg for (_Ip __i = __ia.__1d_.__begin_, __e = __ia.__1d_.__end_; 2989*4d6fc14bSjoerg __i != __e; ++__i, ++__end_) 2990*4d6fc14bSjoerg ::new ((void*)__end_) value_type(__s[*__i]); 2991*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS 2992*4d6fc14bSjoerg } 2993*4d6fc14bSjoerg catch (...) 2994*4d6fc14bSjoerg { 2995*4d6fc14bSjoerg __clear(__n); 2996*4d6fc14bSjoerg throw; 2997*4d6fc14bSjoerg } 2998*4d6fc14bSjoerg#endif // _LIBCPP_NO_EXCEPTIONS 2999*4d6fc14bSjoerg } 3000*4d6fc14bSjoerg} 3001*4d6fc14bSjoerg 3002*4d6fc14bSjoergtemplate <class _Tp> 3003*4d6fc14bSjoerginline 3004*4d6fc14bSjoergvalarray<_Tp>::~valarray() 3005*4d6fc14bSjoerg{ 3006*4d6fc14bSjoerg __clear(size()); 3007*4d6fc14bSjoerg} 3008*4d6fc14bSjoerg 3009*4d6fc14bSjoergtemplate <class _Tp> 3010*4d6fc14bSjoergvalarray<_Tp>& 3011*4d6fc14bSjoergvalarray<_Tp>::__assign_range(const value_type* __f, const value_type* __l) 3012*4d6fc14bSjoerg{ 3013*4d6fc14bSjoerg size_t __n = __l - __f; 3014*4d6fc14bSjoerg if (size() != __n) 3015*4d6fc14bSjoerg { 3016*4d6fc14bSjoerg __clear(size()); 3017*4d6fc14bSjoerg __begin_ = allocator<value_type>().allocate(__n); 3018*4d6fc14bSjoerg __end_ = __begin_ + __n; 3019*4d6fc14bSjoerg _VSTD::uninitialized_copy(__f, __l, __begin_); 3020*4d6fc14bSjoerg } else { 3021*4d6fc14bSjoerg _VSTD::copy(__f, __l, __begin_); 3022*4d6fc14bSjoerg } 3023*4d6fc14bSjoerg return *this; 3024*4d6fc14bSjoerg} 3025*4d6fc14bSjoerg 3026*4d6fc14bSjoergtemplate <class _Tp> 3027*4d6fc14bSjoergvalarray<_Tp>& 3028*4d6fc14bSjoergvalarray<_Tp>::operator=(const valarray& __v) 3029*4d6fc14bSjoerg{ 3030*4d6fc14bSjoerg if (this != &__v) 3031*4d6fc14bSjoerg return __assign_range(__v.__begin_, __v.__end_); 3032*4d6fc14bSjoerg return *this; 3033*4d6fc14bSjoerg} 3034*4d6fc14bSjoerg 3035*4d6fc14bSjoerg#ifndef _LIBCPP_CXX03_LANG 3036*4d6fc14bSjoerg 3037*4d6fc14bSjoergtemplate <class _Tp> 3038*4d6fc14bSjoerginline 3039*4d6fc14bSjoergvalarray<_Tp>& 3040*4d6fc14bSjoergvalarray<_Tp>::operator=(valarray&& __v) _NOEXCEPT 3041*4d6fc14bSjoerg{ 3042*4d6fc14bSjoerg __clear(size()); 3043*4d6fc14bSjoerg __begin_ = __v.__begin_; 3044*4d6fc14bSjoerg __end_ = __v.__end_; 3045*4d6fc14bSjoerg __v.__begin_ = nullptr; 3046*4d6fc14bSjoerg __v.__end_ = nullptr; 3047*4d6fc14bSjoerg return *this; 3048*4d6fc14bSjoerg} 3049*4d6fc14bSjoerg 3050*4d6fc14bSjoergtemplate <class _Tp> 3051*4d6fc14bSjoerginline 3052*4d6fc14bSjoergvalarray<_Tp>& 3053*4d6fc14bSjoergvalarray<_Tp>::operator=(initializer_list<value_type> __il) 3054*4d6fc14bSjoerg{ 3055*4d6fc14bSjoerg return __assign_range(__il.begin(), __il.end()); 3056*4d6fc14bSjoerg} 3057*4d6fc14bSjoerg 3058*4d6fc14bSjoerg#endif // _LIBCPP_CXX03_LANG 3059*4d6fc14bSjoerg 3060*4d6fc14bSjoergtemplate <class _Tp> 3061*4d6fc14bSjoerginline 3062*4d6fc14bSjoergvalarray<_Tp>& 3063*4d6fc14bSjoergvalarray<_Tp>::operator=(const value_type& __x) 3064*4d6fc14bSjoerg{ 3065*4d6fc14bSjoerg _VSTD::fill(__begin_, __end_, __x); 3066*4d6fc14bSjoerg return *this; 3067*4d6fc14bSjoerg} 3068*4d6fc14bSjoerg 3069*4d6fc14bSjoergtemplate <class _Tp> 3070*4d6fc14bSjoerginline 3071*4d6fc14bSjoergvalarray<_Tp>& 3072*4d6fc14bSjoergvalarray<_Tp>::operator=(const slice_array<value_type>& __sa) 3073*4d6fc14bSjoerg{ 3074*4d6fc14bSjoerg value_type* __t = __begin_; 3075*4d6fc14bSjoerg const value_type* __s = __sa.__vp_; 3076*4d6fc14bSjoerg for (size_t __n = __sa.__size_; __n; --__n, __s += __sa.__stride_, ++__t) 3077*4d6fc14bSjoerg *__t = *__s; 3078*4d6fc14bSjoerg return *this; 3079*4d6fc14bSjoerg} 3080*4d6fc14bSjoerg 3081*4d6fc14bSjoergtemplate <class _Tp> 3082*4d6fc14bSjoerginline 3083*4d6fc14bSjoergvalarray<_Tp>& 3084*4d6fc14bSjoergvalarray<_Tp>::operator=(const gslice_array<value_type>& __ga) 3085*4d6fc14bSjoerg{ 3086*4d6fc14bSjoerg typedef const size_t* _Ip; 3087*4d6fc14bSjoerg value_type* __t = __begin_; 3088*4d6fc14bSjoerg const value_type* __s = __ga.__vp_; 3089*4d6fc14bSjoerg for (_Ip __i = __ga.__1d_.__begin_, __e = __ga.__1d_.__end_; 3090*4d6fc14bSjoerg __i != __e; ++__i, ++__t) 3091*4d6fc14bSjoerg *__t = __s[*__i]; 3092*4d6fc14bSjoerg return *this; 3093*4d6fc14bSjoerg} 3094*4d6fc14bSjoerg 3095*4d6fc14bSjoergtemplate <class _Tp> 3096*4d6fc14bSjoerginline 3097*4d6fc14bSjoergvalarray<_Tp>& 3098*4d6fc14bSjoergvalarray<_Tp>::operator=(const mask_array<value_type>& __ma) 3099*4d6fc14bSjoerg{ 3100*4d6fc14bSjoerg typedef const size_t* _Ip; 3101*4d6fc14bSjoerg value_type* __t = __begin_; 3102*4d6fc14bSjoerg const value_type* __s = __ma.__vp_; 3103*4d6fc14bSjoerg for (_Ip __i = __ma.__1d_.__begin_, __e = __ma.__1d_.__end_; 3104*4d6fc14bSjoerg __i != __e; ++__i, ++__t) 3105*4d6fc14bSjoerg *__t = __s[*__i]; 3106*4d6fc14bSjoerg return *this; 3107*4d6fc14bSjoerg} 3108*4d6fc14bSjoerg 3109*4d6fc14bSjoergtemplate <class _Tp> 3110*4d6fc14bSjoerginline 3111*4d6fc14bSjoergvalarray<_Tp>& 3112*4d6fc14bSjoergvalarray<_Tp>::operator=(const indirect_array<value_type>& __ia) 3113*4d6fc14bSjoerg{ 3114*4d6fc14bSjoerg typedef const size_t* _Ip; 3115*4d6fc14bSjoerg value_type* __t = __begin_; 3116*4d6fc14bSjoerg const value_type* __s = __ia.__vp_; 3117*4d6fc14bSjoerg for (_Ip __i = __ia.__1d_.__begin_, __e = __ia.__1d_.__end_; 3118*4d6fc14bSjoerg __i != __e; ++__i, ++__t) 3119*4d6fc14bSjoerg *__t = __s[*__i]; 3120*4d6fc14bSjoerg return *this; 3121*4d6fc14bSjoerg} 3122*4d6fc14bSjoerg 3123*4d6fc14bSjoergtemplate <class _Tp> 3124*4d6fc14bSjoergtemplate <class _ValExpr> 3125*4d6fc14bSjoerginline 3126*4d6fc14bSjoergvalarray<_Tp>& 3127*4d6fc14bSjoergvalarray<_Tp>::operator=(const __val_expr<_ValExpr>& __v) 3128*4d6fc14bSjoerg{ 3129*4d6fc14bSjoerg size_t __n = __v.size(); 3130*4d6fc14bSjoerg if (size() != __n) 3131*4d6fc14bSjoerg resize(__n); 3132*4d6fc14bSjoerg value_type* __t = __begin_; 3133*4d6fc14bSjoerg for (size_t __i = 0; __i != __n; ++__t, ++__i) 3134*4d6fc14bSjoerg *__t = result_type(__v[__i]); 3135*4d6fc14bSjoerg return *this; 3136*4d6fc14bSjoerg} 3137*4d6fc14bSjoerg 3138*4d6fc14bSjoergtemplate <class _Tp> 3139*4d6fc14bSjoerginline 3140*4d6fc14bSjoerg__val_expr<__slice_expr<const valarray<_Tp>&> > 3141*4d6fc14bSjoergvalarray<_Tp>::operator[](slice __s) const 3142*4d6fc14bSjoerg{ 3143*4d6fc14bSjoerg return __val_expr<__slice_expr<const valarray&> >(__slice_expr<const valarray&>(__s, *this)); 3144*4d6fc14bSjoerg} 3145*4d6fc14bSjoerg 3146*4d6fc14bSjoergtemplate <class _Tp> 3147*4d6fc14bSjoerginline 3148*4d6fc14bSjoergslice_array<_Tp> 3149*4d6fc14bSjoergvalarray<_Tp>::operator[](slice __s) 3150*4d6fc14bSjoerg{ 3151*4d6fc14bSjoerg return slice_array<value_type>(__s, *this); 3152*4d6fc14bSjoerg} 3153*4d6fc14bSjoerg 3154*4d6fc14bSjoergtemplate <class _Tp> 3155*4d6fc14bSjoerginline 3156*4d6fc14bSjoerg__val_expr<__indirect_expr<const valarray<_Tp>&> > 3157*4d6fc14bSjoergvalarray<_Tp>::operator[](const gslice& __gs) const 3158*4d6fc14bSjoerg{ 3159*4d6fc14bSjoerg return __val_expr<__indirect_expr<const valarray&> >(__indirect_expr<const valarray&>(__gs.__1d_, *this)); 3160*4d6fc14bSjoerg} 3161*4d6fc14bSjoerg 3162*4d6fc14bSjoergtemplate <class _Tp> 3163*4d6fc14bSjoerginline 3164*4d6fc14bSjoerggslice_array<_Tp> 3165*4d6fc14bSjoergvalarray<_Tp>::operator[](const gslice& __gs) 3166*4d6fc14bSjoerg{ 3167*4d6fc14bSjoerg return gslice_array<value_type>(__gs, *this); 3168*4d6fc14bSjoerg} 3169*4d6fc14bSjoerg 3170*4d6fc14bSjoerg#ifndef _LIBCPP_CXX03_LANG 3171*4d6fc14bSjoerg 3172*4d6fc14bSjoergtemplate <class _Tp> 3173*4d6fc14bSjoerginline 3174*4d6fc14bSjoerg__val_expr<__indirect_expr<const valarray<_Tp>&> > 3175*4d6fc14bSjoergvalarray<_Tp>::operator[](gslice&& __gs) const 3176*4d6fc14bSjoerg{ 3177*4d6fc14bSjoerg return __val_expr<__indirect_expr<const valarray&> >(__indirect_expr<const valarray&>(move(__gs.__1d_), *this)); 3178*4d6fc14bSjoerg} 3179*4d6fc14bSjoerg 3180*4d6fc14bSjoergtemplate <class _Tp> 3181*4d6fc14bSjoerginline 3182*4d6fc14bSjoerggslice_array<_Tp> 3183*4d6fc14bSjoergvalarray<_Tp>::operator[](gslice&& __gs) 3184*4d6fc14bSjoerg{ 3185*4d6fc14bSjoerg return gslice_array<value_type>(move(__gs), *this); 3186*4d6fc14bSjoerg} 3187*4d6fc14bSjoerg 3188*4d6fc14bSjoerg#endif // _LIBCPP_CXX03_LANG 3189*4d6fc14bSjoerg 3190*4d6fc14bSjoergtemplate <class _Tp> 3191*4d6fc14bSjoerginline 3192*4d6fc14bSjoerg__val_expr<__mask_expr<const valarray<_Tp>&> > 3193*4d6fc14bSjoergvalarray<_Tp>::operator[](const valarray<bool>& __vb) const 3194*4d6fc14bSjoerg{ 3195*4d6fc14bSjoerg return __val_expr<__mask_expr<const valarray&> >(__mask_expr<const valarray&>(__vb, *this)); 3196*4d6fc14bSjoerg} 3197*4d6fc14bSjoerg 3198*4d6fc14bSjoergtemplate <class _Tp> 3199*4d6fc14bSjoerginline 3200*4d6fc14bSjoergmask_array<_Tp> 3201*4d6fc14bSjoergvalarray<_Tp>::operator[](const valarray<bool>& __vb) 3202*4d6fc14bSjoerg{ 3203*4d6fc14bSjoerg return mask_array<value_type>(__vb, *this); 3204*4d6fc14bSjoerg} 3205*4d6fc14bSjoerg 3206*4d6fc14bSjoerg#ifndef _LIBCPP_CXX03_LANG 3207*4d6fc14bSjoerg 3208*4d6fc14bSjoergtemplate <class _Tp> 3209*4d6fc14bSjoerginline 3210*4d6fc14bSjoerg__val_expr<__mask_expr<const valarray<_Tp>&> > 3211*4d6fc14bSjoergvalarray<_Tp>::operator[](valarray<bool>&& __vb) const 3212*4d6fc14bSjoerg{ 3213*4d6fc14bSjoerg return __val_expr<__mask_expr<const valarray&> >(__mask_expr<const valarray&>(move(__vb), *this)); 3214*4d6fc14bSjoerg} 3215*4d6fc14bSjoerg 3216*4d6fc14bSjoergtemplate <class _Tp> 3217*4d6fc14bSjoerginline 3218*4d6fc14bSjoergmask_array<_Tp> 3219*4d6fc14bSjoergvalarray<_Tp>::operator[](valarray<bool>&& __vb) 3220*4d6fc14bSjoerg{ 3221*4d6fc14bSjoerg return mask_array<value_type>(move(__vb), *this); 3222*4d6fc14bSjoerg} 3223*4d6fc14bSjoerg 3224*4d6fc14bSjoerg#endif // _LIBCPP_CXX03_LANG 3225*4d6fc14bSjoerg 3226*4d6fc14bSjoergtemplate <class _Tp> 3227*4d6fc14bSjoerginline 3228*4d6fc14bSjoerg__val_expr<__indirect_expr<const valarray<_Tp>&> > 3229*4d6fc14bSjoergvalarray<_Tp>::operator[](const valarray<size_t>& __vs) const 3230*4d6fc14bSjoerg{ 3231*4d6fc14bSjoerg return __val_expr<__indirect_expr<const valarray&> >(__indirect_expr<const valarray&>(__vs, *this)); 3232*4d6fc14bSjoerg} 3233*4d6fc14bSjoerg 3234*4d6fc14bSjoergtemplate <class _Tp> 3235*4d6fc14bSjoerginline 3236*4d6fc14bSjoergindirect_array<_Tp> 3237*4d6fc14bSjoergvalarray<_Tp>::operator[](const valarray<size_t>& __vs) 3238*4d6fc14bSjoerg{ 3239*4d6fc14bSjoerg return indirect_array<value_type>(__vs, *this); 3240*4d6fc14bSjoerg} 3241*4d6fc14bSjoerg 3242*4d6fc14bSjoerg#ifndef _LIBCPP_CXX03_LANG 3243*4d6fc14bSjoerg 3244*4d6fc14bSjoergtemplate <class _Tp> 3245*4d6fc14bSjoerginline 3246*4d6fc14bSjoerg__val_expr<__indirect_expr<const valarray<_Tp>&> > 3247*4d6fc14bSjoergvalarray<_Tp>::operator[](valarray<size_t>&& __vs) const 3248*4d6fc14bSjoerg{ 3249*4d6fc14bSjoerg return __val_expr<__indirect_expr<const valarray&> >(__indirect_expr<const valarray&>(move(__vs), *this)); 3250*4d6fc14bSjoerg} 3251*4d6fc14bSjoerg 3252*4d6fc14bSjoergtemplate <class _Tp> 3253*4d6fc14bSjoerginline 3254*4d6fc14bSjoergindirect_array<_Tp> 3255*4d6fc14bSjoergvalarray<_Tp>::operator[](valarray<size_t>&& __vs) 3256*4d6fc14bSjoerg{ 3257*4d6fc14bSjoerg return indirect_array<value_type>(move(__vs), *this); 3258*4d6fc14bSjoerg} 3259*4d6fc14bSjoerg 3260*4d6fc14bSjoerg#endif // _LIBCPP_CXX03_LANG 3261*4d6fc14bSjoerg 3262*4d6fc14bSjoergtemplate <class _Tp> 3263*4d6fc14bSjoergvalarray<_Tp> 3264*4d6fc14bSjoergvalarray<_Tp>::operator+() const 3265*4d6fc14bSjoerg{ 3266*4d6fc14bSjoerg valarray<value_type> __r; 3267*4d6fc14bSjoerg size_t __n = size(); 3268*4d6fc14bSjoerg if (__n) 3269*4d6fc14bSjoerg { 3270*4d6fc14bSjoerg __r.__begin_ = __r.__end_ = allocator<value_type>().allocate(__n); 3271*4d6fc14bSjoerg for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n) 3272*4d6fc14bSjoerg ::new ((void*)__r.__end_) value_type(+*__p); 3273*4d6fc14bSjoerg } 3274*4d6fc14bSjoerg return __r; 3275*4d6fc14bSjoerg} 3276*4d6fc14bSjoerg 3277*4d6fc14bSjoergtemplate <class _Tp> 3278*4d6fc14bSjoergvalarray<_Tp> 3279*4d6fc14bSjoergvalarray<_Tp>::operator-() const 3280*4d6fc14bSjoerg{ 3281*4d6fc14bSjoerg valarray<value_type> __r; 3282*4d6fc14bSjoerg size_t __n = size(); 3283*4d6fc14bSjoerg if (__n) 3284*4d6fc14bSjoerg { 3285*4d6fc14bSjoerg __r.__begin_ = __r.__end_ = allocator<value_type>().allocate(__n); 3286*4d6fc14bSjoerg for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n) 3287*4d6fc14bSjoerg ::new ((void*)__r.__end_) value_type(-*__p); 3288*4d6fc14bSjoerg } 3289*4d6fc14bSjoerg return __r; 3290*4d6fc14bSjoerg} 3291*4d6fc14bSjoerg 3292*4d6fc14bSjoergtemplate <class _Tp> 3293*4d6fc14bSjoergvalarray<_Tp> 3294*4d6fc14bSjoergvalarray<_Tp>::operator~() const 3295*4d6fc14bSjoerg{ 3296*4d6fc14bSjoerg valarray<value_type> __r; 3297*4d6fc14bSjoerg size_t __n = size(); 3298*4d6fc14bSjoerg if (__n) 3299*4d6fc14bSjoerg { 3300*4d6fc14bSjoerg __r.__begin_ = __r.__end_ = allocator<value_type>().allocate(__n); 3301*4d6fc14bSjoerg for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n) 3302*4d6fc14bSjoerg ::new ((void*)__r.__end_) value_type(~*__p); 3303*4d6fc14bSjoerg } 3304*4d6fc14bSjoerg return __r; 3305*4d6fc14bSjoerg} 3306*4d6fc14bSjoerg 3307*4d6fc14bSjoergtemplate <class _Tp> 3308*4d6fc14bSjoergvalarray<bool> 3309*4d6fc14bSjoergvalarray<_Tp>::operator!() const 3310*4d6fc14bSjoerg{ 3311*4d6fc14bSjoerg valarray<bool> __r; 3312*4d6fc14bSjoerg size_t __n = size(); 3313*4d6fc14bSjoerg if (__n) 3314*4d6fc14bSjoerg { 3315*4d6fc14bSjoerg __r.__begin_ = __r.__end_ = allocator<bool>().allocate(__n); 3316*4d6fc14bSjoerg for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n) 3317*4d6fc14bSjoerg ::new ((void*)__r.__end_) bool(!*__p); 3318*4d6fc14bSjoerg } 3319*4d6fc14bSjoerg return __r; 3320*4d6fc14bSjoerg} 3321*4d6fc14bSjoerg 3322*4d6fc14bSjoergtemplate <class _Tp> 3323*4d6fc14bSjoerginline 3324*4d6fc14bSjoergvalarray<_Tp>& 3325*4d6fc14bSjoergvalarray<_Tp>::operator*=(const value_type& __x) 3326*4d6fc14bSjoerg{ 3327*4d6fc14bSjoerg for (value_type* __p = __begin_; __p != __end_; ++__p) 3328*4d6fc14bSjoerg *__p *= __x; 3329*4d6fc14bSjoerg return *this; 3330*4d6fc14bSjoerg} 3331*4d6fc14bSjoerg 3332*4d6fc14bSjoergtemplate <class _Tp> 3333*4d6fc14bSjoerginline 3334*4d6fc14bSjoergvalarray<_Tp>& 3335*4d6fc14bSjoergvalarray<_Tp>::operator/=(const value_type& __x) 3336*4d6fc14bSjoerg{ 3337*4d6fc14bSjoerg for (value_type* __p = __begin_; __p != __end_; ++__p) 3338*4d6fc14bSjoerg *__p /= __x; 3339*4d6fc14bSjoerg return *this; 3340*4d6fc14bSjoerg} 3341*4d6fc14bSjoerg 3342*4d6fc14bSjoergtemplate <class _Tp> 3343*4d6fc14bSjoerginline 3344*4d6fc14bSjoergvalarray<_Tp>& 3345*4d6fc14bSjoergvalarray<_Tp>::operator%=(const value_type& __x) 3346*4d6fc14bSjoerg{ 3347*4d6fc14bSjoerg for (value_type* __p = __begin_; __p != __end_; ++__p) 3348*4d6fc14bSjoerg *__p %= __x; 3349*4d6fc14bSjoerg return *this; 3350*4d6fc14bSjoerg} 3351*4d6fc14bSjoerg 3352*4d6fc14bSjoergtemplate <class _Tp> 3353*4d6fc14bSjoerginline 3354*4d6fc14bSjoergvalarray<_Tp>& 3355*4d6fc14bSjoergvalarray<_Tp>::operator+=(const value_type& __x) 3356*4d6fc14bSjoerg{ 3357*4d6fc14bSjoerg for (value_type* __p = __begin_; __p != __end_; ++__p) 3358*4d6fc14bSjoerg *__p += __x; 3359*4d6fc14bSjoerg return *this; 3360*4d6fc14bSjoerg} 3361*4d6fc14bSjoerg 3362*4d6fc14bSjoergtemplate <class _Tp> 3363*4d6fc14bSjoerginline 3364*4d6fc14bSjoergvalarray<_Tp>& 3365*4d6fc14bSjoergvalarray<_Tp>::operator-=(const value_type& __x) 3366*4d6fc14bSjoerg{ 3367*4d6fc14bSjoerg for (value_type* __p = __begin_; __p != __end_; ++__p) 3368*4d6fc14bSjoerg *__p -= __x; 3369*4d6fc14bSjoerg return *this; 3370*4d6fc14bSjoerg} 3371*4d6fc14bSjoerg 3372*4d6fc14bSjoergtemplate <class _Tp> 3373*4d6fc14bSjoerginline 3374*4d6fc14bSjoergvalarray<_Tp>& 3375*4d6fc14bSjoergvalarray<_Tp>::operator^=(const value_type& __x) 3376*4d6fc14bSjoerg{ 3377*4d6fc14bSjoerg for (value_type* __p = __begin_; __p != __end_; ++__p) 3378*4d6fc14bSjoerg *__p ^= __x; 3379*4d6fc14bSjoerg return *this; 3380*4d6fc14bSjoerg} 3381*4d6fc14bSjoerg 3382*4d6fc14bSjoergtemplate <class _Tp> 3383*4d6fc14bSjoerginline 3384*4d6fc14bSjoergvalarray<_Tp>& 3385*4d6fc14bSjoergvalarray<_Tp>::operator&=(const value_type& __x) 3386*4d6fc14bSjoerg{ 3387*4d6fc14bSjoerg for (value_type* __p = __begin_; __p != __end_; ++__p) 3388*4d6fc14bSjoerg *__p &= __x; 3389*4d6fc14bSjoerg return *this; 3390*4d6fc14bSjoerg} 3391*4d6fc14bSjoerg 3392*4d6fc14bSjoergtemplate <class _Tp> 3393*4d6fc14bSjoerginline 3394*4d6fc14bSjoergvalarray<_Tp>& 3395*4d6fc14bSjoergvalarray<_Tp>::operator|=(const value_type& __x) 3396*4d6fc14bSjoerg{ 3397*4d6fc14bSjoerg for (value_type* __p = __begin_; __p != __end_; ++__p) 3398*4d6fc14bSjoerg *__p |= __x; 3399*4d6fc14bSjoerg return *this; 3400*4d6fc14bSjoerg} 3401*4d6fc14bSjoerg 3402*4d6fc14bSjoergtemplate <class _Tp> 3403*4d6fc14bSjoerginline 3404*4d6fc14bSjoergvalarray<_Tp>& 3405*4d6fc14bSjoergvalarray<_Tp>::operator<<=(const value_type& __x) 3406*4d6fc14bSjoerg{ 3407*4d6fc14bSjoerg for (value_type* __p = __begin_; __p != __end_; ++__p) 3408*4d6fc14bSjoerg *__p <<= __x; 3409*4d6fc14bSjoerg return *this; 3410*4d6fc14bSjoerg} 3411*4d6fc14bSjoerg 3412*4d6fc14bSjoergtemplate <class _Tp> 3413*4d6fc14bSjoerginline 3414*4d6fc14bSjoergvalarray<_Tp>& 3415*4d6fc14bSjoergvalarray<_Tp>::operator>>=(const value_type& __x) 3416*4d6fc14bSjoerg{ 3417*4d6fc14bSjoerg for (value_type* __p = __begin_; __p != __end_; ++__p) 3418*4d6fc14bSjoerg *__p >>= __x; 3419*4d6fc14bSjoerg return *this; 3420*4d6fc14bSjoerg} 3421*4d6fc14bSjoerg 3422*4d6fc14bSjoergtemplate <class _Tp> 3423*4d6fc14bSjoergtemplate <class _Expr> 3424*4d6fc14bSjoerginline 3425*4d6fc14bSjoergtypename enable_if 3426*4d6fc14bSjoerg< 3427*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 3428*4d6fc14bSjoerg valarray<_Tp>& 3429*4d6fc14bSjoerg>::type 3430*4d6fc14bSjoergvalarray<_Tp>::operator*=(const _Expr& __v) 3431*4d6fc14bSjoerg{ 3432*4d6fc14bSjoerg size_t __i = 0; 3433*4d6fc14bSjoerg for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i) 3434*4d6fc14bSjoerg *__t *= __v[__i]; 3435*4d6fc14bSjoerg return *this; 3436*4d6fc14bSjoerg} 3437*4d6fc14bSjoerg 3438*4d6fc14bSjoergtemplate <class _Tp> 3439*4d6fc14bSjoergtemplate <class _Expr> 3440*4d6fc14bSjoerginline 3441*4d6fc14bSjoergtypename enable_if 3442*4d6fc14bSjoerg< 3443*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 3444*4d6fc14bSjoerg valarray<_Tp>& 3445*4d6fc14bSjoerg>::type 3446*4d6fc14bSjoergvalarray<_Tp>::operator/=(const _Expr& __v) 3447*4d6fc14bSjoerg{ 3448*4d6fc14bSjoerg size_t __i = 0; 3449*4d6fc14bSjoerg for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i) 3450*4d6fc14bSjoerg *__t /= __v[__i]; 3451*4d6fc14bSjoerg return *this; 3452*4d6fc14bSjoerg} 3453*4d6fc14bSjoerg 3454*4d6fc14bSjoergtemplate <class _Tp> 3455*4d6fc14bSjoergtemplate <class _Expr> 3456*4d6fc14bSjoerginline 3457*4d6fc14bSjoergtypename enable_if 3458*4d6fc14bSjoerg< 3459*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 3460*4d6fc14bSjoerg valarray<_Tp>& 3461*4d6fc14bSjoerg>::type 3462*4d6fc14bSjoergvalarray<_Tp>::operator%=(const _Expr& __v) 3463*4d6fc14bSjoerg{ 3464*4d6fc14bSjoerg size_t __i = 0; 3465*4d6fc14bSjoerg for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i) 3466*4d6fc14bSjoerg *__t %= __v[__i]; 3467*4d6fc14bSjoerg return *this; 3468*4d6fc14bSjoerg} 3469*4d6fc14bSjoerg 3470*4d6fc14bSjoergtemplate <class _Tp> 3471*4d6fc14bSjoergtemplate <class _Expr> 3472*4d6fc14bSjoerginline 3473*4d6fc14bSjoergtypename enable_if 3474*4d6fc14bSjoerg< 3475*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 3476*4d6fc14bSjoerg valarray<_Tp>& 3477*4d6fc14bSjoerg>::type 3478*4d6fc14bSjoergvalarray<_Tp>::operator+=(const _Expr& __v) 3479*4d6fc14bSjoerg{ 3480*4d6fc14bSjoerg size_t __i = 0; 3481*4d6fc14bSjoerg for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i) 3482*4d6fc14bSjoerg *__t += __v[__i]; 3483*4d6fc14bSjoerg return *this; 3484*4d6fc14bSjoerg} 3485*4d6fc14bSjoerg 3486*4d6fc14bSjoergtemplate <class _Tp> 3487*4d6fc14bSjoergtemplate <class _Expr> 3488*4d6fc14bSjoerginline 3489*4d6fc14bSjoergtypename enable_if 3490*4d6fc14bSjoerg< 3491*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 3492*4d6fc14bSjoerg valarray<_Tp>& 3493*4d6fc14bSjoerg>::type 3494*4d6fc14bSjoergvalarray<_Tp>::operator-=(const _Expr& __v) 3495*4d6fc14bSjoerg{ 3496*4d6fc14bSjoerg size_t __i = 0; 3497*4d6fc14bSjoerg for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i) 3498*4d6fc14bSjoerg *__t -= __v[__i]; 3499*4d6fc14bSjoerg return *this; 3500*4d6fc14bSjoerg} 3501*4d6fc14bSjoerg 3502*4d6fc14bSjoergtemplate <class _Tp> 3503*4d6fc14bSjoergtemplate <class _Expr> 3504*4d6fc14bSjoerginline 3505*4d6fc14bSjoergtypename enable_if 3506*4d6fc14bSjoerg< 3507*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 3508*4d6fc14bSjoerg valarray<_Tp>& 3509*4d6fc14bSjoerg>::type 3510*4d6fc14bSjoergvalarray<_Tp>::operator^=(const _Expr& __v) 3511*4d6fc14bSjoerg{ 3512*4d6fc14bSjoerg size_t __i = 0; 3513*4d6fc14bSjoerg for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i) 3514*4d6fc14bSjoerg *__t ^= __v[__i]; 3515*4d6fc14bSjoerg return *this; 3516*4d6fc14bSjoerg} 3517*4d6fc14bSjoerg 3518*4d6fc14bSjoergtemplate <class _Tp> 3519*4d6fc14bSjoergtemplate <class _Expr> 3520*4d6fc14bSjoerginline 3521*4d6fc14bSjoergtypename enable_if 3522*4d6fc14bSjoerg< 3523*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 3524*4d6fc14bSjoerg valarray<_Tp>& 3525*4d6fc14bSjoerg>::type 3526*4d6fc14bSjoergvalarray<_Tp>::operator|=(const _Expr& __v) 3527*4d6fc14bSjoerg{ 3528*4d6fc14bSjoerg size_t __i = 0; 3529*4d6fc14bSjoerg for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i) 3530*4d6fc14bSjoerg *__t |= __v[__i]; 3531*4d6fc14bSjoerg return *this; 3532*4d6fc14bSjoerg} 3533*4d6fc14bSjoerg 3534*4d6fc14bSjoergtemplate <class _Tp> 3535*4d6fc14bSjoergtemplate <class _Expr> 3536*4d6fc14bSjoerginline 3537*4d6fc14bSjoergtypename enable_if 3538*4d6fc14bSjoerg< 3539*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 3540*4d6fc14bSjoerg valarray<_Tp>& 3541*4d6fc14bSjoerg>::type 3542*4d6fc14bSjoergvalarray<_Tp>::operator&=(const _Expr& __v) 3543*4d6fc14bSjoerg{ 3544*4d6fc14bSjoerg size_t __i = 0; 3545*4d6fc14bSjoerg for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i) 3546*4d6fc14bSjoerg *__t &= __v[__i]; 3547*4d6fc14bSjoerg return *this; 3548*4d6fc14bSjoerg} 3549*4d6fc14bSjoerg 3550*4d6fc14bSjoergtemplate <class _Tp> 3551*4d6fc14bSjoergtemplate <class _Expr> 3552*4d6fc14bSjoerginline 3553*4d6fc14bSjoergtypename enable_if 3554*4d6fc14bSjoerg< 3555*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 3556*4d6fc14bSjoerg valarray<_Tp>& 3557*4d6fc14bSjoerg>::type 3558*4d6fc14bSjoergvalarray<_Tp>::operator<<=(const _Expr& __v) 3559*4d6fc14bSjoerg{ 3560*4d6fc14bSjoerg size_t __i = 0; 3561*4d6fc14bSjoerg for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i) 3562*4d6fc14bSjoerg *__t <<= __v[__i]; 3563*4d6fc14bSjoerg return *this; 3564*4d6fc14bSjoerg} 3565*4d6fc14bSjoerg 3566*4d6fc14bSjoergtemplate <class _Tp> 3567*4d6fc14bSjoergtemplate <class _Expr> 3568*4d6fc14bSjoerginline 3569*4d6fc14bSjoergtypename enable_if 3570*4d6fc14bSjoerg< 3571*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 3572*4d6fc14bSjoerg valarray<_Tp>& 3573*4d6fc14bSjoerg>::type 3574*4d6fc14bSjoergvalarray<_Tp>::operator>>=(const _Expr& __v) 3575*4d6fc14bSjoerg{ 3576*4d6fc14bSjoerg size_t __i = 0; 3577*4d6fc14bSjoerg for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i) 3578*4d6fc14bSjoerg *__t >>= __v[__i]; 3579*4d6fc14bSjoerg return *this; 3580*4d6fc14bSjoerg} 3581*4d6fc14bSjoerg 3582*4d6fc14bSjoergtemplate <class _Tp> 3583*4d6fc14bSjoerginline 3584*4d6fc14bSjoergvoid 3585*4d6fc14bSjoergvalarray<_Tp>::swap(valarray& __v) _NOEXCEPT 3586*4d6fc14bSjoerg{ 3587*4d6fc14bSjoerg _VSTD::swap(__begin_, __v.__begin_); 3588*4d6fc14bSjoerg _VSTD::swap(__end_, __v.__end_); 3589*4d6fc14bSjoerg} 3590*4d6fc14bSjoerg 3591*4d6fc14bSjoergtemplate <class _Tp> 3592*4d6fc14bSjoerginline 3593*4d6fc14bSjoerg_Tp 3594*4d6fc14bSjoergvalarray<_Tp>::sum() const 3595*4d6fc14bSjoerg{ 3596*4d6fc14bSjoerg if (__begin_ == __end_) 3597*4d6fc14bSjoerg return value_type(); 3598*4d6fc14bSjoerg const value_type* __p = __begin_; 3599*4d6fc14bSjoerg _Tp __r = *__p; 3600*4d6fc14bSjoerg for (++__p; __p != __end_; ++__p) 3601*4d6fc14bSjoerg __r += *__p; 3602*4d6fc14bSjoerg return __r; 3603*4d6fc14bSjoerg} 3604*4d6fc14bSjoerg 3605*4d6fc14bSjoergtemplate <class _Tp> 3606*4d6fc14bSjoerginline 3607*4d6fc14bSjoerg_Tp 3608*4d6fc14bSjoergvalarray<_Tp>::min() const 3609*4d6fc14bSjoerg{ 3610*4d6fc14bSjoerg if (__begin_ == __end_) 3611*4d6fc14bSjoerg return value_type(); 3612*4d6fc14bSjoerg return *_VSTD::min_element(__begin_, __end_); 3613*4d6fc14bSjoerg} 3614*4d6fc14bSjoerg 3615*4d6fc14bSjoergtemplate <class _Tp> 3616*4d6fc14bSjoerginline 3617*4d6fc14bSjoerg_Tp 3618*4d6fc14bSjoergvalarray<_Tp>::max() const 3619*4d6fc14bSjoerg{ 3620*4d6fc14bSjoerg if (__begin_ == __end_) 3621*4d6fc14bSjoerg return value_type(); 3622*4d6fc14bSjoerg return *_VSTD::max_element(__begin_, __end_); 3623*4d6fc14bSjoerg} 3624*4d6fc14bSjoerg 3625*4d6fc14bSjoergtemplate <class _Tp> 3626*4d6fc14bSjoergvalarray<_Tp> 3627*4d6fc14bSjoergvalarray<_Tp>::shift(int __i) const 3628*4d6fc14bSjoerg{ 3629*4d6fc14bSjoerg valarray<value_type> __r; 3630*4d6fc14bSjoerg size_t __n = size(); 3631*4d6fc14bSjoerg if (__n) 3632*4d6fc14bSjoerg { 3633*4d6fc14bSjoerg __r.__begin_ = __r.__end_ = allocator<value_type>().allocate(__n); 3634*4d6fc14bSjoerg const value_type* __sb; 3635*4d6fc14bSjoerg value_type* __tb; 3636*4d6fc14bSjoerg value_type* __te; 3637*4d6fc14bSjoerg if (__i >= 0) 3638*4d6fc14bSjoerg { 3639*4d6fc14bSjoerg __i = _VSTD::min(__i, static_cast<int>(__n)); 3640*4d6fc14bSjoerg __sb = __begin_ + __i; 3641*4d6fc14bSjoerg __tb = __r.__begin_; 3642*4d6fc14bSjoerg __te = __r.__begin_ + (__n - __i); 3643*4d6fc14bSjoerg } 3644*4d6fc14bSjoerg else 3645*4d6fc14bSjoerg { 3646*4d6fc14bSjoerg __i = _VSTD::min(-__i, static_cast<int>(__n)); 3647*4d6fc14bSjoerg __sb = __begin_; 3648*4d6fc14bSjoerg __tb = __r.__begin_ + __i; 3649*4d6fc14bSjoerg __te = __r.__begin_ + __n; 3650*4d6fc14bSjoerg } 3651*4d6fc14bSjoerg for (; __r.__end_ != __tb; ++__r.__end_) 3652*4d6fc14bSjoerg ::new ((void*)__r.__end_) value_type(); 3653*4d6fc14bSjoerg for (; __r.__end_ != __te; ++__r.__end_, ++__sb) 3654*4d6fc14bSjoerg ::new ((void*)__r.__end_) value_type(*__sb); 3655*4d6fc14bSjoerg for (__te = __r.__begin_ + __n; __r.__end_ != __te; ++__r.__end_) 3656*4d6fc14bSjoerg ::new ((void*)__r.__end_) value_type(); 3657*4d6fc14bSjoerg } 3658*4d6fc14bSjoerg return __r; 3659*4d6fc14bSjoerg} 3660*4d6fc14bSjoerg 3661*4d6fc14bSjoergtemplate <class _Tp> 3662*4d6fc14bSjoergvalarray<_Tp> 3663*4d6fc14bSjoergvalarray<_Tp>::cshift(int __i) const 3664*4d6fc14bSjoerg{ 3665*4d6fc14bSjoerg valarray<value_type> __r; 3666*4d6fc14bSjoerg size_t __n = size(); 3667*4d6fc14bSjoerg if (__n) 3668*4d6fc14bSjoerg { 3669*4d6fc14bSjoerg __r.__begin_ = __r.__end_ = allocator<value_type>().allocate(__n); 3670*4d6fc14bSjoerg __i %= static_cast<int>(__n); 3671*4d6fc14bSjoerg const value_type* __m = __i >= 0 ? __begin_ + __i : __end_ + __i; 3672*4d6fc14bSjoerg for (const value_type* __s = __m; __s != __end_; ++__r.__end_, ++__s) 3673*4d6fc14bSjoerg ::new ((void*)__r.__end_) value_type(*__s); 3674*4d6fc14bSjoerg for (const value_type* __s = __begin_; __s != __m; ++__r.__end_, ++__s) 3675*4d6fc14bSjoerg ::new ((void*)__r.__end_) value_type(*__s); 3676*4d6fc14bSjoerg } 3677*4d6fc14bSjoerg return __r; 3678*4d6fc14bSjoerg} 3679*4d6fc14bSjoerg 3680*4d6fc14bSjoergtemplate <class _Tp> 3681*4d6fc14bSjoergvalarray<_Tp> 3682*4d6fc14bSjoergvalarray<_Tp>::apply(value_type __f(value_type)) const 3683*4d6fc14bSjoerg{ 3684*4d6fc14bSjoerg valarray<value_type> __r; 3685*4d6fc14bSjoerg size_t __n = size(); 3686*4d6fc14bSjoerg if (__n) 3687*4d6fc14bSjoerg { 3688*4d6fc14bSjoerg __r.__begin_ = __r.__end_ = allocator<value_type>().allocate(__n); 3689*4d6fc14bSjoerg for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n) 3690*4d6fc14bSjoerg ::new ((void*)__r.__end_) value_type(__f(*__p)); 3691*4d6fc14bSjoerg } 3692*4d6fc14bSjoerg return __r; 3693*4d6fc14bSjoerg} 3694*4d6fc14bSjoerg 3695*4d6fc14bSjoergtemplate <class _Tp> 3696*4d6fc14bSjoergvalarray<_Tp> 3697*4d6fc14bSjoergvalarray<_Tp>::apply(value_type __f(const value_type&)) const 3698*4d6fc14bSjoerg{ 3699*4d6fc14bSjoerg valarray<value_type> __r; 3700*4d6fc14bSjoerg size_t __n = size(); 3701*4d6fc14bSjoerg if (__n) 3702*4d6fc14bSjoerg { 3703*4d6fc14bSjoerg __r.__begin_ = __r.__end_ = allocator<value_type>().allocate(__n); 3704*4d6fc14bSjoerg for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n) 3705*4d6fc14bSjoerg ::new ((void*)__r.__end_) value_type(__f(*__p)); 3706*4d6fc14bSjoerg } 3707*4d6fc14bSjoerg return __r; 3708*4d6fc14bSjoerg} 3709*4d6fc14bSjoerg 3710*4d6fc14bSjoergtemplate <class _Tp> 3711*4d6fc14bSjoerginline 3712*4d6fc14bSjoergvoid valarray<_Tp>::__clear(size_t __capacity) 3713*4d6fc14bSjoerg{ 3714*4d6fc14bSjoerg if (__begin_ != nullptr) 3715*4d6fc14bSjoerg { 3716*4d6fc14bSjoerg while (__end_ != __begin_) 3717*4d6fc14bSjoerg (--__end_)->~value_type(); 3718*4d6fc14bSjoerg allocator<value_type>().deallocate(__begin_, __capacity); 3719*4d6fc14bSjoerg __begin_ = __end_ = nullptr; 3720*4d6fc14bSjoerg } 3721*4d6fc14bSjoerg} 3722*4d6fc14bSjoerg 3723*4d6fc14bSjoergtemplate <class _Tp> 3724*4d6fc14bSjoergvoid 3725*4d6fc14bSjoergvalarray<_Tp>::resize(size_t __n, value_type __x) 3726*4d6fc14bSjoerg{ 3727*4d6fc14bSjoerg __clear(size()); 3728*4d6fc14bSjoerg if (__n) 3729*4d6fc14bSjoerg { 3730*4d6fc14bSjoerg __begin_ = __end_ = allocator<value_type>().allocate(__n); 3731*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS 3732*4d6fc14bSjoerg try 3733*4d6fc14bSjoerg { 3734*4d6fc14bSjoerg#endif // _LIBCPP_NO_EXCEPTIONS 3735*4d6fc14bSjoerg for (size_t __n_left = __n; __n_left; --__n_left, ++__end_) 3736*4d6fc14bSjoerg ::new ((void*)__end_) value_type(__x); 3737*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS 3738*4d6fc14bSjoerg } 3739*4d6fc14bSjoerg catch (...) 3740*4d6fc14bSjoerg { 3741*4d6fc14bSjoerg __clear(__n); 3742*4d6fc14bSjoerg throw; 3743*4d6fc14bSjoerg } 3744*4d6fc14bSjoerg#endif // _LIBCPP_NO_EXCEPTIONS 3745*4d6fc14bSjoerg } 3746*4d6fc14bSjoerg} 3747*4d6fc14bSjoerg 3748*4d6fc14bSjoergtemplate<class _Tp> 3749*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 3750*4d6fc14bSjoergvoid 3751*4d6fc14bSjoergswap(valarray<_Tp>& __x, valarray<_Tp>& __y) _NOEXCEPT 3752*4d6fc14bSjoerg{ 3753*4d6fc14bSjoerg __x.swap(__y); 3754*4d6fc14bSjoerg} 3755*4d6fc14bSjoerg 3756*4d6fc14bSjoergtemplate<class _Expr1, class _Expr2> 3757*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 3758*4d6fc14bSjoergtypename enable_if 3759*4d6fc14bSjoerg< 3760*4d6fc14bSjoerg __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, 3761*4d6fc14bSjoerg __val_expr<_BinaryOp<multiplies<typename _Expr1::value_type>, _Expr1, _Expr2> > 3762*4d6fc14bSjoerg>::type 3763*4d6fc14bSjoergoperator*(const _Expr1& __x, const _Expr2& __y) 3764*4d6fc14bSjoerg{ 3765*4d6fc14bSjoerg typedef typename _Expr1::value_type value_type; 3766*4d6fc14bSjoerg typedef _BinaryOp<multiplies<value_type>, _Expr1, _Expr2> _Op; 3767*4d6fc14bSjoerg return __val_expr<_Op>(_Op(multiplies<value_type>(), __x, __y)); 3768*4d6fc14bSjoerg} 3769*4d6fc14bSjoerg 3770*4d6fc14bSjoergtemplate<class _Expr> 3771*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 3772*4d6fc14bSjoergtypename enable_if 3773*4d6fc14bSjoerg< 3774*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 3775*4d6fc14bSjoerg __val_expr<_BinaryOp<multiplies<typename _Expr::value_type>, 3776*4d6fc14bSjoerg _Expr, __scalar_expr<typename _Expr::value_type> > > 3777*4d6fc14bSjoerg>::type 3778*4d6fc14bSjoergoperator*(const _Expr& __x, const typename _Expr::value_type& __y) 3779*4d6fc14bSjoerg{ 3780*4d6fc14bSjoerg typedef typename _Expr::value_type value_type; 3781*4d6fc14bSjoerg typedef _BinaryOp<multiplies<value_type>, _Expr, __scalar_expr<value_type> > _Op; 3782*4d6fc14bSjoerg return __val_expr<_Op>(_Op(multiplies<value_type>(), 3783*4d6fc14bSjoerg __x, __scalar_expr<value_type>(__y, __x.size()))); 3784*4d6fc14bSjoerg} 3785*4d6fc14bSjoerg 3786*4d6fc14bSjoergtemplate<class _Expr> 3787*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 3788*4d6fc14bSjoergtypename enable_if 3789*4d6fc14bSjoerg< 3790*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 3791*4d6fc14bSjoerg __val_expr<_BinaryOp<multiplies<typename _Expr::value_type>, 3792*4d6fc14bSjoerg __scalar_expr<typename _Expr::value_type>, _Expr> > 3793*4d6fc14bSjoerg>::type 3794*4d6fc14bSjoergoperator*(const typename _Expr::value_type& __x, const _Expr& __y) 3795*4d6fc14bSjoerg{ 3796*4d6fc14bSjoerg typedef typename _Expr::value_type value_type; 3797*4d6fc14bSjoerg typedef _BinaryOp<multiplies<value_type>, __scalar_expr<value_type>, _Expr> _Op; 3798*4d6fc14bSjoerg return __val_expr<_Op>(_Op(multiplies<value_type>(), 3799*4d6fc14bSjoerg __scalar_expr<value_type>(__x, __y.size()), __y)); 3800*4d6fc14bSjoerg} 3801*4d6fc14bSjoerg 3802*4d6fc14bSjoergtemplate<class _Expr1, class _Expr2> 3803*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 3804*4d6fc14bSjoergtypename enable_if 3805*4d6fc14bSjoerg< 3806*4d6fc14bSjoerg __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, 3807*4d6fc14bSjoerg __val_expr<_BinaryOp<divides<typename _Expr1::value_type>, _Expr1, _Expr2> > 3808*4d6fc14bSjoerg>::type 3809*4d6fc14bSjoergoperator/(const _Expr1& __x, const _Expr2& __y) 3810*4d6fc14bSjoerg{ 3811*4d6fc14bSjoerg typedef typename _Expr1::value_type value_type; 3812*4d6fc14bSjoerg typedef _BinaryOp<divides<value_type>, _Expr1, _Expr2> _Op; 3813*4d6fc14bSjoerg return __val_expr<_Op>(_Op(divides<value_type>(), __x, __y)); 3814*4d6fc14bSjoerg} 3815*4d6fc14bSjoerg 3816*4d6fc14bSjoergtemplate<class _Expr> 3817*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 3818*4d6fc14bSjoergtypename enable_if 3819*4d6fc14bSjoerg< 3820*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 3821*4d6fc14bSjoerg __val_expr<_BinaryOp<divides<typename _Expr::value_type>, 3822*4d6fc14bSjoerg _Expr, __scalar_expr<typename _Expr::value_type> > > 3823*4d6fc14bSjoerg>::type 3824*4d6fc14bSjoergoperator/(const _Expr& __x, const typename _Expr::value_type& __y) 3825*4d6fc14bSjoerg{ 3826*4d6fc14bSjoerg typedef typename _Expr::value_type value_type; 3827*4d6fc14bSjoerg typedef _BinaryOp<divides<value_type>, _Expr, __scalar_expr<value_type> > _Op; 3828*4d6fc14bSjoerg return __val_expr<_Op>(_Op(divides<value_type>(), 3829*4d6fc14bSjoerg __x, __scalar_expr<value_type>(__y, __x.size()))); 3830*4d6fc14bSjoerg} 3831*4d6fc14bSjoerg 3832*4d6fc14bSjoergtemplate<class _Expr> 3833*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 3834*4d6fc14bSjoergtypename enable_if 3835*4d6fc14bSjoerg< 3836*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 3837*4d6fc14bSjoerg __val_expr<_BinaryOp<divides<typename _Expr::value_type>, 3838*4d6fc14bSjoerg __scalar_expr<typename _Expr::value_type>, _Expr> > 3839*4d6fc14bSjoerg>::type 3840*4d6fc14bSjoergoperator/(const typename _Expr::value_type& __x, const _Expr& __y) 3841*4d6fc14bSjoerg{ 3842*4d6fc14bSjoerg typedef typename _Expr::value_type value_type; 3843*4d6fc14bSjoerg typedef _BinaryOp<divides<value_type>, __scalar_expr<value_type>, _Expr> _Op; 3844*4d6fc14bSjoerg return __val_expr<_Op>(_Op(divides<value_type>(), 3845*4d6fc14bSjoerg __scalar_expr<value_type>(__x, __y.size()), __y)); 3846*4d6fc14bSjoerg} 3847*4d6fc14bSjoerg 3848*4d6fc14bSjoergtemplate<class _Expr1, class _Expr2> 3849*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 3850*4d6fc14bSjoergtypename enable_if 3851*4d6fc14bSjoerg< 3852*4d6fc14bSjoerg __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, 3853*4d6fc14bSjoerg __val_expr<_BinaryOp<modulus<typename _Expr1::value_type>, _Expr1, _Expr2> > 3854*4d6fc14bSjoerg>::type 3855*4d6fc14bSjoergoperator%(const _Expr1& __x, const _Expr2& __y) 3856*4d6fc14bSjoerg{ 3857*4d6fc14bSjoerg typedef typename _Expr1::value_type value_type; 3858*4d6fc14bSjoerg typedef _BinaryOp<modulus<value_type>, _Expr1, _Expr2> _Op; 3859*4d6fc14bSjoerg return __val_expr<_Op>(_Op(modulus<value_type>(), __x, __y)); 3860*4d6fc14bSjoerg} 3861*4d6fc14bSjoerg 3862*4d6fc14bSjoergtemplate<class _Expr> 3863*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 3864*4d6fc14bSjoergtypename enable_if 3865*4d6fc14bSjoerg< 3866*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 3867*4d6fc14bSjoerg __val_expr<_BinaryOp<modulus<typename _Expr::value_type>, 3868*4d6fc14bSjoerg _Expr, __scalar_expr<typename _Expr::value_type> > > 3869*4d6fc14bSjoerg>::type 3870*4d6fc14bSjoergoperator%(const _Expr& __x, const typename _Expr::value_type& __y) 3871*4d6fc14bSjoerg{ 3872*4d6fc14bSjoerg typedef typename _Expr::value_type value_type; 3873*4d6fc14bSjoerg typedef _BinaryOp<modulus<value_type>, _Expr, __scalar_expr<value_type> > _Op; 3874*4d6fc14bSjoerg return __val_expr<_Op>(_Op(modulus<value_type>(), 3875*4d6fc14bSjoerg __x, __scalar_expr<value_type>(__y, __x.size()))); 3876*4d6fc14bSjoerg} 3877*4d6fc14bSjoerg 3878*4d6fc14bSjoergtemplate<class _Expr> 3879*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 3880*4d6fc14bSjoergtypename enable_if 3881*4d6fc14bSjoerg< 3882*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 3883*4d6fc14bSjoerg __val_expr<_BinaryOp<modulus<typename _Expr::value_type>, 3884*4d6fc14bSjoerg __scalar_expr<typename _Expr::value_type>, _Expr> > 3885*4d6fc14bSjoerg>::type 3886*4d6fc14bSjoergoperator%(const typename _Expr::value_type& __x, const _Expr& __y) 3887*4d6fc14bSjoerg{ 3888*4d6fc14bSjoerg typedef typename _Expr::value_type value_type; 3889*4d6fc14bSjoerg typedef _BinaryOp<modulus<value_type>, __scalar_expr<value_type>, _Expr> _Op; 3890*4d6fc14bSjoerg return __val_expr<_Op>(_Op(modulus<value_type>(), 3891*4d6fc14bSjoerg __scalar_expr<value_type>(__x, __y.size()), __y)); 3892*4d6fc14bSjoerg} 3893*4d6fc14bSjoerg 3894*4d6fc14bSjoergtemplate<class _Expr1, class _Expr2> 3895*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 3896*4d6fc14bSjoergtypename enable_if 3897*4d6fc14bSjoerg< 3898*4d6fc14bSjoerg __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, 3899*4d6fc14bSjoerg __val_expr<_BinaryOp<plus<typename _Expr1::value_type>, _Expr1, _Expr2> > 3900*4d6fc14bSjoerg>::type 3901*4d6fc14bSjoergoperator+(const _Expr1& __x, const _Expr2& __y) 3902*4d6fc14bSjoerg{ 3903*4d6fc14bSjoerg typedef typename _Expr1::value_type value_type; 3904*4d6fc14bSjoerg typedef _BinaryOp<plus<value_type>, _Expr1, _Expr2> _Op; 3905*4d6fc14bSjoerg return __val_expr<_Op>(_Op(plus<value_type>(), __x, __y)); 3906*4d6fc14bSjoerg} 3907*4d6fc14bSjoerg 3908*4d6fc14bSjoergtemplate<class _Expr> 3909*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 3910*4d6fc14bSjoergtypename enable_if 3911*4d6fc14bSjoerg< 3912*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 3913*4d6fc14bSjoerg __val_expr<_BinaryOp<plus<typename _Expr::value_type>, 3914*4d6fc14bSjoerg _Expr, __scalar_expr<typename _Expr::value_type> > > 3915*4d6fc14bSjoerg>::type 3916*4d6fc14bSjoergoperator+(const _Expr& __x, const typename _Expr::value_type& __y) 3917*4d6fc14bSjoerg{ 3918*4d6fc14bSjoerg typedef typename _Expr::value_type value_type; 3919*4d6fc14bSjoerg typedef _BinaryOp<plus<value_type>, _Expr, __scalar_expr<value_type> > _Op; 3920*4d6fc14bSjoerg return __val_expr<_Op>(_Op(plus<value_type>(), 3921*4d6fc14bSjoerg __x, __scalar_expr<value_type>(__y, __x.size()))); 3922*4d6fc14bSjoerg} 3923*4d6fc14bSjoerg 3924*4d6fc14bSjoergtemplate<class _Expr> 3925*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 3926*4d6fc14bSjoergtypename enable_if 3927*4d6fc14bSjoerg< 3928*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 3929*4d6fc14bSjoerg __val_expr<_BinaryOp<plus<typename _Expr::value_type>, 3930*4d6fc14bSjoerg __scalar_expr<typename _Expr::value_type>, _Expr> > 3931*4d6fc14bSjoerg>::type 3932*4d6fc14bSjoergoperator+(const typename _Expr::value_type& __x, const _Expr& __y) 3933*4d6fc14bSjoerg{ 3934*4d6fc14bSjoerg typedef typename _Expr::value_type value_type; 3935*4d6fc14bSjoerg typedef _BinaryOp<plus<value_type>, __scalar_expr<value_type>, _Expr> _Op; 3936*4d6fc14bSjoerg return __val_expr<_Op>(_Op(plus<value_type>(), 3937*4d6fc14bSjoerg __scalar_expr<value_type>(__x, __y.size()), __y)); 3938*4d6fc14bSjoerg} 3939*4d6fc14bSjoerg 3940*4d6fc14bSjoergtemplate<class _Expr1, class _Expr2> 3941*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 3942*4d6fc14bSjoergtypename enable_if 3943*4d6fc14bSjoerg< 3944*4d6fc14bSjoerg __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, 3945*4d6fc14bSjoerg __val_expr<_BinaryOp<minus<typename _Expr1::value_type>, _Expr1, _Expr2> > 3946*4d6fc14bSjoerg>::type 3947*4d6fc14bSjoergoperator-(const _Expr1& __x, const _Expr2& __y) 3948*4d6fc14bSjoerg{ 3949*4d6fc14bSjoerg typedef typename _Expr1::value_type value_type; 3950*4d6fc14bSjoerg typedef _BinaryOp<minus<value_type>, _Expr1, _Expr2> _Op; 3951*4d6fc14bSjoerg return __val_expr<_Op>(_Op(minus<value_type>(), __x, __y)); 3952*4d6fc14bSjoerg} 3953*4d6fc14bSjoerg 3954*4d6fc14bSjoergtemplate<class _Expr> 3955*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 3956*4d6fc14bSjoergtypename enable_if 3957*4d6fc14bSjoerg< 3958*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 3959*4d6fc14bSjoerg __val_expr<_BinaryOp<minus<typename _Expr::value_type>, 3960*4d6fc14bSjoerg _Expr, __scalar_expr<typename _Expr::value_type> > > 3961*4d6fc14bSjoerg>::type 3962*4d6fc14bSjoergoperator-(const _Expr& __x, const typename _Expr::value_type& __y) 3963*4d6fc14bSjoerg{ 3964*4d6fc14bSjoerg typedef typename _Expr::value_type value_type; 3965*4d6fc14bSjoerg typedef _BinaryOp<minus<value_type>, _Expr, __scalar_expr<value_type> > _Op; 3966*4d6fc14bSjoerg return __val_expr<_Op>(_Op(minus<value_type>(), 3967*4d6fc14bSjoerg __x, __scalar_expr<value_type>(__y, __x.size()))); 3968*4d6fc14bSjoerg} 3969*4d6fc14bSjoerg 3970*4d6fc14bSjoergtemplate<class _Expr> 3971*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 3972*4d6fc14bSjoergtypename enable_if 3973*4d6fc14bSjoerg< 3974*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 3975*4d6fc14bSjoerg __val_expr<_BinaryOp<minus<typename _Expr::value_type>, 3976*4d6fc14bSjoerg __scalar_expr<typename _Expr::value_type>, _Expr> > 3977*4d6fc14bSjoerg>::type 3978*4d6fc14bSjoergoperator-(const typename _Expr::value_type& __x, const _Expr& __y) 3979*4d6fc14bSjoerg{ 3980*4d6fc14bSjoerg typedef typename _Expr::value_type value_type; 3981*4d6fc14bSjoerg typedef _BinaryOp<minus<value_type>, __scalar_expr<value_type>, _Expr> _Op; 3982*4d6fc14bSjoerg return __val_expr<_Op>(_Op(minus<value_type>(), 3983*4d6fc14bSjoerg __scalar_expr<value_type>(__x, __y.size()), __y)); 3984*4d6fc14bSjoerg} 3985*4d6fc14bSjoerg 3986*4d6fc14bSjoergtemplate<class _Expr1, class _Expr2> 3987*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 3988*4d6fc14bSjoergtypename enable_if 3989*4d6fc14bSjoerg< 3990*4d6fc14bSjoerg __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, 3991*4d6fc14bSjoerg __val_expr<_BinaryOp<bit_xor<typename _Expr1::value_type>, _Expr1, _Expr2> > 3992*4d6fc14bSjoerg>::type 3993*4d6fc14bSjoergoperator^(const _Expr1& __x, const _Expr2& __y) 3994*4d6fc14bSjoerg{ 3995*4d6fc14bSjoerg typedef typename _Expr1::value_type value_type; 3996*4d6fc14bSjoerg typedef _BinaryOp<bit_xor<value_type>, _Expr1, _Expr2> _Op; 3997*4d6fc14bSjoerg return __val_expr<_Op>(_Op(bit_xor<value_type>(), __x, __y)); 3998*4d6fc14bSjoerg} 3999*4d6fc14bSjoerg 4000*4d6fc14bSjoergtemplate<class _Expr> 4001*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 4002*4d6fc14bSjoergtypename enable_if 4003*4d6fc14bSjoerg< 4004*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 4005*4d6fc14bSjoerg __val_expr<_BinaryOp<bit_xor<typename _Expr::value_type>, 4006*4d6fc14bSjoerg _Expr, __scalar_expr<typename _Expr::value_type> > > 4007*4d6fc14bSjoerg>::type 4008*4d6fc14bSjoergoperator^(const _Expr& __x, const typename _Expr::value_type& __y) 4009*4d6fc14bSjoerg{ 4010*4d6fc14bSjoerg typedef typename _Expr::value_type value_type; 4011*4d6fc14bSjoerg typedef _BinaryOp<bit_xor<value_type>, _Expr, __scalar_expr<value_type> > _Op; 4012*4d6fc14bSjoerg return __val_expr<_Op>(_Op(bit_xor<value_type>(), 4013*4d6fc14bSjoerg __x, __scalar_expr<value_type>(__y, __x.size()))); 4014*4d6fc14bSjoerg} 4015*4d6fc14bSjoerg 4016*4d6fc14bSjoergtemplate<class _Expr> 4017*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 4018*4d6fc14bSjoergtypename enable_if 4019*4d6fc14bSjoerg< 4020*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 4021*4d6fc14bSjoerg __val_expr<_BinaryOp<bit_xor<typename _Expr::value_type>, 4022*4d6fc14bSjoerg __scalar_expr<typename _Expr::value_type>, _Expr> > 4023*4d6fc14bSjoerg>::type 4024*4d6fc14bSjoergoperator^(const typename _Expr::value_type& __x, const _Expr& __y) 4025*4d6fc14bSjoerg{ 4026*4d6fc14bSjoerg typedef typename _Expr::value_type value_type; 4027*4d6fc14bSjoerg typedef _BinaryOp<bit_xor<value_type>, __scalar_expr<value_type>, _Expr> _Op; 4028*4d6fc14bSjoerg return __val_expr<_Op>(_Op(bit_xor<value_type>(), 4029*4d6fc14bSjoerg __scalar_expr<value_type>(__x, __y.size()), __y)); 4030*4d6fc14bSjoerg} 4031*4d6fc14bSjoerg 4032*4d6fc14bSjoergtemplate<class _Expr1, class _Expr2> 4033*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 4034*4d6fc14bSjoergtypename enable_if 4035*4d6fc14bSjoerg< 4036*4d6fc14bSjoerg __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, 4037*4d6fc14bSjoerg __val_expr<_BinaryOp<bit_and<typename _Expr1::value_type>, _Expr1, _Expr2> > 4038*4d6fc14bSjoerg>::type 4039*4d6fc14bSjoergoperator&(const _Expr1& __x, const _Expr2& __y) 4040*4d6fc14bSjoerg{ 4041*4d6fc14bSjoerg typedef typename _Expr1::value_type value_type; 4042*4d6fc14bSjoerg typedef _BinaryOp<bit_and<value_type>, _Expr1, _Expr2> _Op; 4043*4d6fc14bSjoerg return __val_expr<_Op>(_Op(bit_and<value_type>(), __x, __y)); 4044*4d6fc14bSjoerg} 4045*4d6fc14bSjoerg 4046*4d6fc14bSjoergtemplate<class _Expr> 4047*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 4048*4d6fc14bSjoergtypename enable_if 4049*4d6fc14bSjoerg< 4050*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 4051*4d6fc14bSjoerg __val_expr<_BinaryOp<bit_and<typename _Expr::value_type>, 4052*4d6fc14bSjoerg _Expr, __scalar_expr<typename _Expr::value_type> > > 4053*4d6fc14bSjoerg>::type 4054*4d6fc14bSjoergoperator&(const _Expr& __x, const typename _Expr::value_type& __y) 4055*4d6fc14bSjoerg{ 4056*4d6fc14bSjoerg typedef typename _Expr::value_type value_type; 4057*4d6fc14bSjoerg typedef _BinaryOp<bit_and<value_type>, _Expr, __scalar_expr<value_type> > _Op; 4058*4d6fc14bSjoerg return __val_expr<_Op>(_Op(bit_and<value_type>(), 4059*4d6fc14bSjoerg __x, __scalar_expr<value_type>(__y, __x.size()))); 4060*4d6fc14bSjoerg} 4061*4d6fc14bSjoerg 4062*4d6fc14bSjoergtemplate<class _Expr> 4063*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 4064*4d6fc14bSjoergtypename enable_if 4065*4d6fc14bSjoerg< 4066*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 4067*4d6fc14bSjoerg __val_expr<_BinaryOp<bit_and<typename _Expr::value_type>, 4068*4d6fc14bSjoerg __scalar_expr<typename _Expr::value_type>, _Expr> > 4069*4d6fc14bSjoerg>::type 4070*4d6fc14bSjoergoperator&(const typename _Expr::value_type& __x, const _Expr& __y) 4071*4d6fc14bSjoerg{ 4072*4d6fc14bSjoerg typedef typename _Expr::value_type value_type; 4073*4d6fc14bSjoerg typedef _BinaryOp<bit_and<value_type>, __scalar_expr<value_type>, _Expr> _Op; 4074*4d6fc14bSjoerg return __val_expr<_Op>(_Op(bit_and<value_type>(), 4075*4d6fc14bSjoerg __scalar_expr<value_type>(__x, __y.size()), __y)); 4076*4d6fc14bSjoerg} 4077*4d6fc14bSjoerg 4078*4d6fc14bSjoergtemplate<class _Expr1, class _Expr2> 4079*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 4080*4d6fc14bSjoergtypename enable_if 4081*4d6fc14bSjoerg< 4082*4d6fc14bSjoerg __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, 4083*4d6fc14bSjoerg __val_expr<_BinaryOp<bit_or<typename _Expr1::value_type>, _Expr1, _Expr2> > 4084*4d6fc14bSjoerg>::type 4085*4d6fc14bSjoergoperator|(const _Expr1& __x, const _Expr2& __y) 4086*4d6fc14bSjoerg{ 4087*4d6fc14bSjoerg typedef typename _Expr1::value_type value_type; 4088*4d6fc14bSjoerg typedef _BinaryOp<bit_or<value_type>, _Expr1, _Expr2> _Op; 4089*4d6fc14bSjoerg return __val_expr<_Op>(_Op(bit_or<value_type>(), __x, __y)); 4090*4d6fc14bSjoerg} 4091*4d6fc14bSjoerg 4092*4d6fc14bSjoergtemplate<class _Expr> 4093*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 4094*4d6fc14bSjoergtypename enable_if 4095*4d6fc14bSjoerg< 4096*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 4097*4d6fc14bSjoerg __val_expr<_BinaryOp<bit_or<typename _Expr::value_type>, 4098*4d6fc14bSjoerg _Expr, __scalar_expr<typename _Expr::value_type> > > 4099*4d6fc14bSjoerg>::type 4100*4d6fc14bSjoergoperator|(const _Expr& __x, const typename _Expr::value_type& __y) 4101*4d6fc14bSjoerg{ 4102*4d6fc14bSjoerg typedef typename _Expr::value_type value_type; 4103*4d6fc14bSjoerg typedef _BinaryOp<bit_or<value_type>, _Expr, __scalar_expr<value_type> > _Op; 4104*4d6fc14bSjoerg return __val_expr<_Op>(_Op(bit_or<value_type>(), 4105*4d6fc14bSjoerg __x, __scalar_expr<value_type>(__y, __x.size()))); 4106*4d6fc14bSjoerg} 4107*4d6fc14bSjoerg 4108*4d6fc14bSjoergtemplate<class _Expr> 4109*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 4110*4d6fc14bSjoergtypename enable_if 4111*4d6fc14bSjoerg< 4112*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 4113*4d6fc14bSjoerg __val_expr<_BinaryOp<bit_or<typename _Expr::value_type>, 4114*4d6fc14bSjoerg __scalar_expr<typename _Expr::value_type>, _Expr> > 4115*4d6fc14bSjoerg>::type 4116*4d6fc14bSjoergoperator|(const typename _Expr::value_type& __x, const _Expr& __y) 4117*4d6fc14bSjoerg{ 4118*4d6fc14bSjoerg typedef typename _Expr::value_type value_type; 4119*4d6fc14bSjoerg typedef _BinaryOp<bit_or<value_type>, __scalar_expr<value_type>, _Expr> _Op; 4120*4d6fc14bSjoerg return __val_expr<_Op>(_Op(bit_or<value_type>(), 4121*4d6fc14bSjoerg __scalar_expr<value_type>(__x, __y.size()), __y)); 4122*4d6fc14bSjoerg} 4123*4d6fc14bSjoerg 4124*4d6fc14bSjoergtemplate<class _Expr1, class _Expr2> 4125*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 4126*4d6fc14bSjoergtypename enable_if 4127*4d6fc14bSjoerg< 4128*4d6fc14bSjoerg __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, 4129*4d6fc14bSjoerg __val_expr<_BinaryOp<__bit_shift_left<typename _Expr1::value_type>, _Expr1, _Expr2> > 4130*4d6fc14bSjoerg>::type 4131*4d6fc14bSjoergoperator<<(const _Expr1& __x, const _Expr2& __y) 4132*4d6fc14bSjoerg{ 4133*4d6fc14bSjoerg typedef typename _Expr1::value_type value_type; 4134*4d6fc14bSjoerg typedef _BinaryOp<__bit_shift_left<value_type>, _Expr1, _Expr2> _Op; 4135*4d6fc14bSjoerg return __val_expr<_Op>(_Op(__bit_shift_left<value_type>(), __x, __y)); 4136*4d6fc14bSjoerg} 4137*4d6fc14bSjoerg 4138*4d6fc14bSjoergtemplate<class _Expr> 4139*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 4140*4d6fc14bSjoergtypename enable_if 4141*4d6fc14bSjoerg< 4142*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 4143*4d6fc14bSjoerg __val_expr<_BinaryOp<__bit_shift_left<typename _Expr::value_type>, 4144*4d6fc14bSjoerg _Expr, __scalar_expr<typename _Expr::value_type> > > 4145*4d6fc14bSjoerg>::type 4146*4d6fc14bSjoergoperator<<(const _Expr& __x, const typename _Expr::value_type& __y) 4147*4d6fc14bSjoerg{ 4148*4d6fc14bSjoerg typedef typename _Expr::value_type value_type; 4149*4d6fc14bSjoerg typedef _BinaryOp<__bit_shift_left<value_type>, _Expr, __scalar_expr<value_type> > _Op; 4150*4d6fc14bSjoerg return __val_expr<_Op>(_Op(__bit_shift_left<value_type>(), 4151*4d6fc14bSjoerg __x, __scalar_expr<value_type>(__y, __x.size()))); 4152*4d6fc14bSjoerg} 4153*4d6fc14bSjoerg 4154*4d6fc14bSjoergtemplate<class _Expr> 4155*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 4156*4d6fc14bSjoergtypename enable_if 4157*4d6fc14bSjoerg< 4158*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 4159*4d6fc14bSjoerg __val_expr<_BinaryOp<__bit_shift_left<typename _Expr::value_type>, 4160*4d6fc14bSjoerg __scalar_expr<typename _Expr::value_type>, _Expr> > 4161*4d6fc14bSjoerg>::type 4162*4d6fc14bSjoergoperator<<(const typename _Expr::value_type& __x, const _Expr& __y) 4163*4d6fc14bSjoerg{ 4164*4d6fc14bSjoerg typedef typename _Expr::value_type value_type; 4165*4d6fc14bSjoerg typedef _BinaryOp<__bit_shift_left<value_type>, __scalar_expr<value_type>, _Expr> _Op; 4166*4d6fc14bSjoerg return __val_expr<_Op>(_Op(__bit_shift_left<value_type>(), 4167*4d6fc14bSjoerg __scalar_expr<value_type>(__x, __y.size()), __y)); 4168*4d6fc14bSjoerg} 4169*4d6fc14bSjoerg 4170*4d6fc14bSjoergtemplate<class _Expr1, class _Expr2> 4171*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 4172*4d6fc14bSjoergtypename enable_if 4173*4d6fc14bSjoerg< 4174*4d6fc14bSjoerg __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, 4175*4d6fc14bSjoerg __val_expr<_BinaryOp<__bit_shift_right<typename _Expr1::value_type>, _Expr1, _Expr2> > 4176*4d6fc14bSjoerg>::type 4177*4d6fc14bSjoergoperator>>(const _Expr1& __x, const _Expr2& __y) 4178*4d6fc14bSjoerg{ 4179*4d6fc14bSjoerg typedef typename _Expr1::value_type value_type; 4180*4d6fc14bSjoerg typedef _BinaryOp<__bit_shift_right<value_type>, _Expr1, _Expr2> _Op; 4181*4d6fc14bSjoerg return __val_expr<_Op>(_Op(__bit_shift_right<value_type>(), __x, __y)); 4182*4d6fc14bSjoerg} 4183*4d6fc14bSjoerg 4184*4d6fc14bSjoergtemplate<class _Expr> 4185*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 4186*4d6fc14bSjoergtypename enable_if 4187*4d6fc14bSjoerg< 4188*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 4189*4d6fc14bSjoerg __val_expr<_BinaryOp<__bit_shift_right<typename _Expr::value_type>, 4190*4d6fc14bSjoerg _Expr, __scalar_expr<typename _Expr::value_type> > > 4191*4d6fc14bSjoerg>::type 4192*4d6fc14bSjoergoperator>>(const _Expr& __x, const typename _Expr::value_type& __y) 4193*4d6fc14bSjoerg{ 4194*4d6fc14bSjoerg typedef typename _Expr::value_type value_type; 4195*4d6fc14bSjoerg typedef _BinaryOp<__bit_shift_right<value_type>, _Expr, __scalar_expr<value_type> > _Op; 4196*4d6fc14bSjoerg return __val_expr<_Op>(_Op(__bit_shift_right<value_type>(), 4197*4d6fc14bSjoerg __x, __scalar_expr<value_type>(__y, __x.size()))); 4198*4d6fc14bSjoerg} 4199*4d6fc14bSjoerg 4200*4d6fc14bSjoergtemplate<class _Expr> 4201*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 4202*4d6fc14bSjoergtypename enable_if 4203*4d6fc14bSjoerg< 4204*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 4205*4d6fc14bSjoerg __val_expr<_BinaryOp<__bit_shift_right<typename _Expr::value_type>, 4206*4d6fc14bSjoerg __scalar_expr<typename _Expr::value_type>, _Expr> > 4207*4d6fc14bSjoerg>::type 4208*4d6fc14bSjoergoperator>>(const typename _Expr::value_type& __x, const _Expr& __y) 4209*4d6fc14bSjoerg{ 4210*4d6fc14bSjoerg typedef typename _Expr::value_type value_type; 4211*4d6fc14bSjoerg typedef _BinaryOp<__bit_shift_right<value_type>, __scalar_expr<value_type>, _Expr> _Op; 4212*4d6fc14bSjoerg return __val_expr<_Op>(_Op(__bit_shift_right<value_type>(), 4213*4d6fc14bSjoerg __scalar_expr<value_type>(__x, __y.size()), __y)); 4214*4d6fc14bSjoerg} 4215*4d6fc14bSjoerg 4216*4d6fc14bSjoergtemplate<class _Expr1, class _Expr2> 4217*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 4218*4d6fc14bSjoergtypename enable_if 4219*4d6fc14bSjoerg< 4220*4d6fc14bSjoerg __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, 4221*4d6fc14bSjoerg __val_expr<_BinaryOp<logical_and<typename _Expr1::value_type>, _Expr1, _Expr2> > 4222*4d6fc14bSjoerg>::type 4223*4d6fc14bSjoergoperator&&(const _Expr1& __x, const _Expr2& __y) 4224*4d6fc14bSjoerg{ 4225*4d6fc14bSjoerg typedef typename _Expr1::value_type value_type; 4226*4d6fc14bSjoerg typedef _BinaryOp<logical_and<value_type>, _Expr1, _Expr2> _Op; 4227*4d6fc14bSjoerg return __val_expr<_Op>(_Op(logical_and<value_type>(), __x, __y)); 4228*4d6fc14bSjoerg} 4229*4d6fc14bSjoerg 4230*4d6fc14bSjoergtemplate<class _Expr> 4231*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 4232*4d6fc14bSjoergtypename enable_if 4233*4d6fc14bSjoerg< 4234*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 4235*4d6fc14bSjoerg __val_expr<_BinaryOp<logical_and<typename _Expr::value_type>, 4236*4d6fc14bSjoerg _Expr, __scalar_expr<typename _Expr::value_type> > > 4237*4d6fc14bSjoerg>::type 4238*4d6fc14bSjoergoperator&&(const _Expr& __x, const typename _Expr::value_type& __y) 4239*4d6fc14bSjoerg{ 4240*4d6fc14bSjoerg typedef typename _Expr::value_type value_type; 4241*4d6fc14bSjoerg typedef _BinaryOp<logical_and<value_type>, _Expr, __scalar_expr<value_type> > _Op; 4242*4d6fc14bSjoerg return __val_expr<_Op>(_Op(logical_and<value_type>(), 4243*4d6fc14bSjoerg __x, __scalar_expr<value_type>(__y, __x.size()))); 4244*4d6fc14bSjoerg} 4245*4d6fc14bSjoerg 4246*4d6fc14bSjoergtemplate<class _Expr> 4247*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 4248*4d6fc14bSjoergtypename enable_if 4249*4d6fc14bSjoerg< 4250*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 4251*4d6fc14bSjoerg __val_expr<_BinaryOp<logical_and<typename _Expr::value_type>, 4252*4d6fc14bSjoerg __scalar_expr<typename _Expr::value_type>, _Expr> > 4253*4d6fc14bSjoerg>::type 4254*4d6fc14bSjoergoperator&&(const typename _Expr::value_type& __x, const _Expr& __y) 4255*4d6fc14bSjoerg{ 4256*4d6fc14bSjoerg typedef typename _Expr::value_type value_type; 4257*4d6fc14bSjoerg typedef _BinaryOp<logical_and<value_type>, __scalar_expr<value_type>, _Expr> _Op; 4258*4d6fc14bSjoerg return __val_expr<_Op>(_Op(logical_and<value_type>(), 4259*4d6fc14bSjoerg __scalar_expr<value_type>(__x, __y.size()), __y)); 4260*4d6fc14bSjoerg} 4261*4d6fc14bSjoerg 4262*4d6fc14bSjoergtemplate<class _Expr1, class _Expr2> 4263*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 4264*4d6fc14bSjoergtypename enable_if 4265*4d6fc14bSjoerg< 4266*4d6fc14bSjoerg __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, 4267*4d6fc14bSjoerg __val_expr<_BinaryOp<logical_or<typename _Expr1::value_type>, _Expr1, _Expr2> > 4268*4d6fc14bSjoerg>::type 4269*4d6fc14bSjoergoperator||(const _Expr1& __x, const _Expr2& __y) 4270*4d6fc14bSjoerg{ 4271*4d6fc14bSjoerg typedef typename _Expr1::value_type value_type; 4272*4d6fc14bSjoerg typedef _BinaryOp<logical_or<value_type>, _Expr1, _Expr2> _Op; 4273*4d6fc14bSjoerg return __val_expr<_Op>(_Op(logical_or<value_type>(), __x, __y)); 4274*4d6fc14bSjoerg} 4275*4d6fc14bSjoerg 4276*4d6fc14bSjoergtemplate<class _Expr> 4277*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 4278*4d6fc14bSjoergtypename enable_if 4279*4d6fc14bSjoerg< 4280*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 4281*4d6fc14bSjoerg __val_expr<_BinaryOp<logical_or<typename _Expr::value_type>, 4282*4d6fc14bSjoerg _Expr, __scalar_expr<typename _Expr::value_type> > > 4283*4d6fc14bSjoerg>::type 4284*4d6fc14bSjoergoperator||(const _Expr& __x, const typename _Expr::value_type& __y) 4285*4d6fc14bSjoerg{ 4286*4d6fc14bSjoerg typedef typename _Expr::value_type value_type; 4287*4d6fc14bSjoerg typedef _BinaryOp<logical_or<value_type>, _Expr, __scalar_expr<value_type> > _Op; 4288*4d6fc14bSjoerg return __val_expr<_Op>(_Op(logical_or<value_type>(), 4289*4d6fc14bSjoerg __x, __scalar_expr<value_type>(__y, __x.size()))); 4290*4d6fc14bSjoerg} 4291*4d6fc14bSjoerg 4292*4d6fc14bSjoergtemplate<class _Expr> 4293*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 4294*4d6fc14bSjoergtypename enable_if 4295*4d6fc14bSjoerg< 4296*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 4297*4d6fc14bSjoerg __val_expr<_BinaryOp<logical_or<typename _Expr::value_type>, 4298*4d6fc14bSjoerg __scalar_expr<typename _Expr::value_type>, _Expr> > 4299*4d6fc14bSjoerg>::type 4300*4d6fc14bSjoergoperator||(const typename _Expr::value_type& __x, const _Expr& __y) 4301*4d6fc14bSjoerg{ 4302*4d6fc14bSjoerg typedef typename _Expr::value_type value_type; 4303*4d6fc14bSjoerg typedef _BinaryOp<logical_or<value_type>, __scalar_expr<value_type>, _Expr> _Op; 4304*4d6fc14bSjoerg return __val_expr<_Op>(_Op(logical_or<value_type>(), 4305*4d6fc14bSjoerg __scalar_expr<value_type>(__x, __y.size()), __y)); 4306*4d6fc14bSjoerg} 4307*4d6fc14bSjoerg 4308*4d6fc14bSjoergtemplate<class _Expr1, class _Expr2> 4309*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 4310*4d6fc14bSjoergtypename enable_if 4311*4d6fc14bSjoerg< 4312*4d6fc14bSjoerg __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, 4313*4d6fc14bSjoerg __val_expr<_BinaryOp<equal_to<typename _Expr1::value_type>, _Expr1, _Expr2> > 4314*4d6fc14bSjoerg>::type 4315*4d6fc14bSjoergoperator==(const _Expr1& __x, const _Expr2& __y) 4316*4d6fc14bSjoerg{ 4317*4d6fc14bSjoerg typedef typename _Expr1::value_type value_type; 4318*4d6fc14bSjoerg typedef _BinaryOp<equal_to<value_type>, _Expr1, _Expr2> _Op; 4319*4d6fc14bSjoerg return __val_expr<_Op>(_Op(equal_to<value_type>(), __x, __y)); 4320*4d6fc14bSjoerg} 4321*4d6fc14bSjoerg 4322*4d6fc14bSjoergtemplate<class _Expr> 4323*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 4324*4d6fc14bSjoergtypename enable_if 4325*4d6fc14bSjoerg< 4326*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 4327*4d6fc14bSjoerg __val_expr<_BinaryOp<equal_to<typename _Expr::value_type>, 4328*4d6fc14bSjoerg _Expr, __scalar_expr<typename _Expr::value_type> > > 4329*4d6fc14bSjoerg>::type 4330*4d6fc14bSjoergoperator==(const _Expr& __x, const typename _Expr::value_type& __y) 4331*4d6fc14bSjoerg{ 4332*4d6fc14bSjoerg typedef typename _Expr::value_type value_type; 4333*4d6fc14bSjoerg typedef _BinaryOp<equal_to<value_type>, _Expr, __scalar_expr<value_type> > _Op; 4334*4d6fc14bSjoerg return __val_expr<_Op>(_Op(equal_to<value_type>(), 4335*4d6fc14bSjoerg __x, __scalar_expr<value_type>(__y, __x.size()))); 4336*4d6fc14bSjoerg} 4337*4d6fc14bSjoerg 4338*4d6fc14bSjoergtemplate<class _Expr> 4339*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 4340*4d6fc14bSjoergtypename enable_if 4341*4d6fc14bSjoerg< 4342*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 4343*4d6fc14bSjoerg __val_expr<_BinaryOp<equal_to<typename _Expr::value_type>, 4344*4d6fc14bSjoerg __scalar_expr<typename _Expr::value_type>, _Expr> > 4345*4d6fc14bSjoerg>::type 4346*4d6fc14bSjoergoperator==(const typename _Expr::value_type& __x, const _Expr& __y) 4347*4d6fc14bSjoerg{ 4348*4d6fc14bSjoerg typedef typename _Expr::value_type value_type; 4349*4d6fc14bSjoerg typedef _BinaryOp<equal_to<value_type>, __scalar_expr<value_type>, _Expr> _Op; 4350*4d6fc14bSjoerg return __val_expr<_Op>(_Op(equal_to<value_type>(), 4351*4d6fc14bSjoerg __scalar_expr<value_type>(__x, __y.size()), __y)); 4352*4d6fc14bSjoerg} 4353*4d6fc14bSjoerg 4354*4d6fc14bSjoergtemplate<class _Expr1, class _Expr2> 4355*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 4356*4d6fc14bSjoergtypename enable_if 4357*4d6fc14bSjoerg< 4358*4d6fc14bSjoerg __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, 4359*4d6fc14bSjoerg __val_expr<_BinaryOp<not_equal_to<typename _Expr1::value_type>, _Expr1, _Expr2> > 4360*4d6fc14bSjoerg>::type 4361*4d6fc14bSjoergoperator!=(const _Expr1& __x, const _Expr2& __y) 4362*4d6fc14bSjoerg{ 4363*4d6fc14bSjoerg typedef typename _Expr1::value_type value_type; 4364*4d6fc14bSjoerg typedef _BinaryOp<not_equal_to<value_type>, _Expr1, _Expr2> _Op; 4365*4d6fc14bSjoerg return __val_expr<_Op>(_Op(not_equal_to<value_type>(), __x, __y)); 4366*4d6fc14bSjoerg} 4367*4d6fc14bSjoerg 4368*4d6fc14bSjoergtemplate<class _Expr> 4369*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 4370*4d6fc14bSjoergtypename enable_if 4371*4d6fc14bSjoerg< 4372*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 4373*4d6fc14bSjoerg __val_expr<_BinaryOp<not_equal_to<typename _Expr::value_type>, 4374*4d6fc14bSjoerg _Expr, __scalar_expr<typename _Expr::value_type> > > 4375*4d6fc14bSjoerg>::type 4376*4d6fc14bSjoergoperator!=(const _Expr& __x, const typename _Expr::value_type& __y) 4377*4d6fc14bSjoerg{ 4378*4d6fc14bSjoerg typedef typename _Expr::value_type value_type; 4379*4d6fc14bSjoerg typedef _BinaryOp<not_equal_to<value_type>, _Expr, __scalar_expr<value_type> > _Op; 4380*4d6fc14bSjoerg return __val_expr<_Op>(_Op(not_equal_to<value_type>(), 4381*4d6fc14bSjoerg __x, __scalar_expr<value_type>(__y, __x.size()))); 4382*4d6fc14bSjoerg} 4383*4d6fc14bSjoerg 4384*4d6fc14bSjoergtemplate<class _Expr> 4385*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 4386*4d6fc14bSjoergtypename enable_if 4387*4d6fc14bSjoerg< 4388*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 4389*4d6fc14bSjoerg __val_expr<_BinaryOp<not_equal_to<typename _Expr::value_type>, 4390*4d6fc14bSjoerg __scalar_expr<typename _Expr::value_type>, _Expr> > 4391*4d6fc14bSjoerg>::type 4392*4d6fc14bSjoergoperator!=(const typename _Expr::value_type& __x, const _Expr& __y) 4393*4d6fc14bSjoerg{ 4394*4d6fc14bSjoerg typedef typename _Expr::value_type value_type; 4395*4d6fc14bSjoerg typedef _BinaryOp<not_equal_to<value_type>, __scalar_expr<value_type>, _Expr> _Op; 4396*4d6fc14bSjoerg return __val_expr<_Op>(_Op(not_equal_to<value_type>(), 4397*4d6fc14bSjoerg __scalar_expr<value_type>(__x, __y.size()), __y)); 4398*4d6fc14bSjoerg} 4399*4d6fc14bSjoerg 4400*4d6fc14bSjoergtemplate<class _Expr1, class _Expr2> 4401*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 4402*4d6fc14bSjoergtypename enable_if 4403*4d6fc14bSjoerg< 4404*4d6fc14bSjoerg __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, 4405*4d6fc14bSjoerg __val_expr<_BinaryOp<less<typename _Expr1::value_type>, _Expr1, _Expr2> > 4406*4d6fc14bSjoerg>::type 4407*4d6fc14bSjoergoperator<(const _Expr1& __x, const _Expr2& __y) 4408*4d6fc14bSjoerg{ 4409*4d6fc14bSjoerg typedef typename _Expr1::value_type value_type; 4410*4d6fc14bSjoerg typedef _BinaryOp<less<value_type>, _Expr1, _Expr2> _Op; 4411*4d6fc14bSjoerg return __val_expr<_Op>(_Op(less<value_type>(), __x, __y)); 4412*4d6fc14bSjoerg} 4413*4d6fc14bSjoerg 4414*4d6fc14bSjoergtemplate<class _Expr> 4415*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 4416*4d6fc14bSjoergtypename enable_if 4417*4d6fc14bSjoerg< 4418*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 4419*4d6fc14bSjoerg __val_expr<_BinaryOp<less<typename _Expr::value_type>, 4420*4d6fc14bSjoerg _Expr, __scalar_expr<typename _Expr::value_type> > > 4421*4d6fc14bSjoerg>::type 4422*4d6fc14bSjoergoperator<(const _Expr& __x, const typename _Expr::value_type& __y) 4423*4d6fc14bSjoerg{ 4424*4d6fc14bSjoerg typedef typename _Expr::value_type value_type; 4425*4d6fc14bSjoerg typedef _BinaryOp<less<value_type>, _Expr, __scalar_expr<value_type> > _Op; 4426*4d6fc14bSjoerg return __val_expr<_Op>(_Op(less<value_type>(), 4427*4d6fc14bSjoerg __x, __scalar_expr<value_type>(__y, __x.size()))); 4428*4d6fc14bSjoerg} 4429*4d6fc14bSjoerg 4430*4d6fc14bSjoergtemplate<class _Expr> 4431*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 4432*4d6fc14bSjoergtypename enable_if 4433*4d6fc14bSjoerg< 4434*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 4435*4d6fc14bSjoerg __val_expr<_BinaryOp<less<typename _Expr::value_type>, 4436*4d6fc14bSjoerg __scalar_expr<typename _Expr::value_type>, _Expr> > 4437*4d6fc14bSjoerg>::type 4438*4d6fc14bSjoergoperator<(const typename _Expr::value_type& __x, const _Expr& __y) 4439*4d6fc14bSjoerg{ 4440*4d6fc14bSjoerg typedef typename _Expr::value_type value_type; 4441*4d6fc14bSjoerg typedef _BinaryOp<less<value_type>, __scalar_expr<value_type>, _Expr> _Op; 4442*4d6fc14bSjoerg return __val_expr<_Op>(_Op(less<value_type>(), 4443*4d6fc14bSjoerg __scalar_expr<value_type>(__x, __y.size()), __y)); 4444*4d6fc14bSjoerg} 4445*4d6fc14bSjoerg 4446*4d6fc14bSjoergtemplate<class _Expr1, class _Expr2> 4447*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 4448*4d6fc14bSjoergtypename enable_if 4449*4d6fc14bSjoerg< 4450*4d6fc14bSjoerg __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, 4451*4d6fc14bSjoerg __val_expr<_BinaryOp<greater<typename _Expr1::value_type>, _Expr1, _Expr2> > 4452*4d6fc14bSjoerg>::type 4453*4d6fc14bSjoergoperator>(const _Expr1& __x, const _Expr2& __y) 4454*4d6fc14bSjoerg{ 4455*4d6fc14bSjoerg typedef typename _Expr1::value_type value_type; 4456*4d6fc14bSjoerg typedef _BinaryOp<greater<value_type>, _Expr1, _Expr2> _Op; 4457*4d6fc14bSjoerg return __val_expr<_Op>(_Op(greater<value_type>(), __x, __y)); 4458*4d6fc14bSjoerg} 4459*4d6fc14bSjoerg 4460*4d6fc14bSjoergtemplate<class _Expr> 4461*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 4462*4d6fc14bSjoergtypename enable_if 4463*4d6fc14bSjoerg< 4464*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 4465*4d6fc14bSjoerg __val_expr<_BinaryOp<greater<typename _Expr::value_type>, 4466*4d6fc14bSjoerg _Expr, __scalar_expr<typename _Expr::value_type> > > 4467*4d6fc14bSjoerg>::type 4468*4d6fc14bSjoergoperator>(const _Expr& __x, const typename _Expr::value_type& __y) 4469*4d6fc14bSjoerg{ 4470*4d6fc14bSjoerg typedef typename _Expr::value_type value_type; 4471*4d6fc14bSjoerg typedef _BinaryOp<greater<value_type>, _Expr, __scalar_expr<value_type> > _Op; 4472*4d6fc14bSjoerg return __val_expr<_Op>(_Op(greater<value_type>(), 4473*4d6fc14bSjoerg __x, __scalar_expr<value_type>(__y, __x.size()))); 4474*4d6fc14bSjoerg} 4475*4d6fc14bSjoerg 4476*4d6fc14bSjoergtemplate<class _Expr> 4477*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 4478*4d6fc14bSjoergtypename enable_if 4479*4d6fc14bSjoerg< 4480*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 4481*4d6fc14bSjoerg __val_expr<_BinaryOp<greater<typename _Expr::value_type>, 4482*4d6fc14bSjoerg __scalar_expr<typename _Expr::value_type>, _Expr> > 4483*4d6fc14bSjoerg>::type 4484*4d6fc14bSjoergoperator>(const typename _Expr::value_type& __x, const _Expr& __y) 4485*4d6fc14bSjoerg{ 4486*4d6fc14bSjoerg typedef typename _Expr::value_type value_type; 4487*4d6fc14bSjoerg typedef _BinaryOp<greater<value_type>, __scalar_expr<value_type>, _Expr> _Op; 4488*4d6fc14bSjoerg return __val_expr<_Op>(_Op(greater<value_type>(), 4489*4d6fc14bSjoerg __scalar_expr<value_type>(__x, __y.size()), __y)); 4490*4d6fc14bSjoerg} 4491*4d6fc14bSjoerg 4492*4d6fc14bSjoergtemplate<class _Expr1, class _Expr2> 4493*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 4494*4d6fc14bSjoergtypename enable_if 4495*4d6fc14bSjoerg< 4496*4d6fc14bSjoerg __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, 4497*4d6fc14bSjoerg __val_expr<_BinaryOp<less_equal<typename _Expr1::value_type>, _Expr1, _Expr2> > 4498*4d6fc14bSjoerg>::type 4499*4d6fc14bSjoergoperator<=(const _Expr1& __x, const _Expr2& __y) 4500*4d6fc14bSjoerg{ 4501*4d6fc14bSjoerg typedef typename _Expr1::value_type value_type; 4502*4d6fc14bSjoerg typedef _BinaryOp<less_equal<value_type>, _Expr1, _Expr2> _Op; 4503*4d6fc14bSjoerg return __val_expr<_Op>(_Op(less_equal<value_type>(), __x, __y)); 4504*4d6fc14bSjoerg} 4505*4d6fc14bSjoerg 4506*4d6fc14bSjoergtemplate<class _Expr> 4507*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 4508*4d6fc14bSjoergtypename enable_if 4509*4d6fc14bSjoerg< 4510*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 4511*4d6fc14bSjoerg __val_expr<_BinaryOp<less_equal<typename _Expr::value_type>, 4512*4d6fc14bSjoerg _Expr, __scalar_expr<typename _Expr::value_type> > > 4513*4d6fc14bSjoerg>::type 4514*4d6fc14bSjoergoperator<=(const _Expr& __x, const typename _Expr::value_type& __y) 4515*4d6fc14bSjoerg{ 4516*4d6fc14bSjoerg typedef typename _Expr::value_type value_type; 4517*4d6fc14bSjoerg typedef _BinaryOp<less_equal<value_type>, _Expr, __scalar_expr<value_type> > _Op; 4518*4d6fc14bSjoerg return __val_expr<_Op>(_Op(less_equal<value_type>(), 4519*4d6fc14bSjoerg __x, __scalar_expr<value_type>(__y, __x.size()))); 4520*4d6fc14bSjoerg} 4521*4d6fc14bSjoerg 4522*4d6fc14bSjoergtemplate<class _Expr> 4523*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 4524*4d6fc14bSjoergtypename enable_if 4525*4d6fc14bSjoerg< 4526*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 4527*4d6fc14bSjoerg __val_expr<_BinaryOp<less_equal<typename _Expr::value_type>, 4528*4d6fc14bSjoerg __scalar_expr<typename _Expr::value_type>, _Expr> > 4529*4d6fc14bSjoerg>::type 4530*4d6fc14bSjoergoperator<=(const typename _Expr::value_type& __x, const _Expr& __y) 4531*4d6fc14bSjoerg{ 4532*4d6fc14bSjoerg typedef typename _Expr::value_type value_type; 4533*4d6fc14bSjoerg typedef _BinaryOp<less_equal<value_type>, __scalar_expr<value_type>, _Expr> _Op; 4534*4d6fc14bSjoerg return __val_expr<_Op>(_Op(less_equal<value_type>(), 4535*4d6fc14bSjoerg __scalar_expr<value_type>(__x, __y.size()), __y)); 4536*4d6fc14bSjoerg} 4537*4d6fc14bSjoerg 4538*4d6fc14bSjoergtemplate<class _Expr1, class _Expr2> 4539*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 4540*4d6fc14bSjoergtypename enable_if 4541*4d6fc14bSjoerg< 4542*4d6fc14bSjoerg __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, 4543*4d6fc14bSjoerg __val_expr<_BinaryOp<greater_equal<typename _Expr1::value_type>, _Expr1, _Expr2> > 4544*4d6fc14bSjoerg>::type 4545*4d6fc14bSjoergoperator>=(const _Expr1& __x, const _Expr2& __y) 4546*4d6fc14bSjoerg{ 4547*4d6fc14bSjoerg typedef typename _Expr1::value_type value_type; 4548*4d6fc14bSjoerg typedef _BinaryOp<greater_equal<value_type>, _Expr1, _Expr2> _Op; 4549*4d6fc14bSjoerg return __val_expr<_Op>(_Op(greater_equal<value_type>(), __x, __y)); 4550*4d6fc14bSjoerg} 4551*4d6fc14bSjoerg 4552*4d6fc14bSjoergtemplate<class _Expr> 4553*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 4554*4d6fc14bSjoergtypename enable_if 4555*4d6fc14bSjoerg< 4556*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 4557*4d6fc14bSjoerg __val_expr<_BinaryOp<greater_equal<typename _Expr::value_type>, 4558*4d6fc14bSjoerg _Expr, __scalar_expr<typename _Expr::value_type> > > 4559*4d6fc14bSjoerg>::type 4560*4d6fc14bSjoergoperator>=(const _Expr& __x, const typename _Expr::value_type& __y) 4561*4d6fc14bSjoerg{ 4562*4d6fc14bSjoerg typedef typename _Expr::value_type value_type; 4563*4d6fc14bSjoerg typedef _BinaryOp<greater_equal<value_type>, _Expr, __scalar_expr<value_type> > _Op; 4564*4d6fc14bSjoerg return __val_expr<_Op>(_Op(greater_equal<value_type>(), 4565*4d6fc14bSjoerg __x, __scalar_expr<value_type>(__y, __x.size()))); 4566*4d6fc14bSjoerg} 4567*4d6fc14bSjoerg 4568*4d6fc14bSjoergtemplate<class _Expr> 4569*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 4570*4d6fc14bSjoergtypename enable_if 4571*4d6fc14bSjoerg< 4572*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 4573*4d6fc14bSjoerg __val_expr<_BinaryOp<greater_equal<typename _Expr::value_type>, 4574*4d6fc14bSjoerg __scalar_expr<typename _Expr::value_type>, _Expr> > 4575*4d6fc14bSjoerg>::type 4576*4d6fc14bSjoergoperator>=(const typename _Expr::value_type& __x, const _Expr& __y) 4577*4d6fc14bSjoerg{ 4578*4d6fc14bSjoerg typedef typename _Expr::value_type value_type; 4579*4d6fc14bSjoerg typedef _BinaryOp<greater_equal<value_type>, __scalar_expr<value_type>, _Expr> _Op; 4580*4d6fc14bSjoerg return __val_expr<_Op>(_Op(greater_equal<value_type>(), 4581*4d6fc14bSjoerg __scalar_expr<value_type>(__x, __y.size()), __y)); 4582*4d6fc14bSjoerg} 4583*4d6fc14bSjoerg 4584*4d6fc14bSjoergtemplate<class _Expr> 4585*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 4586*4d6fc14bSjoergtypename enable_if 4587*4d6fc14bSjoerg< 4588*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 4589*4d6fc14bSjoerg __val_expr<_UnaryOp<__abs_expr<typename _Expr::value_type>, _Expr> > 4590*4d6fc14bSjoerg>::type 4591*4d6fc14bSjoergabs(const _Expr& __x) 4592*4d6fc14bSjoerg{ 4593*4d6fc14bSjoerg typedef typename _Expr::value_type value_type; 4594*4d6fc14bSjoerg typedef _UnaryOp<__abs_expr<value_type>, _Expr> _Op; 4595*4d6fc14bSjoerg return __val_expr<_Op>(_Op(__abs_expr<value_type>(), __x)); 4596*4d6fc14bSjoerg} 4597*4d6fc14bSjoerg 4598*4d6fc14bSjoergtemplate<class _Expr> 4599*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 4600*4d6fc14bSjoergtypename enable_if 4601*4d6fc14bSjoerg< 4602*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 4603*4d6fc14bSjoerg __val_expr<_UnaryOp<__acos_expr<typename _Expr::value_type>, _Expr> > 4604*4d6fc14bSjoerg>::type 4605*4d6fc14bSjoergacos(const _Expr& __x) 4606*4d6fc14bSjoerg{ 4607*4d6fc14bSjoerg typedef typename _Expr::value_type value_type; 4608*4d6fc14bSjoerg typedef _UnaryOp<__acos_expr<value_type>, _Expr> _Op; 4609*4d6fc14bSjoerg return __val_expr<_Op>(_Op(__acos_expr<value_type>(), __x)); 4610*4d6fc14bSjoerg} 4611*4d6fc14bSjoerg 4612*4d6fc14bSjoergtemplate<class _Expr> 4613*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 4614*4d6fc14bSjoergtypename enable_if 4615*4d6fc14bSjoerg< 4616*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 4617*4d6fc14bSjoerg __val_expr<_UnaryOp<__asin_expr<typename _Expr::value_type>, _Expr> > 4618*4d6fc14bSjoerg>::type 4619*4d6fc14bSjoergasin(const _Expr& __x) 4620*4d6fc14bSjoerg{ 4621*4d6fc14bSjoerg typedef typename _Expr::value_type value_type; 4622*4d6fc14bSjoerg typedef _UnaryOp<__asin_expr<value_type>, _Expr> _Op; 4623*4d6fc14bSjoerg return __val_expr<_Op>(_Op(__asin_expr<value_type>(), __x)); 4624*4d6fc14bSjoerg} 4625*4d6fc14bSjoerg 4626*4d6fc14bSjoergtemplate<class _Expr> 4627*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 4628*4d6fc14bSjoergtypename enable_if 4629*4d6fc14bSjoerg< 4630*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 4631*4d6fc14bSjoerg __val_expr<_UnaryOp<__atan_expr<typename _Expr::value_type>, _Expr> > 4632*4d6fc14bSjoerg>::type 4633*4d6fc14bSjoergatan(const _Expr& __x) 4634*4d6fc14bSjoerg{ 4635*4d6fc14bSjoerg typedef typename _Expr::value_type value_type; 4636*4d6fc14bSjoerg typedef _UnaryOp<__atan_expr<value_type>, _Expr> _Op; 4637*4d6fc14bSjoerg return __val_expr<_Op>(_Op(__atan_expr<value_type>(), __x)); 4638*4d6fc14bSjoerg} 4639*4d6fc14bSjoerg 4640*4d6fc14bSjoergtemplate<class _Expr1, class _Expr2> 4641*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 4642*4d6fc14bSjoergtypename enable_if 4643*4d6fc14bSjoerg< 4644*4d6fc14bSjoerg __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, 4645*4d6fc14bSjoerg __val_expr<_BinaryOp<__atan2_expr<typename _Expr1::value_type>, _Expr1, _Expr2> > 4646*4d6fc14bSjoerg>::type 4647*4d6fc14bSjoergatan2(const _Expr1& __x, const _Expr2& __y) 4648*4d6fc14bSjoerg{ 4649*4d6fc14bSjoerg typedef typename _Expr1::value_type value_type; 4650*4d6fc14bSjoerg typedef _BinaryOp<__atan2_expr<value_type>, _Expr1, _Expr2> _Op; 4651*4d6fc14bSjoerg return __val_expr<_Op>(_Op(__atan2_expr<value_type>(), __x, __y)); 4652*4d6fc14bSjoerg} 4653*4d6fc14bSjoerg 4654*4d6fc14bSjoergtemplate<class _Expr> 4655*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 4656*4d6fc14bSjoergtypename enable_if 4657*4d6fc14bSjoerg< 4658*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 4659*4d6fc14bSjoerg __val_expr<_BinaryOp<__atan2_expr<typename _Expr::value_type>, 4660*4d6fc14bSjoerg _Expr, __scalar_expr<typename _Expr::value_type> > > 4661*4d6fc14bSjoerg>::type 4662*4d6fc14bSjoergatan2(const _Expr& __x, const typename _Expr::value_type& __y) 4663*4d6fc14bSjoerg{ 4664*4d6fc14bSjoerg typedef typename _Expr::value_type value_type; 4665*4d6fc14bSjoerg typedef _BinaryOp<__atan2_expr<value_type>, _Expr, __scalar_expr<value_type> > _Op; 4666*4d6fc14bSjoerg return __val_expr<_Op>(_Op(__atan2_expr<value_type>(), 4667*4d6fc14bSjoerg __x, __scalar_expr<value_type>(__y, __x.size()))); 4668*4d6fc14bSjoerg} 4669*4d6fc14bSjoerg 4670*4d6fc14bSjoergtemplate<class _Expr> 4671*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 4672*4d6fc14bSjoergtypename enable_if 4673*4d6fc14bSjoerg< 4674*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 4675*4d6fc14bSjoerg __val_expr<_BinaryOp<__atan2_expr<typename _Expr::value_type>, 4676*4d6fc14bSjoerg __scalar_expr<typename _Expr::value_type>, _Expr> > 4677*4d6fc14bSjoerg>::type 4678*4d6fc14bSjoergatan2(const typename _Expr::value_type& __x, const _Expr& __y) 4679*4d6fc14bSjoerg{ 4680*4d6fc14bSjoerg typedef typename _Expr::value_type value_type; 4681*4d6fc14bSjoerg typedef _BinaryOp<__atan2_expr<value_type>, __scalar_expr<value_type>, _Expr> _Op; 4682*4d6fc14bSjoerg return __val_expr<_Op>(_Op(__atan2_expr<value_type>(), 4683*4d6fc14bSjoerg __scalar_expr<value_type>(__x, __y.size()), __y)); 4684*4d6fc14bSjoerg} 4685*4d6fc14bSjoerg 4686*4d6fc14bSjoergtemplate<class _Expr> 4687*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 4688*4d6fc14bSjoergtypename enable_if 4689*4d6fc14bSjoerg< 4690*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 4691*4d6fc14bSjoerg __val_expr<_UnaryOp<__cos_expr<typename _Expr::value_type>, _Expr> > 4692*4d6fc14bSjoerg>::type 4693*4d6fc14bSjoergcos(const _Expr& __x) 4694*4d6fc14bSjoerg{ 4695*4d6fc14bSjoerg typedef typename _Expr::value_type value_type; 4696*4d6fc14bSjoerg typedef _UnaryOp<__cos_expr<value_type>, _Expr> _Op; 4697*4d6fc14bSjoerg return __val_expr<_Op>(_Op(__cos_expr<value_type>(), __x)); 4698*4d6fc14bSjoerg} 4699*4d6fc14bSjoerg 4700*4d6fc14bSjoergtemplate<class _Expr> 4701*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 4702*4d6fc14bSjoergtypename enable_if 4703*4d6fc14bSjoerg< 4704*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 4705*4d6fc14bSjoerg __val_expr<_UnaryOp<__cosh_expr<typename _Expr::value_type>, _Expr> > 4706*4d6fc14bSjoerg>::type 4707*4d6fc14bSjoergcosh(const _Expr& __x) 4708*4d6fc14bSjoerg{ 4709*4d6fc14bSjoerg typedef typename _Expr::value_type value_type; 4710*4d6fc14bSjoerg typedef _UnaryOp<__cosh_expr<value_type>, _Expr> _Op; 4711*4d6fc14bSjoerg return __val_expr<_Op>(_Op(__cosh_expr<value_type>(), __x)); 4712*4d6fc14bSjoerg} 4713*4d6fc14bSjoerg 4714*4d6fc14bSjoergtemplate<class _Expr> 4715*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 4716*4d6fc14bSjoergtypename enable_if 4717*4d6fc14bSjoerg< 4718*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 4719*4d6fc14bSjoerg __val_expr<_UnaryOp<__exp_expr<typename _Expr::value_type>, _Expr> > 4720*4d6fc14bSjoerg>::type 4721*4d6fc14bSjoergexp(const _Expr& __x) 4722*4d6fc14bSjoerg{ 4723*4d6fc14bSjoerg typedef typename _Expr::value_type value_type; 4724*4d6fc14bSjoerg typedef _UnaryOp<__exp_expr<value_type>, _Expr> _Op; 4725*4d6fc14bSjoerg return __val_expr<_Op>(_Op(__exp_expr<value_type>(), __x)); 4726*4d6fc14bSjoerg} 4727*4d6fc14bSjoerg 4728*4d6fc14bSjoergtemplate<class _Expr> 4729*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 4730*4d6fc14bSjoergtypename enable_if 4731*4d6fc14bSjoerg< 4732*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 4733*4d6fc14bSjoerg __val_expr<_UnaryOp<__log_expr<typename _Expr::value_type>, _Expr> > 4734*4d6fc14bSjoerg>::type 4735*4d6fc14bSjoerglog(const _Expr& __x) 4736*4d6fc14bSjoerg{ 4737*4d6fc14bSjoerg typedef typename _Expr::value_type value_type; 4738*4d6fc14bSjoerg typedef _UnaryOp<__log_expr<value_type>, _Expr> _Op; 4739*4d6fc14bSjoerg return __val_expr<_Op>(_Op(__log_expr<value_type>(), __x)); 4740*4d6fc14bSjoerg} 4741*4d6fc14bSjoerg 4742*4d6fc14bSjoergtemplate<class _Expr> 4743*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 4744*4d6fc14bSjoergtypename enable_if 4745*4d6fc14bSjoerg< 4746*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 4747*4d6fc14bSjoerg __val_expr<_UnaryOp<__log10_expr<typename _Expr::value_type>, _Expr> > 4748*4d6fc14bSjoerg>::type 4749*4d6fc14bSjoerglog10(const _Expr& __x) 4750*4d6fc14bSjoerg{ 4751*4d6fc14bSjoerg typedef typename _Expr::value_type value_type; 4752*4d6fc14bSjoerg typedef _UnaryOp<__log10_expr<value_type>, _Expr> _Op; 4753*4d6fc14bSjoerg return __val_expr<_Op>(_Op(__log10_expr<value_type>(), __x)); 4754*4d6fc14bSjoerg} 4755*4d6fc14bSjoerg 4756*4d6fc14bSjoergtemplate<class _Expr1, class _Expr2> 4757*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 4758*4d6fc14bSjoergtypename enable_if 4759*4d6fc14bSjoerg< 4760*4d6fc14bSjoerg __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, 4761*4d6fc14bSjoerg __val_expr<_BinaryOp<__pow_expr<typename _Expr1::value_type>, _Expr1, _Expr2> > 4762*4d6fc14bSjoerg>::type 4763*4d6fc14bSjoergpow(const _Expr1& __x, const _Expr2& __y) 4764*4d6fc14bSjoerg{ 4765*4d6fc14bSjoerg typedef typename _Expr1::value_type value_type; 4766*4d6fc14bSjoerg typedef _BinaryOp<__pow_expr<value_type>, _Expr1, _Expr2> _Op; 4767*4d6fc14bSjoerg return __val_expr<_Op>(_Op(__pow_expr<value_type>(), __x, __y)); 4768*4d6fc14bSjoerg} 4769*4d6fc14bSjoerg 4770*4d6fc14bSjoergtemplate<class _Expr> 4771*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 4772*4d6fc14bSjoergtypename enable_if 4773*4d6fc14bSjoerg< 4774*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 4775*4d6fc14bSjoerg __val_expr<_BinaryOp<__pow_expr<typename _Expr::value_type>, 4776*4d6fc14bSjoerg _Expr, __scalar_expr<typename _Expr::value_type> > > 4777*4d6fc14bSjoerg>::type 4778*4d6fc14bSjoergpow(const _Expr& __x, const typename _Expr::value_type& __y) 4779*4d6fc14bSjoerg{ 4780*4d6fc14bSjoerg typedef typename _Expr::value_type value_type; 4781*4d6fc14bSjoerg typedef _BinaryOp<__pow_expr<value_type>, _Expr, __scalar_expr<value_type> > _Op; 4782*4d6fc14bSjoerg return __val_expr<_Op>(_Op(__pow_expr<value_type>(), 4783*4d6fc14bSjoerg __x, __scalar_expr<value_type>(__y, __x.size()))); 4784*4d6fc14bSjoerg} 4785*4d6fc14bSjoerg 4786*4d6fc14bSjoergtemplate<class _Expr> 4787*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 4788*4d6fc14bSjoergtypename enable_if 4789*4d6fc14bSjoerg< 4790*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 4791*4d6fc14bSjoerg __val_expr<_BinaryOp<__pow_expr<typename _Expr::value_type>, 4792*4d6fc14bSjoerg __scalar_expr<typename _Expr::value_type>, _Expr> > 4793*4d6fc14bSjoerg>::type 4794*4d6fc14bSjoergpow(const typename _Expr::value_type& __x, const _Expr& __y) 4795*4d6fc14bSjoerg{ 4796*4d6fc14bSjoerg typedef typename _Expr::value_type value_type; 4797*4d6fc14bSjoerg typedef _BinaryOp<__pow_expr<value_type>, __scalar_expr<value_type>, _Expr> _Op; 4798*4d6fc14bSjoerg return __val_expr<_Op>(_Op(__pow_expr<value_type>(), 4799*4d6fc14bSjoerg __scalar_expr<value_type>(__x, __y.size()), __y)); 4800*4d6fc14bSjoerg} 4801*4d6fc14bSjoerg 4802*4d6fc14bSjoergtemplate<class _Expr> 4803*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 4804*4d6fc14bSjoergtypename enable_if 4805*4d6fc14bSjoerg< 4806*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 4807*4d6fc14bSjoerg __val_expr<_UnaryOp<__sin_expr<typename _Expr::value_type>, _Expr> > 4808*4d6fc14bSjoerg>::type 4809*4d6fc14bSjoergsin(const _Expr& __x) 4810*4d6fc14bSjoerg{ 4811*4d6fc14bSjoerg typedef typename _Expr::value_type value_type; 4812*4d6fc14bSjoerg typedef _UnaryOp<__sin_expr<value_type>, _Expr> _Op; 4813*4d6fc14bSjoerg return __val_expr<_Op>(_Op(__sin_expr<value_type>(), __x)); 4814*4d6fc14bSjoerg} 4815*4d6fc14bSjoerg 4816*4d6fc14bSjoergtemplate<class _Expr> 4817*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 4818*4d6fc14bSjoergtypename enable_if 4819*4d6fc14bSjoerg< 4820*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 4821*4d6fc14bSjoerg __val_expr<_UnaryOp<__sinh_expr<typename _Expr::value_type>, _Expr> > 4822*4d6fc14bSjoerg>::type 4823*4d6fc14bSjoergsinh(const _Expr& __x) 4824*4d6fc14bSjoerg{ 4825*4d6fc14bSjoerg typedef typename _Expr::value_type value_type; 4826*4d6fc14bSjoerg typedef _UnaryOp<__sinh_expr<value_type>, _Expr> _Op; 4827*4d6fc14bSjoerg return __val_expr<_Op>(_Op(__sinh_expr<value_type>(), __x)); 4828*4d6fc14bSjoerg} 4829*4d6fc14bSjoerg 4830*4d6fc14bSjoergtemplate<class _Expr> 4831*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 4832*4d6fc14bSjoergtypename enable_if 4833*4d6fc14bSjoerg< 4834*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 4835*4d6fc14bSjoerg __val_expr<_UnaryOp<__sqrt_expr<typename _Expr::value_type>, _Expr> > 4836*4d6fc14bSjoerg>::type 4837*4d6fc14bSjoergsqrt(const _Expr& __x) 4838*4d6fc14bSjoerg{ 4839*4d6fc14bSjoerg typedef typename _Expr::value_type value_type; 4840*4d6fc14bSjoerg typedef _UnaryOp<__sqrt_expr<value_type>, _Expr> _Op; 4841*4d6fc14bSjoerg return __val_expr<_Op>(_Op(__sqrt_expr<value_type>(), __x)); 4842*4d6fc14bSjoerg} 4843*4d6fc14bSjoerg 4844*4d6fc14bSjoergtemplate<class _Expr> 4845*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 4846*4d6fc14bSjoergtypename enable_if 4847*4d6fc14bSjoerg< 4848*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 4849*4d6fc14bSjoerg __val_expr<_UnaryOp<__tan_expr<typename _Expr::value_type>, _Expr> > 4850*4d6fc14bSjoerg>::type 4851*4d6fc14bSjoergtan(const _Expr& __x) 4852*4d6fc14bSjoerg{ 4853*4d6fc14bSjoerg typedef typename _Expr::value_type value_type; 4854*4d6fc14bSjoerg typedef _UnaryOp<__tan_expr<value_type>, _Expr> _Op; 4855*4d6fc14bSjoerg return __val_expr<_Op>(_Op(__tan_expr<value_type>(), __x)); 4856*4d6fc14bSjoerg} 4857*4d6fc14bSjoerg 4858*4d6fc14bSjoergtemplate<class _Expr> 4859*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 4860*4d6fc14bSjoergtypename enable_if 4861*4d6fc14bSjoerg< 4862*4d6fc14bSjoerg __is_val_expr<_Expr>::value, 4863*4d6fc14bSjoerg __val_expr<_UnaryOp<__tanh_expr<typename _Expr::value_type>, _Expr> > 4864*4d6fc14bSjoerg>::type 4865*4d6fc14bSjoergtanh(const _Expr& __x) 4866*4d6fc14bSjoerg{ 4867*4d6fc14bSjoerg typedef typename _Expr::value_type value_type; 4868*4d6fc14bSjoerg typedef _UnaryOp<__tanh_expr<value_type>, _Expr> _Op; 4869*4d6fc14bSjoerg return __val_expr<_Op>(_Op(__tanh_expr<value_type>(), __x)); 4870*4d6fc14bSjoerg} 4871*4d6fc14bSjoerg 4872*4d6fc14bSjoergtemplate <class _Tp> 4873*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 4874*4d6fc14bSjoerg_Tp* 4875*4d6fc14bSjoergbegin(valarray<_Tp>& __v) 4876*4d6fc14bSjoerg{ 4877*4d6fc14bSjoerg return __v.__begin_; 4878*4d6fc14bSjoerg} 4879*4d6fc14bSjoerg 4880*4d6fc14bSjoergtemplate <class _Tp> 4881*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 4882*4d6fc14bSjoergconst _Tp* 4883*4d6fc14bSjoergbegin(const valarray<_Tp>& __v) 4884*4d6fc14bSjoerg{ 4885*4d6fc14bSjoerg return __v.__begin_; 4886*4d6fc14bSjoerg} 4887*4d6fc14bSjoerg 4888*4d6fc14bSjoergtemplate <class _Tp> 4889*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 4890*4d6fc14bSjoerg_Tp* 4891*4d6fc14bSjoergend(valarray<_Tp>& __v) 4892*4d6fc14bSjoerg{ 4893*4d6fc14bSjoerg return __v.__end_; 4894*4d6fc14bSjoerg} 4895*4d6fc14bSjoerg 4896*4d6fc14bSjoergtemplate <class _Tp> 4897*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 4898*4d6fc14bSjoergconst _Tp* 4899*4d6fc14bSjoergend(const valarray<_Tp>& __v) 4900*4d6fc14bSjoerg{ 4901*4d6fc14bSjoerg return __v.__end_; 4902*4d6fc14bSjoerg} 4903*4d6fc14bSjoerg 4904*4d6fc14bSjoerg_LIBCPP_END_NAMESPACE_STD 4905*4d6fc14bSjoerg 4906*4d6fc14bSjoerg_LIBCPP_POP_MACROS 4907*4d6fc14bSjoerg 4908*4d6fc14bSjoerg#endif // _LIBCPP_VALARRAY 4909