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