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