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