xref: /freebsd/contrib/llvm-project/libcxx/include/valarray (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
1 0b57cec5SDimitry Andric// -*- C++ -*-
2 349cc55cSDimitry Andric//===----------------------------------------------------------------------===//
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 349cc55cSDimitry Andrictemplate<class T, size_t cnt> valarray(const T(&)[cnt], size_t) -> valarray<T>;
109 349cc55cSDimitry Andric
110 0b57cec5SDimitry Andricclass slice
111 0b57cec5SDimitry Andric{
112 0b57cec5SDimitry Andricpublic:
113 0b57cec5SDimitry Andric    slice();
114 0b57cec5SDimitry Andric    slice(size_t start, size_t size, size_t stride);
115 0b57cec5SDimitry Andric
116 0b57cec5SDimitry Andric    size_t start()  const;
117 0b57cec5SDimitry Andric    size_t size()   const;
118 0b57cec5SDimitry Andric    size_t stride() const;
119 06c3fb27SDimitry Andric
120 06c3fb27SDimitry Andric    friend bool operator==(const slice& x, const slice& y); // since C++20
121 0b57cec5SDimitry Andric};
122 0b57cec5SDimitry Andric
123 0b57cec5SDimitry Andrictemplate <class T>
124 0b57cec5SDimitry Andricclass slice_array
125 0b57cec5SDimitry Andric{
126 0b57cec5SDimitry Andricpublic:
127 0b57cec5SDimitry Andric    typedef T value_type;
128 0b57cec5SDimitry Andric
129 0b57cec5SDimitry Andric    const slice_array& operator=(const slice_array& sa) 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    void operator&= (const valarray<value_type>& v) const;
138 0b57cec5SDimitry Andric    void operator|= (const valarray<value_type>& v) const;
139 0b57cec5SDimitry Andric    void operator<<=(const valarray<value_type>& v) const;
140 0b57cec5SDimitry Andric    void operator>>=(const valarray<value_type>& v) const;
141 0b57cec5SDimitry Andric
142 0b57cec5SDimitry Andric    void operator=(const value_type& x) const;
143 e8d8bef9SDimitry Andric    void operator=(const valarray<T>& val_arr) const;
144 0b57cec5SDimitry Andric
145 0b57cec5SDimitry Andric    slice_array() = delete;
146 0b57cec5SDimitry Andric};
147 0b57cec5SDimitry Andric
148 0b57cec5SDimitry Andricclass gslice
149 0b57cec5SDimitry Andric{
150 0b57cec5SDimitry Andricpublic:
151 0b57cec5SDimitry Andric    gslice();
152 0b57cec5SDimitry Andric    gslice(size_t start, const valarray<size_t>& size,
153 0b57cec5SDimitry Andric                         const valarray<size_t>& stride);
154 0b57cec5SDimitry Andric
155 0b57cec5SDimitry Andric    size_t           start()  const;
156 0b57cec5SDimitry Andric    valarray<size_t> size()   const;
157 0b57cec5SDimitry Andric    valarray<size_t> stride() const;
158 0b57cec5SDimitry Andric};
159 0b57cec5SDimitry Andric
160 0b57cec5SDimitry Andrictemplate <class T>
161 0b57cec5SDimitry Andricclass gslice_array
162 0b57cec5SDimitry Andric{
163 0b57cec5SDimitry Andricpublic:
164 0b57cec5SDimitry Andric    typedef T value_type;
165 0b57cec5SDimitry Andric
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    void operator^= (const valarray<value_type>& v) const;
173 0b57cec5SDimitry Andric    void operator&= (const valarray<value_type>& v) const;
174 0b57cec5SDimitry Andric    void operator|= (const valarray<value_type>& v) const;
175 0b57cec5SDimitry Andric    void operator<<=(const valarray<value_type>& v) const;
176 0b57cec5SDimitry Andric    void operator>>=(const valarray<value_type>& v) const;
177 0b57cec5SDimitry Andric
178 0b57cec5SDimitry Andric    gslice_array(const gslice_array& ga);
179 0b57cec5SDimitry Andric    ~gslice_array();
180 0b57cec5SDimitry Andric    const gslice_array& operator=(const gslice_array& ga) const;
181 0b57cec5SDimitry Andric    void operator=(const value_type& x) const;
182 0b57cec5SDimitry Andric
183 0b57cec5SDimitry Andric    gslice_array() = delete;
184 0b57cec5SDimitry Andric};
185 0b57cec5SDimitry Andric
186 0b57cec5SDimitry Andrictemplate <class T>
187 0b57cec5SDimitry Andricclass mask_array
188 0b57cec5SDimitry Andric{
189 0b57cec5SDimitry Andricpublic:
190 0b57cec5SDimitry Andric    typedef T value_type;
191 0b57cec5SDimitry Andric
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    void operator^= (const valarray<value_type>& v) const;
199 0b57cec5SDimitry Andric    void operator&= (const valarray<value_type>& v) const;
200 0b57cec5SDimitry Andric    void operator|= (const valarray<value_type>& v) const;
201 0b57cec5SDimitry Andric    void operator<<=(const valarray<value_type>& v) const;
202 0b57cec5SDimitry Andric    void operator>>=(const valarray<value_type>& v) const;
203 0b57cec5SDimitry Andric
204 0b57cec5SDimitry Andric    mask_array(const mask_array& ma);
205 0b57cec5SDimitry Andric    ~mask_array();
206 0b57cec5SDimitry Andric    const mask_array& operator=(const mask_array& ma) const;
207 0b57cec5SDimitry Andric    void operator=(const value_type& x) const;
208 0b57cec5SDimitry Andric
209 0b57cec5SDimitry Andric    mask_array() = delete;
210 0b57cec5SDimitry Andric};
211 0b57cec5SDimitry Andric
212 0b57cec5SDimitry Andrictemplate <class T>
213 0b57cec5SDimitry Andricclass indirect_array
214 0b57cec5SDimitry Andric{
215 0b57cec5SDimitry Andricpublic:
216 0b57cec5SDimitry Andric    typedef T value_type;
217 0b57cec5SDimitry Andric
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    void operator^= (const valarray<value_type>& v) const;
225 0b57cec5SDimitry Andric    void operator&= (const valarray<value_type>& v) const;
226 0b57cec5SDimitry Andric    void operator|= (const valarray<value_type>& v) const;
227 0b57cec5SDimitry Andric    void operator<<=(const valarray<value_type>& v) const;
228 0b57cec5SDimitry Andric    void operator>>=(const valarray<value_type>& v) const;
229 0b57cec5SDimitry Andric
230 0b57cec5SDimitry Andric    indirect_array(const indirect_array& ia);
231 0b57cec5SDimitry Andric    ~indirect_array();
232 0b57cec5SDimitry Andric    const indirect_array& operator=(const indirect_array& ia) const;
233 0b57cec5SDimitry Andric    void operator=(const value_type& x) const;
234 0b57cec5SDimitry Andric
235 0b57cec5SDimitry Andric    indirect_array() = delete;
236 0b57cec5SDimitry Andric};
237 0b57cec5SDimitry Andric
238 0b57cec5SDimitry Andrictemplate<class T> void swap(valarray<T>& x, valarray<T>& y) noexcept;
239 0b57cec5SDimitry Andric
240 0b57cec5SDimitry Andrictemplate<class T> valarray<T> operator* (const valarray<T>& x, const valarray<T>& y);
241 0b57cec5SDimitry Andrictemplate<class T> valarray<T> operator* (const valarray<T>& x, const T& y);
242 0b57cec5SDimitry Andrictemplate<class T> valarray<T> operator* (const T& x, const valarray<T>& y);
243 0b57cec5SDimitry Andric
244 0b57cec5SDimitry Andrictemplate<class T> valarray<T> operator/ (const valarray<T>& x, const valarray<T>& y);
245 0b57cec5SDimitry Andrictemplate<class T> valarray<T> operator/ (const valarray<T>& x, const T& y);
246 0b57cec5SDimitry Andrictemplate<class T> valarray<T> operator/ (const T& x, const valarray<T>& y);
247 0b57cec5SDimitry Andric
248 0b57cec5SDimitry Andrictemplate<class T> valarray<T> operator% (const valarray<T>& x, const valarray<T>& y);
249 0b57cec5SDimitry Andrictemplate<class T> valarray<T> operator% (const valarray<T>& x, const T& y);
250 0b57cec5SDimitry Andrictemplate<class T> valarray<T> operator% (const T& x, const valarray<T>& y);
251 0b57cec5SDimitry Andric
252 0b57cec5SDimitry Andrictemplate<class T> valarray<T> operator+ (const valarray<T>& x, const valarray<T>& y);
253 0b57cec5SDimitry Andrictemplate<class T> valarray<T> operator+ (const valarray<T>& x, const T& y);
254 0b57cec5SDimitry Andrictemplate<class T> valarray<T> operator+ (const T& x, const valarray<T>& y);
255 0b57cec5SDimitry Andric
256 0b57cec5SDimitry Andrictemplate<class T> valarray<T> operator- (const valarray<T>& x, const valarray<T>& y);
257 0b57cec5SDimitry Andrictemplate<class T> valarray<T> operator- (const valarray<T>& x, const T& y);
258 0b57cec5SDimitry Andrictemplate<class T> valarray<T> operator- (const T& x, const valarray<T>& y);
259 0b57cec5SDimitry Andric
260 0b57cec5SDimitry Andrictemplate<class T> valarray<T> operator^ (const valarray<T>& x, const valarray<T>& y);
261 0b57cec5SDimitry Andrictemplate<class T> valarray<T> operator^ (const valarray<T>& x, const T& y);
262 0b57cec5SDimitry Andrictemplate<class T> valarray<T> operator^ (const T& x, const valarray<T>& y);
263 0b57cec5SDimitry Andric
264 0b57cec5SDimitry Andrictemplate<class T> valarray<T> operator& (const valarray<T>& x, const valarray<T>& y);
265 0b57cec5SDimitry Andrictemplate<class T> valarray<T> operator& (const valarray<T>& x, const T& y);
266 0b57cec5SDimitry Andrictemplate<class T> valarray<T> operator& (const T& x, const valarray<T>& y);
267 0b57cec5SDimitry Andric
268 0b57cec5SDimitry Andrictemplate<class T> valarray<T> operator| (const valarray<T>& x, const valarray<T>& y);
269 0b57cec5SDimitry Andrictemplate<class T> valarray<T> operator| (const valarray<T>& x, const T& y);
270 0b57cec5SDimitry Andrictemplate<class T> valarray<T> operator| (const T& x, const valarray<T>& y);
271 0b57cec5SDimitry Andric
272 0b57cec5SDimitry Andrictemplate<class T> valarray<T> operator<<(const valarray<T>& x, const valarray<T>& y);
273 0b57cec5SDimitry Andrictemplate<class T> valarray<T> operator<<(const valarray<T>& x, const T& y);
274 0b57cec5SDimitry Andrictemplate<class T> valarray<T> operator<<(const T& x, const valarray<T>& y);
275 0b57cec5SDimitry Andric
276 0b57cec5SDimitry Andrictemplate<class T> valarray<T> operator>>(const valarray<T>& x, const valarray<T>& y);
277 0b57cec5SDimitry Andrictemplate<class T> valarray<T> operator>>(const valarray<T>& x, const T& y);
278 0b57cec5SDimitry Andrictemplate<class T> valarray<T> operator>>(const T& x, const valarray<T>& y);
279 0b57cec5SDimitry Andric
280 0b57cec5SDimitry Andrictemplate<class T> valarray<bool> operator&&(const valarray<T>& x, const valarray<T>& y);
281 0b57cec5SDimitry Andrictemplate<class T> valarray<bool> operator&&(const valarray<T>& x, const T& y);
282 0b57cec5SDimitry Andrictemplate<class T> valarray<bool> operator&&(const T& x, const valarray<T>& y);
283 0b57cec5SDimitry Andric
284 0b57cec5SDimitry Andrictemplate<class T> valarray<bool> operator||(const valarray<T>& x, const valarray<T>& y);
285 0b57cec5SDimitry Andrictemplate<class T> valarray<bool> operator||(const valarray<T>& x, const T& y);
286 0b57cec5SDimitry Andrictemplate<class T> valarray<bool> operator||(const T& x, const valarray<T>& y);
287 0b57cec5SDimitry Andric
288 0b57cec5SDimitry Andrictemplate<class T> valarray<bool> operator==(const valarray<T>& x, const valarray<T>& y);
289 0b57cec5SDimitry Andrictemplate<class T> valarray<bool> operator==(const valarray<T>& x, const T& y);
290 0b57cec5SDimitry Andrictemplate<class T> valarray<bool> operator==(const T& x, const valarray<T>& y);
291 0b57cec5SDimitry Andric
292 0b57cec5SDimitry Andrictemplate<class T> valarray<bool> operator!=(const valarray<T>& x, const valarray<T>& y);
293 0b57cec5SDimitry Andrictemplate<class T> valarray<bool> operator!=(const valarray<T>& x, const T& y);
294 0b57cec5SDimitry Andrictemplate<class T> valarray<bool> operator!=(const T& x, const valarray<T>& y);
295 0b57cec5SDimitry Andric
296 0b57cec5SDimitry Andrictemplate<class T> valarray<bool> operator< (const valarray<T>& x, const valarray<T>& y);
297 0b57cec5SDimitry Andrictemplate<class T> valarray<bool> operator< (const valarray<T>& x, const T& y);
298 0b57cec5SDimitry Andrictemplate<class T> valarray<bool> operator< (const T& x, const valarray<T>& y);
299 0b57cec5SDimitry Andric
300 0b57cec5SDimitry Andrictemplate<class T> valarray<bool> operator> (const valarray<T>& x, const valarray<T>& y);
301 0b57cec5SDimitry Andrictemplate<class T> valarray<bool> operator> (const valarray<T>& x, const T& y);
302 0b57cec5SDimitry Andrictemplate<class T> valarray<bool> operator> (const T& x, const valarray<T>& y);
303 0b57cec5SDimitry Andric
304 0b57cec5SDimitry Andrictemplate<class T> valarray<bool> operator<=(const valarray<T>& x, const valarray<T>& y);
305 0b57cec5SDimitry Andrictemplate<class T> valarray<bool> operator<=(const valarray<T>& x, const T& y);
306 0b57cec5SDimitry Andrictemplate<class T> valarray<bool> operator<=(const T& x, const valarray<T>& y);
307 0b57cec5SDimitry Andric
308 0b57cec5SDimitry Andrictemplate<class T> valarray<bool> operator>=(const valarray<T>& x, const valarray<T>& y);
309 0b57cec5SDimitry Andrictemplate<class T> valarray<bool> operator>=(const valarray<T>& x, const T& y);
310 0b57cec5SDimitry Andrictemplate<class T> valarray<bool> operator>=(const T& x, const valarray<T>& y);
311 0b57cec5SDimitry Andric
312 0b57cec5SDimitry Andrictemplate<class T> valarray<T> abs (const valarray<T>& x);
313 0b57cec5SDimitry Andrictemplate<class T> valarray<T> acos (const valarray<T>& x);
314 0b57cec5SDimitry Andrictemplate<class T> valarray<T> asin (const valarray<T>& x);
315 0b57cec5SDimitry Andrictemplate<class T> valarray<T> atan (const valarray<T>& x);
316 0b57cec5SDimitry Andric
317 0b57cec5SDimitry Andrictemplate<class T> valarray<T> atan2(const valarray<T>& x, const valarray<T>& y);
318 0b57cec5SDimitry Andrictemplate<class T> valarray<T> atan2(const valarray<T>& x, const T& y);
319 0b57cec5SDimitry Andrictemplate<class T> valarray<T> atan2(const T& x, const valarray<T>& y);
320 0b57cec5SDimitry Andric
321 0b57cec5SDimitry Andrictemplate<class T> valarray<T> cos (const valarray<T>& x);
322 0b57cec5SDimitry Andrictemplate<class T> valarray<T> cosh (const valarray<T>& x);
323 0b57cec5SDimitry Andrictemplate<class T> valarray<T> exp (const valarray<T>& x);
324 0b57cec5SDimitry Andrictemplate<class T> valarray<T> log (const valarray<T>& x);
325 0b57cec5SDimitry Andrictemplate<class T> valarray<T> log10(const valarray<T>& x);
326 0b57cec5SDimitry Andric
327 0b57cec5SDimitry Andrictemplate<class T> valarray<T> pow(const valarray<T>& x, const valarray<T>& y);
328 0b57cec5SDimitry Andrictemplate<class T> valarray<T> pow(const valarray<T>& x, const T& y);
329 0b57cec5SDimitry Andrictemplate<class T> valarray<T> pow(const T& x, const valarray<T>& y);
330 0b57cec5SDimitry Andric
331 0b57cec5SDimitry Andrictemplate<class T> valarray<T> sin (const valarray<T>& x);
332 0b57cec5SDimitry Andrictemplate<class T> valarray<T> sinh (const valarray<T>& x);
333 0b57cec5SDimitry Andrictemplate<class T> valarray<T> sqrt (const valarray<T>& x);
334 0b57cec5SDimitry Andrictemplate<class T> valarray<T> tan (const valarray<T>& x);
335 0b57cec5SDimitry Andrictemplate<class T> valarray<T> tanh (const valarray<T>& x);
336 0b57cec5SDimitry Andric
337 0b57cec5SDimitry Andrictemplate <class T> unspecified1 begin(valarray<T>& v);
338 0b57cec5SDimitry Andrictemplate <class T> unspecified2 begin(const valarray<T>& v);
339 0b57cec5SDimitry Andrictemplate <class T> unspecified1 end(valarray<T>& v);
340 0b57cec5SDimitry Andrictemplate <class T> unspecified2 end(const valarray<T>& v);
341 0b57cec5SDimitry Andric
342 0b57cec5SDimitry Andric}  // std
343 0b57cec5SDimitry Andric
344 0b57cec5SDimitry Andric*/
345 0b57cec5SDimitry Andric
346 81ad6265SDimitry Andric#include <__algorithm/copy.h>
347 81ad6265SDimitry Andric#include <__algorithm/count.h>
348 81ad6265SDimitry Andric#include <__algorithm/fill.h>
349 81ad6265SDimitry Andric#include <__algorithm/max_element.h>
350 81ad6265SDimitry Andric#include <__algorithm/min.h>
351 81ad6265SDimitry Andric#include <__algorithm/min_element.h>
352 81ad6265SDimitry Andric#include <__algorithm/unwrap_iter.h>
353 *0fca6ea1SDimitry Andric#include <__assert>
354 0b57cec5SDimitry Andric#include <__config>
355 81ad6265SDimitry Andric#include <__functional/operations.h>
356 06c3fb27SDimitry Andric#include <__memory/addressof.h>
357 81ad6265SDimitry Andric#include <__memory/allocator.h>
358 81ad6265SDimitry Andric#include <__memory/uninitialized_algorithms.h>
359 06c3fb27SDimitry Andric#include <__type_traits/decay.h>
360 bdd1243dSDimitry Andric#include <__type_traits/remove_reference.h>
361 81ad6265SDimitry Andric#include <__utility/move.h>
362 81ad6265SDimitry Andric#include <__utility/swap.h>
363 fe6060f1SDimitry Andric#include <cmath>
364 fe6060f1SDimitry Andric#include <cstddef>
365 0b57cec5SDimitry Andric#include <new>
366 04eeddc0SDimitry Andric#include <version>
367 0b57cec5SDimitry Andric
368 81ad6265SDimitry Andric// standard-mandated includes
369 bdd1243dSDimitry Andric
370 bdd1243dSDimitry Andric// [valarray.syn]
371 81ad6265SDimitry Andric#include <initializer_list>
372 81ad6265SDimitry Andric
373 0b57cec5SDimitry Andric#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
374 0b57cec5SDimitry Andric#  pragma GCC system_header
375 0b57cec5SDimitry Andric#endif
376 0b57cec5SDimitry Andric
377 0b57cec5SDimitry Andric_LIBCPP_PUSH_MACROS
378 0b57cec5SDimitry Andric#include <__undef_macros>
379 0b57cec5SDimitry Andric
380 0b57cec5SDimitry Andric_LIBCPP_BEGIN_NAMESPACE_STD
381 0b57cec5SDimitry Andric
382 cb14a3feSDimitry Andrictemplate <class _Tp>
383 cb14a3feSDimitry Andricclass _LIBCPP_TEMPLATE_VIS valarray;
384 0b57cec5SDimitry Andric
385 cb14a3feSDimitry Andricclass _LIBCPP_TEMPLATE_VIS slice {
386 0b57cec5SDimitry Andric  size_t __start_;
387 0b57cec5SDimitry Andric  size_t __size_;
388 0b57cec5SDimitry Andric  size_t __stride_;
389 0b57cec5SDimitry Andric
390 cb14a3feSDimitry Andricpublic:
391 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI slice() : __start_(0), __size_(0), __stride_(0) {}
392 cb14a3feSDimitry Andric
393 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI slice(size_t __start, size_t __size, size_t __stride)
394 cb14a3feSDimitry Andric      : __start_(__start), __size_(__size), __stride_(__stride) {}
395 0b57cec5SDimitry Andric
396 5f757f3fSDimitry Andric  _LIBCPP_HIDE_FROM_ABI size_t start() const { return __start_; }
397 5f757f3fSDimitry Andric  _LIBCPP_HIDE_FROM_ABI size_t size() const { return __size_; }
398 5f757f3fSDimitry Andric  _LIBCPP_HIDE_FROM_ABI size_t stride() const { return __stride_; }
399 06c3fb27SDimitry Andric
400 06c3fb27SDimitry Andric#if _LIBCPP_STD_VER >= 20
401 06c3fb27SDimitry Andric
402 06c3fb27SDimitry Andric  _LIBCPP_HIDE_FROM_ABI friend bool operator==(const slice& __x, const slice& __y) {
403 06c3fb27SDimitry Andric    return __x.start() == __y.start() && __x.size() == __y.size() && __x.stride() == __y.stride();
404 06c3fb27SDimitry Andric  }
405 06c3fb27SDimitry Andric
406 06c3fb27SDimitry Andric#endif
407 0b57cec5SDimitry Andric};
408 0b57cec5SDimitry Andric
409 cb14a3feSDimitry Andrictemplate <class _Tp>
410 cb14a3feSDimitry Andricclass _LIBCPP_TEMPLATE_VIS slice_array;
411 06c3fb27SDimitry Andricclass _LIBCPP_EXPORTED_FROM_ABI gslice;
412 cb14a3feSDimitry Andrictemplate <class _Tp>
413 cb14a3feSDimitry Andricclass _LIBCPP_TEMPLATE_VIS gslice_array;
414 cb14a3feSDimitry Andrictemplate <class _Tp>
415 cb14a3feSDimitry Andricclass _LIBCPP_TEMPLATE_VIS mask_array;
416 cb14a3feSDimitry Andrictemplate <class _Tp>
417 cb14a3feSDimitry Andricclass _LIBCPP_TEMPLATE_VIS indirect_array;
418 0b57cec5SDimitry Andric
419 0b57cec5SDimitry Andrictemplate <class _Tp>
420 cb14a3feSDimitry Andric_LIBCPP_HIDE_FROM_ABI _Tp* begin(valarray<_Tp>& __v);
421 0b57cec5SDimitry Andric
422 0b57cec5SDimitry Andrictemplate <class _Tp>
423 cb14a3feSDimitry Andric_LIBCPP_HIDE_FROM_ABI const _Tp* begin(const valarray<_Tp>& __v);
424 0b57cec5SDimitry Andric
425 0b57cec5SDimitry Andrictemplate <class _Tp>
426 cb14a3feSDimitry Andric_LIBCPP_HIDE_FROM_ABI _Tp* end(valarray<_Tp>& __v);
427 0b57cec5SDimitry Andric
428 0b57cec5SDimitry Andrictemplate <class _Tp>
429 cb14a3feSDimitry Andric_LIBCPP_HIDE_FROM_ABI const _Tp* end(const valarray<_Tp>& __v);
430 0b57cec5SDimitry Andric
431 0b57cec5SDimitry Andrictemplate <class _Op, class _A0>
432 cb14a3feSDimitry Andricstruct _UnaryOp {
433 fe6060f1SDimitry Andric  typedef typename _Op::__result_type __result_type;
434 06c3fb27SDimitry Andric  using value_type = __decay_t<__result_type>;
435 0b57cec5SDimitry Andric
436 0b57cec5SDimitry Andric  _Op __op_;
437 0b57cec5SDimitry Andric  _A0 __a0_;
438 0b57cec5SDimitry Andric
439 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI _UnaryOp(const _Op& __op, const _A0& __a0) : __op_(__op), __a0_(__a0) {}
440 0b57cec5SDimitry Andric
441 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI __result_type operator[](size_t __i) const { return __op_(__a0_[__i]); }
442 0b57cec5SDimitry Andric
443 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI size_t size() const { return __a0_.size(); }
444 0b57cec5SDimitry Andric};
445 0b57cec5SDimitry Andric
446 0b57cec5SDimitry Andrictemplate <class _Op, class _A0, class _A1>
447 cb14a3feSDimitry Andricstruct _BinaryOp {
448 fe6060f1SDimitry Andric  typedef typename _Op::__result_type __result_type;
449 06c3fb27SDimitry Andric  using value_type = __decay_t<__result_type>;
450 0b57cec5SDimitry Andric
451 0b57cec5SDimitry Andric  _Op __op_;
452 0b57cec5SDimitry Andric  _A0 __a0_;
453 0b57cec5SDimitry Andric  _A1 __a1_;
454 0b57cec5SDimitry Andric
455 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI _BinaryOp(const _Op& __op, const _A0& __a0, const _A1& __a1)
456 0b57cec5SDimitry Andric      : __op_(__op), __a0_(__a0), __a1_(__a1) {}
457 0b57cec5SDimitry Andric
458 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI __result_type operator[](size_t __i) const { return __op_(__a0_[__i], __a1_[__i]); }
459 0b57cec5SDimitry Andric
460 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI size_t size() const { return __a0_.size(); }
461 0b57cec5SDimitry Andric};
462 0b57cec5SDimitry Andric
463 0b57cec5SDimitry Andrictemplate <class _Tp>
464 cb14a3feSDimitry Andricclass __scalar_expr {
465 0b57cec5SDimitry Andricpublic:
466 0b57cec5SDimitry Andric  typedef _Tp value_type;
467 fe6060f1SDimitry Andric  typedef const _Tp& __result_type;
468 cb14a3feSDimitry Andric
469 0b57cec5SDimitry Andricprivate:
470 0b57cec5SDimitry Andric  const value_type& __t_;
471 0b57cec5SDimitry Andric  size_t __s_;
472 cb14a3feSDimitry Andric
473 0b57cec5SDimitry Andricpublic:
474 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI explicit __scalar_expr(const value_type& __t, size_t __s) : __t_(__t), __s_(__s) {}
475 0b57cec5SDimitry Andric
476 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI __result_type operator[](size_t) const { return __t_; }
477 0b57cec5SDimitry Andric
478 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI size_t size() const { return __s_; }
479 0b57cec5SDimitry Andric};
480 0b57cec5SDimitry Andric
481 0b57cec5SDimitry Andrictemplate <class _Tp>
482 cb14a3feSDimitry Andricstruct __unary_plus {
483 fe6060f1SDimitry Andric  typedef _Tp __result_type;
484 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI _Tp operator()(const _Tp& __x) const { return +__x; }
485 0b57cec5SDimitry Andric};
486 0b57cec5SDimitry Andric
487 0b57cec5SDimitry Andrictemplate <class _Tp>
488 cb14a3feSDimitry Andricstruct __bit_not {
489 fe6060f1SDimitry Andric  typedef _Tp __result_type;
490 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI _Tp operator()(const _Tp& __x) const { return ~__x; }
491 0b57cec5SDimitry Andric};
492 0b57cec5SDimitry Andric
493 0b57cec5SDimitry Andrictemplate <class _Tp>
494 cb14a3feSDimitry Andricstruct __bit_shift_left {
495 fe6060f1SDimitry Andric  typedef _Tp __result_type;
496 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI _Tp operator()(const _Tp& __x, const _Tp& __y) const { return __x << __y; }
497 0b57cec5SDimitry Andric};
498 0b57cec5SDimitry Andric
499 0b57cec5SDimitry Andrictemplate <class _Tp>
500 cb14a3feSDimitry Andricstruct __bit_shift_right {
501 fe6060f1SDimitry Andric  typedef _Tp __result_type;
502 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI _Tp operator()(const _Tp& __x, const _Tp& __y) const { return __x >> __y; }
503 0b57cec5SDimitry Andric};
504 0b57cec5SDimitry Andric
505 0b57cec5SDimitry Andrictemplate <class _Tp, class _Fp>
506 cb14a3feSDimitry Andricstruct __apply_expr {
507 0b57cec5SDimitry Andricprivate:
508 0b57cec5SDimitry Andric  _Fp __f_;
509 cb14a3feSDimitry Andric
510 0b57cec5SDimitry Andricpublic:
511 fe6060f1SDimitry Andric  typedef _Tp __result_type;
512 fe6060f1SDimitry Andric
513 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI explicit __apply_expr(_Fp __f) : __f_(__f) {}
514 0b57cec5SDimitry Andric
515 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI _Tp operator()(const _Tp& __x) const { return __f_(__x); }
516 0b57cec5SDimitry Andric};
517 0b57cec5SDimitry Andric
518 0b57cec5SDimitry Andrictemplate <class _Tp>
519 cb14a3feSDimitry Andricstruct __abs_expr {
520 fe6060f1SDimitry Andric  typedef _Tp __result_type;
521 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI _Tp operator()(const _Tp& __x) const { return std::abs(__x); }
522 0b57cec5SDimitry Andric};
523 0b57cec5SDimitry Andric
524 0b57cec5SDimitry Andrictemplate <class _Tp>
525 cb14a3feSDimitry Andricstruct __acos_expr {
526 fe6060f1SDimitry Andric  typedef _Tp __result_type;
527 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI _Tp operator()(const _Tp& __x) const { return std::acos(__x); }
528 0b57cec5SDimitry Andric};
529 0b57cec5SDimitry Andric
530 0b57cec5SDimitry Andrictemplate <class _Tp>
531 cb14a3feSDimitry Andricstruct __asin_expr {
532 fe6060f1SDimitry Andric  typedef _Tp __result_type;
533 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI _Tp operator()(const _Tp& __x) const { return std::asin(__x); }
534 0b57cec5SDimitry Andric};
535 0b57cec5SDimitry Andric
536 0b57cec5SDimitry Andrictemplate <class _Tp>
537 cb14a3feSDimitry Andricstruct __atan_expr {
538 fe6060f1SDimitry Andric  typedef _Tp __result_type;
539 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI _Tp operator()(const _Tp& __x) const { return std::atan(__x); }
540 0b57cec5SDimitry Andric};
541 0b57cec5SDimitry Andric
542 0b57cec5SDimitry Andrictemplate <class _Tp>
543 cb14a3feSDimitry Andricstruct __atan2_expr {
544 fe6060f1SDimitry Andric  typedef _Tp __result_type;
545 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI _Tp operator()(const _Tp& __x, const _Tp& __y) const { return std::atan2(__x, __y); }
546 0b57cec5SDimitry Andric};
547 0b57cec5SDimitry Andric
548 0b57cec5SDimitry Andrictemplate <class _Tp>
549 cb14a3feSDimitry Andricstruct __cos_expr {
550 fe6060f1SDimitry Andric  typedef _Tp __result_type;
551 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI _Tp operator()(const _Tp& __x) const { return std::cos(__x); }
552 0b57cec5SDimitry Andric};
553 0b57cec5SDimitry Andric
554 0b57cec5SDimitry Andrictemplate <class _Tp>
555 cb14a3feSDimitry Andricstruct __cosh_expr {
556 fe6060f1SDimitry Andric  typedef _Tp __result_type;
557 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI _Tp operator()(const _Tp& __x) const { return std::cosh(__x); }
558 0b57cec5SDimitry Andric};
559 0b57cec5SDimitry Andric
560 0b57cec5SDimitry Andrictemplate <class _Tp>
561 cb14a3feSDimitry Andricstruct __exp_expr {
562 fe6060f1SDimitry Andric  typedef _Tp __result_type;
563 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI _Tp operator()(const _Tp& __x) const { return std::exp(__x); }
564 0b57cec5SDimitry Andric};
565 0b57cec5SDimitry Andric
566 0b57cec5SDimitry Andrictemplate <class _Tp>
567 cb14a3feSDimitry Andricstruct __log_expr {
568 fe6060f1SDimitry Andric  typedef _Tp __result_type;
569 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI _Tp operator()(const _Tp& __x) const { return std::log(__x); }
570 0b57cec5SDimitry Andric};
571 0b57cec5SDimitry Andric
572 0b57cec5SDimitry Andrictemplate <class _Tp>
573 cb14a3feSDimitry Andricstruct __log10_expr {
574 fe6060f1SDimitry Andric  typedef _Tp __result_type;
575 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI _Tp operator()(const _Tp& __x) const { return std::log10(__x); }
576 0b57cec5SDimitry Andric};
577 0b57cec5SDimitry Andric
578 0b57cec5SDimitry Andrictemplate <class _Tp>
579 cb14a3feSDimitry Andricstruct __pow_expr {
580 fe6060f1SDimitry Andric  typedef _Tp __result_type;
581 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI _Tp operator()(const _Tp& __x, const _Tp& __y) const { return std::pow(__x, __y); }
582 0b57cec5SDimitry Andric};
583 0b57cec5SDimitry Andric
584 0b57cec5SDimitry Andrictemplate <class _Tp>
585 cb14a3feSDimitry Andricstruct __sin_expr {
586 fe6060f1SDimitry Andric  typedef _Tp __result_type;
587 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI _Tp operator()(const _Tp& __x) const { return std::sin(__x); }
588 0b57cec5SDimitry Andric};
589 0b57cec5SDimitry Andric
590 0b57cec5SDimitry Andrictemplate <class _Tp>
591 cb14a3feSDimitry Andricstruct __sinh_expr {
592 fe6060f1SDimitry Andric  typedef _Tp __result_type;
593 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI _Tp operator()(const _Tp& __x) const { return std::sinh(__x); }
594 0b57cec5SDimitry Andric};
595 0b57cec5SDimitry Andric
596 0b57cec5SDimitry Andrictemplate <class _Tp>
597 cb14a3feSDimitry Andricstruct __sqrt_expr {
598 fe6060f1SDimitry Andric  typedef _Tp __result_type;
599 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI _Tp operator()(const _Tp& __x) const { return std::sqrt(__x); }
600 0b57cec5SDimitry Andric};
601 0b57cec5SDimitry Andric
602 0b57cec5SDimitry Andrictemplate <class _Tp>
603 cb14a3feSDimitry Andricstruct __tan_expr {
604 fe6060f1SDimitry Andric  typedef _Tp __result_type;
605 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI _Tp operator()(const _Tp& __x) const { return std::tan(__x); }
606 0b57cec5SDimitry Andric};
607 0b57cec5SDimitry Andric
608 0b57cec5SDimitry Andrictemplate <class _Tp>
609 cb14a3feSDimitry Andricstruct __tanh_expr {
610 fe6060f1SDimitry Andric  typedef _Tp __result_type;
611 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI _Tp operator()(const _Tp& __x) const { return std::tanh(__x); }
612 0b57cec5SDimitry Andric};
613 0b57cec5SDimitry Andric
614 0b57cec5SDimitry Andrictemplate <class _ValExpr>
615 cb14a3feSDimitry Andricclass __slice_expr {
616 bdd1243dSDimitry Andric  typedef __libcpp_remove_reference_t<_ValExpr> _RmExpr;
617 cb14a3feSDimitry Andric
618 0b57cec5SDimitry Andricpublic:
619 0b57cec5SDimitry Andric  typedef typename _RmExpr::value_type value_type;
620 fe6060f1SDimitry Andric  typedef value_type __result_type;
621 0b57cec5SDimitry Andric
622 0b57cec5SDimitry Andricprivate:
623 0b57cec5SDimitry Andric  _ValExpr __expr_;
624 0b57cec5SDimitry Andric  size_t __start_;
625 0b57cec5SDimitry Andric  size_t __size_;
626 0b57cec5SDimitry Andric  size_t __stride_;
627 0b57cec5SDimitry Andric
628 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI __slice_expr(const slice& __sl, const _RmExpr& __e)
629 cb14a3feSDimitry Andric      : __expr_(__e), __start_(__sl.start()), __size_(__sl.size()), __stride_(__sl.stride()) {}
630 cb14a3feSDimitry Andric
631 0b57cec5SDimitry Andricpublic:
632 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI __result_type operator[](size_t __i) const { return __expr_[__start_ + __i * __stride_]; }
633 0b57cec5SDimitry Andric
634 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI size_t size() const { return __size_; }
635 0b57cec5SDimitry Andric
636 cb14a3feSDimitry Andric  template <class>
637 cb14a3feSDimitry Andric  friend class __val_expr;
638 cb14a3feSDimitry Andric  template <class>
639 cb14a3feSDimitry Andric  friend class _LIBCPP_TEMPLATE_VIS valarray;
640 0b57cec5SDimitry Andric};
641 0b57cec5SDimitry Andric
642 0b57cec5SDimitry Andrictemplate <class _ValExpr>
643 0b57cec5SDimitry Andricclass __mask_expr;
644 0b57cec5SDimitry Andric
645 0b57cec5SDimitry Andrictemplate <class _ValExpr>
646 0b57cec5SDimitry Andricclass __indirect_expr;
647 0b57cec5SDimitry Andric
648 0b57cec5SDimitry Andrictemplate <class _ValExpr>
649 cb14a3feSDimitry Andricclass __shift_expr {
650 bdd1243dSDimitry Andric  typedef __libcpp_remove_reference_t<_ValExpr> _RmExpr;
651 cb14a3feSDimitry Andric
652 0b57cec5SDimitry Andricpublic:
653 0b57cec5SDimitry Andric  typedef typename _RmExpr::value_type value_type;
654 fe6060f1SDimitry Andric  typedef value_type __result_type;
655 0b57cec5SDimitry Andric
656 0b57cec5SDimitry Andricprivate:
657 0b57cec5SDimitry Andric  _ValExpr __expr_;
658 0b57cec5SDimitry Andric  size_t __size_;
659 0b57cec5SDimitry Andric  ptrdiff_t __ul_;
660 0b57cec5SDimitry Andric  ptrdiff_t __sn_;
661 0b57cec5SDimitry Andric  ptrdiff_t __n_;
662 cb14a3feSDimitry Andric  static const ptrdiff_t _Np = static_cast<ptrdiff_t>(sizeof(ptrdiff_t) * __CHAR_BIT__ - 1);
663 0b57cec5SDimitry Andric
664 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI __shift_expr(int __n, const _RmExpr& __e) : __expr_(__e), __size_(__e.size()), __n_(__n) {
665 0b57cec5SDimitry Andric    ptrdiff_t __neg_n = static_cast<ptrdiff_t>(__n_ >> _Np);
666 0b57cec5SDimitry Andric    __sn_             = __neg_n | static_cast<ptrdiff_t>(static_cast<size_t>(-__n_) >> _Np);
667 0b57cec5SDimitry Andric    __ul_             = ((__size_ - __n_) & ~__neg_n) | ((__n_ + 1) & __neg_n);
668 0b57cec5SDimitry Andric  }
669 0b57cec5SDimitry Andric
670 cb14a3feSDimitry Andricpublic:
671 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI __result_type operator[](size_t __j) const {
672 0b57cec5SDimitry Andric    ptrdiff_t __i = static_cast<ptrdiff_t>(__j);
673 0b57cec5SDimitry Andric    ptrdiff_t __m = (__sn_ * __i - __ul_) >> _Np;
674 0b57cec5SDimitry Andric    return (__expr_[(__i + __n_) & __m] & __m) | (value_type() & ~__m);
675 0b57cec5SDimitry Andric  }
676 0b57cec5SDimitry Andric
677 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI size_t size() const { return __size_; }
678 0b57cec5SDimitry Andric
679 cb14a3feSDimitry Andric  template <class>
680 cb14a3feSDimitry Andric  friend class __val_expr;
681 0b57cec5SDimitry Andric};
682 0b57cec5SDimitry Andric
683 0b57cec5SDimitry Andrictemplate <class _ValExpr>
684 cb14a3feSDimitry Andricclass __cshift_expr {
685 bdd1243dSDimitry Andric  typedef __libcpp_remove_reference_t<_ValExpr> _RmExpr;
686 cb14a3feSDimitry Andric
687 0b57cec5SDimitry Andricpublic:
688 0b57cec5SDimitry Andric  typedef typename _RmExpr::value_type value_type;
689 fe6060f1SDimitry Andric  typedef value_type __result_type;
690 0b57cec5SDimitry Andric
691 0b57cec5SDimitry Andricprivate:
692 0b57cec5SDimitry Andric  _ValExpr __expr_;
693 0b57cec5SDimitry Andric  size_t __size_;
694 0b57cec5SDimitry Andric  size_t __m_;
695 0b57cec5SDimitry Andric  size_t __o1_;
696 0b57cec5SDimitry Andric  size_t __o2_;
697 0b57cec5SDimitry Andric
698 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI __cshift_expr(int __n, const _RmExpr& __e) : __expr_(__e), __size_(__e.size()) {
699 0b57cec5SDimitry Andric    __n %= static_cast<int>(__size_);
700 cb14a3feSDimitry Andric    if (__n >= 0) {
701 0b57cec5SDimitry Andric      __m_  = __size_ - __n;
702 0b57cec5SDimitry Andric      __o1_ = __n;
703 0b57cec5SDimitry Andric      __o2_ = __n - __size_;
704 cb14a3feSDimitry Andric    } else {
705 0b57cec5SDimitry Andric      __m_  = -__n;
706 0b57cec5SDimitry Andric      __o1_ = __n + __size_;
707 0b57cec5SDimitry Andric      __o2_ = __n;
708 0b57cec5SDimitry Andric    }
709 0b57cec5SDimitry Andric  }
710 0b57cec5SDimitry Andric
711 cb14a3feSDimitry Andricpublic:
712 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI __result_type operator[](size_t __i) const {
713 0b57cec5SDimitry Andric    if (__i < __m_)
714 0b57cec5SDimitry Andric      return __expr_[__i + __o1_];
715 0b57cec5SDimitry Andric    return __expr_[__i + __o2_];
716 0b57cec5SDimitry Andric  }
717 0b57cec5SDimitry Andric
718 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI size_t size() const { return __size_; }
719 0b57cec5SDimitry Andric
720 cb14a3feSDimitry Andric  template <class>
721 cb14a3feSDimitry Andric  friend class __val_expr;
722 0b57cec5SDimitry Andric};
723 0b57cec5SDimitry Andric
724 0b57cec5SDimitry Andrictemplate <class _ValExpr>
725 0b57cec5SDimitry Andricclass __val_expr;
726 0b57cec5SDimitry Andric
727 0b57cec5SDimitry Andrictemplate <class _ValExpr>
728 0b57cec5SDimitry Andricstruct __is_val_expr : false_type {};
729 0b57cec5SDimitry Andric
730 0b57cec5SDimitry Andrictemplate <class _ValExpr>
731 0b57cec5SDimitry Andricstruct __is_val_expr<__val_expr<_ValExpr> > : true_type {};
732 0b57cec5SDimitry Andric
733 0b57cec5SDimitry Andrictemplate <class _Tp>
734 0b57cec5SDimitry Andricstruct __is_val_expr<valarray<_Tp> > : true_type {};
735 0b57cec5SDimitry Andric
736 0b57cec5SDimitry Andrictemplate <class _Tp>
737 *0fca6ea1SDimitry Andricstruct __is_val_expr<slice_array<_Tp> > : true_type {};
738 *0fca6ea1SDimitry Andric
739 *0fca6ea1SDimitry Andrictemplate <class _Tp>
740 *0fca6ea1SDimitry Andricstruct __is_val_expr<gslice_array<_Tp> > : true_type {};
741 *0fca6ea1SDimitry Andric
742 *0fca6ea1SDimitry Andrictemplate <class _Tp>
743 *0fca6ea1SDimitry Andricstruct __is_val_expr<mask_array<_Tp> > : true_type {};
744 *0fca6ea1SDimitry Andric
745 *0fca6ea1SDimitry Andrictemplate <class _Tp>
746 *0fca6ea1SDimitry Andricstruct __is_val_expr<indirect_array<_Tp> > : true_type {};
747 *0fca6ea1SDimitry Andric
748 *0fca6ea1SDimitry Andric// The functions using a __val_expr access the elements by their index.
749 *0fca6ea1SDimitry Andric// valarray and the libc++ lazy proxies have an operator[]. The
750 *0fca6ea1SDimitry Andric// Standard proxy array's don't have this operator, instead they have a
751 *0fca6ea1SDimitry Andric// implementation specific accessor
752 *0fca6ea1SDimitry Andric//   __get(size_t)
753 *0fca6ea1SDimitry Andric//
754 *0fca6ea1SDimitry Andric// The functions use the non-member function
755 *0fca6ea1SDimitry Andric//   __get(__val_expr, size_t)
756 *0fca6ea1SDimitry Andric//
757 *0fca6ea1SDimitry Andric// If the __val_expr is a specialization of __val_expr_use_member_functions it
758 *0fca6ea1SDimitry Andric// uses the __val_expr's member function
759 *0fca6ea1SDimitry Andric//   __get(size_t)
760 *0fca6ea1SDimitry Andric// else it uses the __val_expr's member function
761 *0fca6ea1SDimitry Andric//   operator[](size_t)
762 *0fca6ea1SDimitry Andrictemplate <class _ValExpr>
763 *0fca6ea1SDimitry Andricstruct __val_expr_use_member_functions;
764 *0fca6ea1SDimitry Andric
765 *0fca6ea1SDimitry Andrictemplate <class>
766 *0fca6ea1SDimitry Andricstruct __val_expr_use_member_functions : false_type {};
767 *0fca6ea1SDimitry Andric
768 *0fca6ea1SDimitry Andrictemplate <class _Tp>
769 *0fca6ea1SDimitry Andricstruct __val_expr_use_member_functions<slice_array<_Tp> > : true_type {};
770 *0fca6ea1SDimitry Andric
771 *0fca6ea1SDimitry Andrictemplate <class _Tp>
772 *0fca6ea1SDimitry Andricstruct __val_expr_use_member_functions<gslice_array<_Tp> > : true_type {};
773 *0fca6ea1SDimitry Andric
774 *0fca6ea1SDimitry Andrictemplate <class _Tp>
775 *0fca6ea1SDimitry Andricstruct __val_expr_use_member_functions<mask_array<_Tp> > : true_type {};
776 *0fca6ea1SDimitry Andric
777 *0fca6ea1SDimitry Andrictemplate <class _Tp>
778 *0fca6ea1SDimitry Andricstruct __val_expr_use_member_functions<indirect_array<_Tp> > : true_type {};
779 *0fca6ea1SDimitry Andric
780 *0fca6ea1SDimitry Andrictemplate <class _Tp>
781 cb14a3feSDimitry Andricclass _LIBCPP_TEMPLATE_VIS valarray {
782 0b57cec5SDimitry Andricpublic:
783 0b57cec5SDimitry Andric  typedef _Tp value_type;
784 fe6060f1SDimitry Andric  typedef _Tp __result_type;
785 0b57cec5SDimitry Andric
786 0b57cec5SDimitry Andricprivate:
787 0b57cec5SDimitry Andric  value_type* __begin_;
788 0b57cec5SDimitry Andric  value_type* __end_;
789 0b57cec5SDimitry Andric
790 0b57cec5SDimitry Andricpublic:
791 0b57cec5SDimitry Andric  // construct/destroy:
792 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI valarray() : __begin_(nullptr), __end_(nullptr) {}
793 cb14a3feSDimitry Andric  inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 explicit valarray(size_t __n);
794 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI valarray(const value_type& __x, size_t __n);
795 0b57cec5SDimitry Andric  valarray(const value_type* __p, size_t __n);
796 0b57cec5SDimitry Andric  valarray(const valarray& __v);
797 0b57cec5SDimitry Andric#ifndef _LIBCPP_CXX03_LANG
798 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI valarray(valarray&& __v) _NOEXCEPT;
799 0b57cec5SDimitry Andric  valarray(initializer_list<value_type> __il);
800 0b57cec5SDimitry Andric#endif // _LIBCPP_CXX03_LANG
801 0b57cec5SDimitry Andric  valarray(const slice_array<value_type>& __sa);
802 0b57cec5SDimitry Andric  valarray(const gslice_array<value_type>& __ga);
803 0b57cec5SDimitry Andric  valarray(const mask_array<value_type>& __ma);
804 0b57cec5SDimitry Andric  valarray(const indirect_array<value_type>& __ia);
805 cb14a3feSDimitry Andric  inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 ~valarray();
806 0b57cec5SDimitry Andric
807 0b57cec5SDimitry Andric  // assignment:
808 0b57cec5SDimitry Andric  valarray& operator=(const valarray& __v);
809 0b57cec5SDimitry Andric#ifndef _LIBCPP_CXX03_LANG
810 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI valarray& operator=(valarray&& __v) _NOEXCEPT;
811 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI valarray& operator=(initializer_list<value_type>);
812 0b57cec5SDimitry Andric#endif // _LIBCPP_CXX03_LANG
813 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI valarray& operator=(const value_type& __x);
814 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI valarray& operator=(const slice_array<value_type>& __sa);
815 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI valarray& operator=(const gslice_array<value_type>& __ga);
816 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI valarray& operator=(const mask_array<value_type>& __ma);
817 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI valarray& operator=(const indirect_array<value_type>& __ia);
818 0b57cec5SDimitry Andric  template <class _ValExpr>
819 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI valarray& operator=(const __val_expr<_ValExpr>& __v);
820 0b57cec5SDimitry Andric
821 0b57cec5SDimitry Andric  // element access:
822 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI const value_type& operator[](size_t __i) const { return __begin_[__i]; }
823 0b57cec5SDimitry Andric
824 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI value_type& operator[](size_t __i) { return __begin_[__i]; }
825 0b57cec5SDimitry Andric
826 0b57cec5SDimitry Andric  // subset operations:
827 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI __val_expr<__slice_expr<const valarray&> > operator[](slice __s) const;
828 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI slice_array<value_type> operator[](slice __s);
829 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI __val_expr<__indirect_expr<const valarray&> > operator[](const gslice& __gs) const;
830 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI gslice_array<value_type> operator[](const gslice& __gs);
831 0b57cec5SDimitry Andric#ifndef _LIBCPP_CXX03_LANG
832 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI __val_expr<__indirect_expr<const valarray&> > operator[](gslice&& __gs) const;
833 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI gslice_array<value_type> operator[](gslice&& __gs);
834 0b57cec5SDimitry Andric#endif // _LIBCPP_CXX03_LANG
835 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI __val_expr<__mask_expr<const valarray&> > operator[](const valarray<bool>& __vb) const;
836 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI mask_array<value_type> operator[](const valarray<bool>& __vb);
837 0b57cec5SDimitry Andric#ifndef _LIBCPP_CXX03_LANG
838 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI __val_expr<__mask_expr<const valarray&> > operator[](valarray<bool>&& __vb) const;
839 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI mask_array<value_type> operator[](valarray<bool>&& __vb);
840 0b57cec5SDimitry Andric#endif // _LIBCPP_CXX03_LANG
841 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI __val_expr<__indirect_expr<const valarray&> > operator[](const valarray<size_t>& __vs) const;
842 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI indirect_array<value_type> operator[](const valarray<size_t>& __vs);
843 0b57cec5SDimitry Andric#ifndef _LIBCPP_CXX03_LANG
844 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI __val_expr<__indirect_expr<const valarray&> > operator[](valarray<size_t>&& __vs) const;
845 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI indirect_array<value_type> operator[](valarray<size_t>&& __vs);
846 0b57cec5SDimitry Andric#endif // _LIBCPP_CXX03_LANG
847 0b57cec5SDimitry Andric
848 0b57cec5SDimitry Andric  // unary operators:
849 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI __val_expr<_UnaryOp<__unary_plus<_Tp>, const valarray&> > operator+() const;
850 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI __val_expr<_UnaryOp<negate<_Tp>, const valarray&> > operator-() const;
851 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI __val_expr<_UnaryOp<__bit_not<_Tp>, const valarray&> > operator~() const;
852 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI __val_expr<_UnaryOp<logical_not<_Tp>, const valarray&> > operator!() const;
853 0b57cec5SDimitry Andric
854 0b57cec5SDimitry Andric  // computed assignment:
855 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI valarray& operator*=(const value_type& __x);
856 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI valarray& operator/=(const value_type& __x);
857 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI valarray& operator%=(const value_type& __x);
858 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI valarray& operator+=(const value_type& __x);
859 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI valarray& operator-=(const value_type& __x);
860 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI valarray& operator^=(const value_type& __x);
861 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI valarray& operator&=(const value_type& __x);
862 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI valarray& operator|=(const value_type& __x);
863 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI valarray& operator<<=(const value_type& __x);
864 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI valarray& operator>>=(const value_type& __x);
865 0b57cec5SDimitry Andric
866 5f757f3fSDimitry Andric  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
867 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI valarray& operator*=(const _Expr& __v);
868 0b57cec5SDimitry Andric
869 5f757f3fSDimitry Andric  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
870 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI valarray& operator/=(const _Expr& __v);
871 0b57cec5SDimitry Andric
872 5f757f3fSDimitry Andric  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
873 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI valarray& operator%=(const _Expr& __v);
874 0b57cec5SDimitry Andric
875 5f757f3fSDimitry Andric  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
876 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI valarray& operator+=(const _Expr& __v);
877 0b57cec5SDimitry Andric
878 5f757f3fSDimitry Andric  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
879 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI valarray& operator-=(const _Expr& __v);
880 0b57cec5SDimitry Andric
881 5f757f3fSDimitry Andric  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
882 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI valarray& operator^=(const _Expr& __v);
883 0b57cec5SDimitry Andric
884 5f757f3fSDimitry Andric  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
885 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI valarray& operator|=(const _Expr& __v);
886 0b57cec5SDimitry Andric
887 5f757f3fSDimitry Andric  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
888 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI valarray& operator&=(const _Expr& __v);
889 0b57cec5SDimitry Andric
890 5f757f3fSDimitry Andric  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
891 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI valarray& operator<<=(const _Expr& __v);
892 0b57cec5SDimitry Andric
893 5f757f3fSDimitry Andric  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
894 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI valarray& operator>>=(const _Expr& __v);
895 0b57cec5SDimitry Andric
896 0b57cec5SDimitry Andric  // member functions:
897 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI void swap(valarray& __v) _NOEXCEPT;
898 0b57cec5SDimitry Andric
899 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI size_t size() const { return static_cast<size_t>(__end_ - __begin_); }
900 0b57cec5SDimitry Andric
901 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI value_type sum() const;
902 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI value_type min() const;
903 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI value_type max() const;
904 0b57cec5SDimitry Andric
905 0b57cec5SDimitry Andric  valarray shift(int __i) const;
906 0b57cec5SDimitry Andric  valarray cshift(int __i) const;
907 0b57cec5SDimitry Andric  valarray apply(value_type __f(value_type)) const;
908 0b57cec5SDimitry Andric  valarray apply(value_type __f(const value_type&)) const;
909 0b57cec5SDimitry Andric  void resize(size_t __n, value_type __x = value_type());
910 0b57cec5SDimitry Andric
911 0b57cec5SDimitry Andricprivate:
912 cb14a3feSDimitry Andric  template <class>
913 cb14a3feSDimitry Andric  friend class _LIBCPP_TEMPLATE_VIS valarray;
914 cb14a3feSDimitry Andric  template <class>
915 cb14a3feSDimitry Andric  friend class _LIBCPP_TEMPLATE_VIS slice_array;
916 cb14a3feSDimitry Andric  template <class>
917 cb14a3feSDimitry Andric  friend class _LIBCPP_TEMPLATE_VIS gslice_array;
918 cb14a3feSDimitry Andric  template <class>
919 cb14a3feSDimitry Andric  friend class _LIBCPP_TEMPLATE_VIS mask_array;
920 cb14a3feSDimitry Andric  template <class>
921 cb14a3feSDimitry Andric  friend class __mask_expr;
922 cb14a3feSDimitry Andric  template <class>
923 cb14a3feSDimitry Andric  friend class _LIBCPP_TEMPLATE_VIS indirect_array;
924 cb14a3feSDimitry Andric  template <class>
925 cb14a3feSDimitry Andric  friend class __indirect_expr;
926 cb14a3feSDimitry Andric  template <class>
927 cb14a3feSDimitry Andric  friend class __val_expr;
928 0b57cec5SDimitry Andric
929 0b57cec5SDimitry Andric  template <class _Up>
930 cb14a3feSDimitry Andric  friend _Up* begin(valarray<_Up>& __v);
931 0b57cec5SDimitry Andric
932 0b57cec5SDimitry Andric  template <class _Up>
933 cb14a3feSDimitry Andric  friend const _Up* begin(const valarray<_Up>& __v);
934 0b57cec5SDimitry Andric
935 0b57cec5SDimitry Andric  template <class _Up>
936 cb14a3feSDimitry Andric  friend _Up* end(valarray<_Up>& __v);
937 0b57cec5SDimitry Andric
938 0b57cec5SDimitry Andric  template <class _Up>
939 cb14a3feSDimitry Andric  friend const _Up* end(const valarray<_Up>& __v);
940 0b57cec5SDimitry Andric
941 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI void __clear(size_t __capacity);
942 0b57cec5SDimitry Andric  valarray& __assign_range(const value_type* __f, const value_type* __l);
943 0b57cec5SDimitry Andric};
944 0b57cec5SDimitry Andric
945 06c3fb27SDimitry Andric#if _LIBCPP_STD_VER >= 17
946 349cc55cSDimitry Andrictemplate <class _Tp, size_t _Size>
947 349cc55cSDimitry Andricvalarray(const _Tp (&)[_Size], size_t) -> valarray<_Tp>;
948 349cc55cSDimitry Andric#endif
949 349cc55cSDimitry Andric
950 *0fca6ea1SDimitry Andrictemplate <class _Expr,
951 *0fca6ea1SDimitry Andric          __enable_if_t<__is_val_expr<_Expr>::value && __val_expr_use_member_functions<_Expr>::value, int> = 0>
952 *0fca6ea1SDimitry Andric_LIBCPP_HIDE_FROM_ABI typename _Expr::value_type __get(const _Expr& __v, size_t __i) {
953 *0fca6ea1SDimitry Andric  return __v.__get(__i);
954 *0fca6ea1SDimitry Andric}
955 *0fca6ea1SDimitry Andric
956 *0fca6ea1SDimitry Andrictemplate <class _Expr,
957 *0fca6ea1SDimitry Andric          __enable_if_t<__is_val_expr<_Expr>::value && !__val_expr_use_member_functions<_Expr>::value, int> = 0>
958 *0fca6ea1SDimitry Andric_LIBCPP_HIDE_FROM_ABI typename _Expr::value_type __get(const _Expr& __v, size_t __i) {
959 *0fca6ea1SDimitry Andric  return __v[__i];
960 *0fca6ea1SDimitry Andric}
961 *0fca6ea1SDimitry Andric
962 06c3fb27SDimitry Andricextern template _LIBCPP_EXPORTED_FROM_ABI void valarray<size_t>::resize(size_t, size_t);
963 0b57cec5SDimitry Andric
964 0b57cec5SDimitry Andrictemplate <class _Op, class _Tp>
965 cb14a3feSDimitry Andricstruct _UnaryOp<_Op, valarray<_Tp> > {
966 fe6060f1SDimitry Andric  typedef typename _Op::__result_type __result_type;
967 06c3fb27SDimitry Andric  using value_type = __decay_t<__result_type>;
968 0b57cec5SDimitry Andric
969 0b57cec5SDimitry Andric  _Op __op_;
970 0b57cec5SDimitry Andric  const valarray<_Tp>& __a0_;
971 0b57cec5SDimitry Andric
972 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI _UnaryOp(const _Op& __op, const valarray<_Tp>& __a0) : __op_(__op), __a0_(__a0) {}
973 0b57cec5SDimitry Andric
974 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI __result_type operator[](size_t __i) const { return __op_(__a0_[__i]); }
975 0b57cec5SDimitry Andric
976 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI size_t size() const { return __a0_.size(); }
977 0b57cec5SDimitry Andric};
978 0b57cec5SDimitry Andric
979 0b57cec5SDimitry Andrictemplate <class _Op, class _Tp, class _A1>
980 cb14a3feSDimitry Andricstruct _BinaryOp<_Op, valarray<_Tp>, _A1> {
981 fe6060f1SDimitry Andric  typedef typename _Op::__result_type __result_type;
982 06c3fb27SDimitry Andric  using value_type = __decay_t<__result_type>;
983 0b57cec5SDimitry Andric
984 0b57cec5SDimitry Andric  _Op __op_;
985 0b57cec5SDimitry Andric  const valarray<_Tp>& __a0_;
986 0b57cec5SDimitry Andric  _A1 __a1_;
987 0b57cec5SDimitry Andric
988 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI _BinaryOp(const _Op& __op, const valarray<_Tp>& __a0, const _A1& __a1)
989 0b57cec5SDimitry Andric      : __op_(__op), __a0_(__a0), __a1_(__a1) {}
990 0b57cec5SDimitry Andric
991 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI __result_type operator[](size_t __i) const { return __op_(__a0_[__i], __a1_[__i]); }
992 0b57cec5SDimitry Andric
993 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI size_t size() const { return __a0_.size(); }
994 0b57cec5SDimitry Andric};
995 0b57cec5SDimitry Andric
996 0b57cec5SDimitry Andrictemplate <class _Op, class _A0, class _Tp>
997 cb14a3feSDimitry Andricstruct _BinaryOp<_Op, _A0, valarray<_Tp> > {
998 fe6060f1SDimitry Andric  typedef typename _Op::__result_type __result_type;
999 06c3fb27SDimitry Andric  using value_type = __decay_t<__result_type>;
1000 0b57cec5SDimitry Andric
1001 0b57cec5SDimitry Andric  _Op __op_;
1002 0b57cec5SDimitry Andric  _A0 __a0_;
1003 0b57cec5SDimitry Andric  const valarray<_Tp>& __a1_;
1004 0b57cec5SDimitry Andric
1005 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI _BinaryOp(const _Op& __op, const _A0& __a0, const valarray<_Tp>& __a1)
1006 0b57cec5SDimitry Andric      : __op_(__op), __a0_(__a0), __a1_(__a1) {}
1007 0b57cec5SDimitry Andric
1008 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI __result_type operator[](size_t __i) const { return __op_(__a0_[__i], __a1_[__i]); }
1009 0b57cec5SDimitry Andric
1010 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI size_t size() const { return __a0_.size(); }
1011 0b57cec5SDimitry Andric};
1012 0b57cec5SDimitry Andric
1013 0b57cec5SDimitry Andrictemplate <class _Op, class _Tp>
1014 cb14a3feSDimitry Andricstruct _BinaryOp<_Op, valarray<_Tp>, valarray<_Tp> > {
1015 fe6060f1SDimitry Andric  typedef typename _Op::__result_type __result_type;
1016 06c3fb27SDimitry Andric  using value_type = __decay_t<__result_type>;
1017 0b57cec5SDimitry Andric
1018 0b57cec5SDimitry Andric  _Op __op_;
1019 0b57cec5SDimitry Andric  const valarray<_Tp>& __a0_;
1020 0b57cec5SDimitry Andric  const valarray<_Tp>& __a1_;
1021 0b57cec5SDimitry Andric
1022 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI _BinaryOp(const _Op& __op, const valarray<_Tp>& __a0, const valarray<_Tp>& __a1)
1023 0b57cec5SDimitry Andric      : __op_(__op), __a0_(__a0), __a1_(__a1) {}
1024 0b57cec5SDimitry Andric
1025 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI __result_type operator[](size_t __i) const { return __op_(__a0_[__i], __a1_[__i]); }
1026 0b57cec5SDimitry Andric
1027 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI size_t size() const { return __a0_.size(); }
1028 0b57cec5SDimitry Andric};
1029 0b57cec5SDimitry Andric
1030 0b57cec5SDimitry Andric// slice_array
1031 0b57cec5SDimitry Andric
1032 0b57cec5SDimitry Andrictemplate <class _Tp>
1033 cb14a3feSDimitry Andricclass _LIBCPP_TEMPLATE_VIS slice_array {
1034 0b57cec5SDimitry Andricpublic:
1035 0b57cec5SDimitry Andric  typedef _Tp value_type;
1036 0b57cec5SDimitry Andric
1037 0b57cec5SDimitry Andricprivate:
1038 0b57cec5SDimitry Andric  value_type* __vp_;
1039 0b57cec5SDimitry Andric  size_t __size_;
1040 0b57cec5SDimitry Andric  size_t __stride_;
1041 0b57cec5SDimitry Andric
1042 0b57cec5SDimitry Andricpublic:
1043 5f757f3fSDimitry Andric  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1044 cb14a3feSDimitry Andric  void _LIBCPP_HIDE_FROM_ABI operator=(const _Expr& __v) const;
1045 0b57cec5SDimitry Andric
1046 5f757f3fSDimitry Andric  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1047 cb14a3feSDimitry Andric  void _LIBCPP_HIDE_FROM_ABI operator*=(const _Expr& __v) const;
1048 0b57cec5SDimitry Andric
1049 5f757f3fSDimitry Andric  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1050 cb14a3feSDimitry Andric  void _LIBCPP_HIDE_FROM_ABI operator/=(const _Expr& __v) const;
1051 0b57cec5SDimitry Andric
1052 5f757f3fSDimitry Andric  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1053 cb14a3feSDimitry Andric  void _LIBCPP_HIDE_FROM_ABI operator%=(const _Expr& __v) const;
1054 0b57cec5SDimitry Andric
1055 5f757f3fSDimitry Andric  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1056 cb14a3feSDimitry Andric  void _LIBCPP_HIDE_FROM_ABI operator+=(const _Expr& __v) const;
1057 0b57cec5SDimitry Andric
1058 5f757f3fSDimitry Andric  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1059 cb14a3feSDimitry Andric  void _LIBCPP_HIDE_FROM_ABI operator-=(const _Expr& __v) const;
1060 0b57cec5SDimitry Andric
1061 5f757f3fSDimitry Andric  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1062 cb14a3feSDimitry Andric  void _LIBCPP_HIDE_FROM_ABI operator^=(const _Expr& __v) const;
1063 0b57cec5SDimitry Andric
1064 5f757f3fSDimitry Andric  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1065 cb14a3feSDimitry Andric  void _LIBCPP_HIDE_FROM_ABI operator&=(const _Expr& __v) const;
1066 0b57cec5SDimitry Andric
1067 5f757f3fSDimitry Andric  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1068 cb14a3feSDimitry Andric  void _LIBCPP_HIDE_FROM_ABI operator|=(const _Expr& __v) const;
1069 0b57cec5SDimitry Andric
1070 5f757f3fSDimitry Andric  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1071 cb14a3feSDimitry Andric  void _LIBCPP_HIDE_FROM_ABI operator<<=(const _Expr& __v) const;
1072 0b57cec5SDimitry Andric
1073 5f757f3fSDimitry Andric  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1074 cb14a3feSDimitry Andric  void _LIBCPP_HIDE_FROM_ABI operator>>=(const _Expr& __v) const;
1075 0b57cec5SDimitry Andric
1076 cd0c3137SDimitry Andric  slice_array(slice_array const&) = default;
1077 cd0c3137SDimitry Andric
1078 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI const slice_array& operator=(const slice_array& __sa) const;
1079 0b57cec5SDimitry Andric
1080 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI void operator=(const value_type& __x) const;
1081 0b57cec5SDimitry Andric
1082 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI void operator=(const valarray<value_type>& __va) const;
1083 e8d8bef9SDimitry Andric
1084 *0fca6ea1SDimitry Andric  // Behaves like __val_expr::operator[], which returns by value.
1085 *0fca6ea1SDimitry Andric  _LIBCPP_HIDE_FROM_ABI value_type __get(size_t __i) const {
1086 *0fca6ea1SDimitry Andric    _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(__i < __size_, "slice_array.__get() index out of bounds");
1087 *0fca6ea1SDimitry Andric    return __vp_[__i * __stride_];
1088 *0fca6ea1SDimitry Andric  }
1089 *0fca6ea1SDimitry Andric
1090 0b57cec5SDimitry Andricprivate:
1091 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI slice_array(const slice& __sl, const valarray<value_type>& __v)
1092 cb14a3feSDimitry Andric      : __vp_(const_cast<value_type*>(__v.__begin_ + __sl.start())), __size_(__sl.size()), __stride_(__sl.stride()) {}
1093 0b57cec5SDimitry Andric
1094 cb14a3feSDimitry Andric  template <class>
1095 cb14a3feSDimitry Andric  friend class valarray;
1096 0b57cec5SDimitry Andric};
1097 0b57cec5SDimitry Andric
1098 0b57cec5SDimitry Andrictemplate <class _Tp>
1099 cb14a3feSDimitry Andricinline const slice_array<_Tp>& slice_array<_Tp>::operator=(const slice_array& __sa) const {
1100 0b57cec5SDimitry Andric  value_type* __t       = __vp_;
1101 0b57cec5SDimitry Andric  const value_type* __s = __sa.__vp_;
1102 0b57cec5SDimitry Andric  for (size_t __n = __size_; __n; --__n, __t += __stride_, __s += __sa.__stride_)
1103 0b57cec5SDimitry Andric    *__t = *__s;
1104 0b57cec5SDimitry Andric  return *this;
1105 0b57cec5SDimitry Andric}
1106 0b57cec5SDimitry Andric
1107 0b57cec5SDimitry Andrictemplate <class _Tp>
1108 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1109 cb14a3feSDimitry Andricinline void slice_array<_Tp>::operator=(const _Expr& __v) const {
1110 0b57cec5SDimitry Andric  value_type* __t = __vp_;
1111 0b57cec5SDimitry Andric  for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1112 0b57cec5SDimitry Andric    *__t = __v[__i];
1113 0b57cec5SDimitry Andric}
1114 0b57cec5SDimitry Andric
1115 0b57cec5SDimitry Andrictemplate <class _Tp>
1116 cb14a3feSDimitry Andricinline void slice_array<_Tp>::operator=(const valarray<value_type>& __va) const {
1117 e8d8bef9SDimitry Andric  value_type* __t = __vp_;
1118 e8d8bef9SDimitry Andric  for (size_t __i = 0; __i < __va.size(); ++__i, __t += __stride_)
1119 e8d8bef9SDimitry Andric    *__t = __va[__i];
1120 e8d8bef9SDimitry Andric}
1121 e8d8bef9SDimitry Andric
1122 e8d8bef9SDimitry Andrictemplate <class _Tp>
1123 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1124 cb14a3feSDimitry Andricinline void slice_array<_Tp>::operator*=(const _Expr& __v) const {
1125 0b57cec5SDimitry Andric  value_type* __t = __vp_;
1126 0b57cec5SDimitry Andric  for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1127 0b57cec5SDimitry Andric    *__t *= __v[__i];
1128 0b57cec5SDimitry Andric}
1129 0b57cec5SDimitry Andric
1130 0b57cec5SDimitry Andrictemplate <class _Tp>
1131 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1132 cb14a3feSDimitry Andricinline void slice_array<_Tp>::operator/=(const _Expr& __v) const {
1133 0b57cec5SDimitry Andric  value_type* __t = __vp_;
1134 0b57cec5SDimitry Andric  for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1135 0b57cec5SDimitry Andric    *__t /= __v[__i];
1136 0b57cec5SDimitry Andric}
1137 0b57cec5SDimitry Andric
1138 0b57cec5SDimitry Andrictemplate <class _Tp>
1139 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1140 cb14a3feSDimitry Andricinline void slice_array<_Tp>::operator%=(const _Expr& __v) const {
1141 0b57cec5SDimitry Andric  value_type* __t = __vp_;
1142 0b57cec5SDimitry Andric  for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1143 0b57cec5SDimitry Andric    *__t %= __v[__i];
1144 0b57cec5SDimitry Andric}
1145 0b57cec5SDimitry Andric
1146 0b57cec5SDimitry Andrictemplate <class _Tp>
1147 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1148 cb14a3feSDimitry Andricinline void slice_array<_Tp>::operator+=(const _Expr& __v) const {
1149 0b57cec5SDimitry Andric  value_type* __t = __vp_;
1150 0b57cec5SDimitry Andric  for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1151 0b57cec5SDimitry Andric    *__t += __v[__i];
1152 0b57cec5SDimitry Andric}
1153 0b57cec5SDimitry Andric
1154 0b57cec5SDimitry Andrictemplate <class _Tp>
1155 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1156 cb14a3feSDimitry Andricinline void slice_array<_Tp>::operator-=(const _Expr& __v) const {
1157 0b57cec5SDimitry Andric  value_type* __t = __vp_;
1158 0b57cec5SDimitry Andric  for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1159 0b57cec5SDimitry Andric    *__t -= __v[__i];
1160 0b57cec5SDimitry Andric}
1161 0b57cec5SDimitry Andric
1162 0b57cec5SDimitry Andrictemplate <class _Tp>
1163 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1164 cb14a3feSDimitry Andricinline void slice_array<_Tp>::operator^=(const _Expr& __v) const {
1165 0b57cec5SDimitry Andric  value_type* __t = __vp_;
1166 0b57cec5SDimitry Andric  for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1167 0b57cec5SDimitry Andric    *__t ^= __v[__i];
1168 0b57cec5SDimitry Andric}
1169 0b57cec5SDimitry Andric
1170 0b57cec5SDimitry Andrictemplate <class _Tp>
1171 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1172 cb14a3feSDimitry Andricinline void slice_array<_Tp>::operator&=(const _Expr& __v) const {
1173 0b57cec5SDimitry Andric  value_type* __t = __vp_;
1174 0b57cec5SDimitry Andric  for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1175 0b57cec5SDimitry Andric    *__t &= __v[__i];
1176 0b57cec5SDimitry Andric}
1177 0b57cec5SDimitry Andric
1178 0b57cec5SDimitry Andrictemplate <class _Tp>
1179 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1180 cb14a3feSDimitry Andricinline void slice_array<_Tp>::operator|=(const _Expr& __v) const {
1181 0b57cec5SDimitry Andric  value_type* __t = __vp_;
1182 0b57cec5SDimitry Andric  for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1183 0b57cec5SDimitry Andric    *__t |= __v[__i];
1184 0b57cec5SDimitry Andric}
1185 0b57cec5SDimitry Andric
1186 0b57cec5SDimitry Andrictemplate <class _Tp>
1187 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1188 cb14a3feSDimitry Andricinline void slice_array<_Tp>::operator<<=(const _Expr& __v) const {
1189 0b57cec5SDimitry Andric  value_type* __t = __vp_;
1190 0b57cec5SDimitry Andric  for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1191 0b57cec5SDimitry Andric    *__t <<= __v[__i];
1192 0b57cec5SDimitry Andric}
1193 0b57cec5SDimitry Andric
1194 0b57cec5SDimitry Andrictemplate <class _Tp>
1195 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1196 cb14a3feSDimitry Andricinline void slice_array<_Tp>::operator>>=(const _Expr& __v) const {
1197 0b57cec5SDimitry Andric  value_type* __t = __vp_;
1198 0b57cec5SDimitry Andric  for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1199 0b57cec5SDimitry Andric    *__t >>= __v[__i];
1200 0b57cec5SDimitry Andric}
1201 0b57cec5SDimitry Andric
1202 0b57cec5SDimitry Andrictemplate <class _Tp>
1203 cb14a3feSDimitry Andricinline void slice_array<_Tp>::operator=(const value_type& __x) const {
1204 0b57cec5SDimitry Andric  value_type* __t = __vp_;
1205 0b57cec5SDimitry Andric  for (size_t __n = __size_; __n; --__n, __t += __stride_)
1206 0b57cec5SDimitry Andric    *__t = __x;
1207 0b57cec5SDimitry Andric}
1208 0b57cec5SDimitry Andric
1209 0b57cec5SDimitry Andric// gslice
1210 0b57cec5SDimitry Andric
1211 cb14a3feSDimitry Andricclass _LIBCPP_EXPORTED_FROM_ABI gslice {
1212 0b57cec5SDimitry Andric  valarray<size_t> __size_;
1213 0b57cec5SDimitry Andric  valarray<size_t> __stride_;
1214 0b57cec5SDimitry Andric  valarray<size_t> __1d_;
1215 0b57cec5SDimitry Andric
1216 0b57cec5SDimitry Andricpublic:
1217 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI gslice() {}
1218 0b57cec5SDimitry Andric
1219 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI gslice(size_t __start, const valarray<size_t>& __size, const valarray<size_t>& __stride)
1220 cb14a3feSDimitry Andric      : __size_(__size), __stride_(__stride) {
1221 cb14a3feSDimitry Andric    __init(__start);
1222 cb14a3feSDimitry Andric  }
1223 0b57cec5SDimitry Andric
1224 0b57cec5SDimitry Andric#ifndef _LIBCPP_CXX03_LANG
1225 0b57cec5SDimitry Andric
1226 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI gslice(size_t __start, const valarray<size_t>& __size, valarray<size_t>&& __stride)
1227 cb14a3feSDimitry Andric      : __size_(__size), __stride_(std::move(__stride)) {
1228 cb14a3feSDimitry Andric    __init(__start);
1229 cb14a3feSDimitry Andric  }
1230 0b57cec5SDimitry Andric
1231 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI gslice(size_t __start, valarray<size_t>&& __size, const valarray<size_t>& __stride)
1232 cb14a3feSDimitry Andric      : __size_(std::move(__size)), __stride_(__stride) {
1233 cb14a3feSDimitry Andric    __init(__start);
1234 cb14a3feSDimitry Andric  }
1235 0b57cec5SDimitry Andric
1236 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI gslice(size_t __start, valarray<size_t>&& __size, valarray<size_t>&& __stride)
1237 cb14a3feSDimitry Andric      : __size_(std::move(__size)), __stride_(std::move(__stride)) {
1238 cb14a3feSDimitry Andric    __init(__start);
1239 cb14a3feSDimitry Andric  }
1240 0b57cec5SDimitry Andric
1241 0b57cec5SDimitry Andric#endif // _LIBCPP_CXX03_LANG
1242 0b57cec5SDimitry Andric
1243 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI size_t start() const { return __1d_.size() ? __1d_[0] : 0; }
1244 0b57cec5SDimitry Andric
1245 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI valarray<size_t> size() const { return __size_; }
1246 0b57cec5SDimitry Andric
1247 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI valarray<size_t> stride() const { return __stride_; }
1248 0b57cec5SDimitry Andric
1249 0b57cec5SDimitry Andricprivate:
1250 0b57cec5SDimitry Andric  void __init(size_t __start);
1251 0b57cec5SDimitry Andric
1252 cb14a3feSDimitry Andric  template <class>
1253 cb14a3feSDimitry Andric  friend class gslice_array;
1254 cb14a3feSDimitry Andric  template <class>
1255 cb14a3feSDimitry Andric  friend class valarray;
1256 cb14a3feSDimitry Andric  template <class>
1257 cb14a3feSDimitry Andric  friend class __val_expr;
1258 0b57cec5SDimitry Andric};
1259 0b57cec5SDimitry Andric
1260 0b57cec5SDimitry Andric// gslice_array
1261 0b57cec5SDimitry Andric
1262 0b57cec5SDimitry Andrictemplate <class _Tp>
1263 cb14a3feSDimitry Andricclass _LIBCPP_TEMPLATE_VIS gslice_array {
1264 0b57cec5SDimitry Andricpublic:
1265 0b57cec5SDimitry Andric  typedef _Tp value_type;
1266 0b57cec5SDimitry Andric
1267 0b57cec5SDimitry Andricprivate:
1268 0b57cec5SDimitry Andric  value_type* __vp_;
1269 0b57cec5SDimitry Andric  valarray<size_t> __1d_;
1270 0b57cec5SDimitry Andric
1271 0b57cec5SDimitry Andricpublic:
1272 5f757f3fSDimitry Andric  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1273 cb14a3feSDimitry Andric  void _LIBCPP_HIDE_FROM_ABI operator=(const _Expr& __v) const;
1274 0b57cec5SDimitry Andric
1275 5f757f3fSDimitry Andric  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1276 cb14a3feSDimitry Andric  void _LIBCPP_HIDE_FROM_ABI operator*=(const _Expr& __v) const;
1277 0b57cec5SDimitry Andric
1278 5f757f3fSDimitry Andric  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1279 cb14a3feSDimitry Andric  void _LIBCPP_HIDE_FROM_ABI operator/=(const _Expr& __v) const;
1280 0b57cec5SDimitry Andric
1281 5f757f3fSDimitry Andric  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1282 cb14a3feSDimitry Andric  void _LIBCPP_HIDE_FROM_ABI operator%=(const _Expr& __v) const;
1283 0b57cec5SDimitry Andric
1284 5f757f3fSDimitry Andric  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1285 cb14a3feSDimitry Andric  void _LIBCPP_HIDE_FROM_ABI operator+=(const _Expr& __v) const;
1286 0b57cec5SDimitry Andric
1287 5f757f3fSDimitry Andric  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1288 cb14a3feSDimitry Andric  void _LIBCPP_HIDE_FROM_ABI operator-=(const _Expr& __v) const;
1289 0b57cec5SDimitry Andric
1290 5f757f3fSDimitry Andric  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1291 cb14a3feSDimitry Andric  void _LIBCPP_HIDE_FROM_ABI operator^=(const _Expr& __v) const;
1292 0b57cec5SDimitry Andric
1293 5f757f3fSDimitry Andric  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1294 cb14a3feSDimitry Andric  void _LIBCPP_HIDE_FROM_ABI operator&=(const _Expr& __v) const;
1295 0b57cec5SDimitry Andric
1296 5f757f3fSDimitry Andric  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1297 cb14a3feSDimitry Andric  void _LIBCPP_HIDE_FROM_ABI operator|=(const _Expr& __v) const;
1298 0b57cec5SDimitry Andric
1299 5f757f3fSDimitry Andric  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1300 cb14a3feSDimitry Andric  void _LIBCPP_HIDE_FROM_ABI operator<<=(const _Expr& __v) const;
1301 0b57cec5SDimitry Andric
1302 5f757f3fSDimitry Andric  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1303 cb14a3feSDimitry Andric  void _LIBCPP_HIDE_FROM_ABI operator>>=(const _Expr& __v) const;
1304 0b57cec5SDimitry Andric
1305 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI const gslice_array& operator=(const gslice_array& __ga) const;
1306 0b57cec5SDimitry Andric
1307 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI void operator=(const value_type& __x) const;
1308 0b57cec5SDimitry Andric
1309 cd0c3137SDimitry Andric  gslice_array(const gslice_array&) = default;
1310 0b57cec5SDimitry Andric
1311 *0fca6ea1SDimitry Andric  // Behaves like __val_expr::operator[], which returns by value.
1312 *0fca6ea1SDimitry Andric  _LIBCPP_HIDE_FROM_ABI value_type __get(size_t __i) const {
1313 *0fca6ea1SDimitry Andric    _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(__i < __1d_.size(), "gslice_array.__get() index out of bounds");
1314 *0fca6ea1SDimitry Andric    return __vp_[__1d_[__i]];
1315 *0fca6ea1SDimitry Andric  }
1316 *0fca6ea1SDimitry Andric
1317 0b57cec5SDimitry Andricprivate:
1318 0b57cec5SDimitry Andric  gslice_array(const gslice& __gs, const valarray<value_type>& __v)
1319 cb14a3feSDimitry Andric      : __vp_(const_cast<value_type*>(__v.__begin_)), __1d_(__gs.__1d_) {}
1320 0b57cec5SDimitry Andric
1321 0b57cec5SDimitry Andric#ifndef _LIBCPP_CXX03_LANG
1322 0b57cec5SDimitry Andric  gslice_array(gslice&& __gs, const valarray<value_type>& __v)
1323 cb14a3feSDimitry Andric      : __vp_(const_cast<value_type*>(__v.__begin_)), __1d_(std::move(__gs.__1d_)) {}
1324 0b57cec5SDimitry Andric#endif // _LIBCPP_CXX03_LANG
1325 0b57cec5SDimitry Andric
1326 cb14a3feSDimitry Andric  template <class>
1327 cb14a3feSDimitry Andric  friend class valarray;
1328 0b57cec5SDimitry Andric};
1329 0b57cec5SDimitry Andric
1330 0b57cec5SDimitry Andrictemplate <class _Tp>
1331 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1332 cb14a3feSDimitry Andricinline void gslice_array<_Tp>::operator=(const _Expr& __v) const {
1333 0b57cec5SDimitry Andric  typedef const size_t* _Ip;
1334 0b57cec5SDimitry Andric  size_t __j = 0;
1335 0b57cec5SDimitry Andric  for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1336 0b57cec5SDimitry Andric    __vp_[*__i] = __v[__j];
1337 0b57cec5SDimitry Andric}
1338 0b57cec5SDimitry Andric
1339 0b57cec5SDimitry Andrictemplate <class _Tp>
1340 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1341 cb14a3feSDimitry Andricinline void gslice_array<_Tp>::operator*=(const _Expr& __v) const {
1342 0b57cec5SDimitry Andric  typedef const size_t* _Ip;
1343 0b57cec5SDimitry Andric  size_t __j = 0;
1344 0b57cec5SDimitry Andric  for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1345 0b57cec5SDimitry Andric    __vp_[*__i] *= __v[__j];
1346 0b57cec5SDimitry Andric}
1347 0b57cec5SDimitry Andric
1348 0b57cec5SDimitry Andrictemplate <class _Tp>
1349 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1350 cb14a3feSDimitry Andricinline void gslice_array<_Tp>::operator/=(const _Expr& __v) const {
1351 0b57cec5SDimitry Andric  typedef const size_t* _Ip;
1352 0b57cec5SDimitry Andric  size_t __j = 0;
1353 0b57cec5SDimitry Andric  for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1354 0b57cec5SDimitry Andric    __vp_[*__i] /= __v[__j];
1355 0b57cec5SDimitry Andric}
1356 0b57cec5SDimitry Andric
1357 0b57cec5SDimitry Andrictemplate <class _Tp>
1358 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1359 cb14a3feSDimitry Andricinline void gslice_array<_Tp>::operator%=(const _Expr& __v) const {
1360 0b57cec5SDimitry Andric  typedef const size_t* _Ip;
1361 0b57cec5SDimitry Andric  size_t __j = 0;
1362 0b57cec5SDimitry Andric  for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1363 0b57cec5SDimitry Andric    __vp_[*__i] %= __v[__j];
1364 0b57cec5SDimitry Andric}
1365 0b57cec5SDimitry Andric
1366 0b57cec5SDimitry Andrictemplate <class _Tp>
1367 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1368 cb14a3feSDimitry Andricinline void gslice_array<_Tp>::operator+=(const _Expr& __v) const {
1369 0b57cec5SDimitry Andric  typedef const size_t* _Ip;
1370 0b57cec5SDimitry Andric  size_t __j = 0;
1371 0b57cec5SDimitry Andric  for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1372 0b57cec5SDimitry Andric    __vp_[*__i] += __v[__j];
1373 0b57cec5SDimitry Andric}
1374 0b57cec5SDimitry Andric
1375 0b57cec5SDimitry Andrictemplate <class _Tp>
1376 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1377 cb14a3feSDimitry Andricinline void gslice_array<_Tp>::operator-=(const _Expr& __v) const {
1378 0b57cec5SDimitry Andric  typedef const size_t* _Ip;
1379 0b57cec5SDimitry Andric  size_t __j = 0;
1380 0b57cec5SDimitry Andric  for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1381 0b57cec5SDimitry Andric    __vp_[*__i] -= __v[__j];
1382 0b57cec5SDimitry Andric}
1383 0b57cec5SDimitry Andric
1384 0b57cec5SDimitry Andrictemplate <class _Tp>
1385 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1386 cb14a3feSDimitry Andricinline void gslice_array<_Tp>::operator^=(const _Expr& __v) const {
1387 0b57cec5SDimitry Andric  typedef const size_t* _Ip;
1388 0b57cec5SDimitry Andric  size_t __j = 0;
1389 0b57cec5SDimitry Andric  for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1390 0b57cec5SDimitry Andric    __vp_[*__i] ^= __v[__j];
1391 0b57cec5SDimitry Andric}
1392 0b57cec5SDimitry Andric
1393 0b57cec5SDimitry Andrictemplate <class _Tp>
1394 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1395 cb14a3feSDimitry Andricinline void gslice_array<_Tp>::operator&=(const _Expr& __v) const {
1396 0b57cec5SDimitry Andric  typedef const size_t* _Ip;
1397 0b57cec5SDimitry Andric  size_t __j = 0;
1398 0b57cec5SDimitry Andric  for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1399 0b57cec5SDimitry Andric    __vp_[*__i] &= __v[__j];
1400 0b57cec5SDimitry Andric}
1401 0b57cec5SDimitry Andric
1402 0b57cec5SDimitry Andrictemplate <class _Tp>
1403 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1404 cb14a3feSDimitry Andricinline void gslice_array<_Tp>::operator|=(const _Expr& __v) const {
1405 0b57cec5SDimitry Andric  typedef const size_t* _Ip;
1406 0b57cec5SDimitry Andric  size_t __j = 0;
1407 0b57cec5SDimitry Andric  for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1408 0b57cec5SDimitry Andric    __vp_[*__i] |= __v[__j];
1409 0b57cec5SDimitry Andric}
1410 0b57cec5SDimitry Andric
1411 0b57cec5SDimitry Andrictemplate <class _Tp>
1412 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1413 cb14a3feSDimitry Andricinline void gslice_array<_Tp>::operator<<=(const _Expr& __v) const {
1414 0b57cec5SDimitry Andric  typedef const size_t* _Ip;
1415 0b57cec5SDimitry Andric  size_t __j = 0;
1416 0b57cec5SDimitry Andric  for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1417 0b57cec5SDimitry Andric    __vp_[*__i] <<= __v[__j];
1418 0b57cec5SDimitry Andric}
1419 0b57cec5SDimitry Andric
1420 0b57cec5SDimitry Andrictemplate <class _Tp>
1421 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1422 cb14a3feSDimitry Andricinline void gslice_array<_Tp>::operator>>=(const _Expr& __v) const {
1423 0b57cec5SDimitry Andric  typedef const size_t* _Ip;
1424 0b57cec5SDimitry Andric  size_t __j = 0;
1425 0b57cec5SDimitry Andric  for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1426 0b57cec5SDimitry Andric    __vp_[*__i] >>= __v[__j];
1427 0b57cec5SDimitry Andric}
1428 0b57cec5SDimitry Andric
1429 0b57cec5SDimitry Andrictemplate <class _Tp>
1430 cb14a3feSDimitry Andricinline const gslice_array<_Tp>& gslice_array<_Tp>::operator=(const gslice_array& __ga) const {
1431 0b57cec5SDimitry Andric  typedef const size_t* _Ip;
1432 0b57cec5SDimitry Andric  const value_type* __s = __ga.__vp_;
1433 cb14a3feSDimitry Andric  for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_, __j = __ga.__1d_.__begin_; __i != __e; ++__i, ++__j)
1434 0b57cec5SDimitry Andric    __vp_[*__i] = __s[*__j];
1435 0b57cec5SDimitry Andric  return *this;
1436 0b57cec5SDimitry Andric}
1437 0b57cec5SDimitry Andric
1438 0b57cec5SDimitry Andrictemplate <class _Tp>
1439 cb14a3feSDimitry Andricinline void gslice_array<_Tp>::operator=(const value_type& __x) const {
1440 0b57cec5SDimitry Andric  typedef const size_t* _Ip;
1441 0b57cec5SDimitry Andric  for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i)
1442 0b57cec5SDimitry Andric    __vp_[*__i] = __x;
1443 0b57cec5SDimitry Andric}
1444 0b57cec5SDimitry Andric
1445 0b57cec5SDimitry Andric// mask_array
1446 0b57cec5SDimitry Andric
1447 0b57cec5SDimitry Andrictemplate <class _Tp>
1448 cb14a3feSDimitry Andricclass _LIBCPP_TEMPLATE_VIS mask_array {
1449 0b57cec5SDimitry Andricpublic:
1450 0b57cec5SDimitry Andric  typedef _Tp value_type;
1451 0b57cec5SDimitry Andric
1452 0b57cec5SDimitry Andricprivate:
1453 0b57cec5SDimitry Andric  value_type* __vp_;
1454 0b57cec5SDimitry Andric  valarray<size_t> __1d_;
1455 0b57cec5SDimitry Andric
1456 0b57cec5SDimitry Andricpublic:
1457 5f757f3fSDimitry Andric  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1458 cb14a3feSDimitry Andric  void _LIBCPP_HIDE_FROM_ABI operator=(const _Expr& __v) const;
1459 0b57cec5SDimitry Andric
1460 5f757f3fSDimitry Andric  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1461 cb14a3feSDimitry Andric  void _LIBCPP_HIDE_FROM_ABI operator*=(const _Expr& __v) const;
1462 0b57cec5SDimitry Andric
1463 5f757f3fSDimitry Andric  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1464 cb14a3feSDimitry Andric  void _LIBCPP_HIDE_FROM_ABI operator/=(const _Expr& __v) const;
1465 0b57cec5SDimitry Andric
1466 5f757f3fSDimitry Andric  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1467 cb14a3feSDimitry Andric  void _LIBCPP_HIDE_FROM_ABI operator%=(const _Expr& __v) const;
1468 0b57cec5SDimitry Andric
1469 5f757f3fSDimitry Andric  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1470 cb14a3feSDimitry Andric  void _LIBCPP_HIDE_FROM_ABI operator+=(const _Expr& __v) const;
1471 0b57cec5SDimitry Andric
1472 5f757f3fSDimitry Andric  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1473 cb14a3feSDimitry Andric  void _LIBCPP_HIDE_FROM_ABI operator-=(const _Expr& __v) const;
1474 0b57cec5SDimitry Andric
1475 5f757f3fSDimitry Andric  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1476 cb14a3feSDimitry Andric  void _LIBCPP_HIDE_FROM_ABI operator^=(const _Expr& __v) const;
1477 0b57cec5SDimitry Andric
1478 5f757f3fSDimitry Andric  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1479 cb14a3feSDimitry Andric  void _LIBCPP_HIDE_FROM_ABI operator&=(const _Expr& __v) const;
1480 0b57cec5SDimitry Andric
1481 5f757f3fSDimitry Andric  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1482 cb14a3feSDimitry Andric  void _LIBCPP_HIDE_FROM_ABI operator|=(const _Expr& __v) const;
1483 0b57cec5SDimitry Andric
1484 5f757f3fSDimitry Andric  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1485 cb14a3feSDimitry Andric  void _LIBCPP_HIDE_FROM_ABI operator<<=(const _Expr& __v) const;
1486 0b57cec5SDimitry Andric
1487 5f757f3fSDimitry Andric  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1488 cb14a3feSDimitry Andric  void _LIBCPP_HIDE_FROM_ABI operator>>=(const _Expr& __v) const;
1489 0b57cec5SDimitry Andric
1490 cd0c3137SDimitry Andric  mask_array(const mask_array&) = default;
1491 cd0c3137SDimitry Andric
1492 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI const mask_array& operator=(const mask_array& __ma) const;
1493 0b57cec5SDimitry Andric
1494 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI void operator=(const value_type& __x) const;
1495 0b57cec5SDimitry Andric
1496 *0fca6ea1SDimitry Andric  // Behaves like __val_expr::operator[], which returns by value.
1497 *0fca6ea1SDimitry Andric  _LIBCPP_HIDE_FROM_ABI value_type __get(size_t __i) const {
1498 *0fca6ea1SDimitry Andric    _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(__i < __1d_.size(), "mask_array.__get() index out of bounds");
1499 *0fca6ea1SDimitry Andric    return __vp_[__1d_[__i]];
1500 *0fca6ea1SDimitry Andric  }
1501 *0fca6ea1SDimitry Andric
1502 0b57cec5SDimitry Andricprivate:
1503 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI mask_array(const valarray<bool>& __vb, const valarray<value_type>& __v)
1504 0b57cec5SDimitry Andric      : __vp_(const_cast<value_type*>(__v.__begin_)),
1505 cb14a3feSDimitry Andric        __1d_(static_cast<size_t>(count(__vb.__begin_, __vb.__end_, true))) {
1506 0b57cec5SDimitry Andric    size_t __j = 0;
1507 0b57cec5SDimitry Andric    for (size_t __i = 0; __i < __vb.size(); ++__i)
1508 0b57cec5SDimitry Andric      if (__vb[__i])
1509 0b57cec5SDimitry Andric        __1d_[__j++] = __i;
1510 0b57cec5SDimitry Andric  }
1511 0b57cec5SDimitry Andric
1512 cb14a3feSDimitry Andric  template <class>
1513 cb14a3feSDimitry Andric  friend class valarray;
1514 0b57cec5SDimitry Andric};
1515 0b57cec5SDimitry Andric
1516 0b57cec5SDimitry Andrictemplate <class _Tp>
1517 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1518 cb14a3feSDimitry Andricinline void mask_array<_Tp>::operator=(const _Expr& __v) const {
1519 0b57cec5SDimitry Andric  size_t __n = __1d_.size();
1520 0b57cec5SDimitry Andric  for (size_t __i = 0; __i < __n; ++__i)
1521 0b57cec5SDimitry Andric    __vp_[__1d_[__i]] = __v[__i];
1522 0b57cec5SDimitry Andric}
1523 0b57cec5SDimitry Andric
1524 0b57cec5SDimitry Andrictemplate <class _Tp>
1525 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1526 cb14a3feSDimitry Andricinline void mask_array<_Tp>::operator*=(const _Expr& __v) const {
1527 0b57cec5SDimitry Andric  size_t __n = __1d_.size();
1528 0b57cec5SDimitry Andric  for (size_t __i = 0; __i < __n; ++__i)
1529 0b57cec5SDimitry Andric    __vp_[__1d_[__i]] *= __v[__i];
1530 0b57cec5SDimitry Andric}
1531 0b57cec5SDimitry Andric
1532 0b57cec5SDimitry Andrictemplate <class _Tp>
1533 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1534 cb14a3feSDimitry Andricinline void mask_array<_Tp>::operator/=(const _Expr& __v) const {
1535 0b57cec5SDimitry Andric  size_t __n = __1d_.size();
1536 0b57cec5SDimitry Andric  for (size_t __i = 0; __i < __n; ++__i)
1537 0b57cec5SDimitry Andric    __vp_[__1d_[__i]] /= __v[__i];
1538 0b57cec5SDimitry Andric}
1539 0b57cec5SDimitry Andric
1540 0b57cec5SDimitry Andrictemplate <class _Tp>
1541 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1542 cb14a3feSDimitry Andricinline void mask_array<_Tp>::operator%=(const _Expr& __v) const {
1543 0b57cec5SDimitry Andric  size_t __n = __1d_.size();
1544 0b57cec5SDimitry Andric  for (size_t __i = 0; __i < __n; ++__i)
1545 0b57cec5SDimitry Andric    __vp_[__1d_[__i]] %= __v[__i];
1546 0b57cec5SDimitry Andric}
1547 0b57cec5SDimitry Andric
1548 0b57cec5SDimitry Andrictemplate <class _Tp>
1549 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1550 cb14a3feSDimitry Andricinline void mask_array<_Tp>::operator+=(const _Expr& __v) const {
1551 0b57cec5SDimitry Andric  size_t __n = __1d_.size();
1552 0b57cec5SDimitry Andric  for (size_t __i = 0; __i < __n; ++__i)
1553 0b57cec5SDimitry Andric    __vp_[__1d_[__i]] += __v[__i];
1554 0b57cec5SDimitry Andric}
1555 0b57cec5SDimitry Andric
1556 0b57cec5SDimitry Andrictemplate <class _Tp>
1557 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1558 cb14a3feSDimitry Andricinline void mask_array<_Tp>::operator-=(const _Expr& __v) const {
1559 0b57cec5SDimitry Andric  size_t __n = __1d_.size();
1560 0b57cec5SDimitry Andric  for (size_t __i = 0; __i < __n; ++__i)
1561 0b57cec5SDimitry Andric    __vp_[__1d_[__i]] -= __v[__i];
1562 0b57cec5SDimitry Andric}
1563 0b57cec5SDimitry Andric
1564 0b57cec5SDimitry Andrictemplate <class _Tp>
1565 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1566 cb14a3feSDimitry Andricinline void mask_array<_Tp>::operator^=(const _Expr& __v) const {
1567 0b57cec5SDimitry Andric  size_t __n = __1d_.size();
1568 0b57cec5SDimitry Andric  for (size_t __i = 0; __i < __n; ++__i)
1569 0b57cec5SDimitry Andric    __vp_[__1d_[__i]] ^= __v[__i];
1570 0b57cec5SDimitry Andric}
1571 0b57cec5SDimitry Andric
1572 0b57cec5SDimitry Andrictemplate <class _Tp>
1573 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1574 cb14a3feSDimitry Andricinline void mask_array<_Tp>::operator&=(const _Expr& __v) const {
1575 0b57cec5SDimitry Andric  size_t __n = __1d_.size();
1576 0b57cec5SDimitry Andric  for (size_t __i = 0; __i < __n; ++__i)
1577 0b57cec5SDimitry Andric    __vp_[__1d_[__i]] &= __v[__i];
1578 0b57cec5SDimitry Andric}
1579 0b57cec5SDimitry Andric
1580 0b57cec5SDimitry Andrictemplate <class _Tp>
1581 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1582 cb14a3feSDimitry Andricinline void mask_array<_Tp>::operator|=(const _Expr& __v) const {
1583 0b57cec5SDimitry Andric  size_t __n = __1d_.size();
1584 0b57cec5SDimitry Andric  for (size_t __i = 0; __i < __n; ++__i)
1585 0b57cec5SDimitry Andric    __vp_[__1d_[__i]] |= __v[__i];
1586 0b57cec5SDimitry Andric}
1587 0b57cec5SDimitry Andric
1588 0b57cec5SDimitry Andrictemplate <class _Tp>
1589 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1590 cb14a3feSDimitry Andricinline void mask_array<_Tp>::operator<<=(const _Expr& __v) const {
1591 0b57cec5SDimitry Andric  size_t __n = __1d_.size();
1592 0b57cec5SDimitry Andric  for (size_t __i = 0; __i < __n; ++__i)
1593 0b57cec5SDimitry Andric    __vp_[__1d_[__i]] <<= __v[__i];
1594 0b57cec5SDimitry Andric}
1595 0b57cec5SDimitry Andric
1596 0b57cec5SDimitry Andrictemplate <class _Tp>
1597 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1598 cb14a3feSDimitry Andricinline void mask_array<_Tp>::operator>>=(const _Expr& __v) const {
1599 0b57cec5SDimitry Andric  size_t __n = __1d_.size();
1600 0b57cec5SDimitry Andric  for (size_t __i = 0; __i < __n; ++__i)
1601 0b57cec5SDimitry Andric    __vp_[__1d_[__i]] >>= __v[__i];
1602 0b57cec5SDimitry Andric}
1603 0b57cec5SDimitry Andric
1604 0b57cec5SDimitry Andrictemplate <class _Tp>
1605 cb14a3feSDimitry Andricinline const mask_array<_Tp>& mask_array<_Tp>::operator=(const mask_array& __ma) const {
1606 0b57cec5SDimitry Andric  size_t __n = __1d_.size();
1607 0b57cec5SDimitry Andric  for (size_t __i = 0; __i < __n; ++__i)
1608 0b57cec5SDimitry Andric    __vp_[__1d_[__i]] = __ma.__vp_[__1d_[__i]];
1609 0b57cec5SDimitry Andric  return *this;
1610 0b57cec5SDimitry Andric}
1611 0b57cec5SDimitry Andric
1612 0b57cec5SDimitry Andrictemplate <class _Tp>
1613 cb14a3feSDimitry Andricinline void mask_array<_Tp>::operator=(const value_type& __x) const {
1614 0b57cec5SDimitry Andric  size_t __n = __1d_.size();
1615 0b57cec5SDimitry Andric  for (size_t __i = 0; __i < __n; ++__i)
1616 0b57cec5SDimitry Andric    __vp_[__1d_[__i]] = __x;
1617 0b57cec5SDimitry Andric}
1618 0b57cec5SDimitry Andric
1619 0b57cec5SDimitry Andrictemplate <class _ValExpr>
1620 cb14a3feSDimitry Andricclass __mask_expr {
1621 bdd1243dSDimitry Andric  typedef __libcpp_remove_reference_t<_ValExpr> _RmExpr;
1622 cb14a3feSDimitry Andric
1623 0b57cec5SDimitry Andricpublic:
1624 0b57cec5SDimitry Andric  typedef typename _RmExpr::value_type value_type;
1625 fe6060f1SDimitry Andric  typedef value_type __result_type;
1626 0b57cec5SDimitry Andric
1627 0b57cec5SDimitry Andricprivate:
1628 0b57cec5SDimitry Andric  _ValExpr __expr_;
1629 0b57cec5SDimitry Andric  valarray<size_t> __1d_;
1630 0b57cec5SDimitry Andric
1631 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI __mask_expr(const valarray<bool>& __vb, const _RmExpr& __e)
1632 cb14a3feSDimitry Andric      : __expr_(__e), __1d_(static_cast<size_t>(count(__vb.__begin_, __vb.__end_, true))) {
1633 0b57cec5SDimitry Andric    size_t __j = 0;
1634 0b57cec5SDimitry Andric    for (size_t __i = 0; __i < __vb.size(); ++__i)
1635 0b57cec5SDimitry Andric      if (__vb[__i])
1636 0b57cec5SDimitry Andric        __1d_[__j++] = __i;
1637 0b57cec5SDimitry Andric  }
1638 0b57cec5SDimitry Andric
1639 0b57cec5SDimitry Andricpublic:
1640 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI __result_type operator[](size_t __i) const { return __expr_[__1d_[__i]]; }
1641 0b57cec5SDimitry Andric
1642 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI size_t size() const { return __1d_.size(); }
1643 0b57cec5SDimitry Andric
1644 cb14a3feSDimitry Andric  template <class>
1645 cb14a3feSDimitry Andric  friend class __val_expr;
1646 cb14a3feSDimitry Andric  template <class>
1647 cb14a3feSDimitry Andric  friend class valarray;
1648 0b57cec5SDimitry Andric};
1649 0b57cec5SDimitry Andric
1650 0b57cec5SDimitry Andric// indirect_array
1651 0b57cec5SDimitry Andric
1652 0b57cec5SDimitry Andrictemplate <class _Tp>
1653 cb14a3feSDimitry Andricclass _LIBCPP_TEMPLATE_VIS indirect_array {
1654 0b57cec5SDimitry Andricpublic:
1655 0b57cec5SDimitry Andric  typedef _Tp value_type;
1656 0b57cec5SDimitry Andric
1657 0b57cec5SDimitry Andricprivate:
1658 0b57cec5SDimitry Andric  value_type* __vp_;
1659 0b57cec5SDimitry Andric  valarray<size_t> __1d_;
1660 0b57cec5SDimitry Andric
1661 0b57cec5SDimitry Andricpublic:
1662 5f757f3fSDimitry Andric  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1663 cb14a3feSDimitry Andric  void _LIBCPP_HIDE_FROM_ABI operator=(const _Expr& __v) const;
1664 0b57cec5SDimitry Andric
1665 5f757f3fSDimitry Andric  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1666 cb14a3feSDimitry Andric  void _LIBCPP_HIDE_FROM_ABI operator*=(const _Expr& __v) const;
1667 0b57cec5SDimitry Andric
1668 5f757f3fSDimitry Andric  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1669 cb14a3feSDimitry Andric  void _LIBCPP_HIDE_FROM_ABI operator/=(const _Expr& __v) const;
1670 0b57cec5SDimitry Andric
1671 5f757f3fSDimitry Andric  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1672 cb14a3feSDimitry Andric  void _LIBCPP_HIDE_FROM_ABI operator%=(const _Expr& __v) const;
1673 0b57cec5SDimitry Andric
1674 5f757f3fSDimitry Andric  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1675 cb14a3feSDimitry Andric  void _LIBCPP_HIDE_FROM_ABI operator+=(const _Expr& __v) const;
1676 0b57cec5SDimitry Andric
1677 5f757f3fSDimitry Andric  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1678 cb14a3feSDimitry Andric  void _LIBCPP_HIDE_FROM_ABI operator-=(const _Expr& __v) const;
1679 0b57cec5SDimitry Andric
1680 5f757f3fSDimitry Andric  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1681 cb14a3feSDimitry Andric  void _LIBCPP_HIDE_FROM_ABI operator^=(const _Expr& __v) const;
1682 0b57cec5SDimitry Andric
1683 5f757f3fSDimitry Andric  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1684 cb14a3feSDimitry Andric  void _LIBCPP_HIDE_FROM_ABI operator&=(const _Expr& __v) const;
1685 0b57cec5SDimitry Andric
1686 5f757f3fSDimitry Andric  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1687 cb14a3feSDimitry Andric  void _LIBCPP_HIDE_FROM_ABI operator|=(const _Expr& __v) const;
1688 0b57cec5SDimitry Andric
1689 5f757f3fSDimitry Andric  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1690 cb14a3feSDimitry Andric  void _LIBCPP_HIDE_FROM_ABI operator<<=(const _Expr& __v) const;
1691 0b57cec5SDimitry Andric
1692 5f757f3fSDimitry Andric  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1693 cb14a3feSDimitry Andric  void _LIBCPP_HIDE_FROM_ABI operator>>=(const _Expr& __v) const;
1694 0b57cec5SDimitry Andric
1695 cd0c3137SDimitry Andric  indirect_array(const indirect_array&) = default;
1696 cd0c3137SDimitry Andric
1697 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI const indirect_array& operator=(const indirect_array& __ia) const;
1698 0b57cec5SDimitry Andric
1699 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI void operator=(const value_type& __x) const;
1700 0b57cec5SDimitry Andric
1701 *0fca6ea1SDimitry Andric  // Behaves like __val_expr::operator[], which returns by value.
1702 *0fca6ea1SDimitry Andric  _LIBCPP_HIDE_FROM_ABI value_type __get(size_t __i) const {
1703 *0fca6ea1SDimitry Andric    _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(__i < __1d_.size(), "indirect_array.__get() index out of bounds");
1704 *0fca6ea1SDimitry Andric    return __vp_[__1d_[__i]];
1705 *0fca6ea1SDimitry Andric  }
1706 *0fca6ea1SDimitry Andric
1707 0b57cec5SDimitry Andricprivate:
1708 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI indirect_array(const valarray<size_t>& __ia, const valarray<value_type>& __v)
1709 cb14a3feSDimitry Andric      : __vp_(const_cast<value_type*>(__v.__begin_)), __1d_(__ia) {}
1710 0b57cec5SDimitry Andric
1711 0b57cec5SDimitry Andric#ifndef _LIBCPP_CXX03_LANG
1712 0b57cec5SDimitry Andric
1713 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI indirect_array(valarray<size_t>&& __ia, const valarray<value_type>& __v)
1714 cb14a3feSDimitry Andric      : __vp_(const_cast<value_type*>(__v.__begin_)), __1d_(std::move(__ia)) {}
1715 0b57cec5SDimitry Andric
1716 0b57cec5SDimitry Andric#endif // _LIBCPP_CXX03_LANG
1717 0b57cec5SDimitry Andric
1718 cb14a3feSDimitry Andric  template <class>
1719 cb14a3feSDimitry Andric  friend class valarray;
1720 0b57cec5SDimitry Andric};
1721 0b57cec5SDimitry Andric
1722 0b57cec5SDimitry Andrictemplate <class _Tp>
1723 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1724 cb14a3feSDimitry Andricinline void indirect_array<_Tp>::operator=(const _Expr& __v) const {
1725 0b57cec5SDimitry Andric  size_t __n = __1d_.size();
1726 0b57cec5SDimitry Andric  for (size_t __i = 0; __i < __n; ++__i)
1727 0b57cec5SDimitry Andric    __vp_[__1d_[__i]] = __v[__i];
1728 0b57cec5SDimitry Andric}
1729 0b57cec5SDimitry Andric
1730 0b57cec5SDimitry Andrictemplate <class _Tp>
1731 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1732 cb14a3feSDimitry Andricinline void indirect_array<_Tp>::operator*=(const _Expr& __v) const {
1733 0b57cec5SDimitry Andric  size_t __n = __1d_.size();
1734 0b57cec5SDimitry Andric  for (size_t __i = 0; __i < __n; ++__i)
1735 0b57cec5SDimitry Andric    __vp_[__1d_[__i]] *= __v[__i];
1736 0b57cec5SDimitry Andric}
1737 0b57cec5SDimitry Andric
1738 0b57cec5SDimitry Andrictemplate <class _Tp>
1739 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1740 cb14a3feSDimitry Andricinline void indirect_array<_Tp>::operator/=(const _Expr& __v) const {
1741 0b57cec5SDimitry Andric  size_t __n = __1d_.size();
1742 0b57cec5SDimitry Andric  for (size_t __i = 0; __i < __n; ++__i)
1743 0b57cec5SDimitry Andric    __vp_[__1d_[__i]] /= __v[__i];
1744 0b57cec5SDimitry Andric}
1745 0b57cec5SDimitry Andric
1746 0b57cec5SDimitry Andrictemplate <class _Tp>
1747 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1748 cb14a3feSDimitry Andricinline void indirect_array<_Tp>::operator%=(const _Expr& __v) const {
1749 0b57cec5SDimitry Andric  size_t __n = __1d_.size();
1750 0b57cec5SDimitry Andric  for (size_t __i = 0; __i < __n; ++__i)
1751 0b57cec5SDimitry Andric    __vp_[__1d_[__i]] %= __v[__i];
1752 0b57cec5SDimitry Andric}
1753 0b57cec5SDimitry Andric
1754 0b57cec5SDimitry Andrictemplate <class _Tp>
1755 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1756 cb14a3feSDimitry Andricinline void indirect_array<_Tp>::operator+=(const _Expr& __v) const {
1757 0b57cec5SDimitry Andric  size_t __n = __1d_.size();
1758 0b57cec5SDimitry Andric  for (size_t __i = 0; __i < __n; ++__i)
1759 0b57cec5SDimitry Andric    __vp_[__1d_[__i]] += __v[__i];
1760 0b57cec5SDimitry Andric}
1761 0b57cec5SDimitry Andric
1762 0b57cec5SDimitry Andrictemplate <class _Tp>
1763 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1764 cb14a3feSDimitry Andricinline void indirect_array<_Tp>::operator-=(const _Expr& __v) const {
1765 0b57cec5SDimitry Andric  size_t __n = __1d_.size();
1766 0b57cec5SDimitry Andric  for (size_t __i = 0; __i < __n; ++__i)
1767 0b57cec5SDimitry Andric    __vp_[__1d_[__i]] -= __v[__i];
1768 0b57cec5SDimitry Andric}
1769 0b57cec5SDimitry Andric
1770 0b57cec5SDimitry Andrictemplate <class _Tp>
1771 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1772 cb14a3feSDimitry Andricinline void indirect_array<_Tp>::operator^=(const _Expr& __v) const {
1773 0b57cec5SDimitry Andric  size_t __n = __1d_.size();
1774 0b57cec5SDimitry Andric  for (size_t __i = 0; __i < __n; ++__i)
1775 0b57cec5SDimitry Andric    __vp_[__1d_[__i]] ^= __v[__i];
1776 0b57cec5SDimitry Andric}
1777 0b57cec5SDimitry Andric
1778 0b57cec5SDimitry Andrictemplate <class _Tp>
1779 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1780 cb14a3feSDimitry Andricinline void indirect_array<_Tp>::operator&=(const _Expr& __v) const {
1781 0b57cec5SDimitry Andric  size_t __n = __1d_.size();
1782 0b57cec5SDimitry Andric  for (size_t __i = 0; __i < __n; ++__i)
1783 0b57cec5SDimitry Andric    __vp_[__1d_[__i]] &= __v[__i];
1784 0b57cec5SDimitry Andric}
1785 0b57cec5SDimitry Andric
1786 0b57cec5SDimitry Andrictemplate <class _Tp>
1787 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1788 cb14a3feSDimitry Andricinline void indirect_array<_Tp>::operator|=(const _Expr& __v) const {
1789 0b57cec5SDimitry Andric  size_t __n = __1d_.size();
1790 0b57cec5SDimitry Andric  for (size_t __i = 0; __i < __n; ++__i)
1791 0b57cec5SDimitry Andric    __vp_[__1d_[__i]] |= __v[__i];
1792 0b57cec5SDimitry Andric}
1793 0b57cec5SDimitry Andric
1794 0b57cec5SDimitry Andrictemplate <class _Tp>
1795 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1796 cb14a3feSDimitry Andricinline void indirect_array<_Tp>::operator<<=(const _Expr& __v) const {
1797 0b57cec5SDimitry Andric  size_t __n = __1d_.size();
1798 0b57cec5SDimitry Andric  for (size_t __i = 0; __i < __n; ++__i)
1799 0b57cec5SDimitry Andric    __vp_[__1d_[__i]] <<= __v[__i];
1800 0b57cec5SDimitry Andric}
1801 0b57cec5SDimitry Andric
1802 0b57cec5SDimitry Andrictemplate <class _Tp>
1803 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1804 cb14a3feSDimitry Andricinline void indirect_array<_Tp>::operator>>=(const _Expr& __v) const {
1805 0b57cec5SDimitry Andric  size_t __n = __1d_.size();
1806 0b57cec5SDimitry Andric  for (size_t __i = 0; __i < __n; ++__i)
1807 0b57cec5SDimitry Andric    __vp_[__1d_[__i]] >>= __v[__i];
1808 0b57cec5SDimitry Andric}
1809 0b57cec5SDimitry Andric
1810 0b57cec5SDimitry Andrictemplate <class _Tp>
1811 cb14a3feSDimitry Andricinline const indirect_array<_Tp>& indirect_array<_Tp>::operator=(const indirect_array& __ia) const {
1812 0b57cec5SDimitry Andric  typedef const size_t* _Ip;
1813 0b57cec5SDimitry Andric  const value_type* __s = __ia.__vp_;
1814 cb14a3feSDimitry Andric  for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_, __j = __ia.__1d_.__begin_; __i != __e; ++__i, ++__j)
1815 0b57cec5SDimitry Andric    __vp_[*__i] = __s[*__j];
1816 0b57cec5SDimitry Andric  return *this;
1817 0b57cec5SDimitry Andric}
1818 0b57cec5SDimitry Andric
1819 0b57cec5SDimitry Andrictemplate <class _Tp>
1820 cb14a3feSDimitry Andricinline void indirect_array<_Tp>::operator=(const value_type& __x) const {
1821 0b57cec5SDimitry Andric  typedef const size_t* _Ip;
1822 0b57cec5SDimitry Andric  for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i)
1823 0b57cec5SDimitry Andric    __vp_[*__i] = __x;
1824 0b57cec5SDimitry Andric}
1825 0b57cec5SDimitry Andric
1826 0b57cec5SDimitry Andrictemplate <class _ValExpr>
1827 cb14a3feSDimitry Andricclass __indirect_expr {
1828 bdd1243dSDimitry Andric  typedef __libcpp_remove_reference_t<_ValExpr> _RmExpr;
1829 cb14a3feSDimitry Andric
1830 0b57cec5SDimitry Andricpublic:
1831 0b57cec5SDimitry Andric  typedef typename _RmExpr::value_type value_type;
1832 fe6060f1SDimitry Andric  typedef value_type __result_type;
1833 0b57cec5SDimitry Andric
1834 0b57cec5SDimitry Andricprivate:
1835 0b57cec5SDimitry Andric  _ValExpr __expr_;
1836 0b57cec5SDimitry Andric  valarray<size_t> __1d_;
1837 0b57cec5SDimitry Andric
1838 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI __indirect_expr(const valarray<size_t>& __ia, const _RmExpr& __e) : __expr_(__e), __1d_(__ia) {}
1839 0b57cec5SDimitry Andric
1840 0b57cec5SDimitry Andric#ifndef _LIBCPP_CXX03_LANG
1841 0b57cec5SDimitry Andric
1842 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI __indirect_expr(valarray<size_t>&& __ia, const _RmExpr& __e)
1843 cb14a3feSDimitry Andric      : __expr_(__e), __1d_(std::move(__ia)) {}
1844 0b57cec5SDimitry Andric
1845 0b57cec5SDimitry Andric#endif // _LIBCPP_CXX03_LANG
1846 0b57cec5SDimitry Andric
1847 0b57cec5SDimitry Andricpublic:
1848 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI __result_type operator[](size_t __i) const { return __expr_[__1d_[__i]]; }
1849 0b57cec5SDimitry Andric
1850 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI size_t size() const { return __1d_.size(); }
1851 0b57cec5SDimitry Andric
1852 cb14a3feSDimitry Andric  template <class>
1853 cb14a3feSDimitry Andric  friend class __val_expr;
1854 cb14a3feSDimitry Andric  template <class>
1855 cb14a3feSDimitry Andric  friend class _LIBCPP_TEMPLATE_VIS valarray;
1856 0b57cec5SDimitry Andric};
1857 0b57cec5SDimitry Andric
1858 0b57cec5SDimitry Andrictemplate <class _ValExpr>
1859 cb14a3feSDimitry Andricclass __val_expr {
1860 bdd1243dSDimitry Andric  typedef __libcpp_remove_reference_t<_ValExpr> _RmExpr;
1861 0b57cec5SDimitry Andric
1862 0b57cec5SDimitry Andric  _ValExpr __expr_;
1863 cb14a3feSDimitry Andric
1864 0b57cec5SDimitry Andricpublic:
1865 0b57cec5SDimitry Andric  typedef typename _RmExpr::value_type value_type;
1866 fe6060f1SDimitry Andric  typedef typename _RmExpr::__result_type __result_type;
1867 0b57cec5SDimitry Andric
1868 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI explicit __val_expr(const _RmExpr& __e) : __expr_(__e) {}
1869 0b57cec5SDimitry Andric
1870 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI __result_type operator[](size_t __i) const { return __expr_[__i]; }
1871 0b57cec5SDimitry Andric
1872 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI __val_expr<__slice_expr<_ValExpr> > operator[](slice __s) const {
1873 0b57cec5SDimitry Andric    typedef __slice_expr<_ValExpr> _NewExpr;
1874 0b57cec5SDimitry Andric    return __val_expr< _NewExpr >(_NewExpr(__s, __expr_));
1875 0b57cec5SDimitry Andric  }
1876 0b57cec5SDimitry Andric
1877 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI __val_expr<__indirect_expr<_ValExpr> > operator[](const gslice& __gs) const {
1878 0b57cec5SDimitry Andric    typedef __indirect_expr<_ValExpr> _NewExpr;
1879 0b57cec5SDimitry Andric    return __val_expr<_NewExpr >(_NewExpr(__gs.__1d_, __expr_));
1880 0b57cec5SDimitry Andric  }
1881 0b57cec5SDimitry Andric
1882 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI __val_expr<__mask_expr<_ValExpr> > operator[](const valarray<bool>& __vb) const {
1883 0b57cec5SDimitry Andric    typedef __mask_expr<_ValExpr> _NewExpr;
1884 0b57cec5SDimitry Andric    return __val_expr< _NewExpr >(_NewExpr(__vb, __expr_));
1885 0b57cec5SDimitry Andric  }
1886 0b57cec5SDimitry Andric
1887 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI __val_expr<__indirect_expr<_ValExpr> > operator[](const valarray<size_t>& __vs) const {
1888 0b57cec5SDimitry Andric    typedef __indirect_expr<_ValExpr> _NewExpr;
1889 0b57cec5SDimitry Andric    return __val_expr< _NewExpr >(_NewExpr(__vs, __expr_));
1890 0b57cec5SDimitry Andric  }
1891 0b57cec5SDimitry Andric
1892 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI __val_expr<_UnaryOp<__unary_plus<value_type>, _ValExpr> > operator+() const {
1893 0b57cec5SDimitry Andric    typedef _UnaryOp<__unary_plus<value_type>, _ValExpr> _NewExpr;
1894 0b57cec5SDimitry Andric    return __val_expr<_NewExpr>(_NewExpr(__unary_plus<value_type>(), __expr_));
1895 0b57cec5SDimitry Andric  }
1896 0b57cec5SDimitry Andric
1897 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI __val_expr<_UnaryOp<negate<value_type>, _ValExpr> > operator-() const {
1898 0b57cec5SDimitry Andric    typedef _UnaryOp<negate<value_type>, _ValExpr> _NewExpr;
1899 0b57cec5SDimitry Andric    return __val_expr<_NewExpr>(_NewExpr(negate<value_type>(), __expr_));
1900 0b57cec5SDimitry Andric  }
1901 0b57cec5SDimitry Andric
1902 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI __val_expr<_UnaryOp<__bit_not<value_type>, _ValExpr> > operator~() const {
1903 0b57cec5SDimitry Andric    typedef _UnaryOp<__bit_not<value_type>, _ValExpr> _NewExpr;
1904 0b57cec5SDimitry Andric    return __val_expr<_NewExpr>(_NewExpr(__bit_not<value_type>(), __expr_));
1905 0b57cec5SDimitry Andric  }
1906 0b57cec5SDimitry Andric
1907 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI __val_expr<_UnaryOp<logical_not<value_type>, _ValExpr> > operator!() const {
1908 0b57cec5SDimitry Andric    typedef _UnaryOp<logical_not<value_type>, _ValExpr> _NewExpr;
1909 0b57cec5SDimitry Andric    return __val_expr<_NewExpr>(_NewExpr(logical_not<value_type>(), __expr_));
1910 0b57cec5SDimitry Andric  }
1911 0b57cec5SDimitry Andric
1912 fe6060f1SDimitry Andric  operator valarray<__result_type>() const;
1913 0b57cec5SDimitry Andric
1914 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI size_t size() const { return __expr_.size(); }
1915 0b57cec5SDimitry Andric
1916 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI __result_type sum() const {
1917 0b57cec5SDimitry Andric    size_t __n        = __expr_.size();
1918 fe6060f1SDimitry Andric    __result_type __r = __n ? __expr_[0] : __result_type();
1919 0b57cec5SDimitry Andric    for (size_t __i = 1; __i < __n; ++__i)
1920 0b57cec5SDimitry Andric      __r += __expr_[__i];
1921 0b57cec5SDimitry Andric    return __r;
1922 0b57cec5SDimitry Andric  }
1923 0b57cec5SDimitry Andric
1924 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI __result_type min() const {
1925 0b57cec5SDimitry Andric    size_t __n        = size();
1926 fe6060f1SDimitry Andric    __result_type __r = __n ? (*this)[0] : __result_type();
1927 cb14a3feSDimitry Andric    for (size_t __i = 1; __i < __n; ++__i) {
1928 fe6060f1SDimitry Andric      __result_type __x = __expr_[__i];
1929 0b57cec5SDimitry Andric      if (__x < __r)
1930 0b57cec5SDimitry Andric        __r = __x;
1931 0b57cec5SDimitry Andric    }
1932 0b57cec5SDimitry Andric    return __r;
1933 0b57cec5SDimitry Andric  }
1934 0b57cec5SDimitry Andric
1935 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI __result_type max() const {
1936 0b57cec5SDimitry Andric    size_t __n        = size();
1937 fe6060f1SDimitry Andric    __result_type __r = __n ? (*this)[0] : __result_type();
1938 cb14a3feSDimitry Andric    for (size_t __i = 1; __i < __n; ++__i) {
1939 fe6060f1SDimitry Andric      __result_type __x = __expr_[__i];
1940 0b57cec5SDimitry Andric      if (__r < __x)
1941 0b57cec5SDimitry Andric        __r = __x;
1942 0b57cec5SDimitry Andric    }
1943 0b57cec5SDimitry Andric    return __r;
1944 0b57cec5SDimitry Andric  }
1945 0b57cec5SDimitry Andric
1946 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI __val_expr<__shift_expr<_ValExpr> > shift(int __i) const {
1947 cb14a3feSDimitry Andric    return __val_expr<__shift_expr<_ValExpr> >(__shift_expr<_ValExpr>(__i, __expr_));
1948 cb14a3feSDimitry Andric  }
1949 0b57cec5SDimitry Andric
1950 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI __val_expr<__cshift_expr<_ValExpr> > cshift(int __i) const {
1951 cb14a3feSDimitry Andric    return __val_expr<__cshift_expr<_ValExpr> >(__cshift_expr<_ValExpr>(__i, __expr_));
1952 cb14a3feSDimitry Andric  }
1953 0b57cec5SDimitry Andric
1954 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI __val_expr<_UnaryOp<__apply_expr<value_type, value_type (*)(value_type)>, _ValExpr> >
1955 cb14a3feSDimitry Andric  apply(value_type __f(value_type)) const {
1956 0b57cec5SDimitry Andric    typedef __apply_expr<value_type, value_type (*)(value_type)> _Op;
1957 0b57cec5SDimitry Andric    typedef _UnaryOp<_Op, _ValExpr> _NewExpr;
1958 0b57cec5SDimitry Andric    return __val_expr<_NewExpr>(_NewExpr(_Op(__f), __expr_));
1959 0b57cec5SDimitry Andric  }
1960 0b57cec5SDimitry Andric
1961 cb14a3feSDimitry Andric  _LIBCPP_HIDE_FROM_ABI __val_expr<_UnaryOp<__apply_expr<value_type, value_type (*)(const value_type&)>, _ValExpr> >
1962 cb14a3feSDimitry Andric  apply(value_type __f(const value_type&)) const {
1963 0b57cec5SDimitry Andric    typedef __apply_expr<value_type, value_type (*)(const value_type&)> _Op;
1964 0b57cec5SDimitry Andric    typedef _UnaryOp<_Op, _ValExpr> _NewExpr;
1965 0b57cec5SDimitry Andric    return __val_expr<_NewExpr>(_NewExpr(_Op(__f), __expr_));
1966 0b57cec5SDimitry Andric  }
1967 0b57cec5SDimitry Andric};
1968 0b57cec5SDimitry Andric
1969 0b57cec5SDimitry Andrictemplate <class _ValExpr>
1970 cb14a3feSDimitry Andric__val_expr<_ValExpr>::operator valarray<__val_expr::__result_type>() const {
1971 fe6060f1SDimitry Andric  valarray<__result_type> __r;
1972 0b57cec5SDimitry Andric  size_t __n = __expr_.size();
1973 cb14a3feSDimitry Andric  if (__n) {
1974 cb14a3feSDimitry Andric    __r.__begin_ = __r.__end_ = allocator<__result_type>().allocate(__n);
1975 0b57cec5SDimitry Andric    for (size_t __i = 0; __i != __n; ++__r.__end_, ++__i)
1976 fe6060f1SDimitry Andric      ::new ((void*)__r.__end_) __result_type(__expr_[__i]);
1977 0b57cec5SDimitry Andric  }
1978 0b57cec5SDimitry Andric  return __r;
1979 0b57cec5SDimitry Andric}
1980 0b57cec5SDimitry Andric
1981 0b57cec5SDimitry Andric// valarray
1982 0b57cec5SDimitry Andric
1983 0b57cec5SDimitry Andrictemplate <class _Tp>
1984 cb14a3feSDimitry Andricinline valarray<_Tp>::valarray(size_t __n) : __begin_(nullptr), __end_(nullptr) {
1985 cb14a3feSDimitry Andric  if (__n) {
1986 e8d8bef9SDimitry Andric    __begin_ = __end_ = allocator<value_type>().allocate(__n);
1987 06c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
1988 cb14a3feSDimitry Andric    try {
1989 06c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
1990 0b57cec5SDimitry Andric      for (size_t __n_left = __n; __n_left; --__n_left, ++__end_)
1991 e8d8bef9SDimitry Andric        ::new ((void*)__end_) value_type();
1992 06c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
1993 cb14a3feSDimitry Andric    } catch (...) {
1994 0b57cec5SDimitry Andric      __clear(__n);
1995 0b57cec5SDimitry Andric      throw;
1996 0b57cec5SDimitry Andric    }
1997 06c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
1998 0b57cec5SDimitry Andric  }
1999 0b57cec5SDimitry Andric}
2000 0b57cec5SDimitry Andric
2001 0b57cec5SDimitry Andrictemplate <class _Tp>
2002 cb14a3feSDimitry Andricinline valarray<_Tp>::valarray(const value_type& __x, size_t __n) : __begin_(nullptr), __end_(nullptr) {
2003 0b57cec5SDimitry Andric  resize(__n, __x);
2004 0b57cec5SDimitry Andric}
2005 0b57cec5SDimitry Andric
2006 0b57cec5SDimitry Andrictemplate <class _Tp>
2007 cb14a3feSDimitry Andricvalarray<_Tp>::valarray(const value_type* __p, size_t __n) : __begin_(nullptr), __end_(nullptr) {
2008 cb14a3feSDimitry Andric  if (__n) {
2009 e8d8bef9SDimitry Andric    __begin_ = __end_ = allocator<value_type>().allocate(__n);
2010 06c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
2011 cb14a3feSDimitry Andric    try {
2012 06c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
2013 0b57cec5SDimitry Andric      for (size_t __n_left = __n; __n_left; ++__end_, ++__p, --__n_left)
2014 e8d8bef9SDimitry Andric        ::new ((void*)__end_) value_type(*__p);
2015 06c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
2016 cb14a3feSDimitry Andric    } catch (...) {
2017 0b57cec5SDimitry Andric      __clear(__n);
2018 0b57cec5SDimitry Andric      throw;
2019 0b57cec5SDimitry Andric    }
2020 06c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
2021 0b57cec5SDimitry Andric  }
2022 0b57cec5SDimitry Andric}
2023 0b57cec5SDimitry Andric
2024 0b57cec5SDimitry Andrictemplate <class _Tp>
2025 cb14a3feSDimitry Andricvalarray<_Tp>::valarray(const valarray& __v) : __begin_(nullptr), __end_(nullptr) {
2026 cb14a3feSDimitry Andric  if (__v.size()) {
2027 e8d8bef9SDimitry Andric    __begin_ = __end_ = allocator<value_type>().allocate(__v.size());
2028 06c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
2029 cb14a3feSDimitry Andric    try {
2030 06c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
2031 0b57cec5SDimitry Andric      for (value_type* __p = __v.__begin_; __p != __v.__end_; ++__end_, ++__p)
2032 e8d8bef9SDimitry Andric        ::new ((void*)__end_) value_type(*__p);
2033 06c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
2034 cb14a3feSDimitry Andric    } catch (...) {
2035 0b57cec5SDimitry Andric      __clear(__v.size());
2036 0b57cec5SDimitry Andric      throw;
2037 0b57cec5SDimitry Andric    }
2038 06c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
2039 0b57cec5SDimitry Andric  }
2040 0b57cec5SDimitry Andric}
2041 0b57cec5SDimitry Andric
2042 0b57cec5SDimitry Andric#ifndef _LIBCPP_CXX03_LANG
2043 0b57cec5SDimitry Andric
2044 0b57cec5SDimitry Andrictemplate <class _Tp>
2045 cb14a3feSDimitry Andricinline valarray<_Tp>::valarray(valarray&& __v) _NOEXCEPT : __begin_(__v.__begin_), __end_(__v.__end_) {
2046 0b57cec5SDimitry Andric  __v.__begin_ = __v.__end_ = nullptr;
2047 0b57cec5SDimitry Andric}
2048 0b57cec5SDimitry Andric
2049 0b57cec5SDimitry Andrictemplate <class _Tp>
2050 cb14a3feSDimitry Andricvalarray<_Tp>::valarray(initializer_list<value_type> __il) : __begin_(nullptr), __end_(nullptr) {
2051 0b57cec5SDimitry Andric  const size_t __n = __il.size();
2052 cb14a3feSDimitry Andric  if (__n) {
2053 e8d8bef9SDimitry Andric    __begin_ = __end_ = allocator<value_type>().allocate(__n);
2054 06c3fb27SDimitry Andric#  ifndef _LIBCPP_HAS_NO_EXCEPTIONS
2055 cb14a3feSDimitry Andric    try {
2056 06c3fb27SDimitry Andric#  endif // _LIBCPP_HAS_NO_EXCEPTIONS
2057 0b57cec5SDimitry Andric      size_t __n_left = __n;
2058 0b57cec5SDimitry Andric      for (const value_type* __p = __il.begin(); __n_left; ++__end_, ++__p, --__n_left)
2059 e8d8bef9SDimitry Andric        ::new ((void*)__end_) value_type(*__p);
2060 06c3fb27SDimitry Andric#  ifndef _LIBCPP_HAS_NO_EXCEPTIONS
2061 cb14a3feSDimitry Andric    } catch (...) {
2062 0b57cec5SDimitry Andric      __clear(__n);
2063 0b57cec5SDimitry Andric      throw;
2064 0b57cec5SDimitry Andric    }
2065 06c3fb27SDimitry Andric#  endif // _LIBCPP_HAS_NO_EXCEPTIONS
2066 0b57cec5SDimitry Andric  }
2067 0b57cec5SDimitry Andric}
2068 0b57cec5SDimitry Andric
2069 0b57cec5SDimitry Andric#endif // _LIBCPP_CXX03_LANG
2070 0b57cec5SDimitry Andric
2071 0b57cec5SDimitry Andrictemplate <class _Tp>
2072 cb14a3feSDimitry Andricvalarray<_Tp>::valarray(const slice_array<value_type>& __sa) : __begin_(nullptr), __end_(nullptr) {
2073 0b57cec5SDimitry Andric  const size_t __n = __sa.__size_;
2074 cb14a3feSDimitry Andric  if (__n) {
2075 e8d8bef9SDimitry Andric    __begin_ = __end_ = allocator<value_type>().allocate(__n);
2076 06c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
2077 cb14a3feSDimitry Andric    try {
2078 06c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
2079 0b57cec5SDimitry Andric      size_t __n_left = __n;
2080 0b57cec5SDimitry Andric      for (const value_type* __p = __sa.__vp_; __n_left; ++__end_, __p += __sa.__stride_, --__n_left)
2081 e8d8bef9SDimitry Andric        ::new ((void*)__end_) value_type(*__p);
2082 06c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
2083 cb14a3feSDimitry Andric    } catch (...) {
2084 0b57cec5SDimitry Andric      __clear(__n);
2085 0b57cec5SDimitry Andric      throw;
2086 0b57cec5SDimitry Andric    }
2087 06c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
2088 0b57cec5SDimitry Andric  }
2089 0b57cec5SDimitry Andric}
2090 0b57cec5SDimitry Andric
2091 0b57cec5SDimitry Andrictemplate <class _Tp>
2092 cb14a3feSDimitry Andricvalarray<_Tp>::valarray(const gslice_array<value_type>& __ga) : __begin_(nullptr), __end_(nullptr) {
2093 0b57cec5SDimitry Andric  const size_t __n = __ga.__1d_.size();
2094 cb14a3feSDimitry Andric  if (__n) {
2095 e8d8bef9SDimitry Andric    __begin_ = __end_ = allocator<value_type>().allocate(__n);
2096 06c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
2097 cb14a3feSDimitry Andric    try {
2098 06c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
2099 0b57cec5SDimitry Andric      typedef const size_t* _Ip;
2100 0b57cec5SDimitry Andric      const value_type* __s = __ga.__vp_;
2101 cb14a3feSDimitry Andric      for (_Ip __i = __ga.__1d_.__begin_, __e = __ga.__1d_.__end_; __i != __e; ++__i, ++__end_)
2102 e8d8bef9SDimitry Andric        ::new ((void*)__end_) value_type(__s[*__i]);
2103 06c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
2104 cb14a3feSDimitry Andric    } catch (...) {
2105 0b57cec5SDimitry Andric      __clear(__n);
2106 0b57cec5SDimitry Andric      throw;
2107 0b57cec5SDimitry Andric    }
2108 06c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
2109 0b57cec5SDimitry Andric  }
2110 0b57cec5SDimitry Andric}
2111 0b57cec5SDimitry Andric
2112 0b57cec5SDimitry Andrictemplate <class _Tp>
2113 cb14a3feSDimitry Andricvalarray<_Tp>::valarray(const mask_array<value_type>& __ma) : __begin_(nullptr), __end_(nullptr) {
2114 0b57cec5SDimitry Andric  const size_t __n = __ma.__1d_.size();
2115 cb14a3feSDimitry Andric  if (__n) {
2116 e8d8bef9SDimitry Andric    __begin_ = __end_ = allocator<value_type>().allocate(__n);
2117 06c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
2118 cb14a3feSDimitry Andric    try {
2119 06c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
2120 0b57cec5SDimitry Andric      typedef const size_t* _Ip;
2121 0b57cec5SDimitry Andric      const value_type* __s = __ma.__vp_;
2122 cb14a3feSDimitry Andric      for (_Ip __i = __ma.__1d_.__begin_, __e = __ma.__1d_.__end_; __i != __e; ++__i, ++__end_)
2123 e8d8bef9SDimitry Andric        ::new ((void*)__end_) value_type(__s[*__i]);
2124 06c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
2125 cb14a3feSDimitry Andric    } catch (...) {
2126 0b57cec5SDimitry Andric      __clear(__n);
2127 0b57cec5SDimitry Andric      throw;
2128 0b57cec5SDimitry Andric    }
2129 06c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
2130 0b57cec5SDimitry Andric  }
2131 0b57cec5SDimitry Andric}
2132 0b57cec5SDimitry Andric
2133 0b57cec5SDimitry Andrictemplate <class _Tp>
2134 cb14a3feSDimitry Andricvalarray<_Tp>::valarray(const indirect_array<value_type>& __ia) : __begin_(nullptr), __end_(nullptr) {
2135 0b57cec5SDimitry Andric  const size_t __n = __ia.__1d_.size();
2136 cb14a3feSDimitry Andric  if (__n) {
2137 e8d8bef9SDimitry Andric    __begin_ = __end_ = allocator<value_type>().allocate(__n);
2138 06c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
2139 cb14a3feSDimitry Andric    try {
2140 06c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
2141 0b57cec5SDimitry Andric      typedef const size_t* _Ip;
2142 0b57cec5SDimitry Andric      const value_type* __s = __ia.__vp_;
2143 cb14a3feSDimitry Andric      for (_Ip __i = __ia.__1d_.__begin_, __e = __ia.__1d_.__end_; __i != __e; ++__i, ++__end_)
2144 e8d8bef9SDimitry Andric        ::new ((void*)__end_) value_type(__s[*__i]);
2145 06c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
2146 cb14a3feSDimitry Andric    } catch (...) {
2147 0b57cec5SDimitry Andric      __clear(__n);
2148 0b57cec5SDimitry Andric      throw;
2149 0b57cec5SDimitry Andric    }
2150 06c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
2151 0b57cec5SDimitry Andric  }
2152 0b57cec5SDimitry Andric}
2153 0b57cec5SDimitry Andric
2154 0b57cec5SDimitry Andrictemplate <class _Tp>
2155 cb14a3feSDimitry Andricinline valarray<_Tp>::~valarray() {
2156 0b57cec5SDimitry Andric  __clear(size());
2157 0b57cec5SDimitry Andric}
2158 0b57cec5SDimitry Andric
2159 0b57cec5SDimitry Andrictemplate <class _Tp>
2160 cb14a3feSDimitry Andricvalarray<_Tp>& valarray<_Tp>::__assign_range(const value_type* __f, const value_type* __l) {
2161 0b57cec5SDimitry Andric  size_t __n = __l - __f;
2162 cb14a3feSDimitry Andric  if (size() != __n) {
2163 0b57cec5SDimitry Andric    __clear(size());
2164 e8d8bef9SDimitry Andric    __begin_ = allocator<value_type>().allocate(__n);
2165 0b57cec5SDimitry Andric    __end_   = __begin_ + __n;
2166 5f757f3fSDimitry Andric    std::uninitialized_copy(__f, __l, __begin_);
2167 0b57cec5SDimitry Andric  } else {
2168 5f757f3fSDimitry Andric    std::copy(__f, __l, __begin_);
2169 0b57cec5SDimitry Andric  }
2170 0b57cec5SDimitry Andric  return *this;
2171 0b57cec5SDimitry Andric}
2172 0b57cec5SDimitry Andric
2173 0b57cec5SDimitry Andrictemplate <class _Tp>
2174 cb14a3feSDimitry Andricvalarray<_Tp>& valarray<_Tp>::operator=(const valarray& __v) {
2175 5f757f3fSDimitry Andric  if (this != std::addressof(__v))
2176 0b57cec5SDimitry Andric    return __assign_range(__v.__begin_, __v.__end_);
2177 0b57cec5SDimitry Andric  return *this;
2178 0b57cec5SDimitry Andric}
2179 0b57cec5SDimitry Andric
2180 0b57cec5SDimitry Andric#ifndef _LIBCPP_CXX03_LANG
2181 0b57cec5SDimitry Andric
2182 0b57cec5SDimitry Andrictemplate <class _Tp>
2183 cb14a3feSDimitry Andricinline valarray<_Tp>& valarray<_Tp>::operator=(valarray&& __v) _NOEXCEPT {
2184 0b57cec5SDimitry Andric  __clear(size());
2185 0b57cec5SDimitry Andric  __begin_     = __v.__begin_;
2186 0b57cec5SDimitry Andric  __end_       = __v.__end_;
2187 0b57cec5SDimitry Andric  __v.__begin_ = nullptr;
2188 0b57cec5SDimitry Andric  __v.__end_   = nullptr;
2189 0b57cec5SDimitry Andric  return *this;
2190 0b57cec5SDimitry Andric}
2191 0b57cec5SDimitry Andric
2192 0b57cec5SDimitry Andrictemplate <class _Tp>
2193 cb14a3feSDimitry Andricinline valarray<_Tp>& valarray<_Tp>::operator=(initializer_list<value_type> __il) {
2194 0b57cec5SDimitry Andric  return __assign_range(__il.begin(), __il.end());
2195 0b57cec5SDimitry Andric}
2196 0b57cec5SDimitry Andric
2197 0b57cec5SDimitry Andric#endif // _LIBCPP_CXX03_LANG
2198 0b57cec5SDimitry Andric
2199 0b57cec5SDimitry Andrictemplate <class _Tp>
2200 cb14a3feSDimitry Andricinline valarray<_Tp>& valarray<_Tp>::operator=(const value_type& __x) {
2201 5f757f3fSDimitry Andric  std::fill(__begin_, __end_, __x);
2202 0b57cec5SDimitry Andric  return *this;
2203 0b57cec5SDimitry Andric}
2204 0b57cec5SDimitry Andric
2205 0b57cec5SDimitry Andrictemplate <class _Tp>
2206 cb14a3feSDimitry Andricinline valarray<_Tp>& valarray<_Tp>::operator=(const slice_array<value_type>& __sa) {
2207 0b57cec5SDimitry Andric  value_type* __t       = __begin_;
2208 0b57cec5SDimitry Andric  const value_type* __s = __sa.__vp_;
2209 0b57cec5SDimitry Andric  for (size_t __n = __sa.__size_; __n; --__n, __s += __sa.__stride_, ++__t)
2210 0b57cec5SDimitry Andric    *__t = *__s;
2211 0b57cec5SDimitry Andric  return *this;
2212 0b57cec5SDimitry Andric}
2213 0b57cec5SDimitry Andric
2214 0b57cec5SDimitry Andrictemplate <class _Tp>
2215 cb14a3feSDimitry Andricinline valarray<_Tp>& valarray<_Tp>::operator=(const gslice_array<value_type>& __ga) {
2216 0b57cec5SDimitry Andric  typedef const size_t* _Ip;
2217 0b57cec5SDimitry Andric  value_type* __t       = __begin_;
2218 0b57cec5SDimitry Andric  const value_type* __s = __ga.__vp_;
2219 cb14a3feSDimitry Andric  for (_Ip __i = __ga.__1d_.__begin_, __e = __ga.__1d_.__end_; __i != __e; ++__i, ++__t)
2220 0b57cec5SDimitry Andric    *__t = __s[*__i];
2221 0b57cec5SDimitry Andric  return *this;
2222 0b57cec5SDimitry Andric}
2223 0b57cec5SDimitry Andric
2224 0b57cec5SDimitry Andrictemplate <class _Tp>
2225 cb14a3feSDimitry Andricinline valarray<_Tp>& valarray<_Tp>::operator=(const mask_array<value_type>& __ma) {
2226 0b57cec5SDimitry Andric  typedef const size_t* _Ip;
2227 0b57cec5SDimitry Andric  value_type* __t       = __begin_;
2228 0b57cec5SDimitry Andric  const value_type* __s = __ma.__vp_;
2229 cb14a3feSDimitry Andric  for (_Ip __i = __ma.__1d_.__begin_, __e = __ma.__1d_.__end_; __i != __e; ++__i, ++__t)
2230 0b57cec5SDimitry Andric    *__t = __s[*__i];
2231 0b57cec5SDimitry Andric  return *this;
2232 0b57cec5SDimitry Andric}
2233 0b57cec5SDimitry Andric
2234 0b57cec5SDimitry Andrictemplate <class _Tp>
2235 cb14a3feSDimitry Andricinline valarray<_Tp>& valarray<_Tp>::operator=(const indirect_array<value_type>& __ia) {
2236 0b57cec5SDimitry Andric  typedef const size_t* _Ip;
2237 0b57cec5SDimitry Andric  value_type* __t       = __begin_;
2238 0b57cec5SDimitry Andric  const value_type* __s = __ia.__vp_;
2239 cb14a3feSDimitry Andric  for (_Ip __i = __ia.__1d_.__begin_, __e = __ia.__1d_.__end_; __i != __e; ++__i, ++__t)
2240 0b57cec5SDimitry Andric    *__t = __s[*__i];
2241 0b57cec5SDimitry Andric  return *this;
2242 0b57cec5SDimitry Andric}
2243 0b57cec5SDimitry Andric
2244 0b57cec5SDimitry Andrictemplate <class _Tp>
2245 0b57cec5SDimitry Andrictemplate <class _ValExpr>
2246 cb14a3feSDimitry Andricinline valarray<_Tp>& valarray<_Tp>::operator=(const __val_expr<_ValExpr>& __v) {
2247 0b57cec5SDimitry Andric  size_t __n = __v.size();
2248 0b57cec5SDimitry Andric  if (size() != __n)
2249 0b57cec5SDimitry Andric    resize(__n);
2250 0b57cec5SDimitry Andric  value_type* __t = __begin_;
2251 0b57cec5SDimitry Andric  for (size_t __i = 0; __i != __n; ++__t, ++__i)
2252 fe6060f1SDimitry Andric    *__t = __result_type(__v[__i]);
2253 0b57cec5SDimitry Andric  return *this;
2254 0b57cec5SDimitry Andric}
2255 0b57cec5SDimitry Andric
2256 0b57cec5SDimitry Andrictemplate <class _Tp>
2257 cb14a3feSDimitry Andricinline __val_expr<__slice_expr<const valarray<_Tp>&> > valarray<_Tp>::operator[](slice __s) const {
2258 0b57cec5SDimitry Andric  return __val_expr<__slice_expr<const valarray&> >(__slice_expr<const valarray&>(__s, *this));
2259 0b57cec5SDimitry Andric}
2260 0b57cec5SDimitry Andric
2261 0b57cec5SDimitry Andrictemplate <class _Tp>
2262 cb14a3feSDimitry Andricinline slice_array<_Tp> valarray<_Tp>::operator[](slice __s) {
2263 0b57cec5SDimitry Andric  return slice_array<value_type>(__s, *this);
2264 0b57cec5SDimitry Andric}
2265 0b57cec5SDimitry Andric
2266 0b57cec5SDimitry Andrictemplate <class _Tp>
2267 cb14a3feSDimitry Andricinline __val_expr<__indirect_expr<const valarray<_Tp>&> > valarray<_Tp>::operator[](const gslice& __gs) const {
2268 0b57cec5SDimitry Andric  return __val_expr<__indirect_expr<const valarray&> >(__indirect_expr<const valarray&>(__gs.__1d_, *this));
2269 0b57cec5SDimitry Andric}
2270 0b57cec5SDimitry Andric
2271 0b57cec5SDimitry Andrictemplate <class _Tp>
2272 cb14a3feSDimitry Andricinline gslice_array<_Tp> valarray<_Tp>::operator[](const gslice& __gs) {
2273 0b57cec5SDimitry Andric  return gslice_array<value_type>(__gs, *this);
2274 0b57cec5SDimitry Andric}
2275 0b57cec5SDimitry Andric
2276 0b57cec5SDimitry Andric#ifndef _LIBCPP_CXX03_LANG
2277 0b57cec5SDimitry Andric
2278 0b57cec5SDimitry Andrictemplate <class _Tp>
2279 cb14a3feSDimitry Andricinline __val_expr<__indirect_expr<const valarray<_Tp>&> > valarray<_Tp>::operator[](gslice&& __gs) const {
2280 81ad6265SDimitry Andric  return __val_expr<__indirect_expr<const valarray&> >(__indirect_expr<const valarray&>(std::move(__gs.__1d_), *this));
2281 0b57cec5SDimitry Andric}
2282 0b57cec5SDimitry Andric
2283 0b57cec5SDimitry Andrictemplate <class _Tp>
2284 cb14a3feSDimitry Andricinline gslice_array<_Tp> valarray<_Tp>::operator[](gslice&& __gs) {
2285 81ad6265SDimitry Andric  return gslice_array<value_type>(std::move(__gs), *this);
2286 0b57cec5SDimitry Andric}
2287 0b57cec5SDimitry Andric
2288 0b57cec5SDimitry Andric#endif // _LIBCPP_CXX03_LANG
2289 0b57cec5SDimitry Andric
2290 0b57cec5SDimitry Andrictemplate <class _Tp>
2291 cb14a3feSDimitry Andricinline __val_expr<__mask_expr<const valarray<_Tp>&> > valarray<_Tp>::operator[](const valarray<bool>& __vb) const {
2292 0b57cec5SDimitry Andric  return __val_expr<__mask_expr<const valarray&> >(__mask_expr<const valarray&>(__vb, *this));
2293 0b57cec5SDimitry Andric}
2294 0b57cec5SDimitry Andric
2295 0b57cec5SDimitry Andrictemplate <class _Tp>
2296 cb14a3feSDimitry Andricinline mask_array<_Tp> valarray<_Tp>::operator[](const valarray<bool>& __vb) {
2297 0b57cec5SDimitry Andric  return mask_array<value_type>(__vb, *this);
2298 0b57cec5SDimitry Andric}
2299 0b57cec5SDimitry Andric
2300 0b57cec5SDimitry Andric#ifndef _LIBCPP_CXX03_LANG
2301 0b57cec5SDimitry Andric
2302 0b57cec5SDimitry Andrictemplate <class _Tp>
2303 cb14a3feSDimitry Andricinline __val_expr<__mask_expr<const valarray<_Tp>&> > valarray<_Tp>::operator[](valarray<bool>&& __vb) const {
2304 81ad6265SDimitry Andric  return __val_expr<__mask_expr<const valarray&> >(__mask_expr<const valarray&>(std::move(__vb), *this));
2305 0b57cec5SDimitry Andric}
2306 0b57cec5SDimitry Andric
2307 0b57cec5SDimitry Andrictemplate <class _Tp>
2308 cb14a3feSDimitry Andricinline mask_array<_Tp> valarray<_Tp>::operator[](valarray<bool>&& __vb) {
2309 81ad6265SDimitry Andric  return mask_array<value_type>(std::move(__vb), *this);
2310 0b57cec5SDimitry Andric}
2311 0b57cec5SDimitry Andric
2312 0b57cec5SDimitry Andric#endif // _LIBCPP_CXX03_LANG
2313 0b57cec5SDimitry Andric
2314 0b57cec5SDimitry Andrictemplate <class _Tp>
2315 cb14a3feSDimitry Andricinline __val_expr<__indirect_expr<const valarray<_Tp>&> >
2316 cb14a3feSDimitry Andricvalarray<_Tp>::operator[](const valarray<size_t>& __vs) const {
2317 0b57cec5SDimitry Andric  return __val_expr<__indirect_expr<const valarray&> >(__indirect_expr<const valarray&>(__vs, *this));
2318 0b57cec5SDimitry Andric}
2319 0b57cec5SDimitry Andric
2320 0b57cec5SDimitry Andrictemplate <class _Tp>
2321 cb14a3feSDimitry Andricinline indirect_array<_Tp> valarray<_Tp>::operator[](const valarray<size_t>& __vs) {
2322 0b57cec5SDimitry Andric  return indirect_array<value_type>(__vs, *this);
2323 0b57cec5SDimitry Andric}
2324 0b57cec5SDimitry Andric
2325 0b57cec5SDimitry Andric#ifndef _LIBCPP_CXX03_LANG
2326 0b57cec5SDimitry Andric
2327 0b57cec5SDimitry Andrictemplate <class _Tp>
2328 cb14a3feSDimitry Andricinline __val_expr<__indirect_expr<const valarray<_Tp>&> > valarray<_Tp>::operator[](valarray<size_t>&& __vs) const {
2329 81ad6265SDimitry Andric  return __val_expr<__indirect_expr<const valarray&> >(__indirect_expr<const valarray&>(std::move(__vs), *this));
2330 0b57cec5SDimitry Andric}
2331 0b57cec5SDimitry Andric
2332 0b57cec5SDimitry Andrictemplate <class _Tp>
2333 cb14a3feSDimitry Andricinline indirect_array<_Tp> valarray<_Tp>::operator[](valarray<size_t>&& __vs) {
2334 81ad6265SDimitry Andric  return indirect_array<value_type>(std::move(__vs), *this);
2335 0b57cec5SDimitry Andric}
2336 0b57cec5SDimitry Andric
2337 0b57cec5SDimitry Andric#endif // _LIBCPP_CXX03_LANG
2338 0b57cec5SDimitry Andric
2339 0b57cec5SDimitry Andrictemplate <class _Tp>
2340 cb14a3feSDimitry Andricinline __val_expr<_UnaryOp<__unary_plus<_Tp>, const valarray<_Tp>&> > valarray<_Tp>::operator+() const {
2341 81ad6265SDimitry Andric  using _Op = _UnaryOp<__unary_plus<_Tp>, const valarray<_Tp>&>;
2342 81ad6265SDimitry Andric  return __val_expr<_Op>(_Op(__unary_plus<_Tp>(), *this));
2343 0b57cec5SDimitry Andric}
2344 0b57cec5SDimitry Andric
2345 0b57cec5SDimitry Andrictemplate <class _Tp>
2346 cb14a3feSDimitry Andricinline __val_expr<_UnaryOp<negate<_Tp>, const valarray<_Tp>&> > valarray<_Tp>::operator-() const {
2347 81ad6265SDimitry Andric  using _Op = _UnaryOp<negate<_Tp>, const valarray<_Tp>&>;
2348 81ad6265SDimitry Andric  return __val_expr<_Op>(_Op(negate<_Tp>(), *this));
2349 0b57cec5SDimitry Andric}
2350 0b57cec5SDimitry Andric
2351 0b57cec5SDimitry Andrictemplate <class _Tp>
2352 cb14a3feSDimitry Andricinline __val_expr<_UnaryOp<__bit_not<_Tp>, const valarray<_Tp>&> > valarray<_Tp>::operator~() const {
2353 81ad6265SDimitry Andric  using _Op = _UnaryOp<__bit_not<_Tp>, const valarray<_Tp>&>;
2354 81ad6265SDimitry Andric  return __val_expr<_Op>(_Op(__bit_not<_Tp>(), *this));
2355 0b57cec5SDimitry Andric}
2356 0b57cec5SDimitry Andric
2357 0b57cec5SDimitry Andrictemplate <class _Tp>
2358 cb14a3feSDimitry Andricinline __val_expr<_UnaryOp<logical_not<_Tp>, const valarray<_Tp>&> > valarray<_Tp>::operator!() const {
2359 81ad6265SDimitry Andric  using _Op = _UnaryOp<logical_not<_Tp>, const valarray<_Tp>&>;
2360 81ad6265SDimitry Andric  return __val_expr<_Op>(_Op(logical_not<_Tp>(), *this));
2361 0b57cec5SDimitry Andric}
2362 0b57cec5SDimitry Andric
2363 0b57cec5SDimitry Andrictemplate <class _Tp>
2364 cb14a3feSDimitry Andricinline valarray<_Tp>& valarray<_Tp>::operator*=(const value_type& __x) {
2365 0b57cec5SDimitry Andric  for (value_type* __p = __begin_; __p != __end_; ++__p)
2366 0b57cec5SDimitry Andric    *__p *= __x;
2367 0b57cec5SDimitry Andric  return *this;
2368 0b57cec5SDimitry Andric}
2369 0b57cec5SDimitry Andric
2370 0b57cec5SDimitry Andrictemplate <class _Tp>
2371 cb14a3feSDimitry Andricinline valarray<_Tp>& valarray<_Tp>::operator/=(const value_type& __x) {
2372 0b57cec5SDimitry Andric  for (value_type* __p = __begin_; __p != __end_; ++__p)
2373 0b57cec5SDimitry Andric    *__p /= __x;
2374 0b57cec5SDimitry Andric  return *this;
2375 0b57cec5SDimitry Andric}
2376 0b57cec5SDimitry Andric
2377 0b57cec5SDimitry Andrictemplate <class _Tp>
2378 cb14a3feSDimitry Andricinline valarray<_Tp>& valarray<_Tp>::operator%=(const value_type& __x) {
2379 0b57cec5SDimitry Andric  for (value_type* __p = __begin_; __p != __end_; ++__p)
2380 0b57cec5SDimitry Andric    *__p %= __x;
2381 0b57cec5SDimitry Andric  return *this;
2382 0b57cec5SDimitry Andric}
2383 0b57cec5SDimitry Andric
2384 0b57cec5SDimitry Andrictemplate <class _Tp>
2385 cb14a3feSDimitry Andricinline valarray<_Tp>& valarray<_Tp>::operator+=(const value_type& __x) {
2386 0b57cec5SDimitry Andric  for (value_type* __p = __begin_; __p != __end_; ++__p)
2387 0b57cec5SDimitry Andric    *__p += __x;
2388 0b57cec5SDimitry Andric  return *this;
2389 0b57cec5SDimitry Andric}
2390 0b57cec5SDimitry Andric
2391 0b57cec5SDimitry Andrictemplate <class _Tp>
2392 cb14a3feSDimitry Andricinline valarray<_Tp>& valarray<_Tp>::operator-=(const value_type& __x) {
2393 0b57cec5SDimitry Andric  for (value_type* __p = __begin_; __p != __end_; ++__p)
2394 0b57cec5SDimitry Andric    *__p -= __x;
2395 0b57cec5SDimitry Andric  return *this;
2396 0b57cec5SDimitry Andric}
2397 0b57cec5SDimitry Andric
2398 0b57cec5SDimitry Andrictemplate <class _Tp>
2399 cb14a3feSDimitry Andricinline valarray<_Tp>& valarray<_Tp>::operator^=(const value_type& __x) {
2400 0b57cec5SDimitry Andric  for (value_type* __p = __begin_; __p != __end_; ++__p)
2401 0b57cec5SDimitry Andric    *__p ^= __x;
2402 0b57cec5SDimitry Andric  return *this;
2403 0b57cec5SDimitry Andric}
2404 0b57cec5SDimitry Andric
2405 0b57cec5SDimitry Andrictemplate <class _Tp>
2406 cb14a3feSDimitry Andricinline valarray<_Tp>& valarray<_Tp>::operator&=(const value_type& __x) {
2407 0b57cec5SDimitry Andric  for (value_type* __p = __begin_; __p != __end_; ++__p)
2408 0b57cec5SDimitry Andric    *__p &= __x;
2409 0b57cec5SDimitry Andric  return *this;
2410 0b57cec5SDimitry Andric}
2411 0b57cec5SDimitry Andric
2412 0b57cec5SDimitry Andrictemplate <class _Tp>
2413 cb14a3feSDimitry Andricinline valarray<_Tp>& valarray<_Tp>::operator|=(const value_type& __x) {
2414 0b57cec5SDimitry Andric  for (value_type* __p = __begin_; __p != __end_; ++__p)
2415 0b57cec5SDimitry Andric    *__p |= __x;
2416 0b57cec5SDimitry Andric  return *this;
2417 0b57cec5SDimitry Andric}
2418 0b57cec5SDimitry Andric
2419 0b57cec5SDimitry Andrictemplate <class _Tp>
2420 cb14a3feSDimitry Andricinline valarray<_Tp>& valarray<_Tp>::operator<<=(const value_type& __x) {
2421 0b57cec5SDimitry Andric  for (value_type* __p = __begin_; __p != __end_; ++__p)
2422 0b57cec5SDimitry Andric    *__p <<= __x;
2423 0b57cec5SDimitry Andric  return *this;
2424 0b57cec5SDimitry Andric}
2425 0b57cec5SDimitry Andric
2426 0b57cec5SDimitry Andrictemplate <class _Tp>
2427 cb14a3feSDimitry Andricinline valarray<_Tp>& valarray<_Tp>::operator>>=(const value_type& __x) {
2428 0b57cec5SDimitry Andric  for (value_type* __p = __begin_; __p != __end_; ++__p)
2429 0b57cec5SDimitry Andric    *__p >>= __x;
2430 0b57cec5SDimitry Andric  return *this;
2431 0b57cec5SDimitry Andric}
2432 0b57cec5SDimitry Andric
2433 0b57cec5SDimitry Andrictemplate <class _Tp>
2434 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
2435 cb14a3feSDimitry Andricinline valarray<_Tp>& valarray<_Tp>::operator*=(const _Expr& __v) {
2436 0b57cec5SDimitry Andric  size_t __i = 0;
2437 0b57cec5SDimitry Andric  for (value_type* __t = __begin_; __t != __end_; ++__t, ++__i)
2438 *0fca6ea1SDimitry Andric    *__t *= std::__get(__v, __i);
2439 0b57cec5SDimitry Andric  return *this;
2440 0b57cec5SDimitry Andric}
2441 0b57cec5SDimitry Andric
2442 0b57cec5SDimitry Andrictemplate <class _Tp>
2443 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
2444 cb14a3feSDimitry Andricinline valarray<_Tp>& valarray<_Tp>::operator/=(const _Expr& __v) {
2445 0b57cec5SDimitry Andric  size_t __i = 0;
2446 0b57cec5SDimitry Andric  for (value_type* __t = __begin_; __t != __end_; ++__t, ++__i)
2447 *0fca6ea1SDimitry Andric    *__t /= std::__get(__v, __i);
2448 0b57cec5SDimitry Andric  return *this;
2449 0b57cec5SDimitry Andric}
2450 0b57cec5SDimitry Andric
2451 0b57cec5SDimitry Andrictemplate <class _Tp>
2452 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
2453 cb14a3feSDimitry Andricinline valarray<_Tp>& valarray<_Tp>::operator%=(const _Expr& __v) {
2454 0b57cec5SDimitry Andric  size_t __i = 0;
2455 0b57cec5SDimitry Andric  for (value_type* __t = __begin_; __t != __end_; ++__t, ++__i)
2456 *0fca6ea1SDimitry Andric    *__t %= std::__get(__v, __i);
2457 0b57cec5SDimitry Andric  return *this;
2458 0b57cec5SDimitry Andric}
2459 0b57cec5SDimitry Andric
2460 0b57cec5SDimitry Andrictemplate <class _Tp>
2461 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
2462 cb14a3feSDimitry Andricinline valarray<_Tp>& valarray<_Tp>::operator+=(const _Expr& __v) {
2463 0b57cec5SDimitry Andric  size_t __i = 0;
2464 0b57cec5SDimitry Andric  for (value_type* __t = __begin_; __t != __end_; ++__t, ++__i)
2465 *0fca6ea1SDimitry Andric    *__t += std::__get(__v, __i);
2466 0b57cec5SDimitry Andric  return *this;
2467 0b57cec5SDimitry Andric}
2468 0b57cec5SDimitry Andric
2469 0b57cec5SDimitry Andrictemplate <class _Tp>
2470 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
2471 cb14a3feSDimitry Andricinline valarray<_Tp>& valarray<_Tp>::operator-=(const _Expr& __v) {
2472 0b57cec5SDimitry Andric  size_t __i = 0;
2473 0b57cec5SDimitry Andric  for (value_type* __t = __begin_; __t != __end_; ++__t, ++__i)
2474 *0fca6ea1SDimitry Andric    *__t -= std::__get(__v, __i);
2475 0b57cec5SDimitry Andric  return *this;
2476 0b57cec5SDimitry Andric}
2477 0b57cec5SDimitry Andric
2478 0b57cec5SDimitry Andrictemplate <class _Tp>
2479 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
2480 cb14a3feSDimitry Andricinline valarray<_Tp>& valarray<_Tp>::operator^=(const _Expr& __v) {
2481 0b57cec5SDimitry Andric  size_t __i = 0;
2482 0b57cec5SDimitry Andric  for (value_type* __t = __begin_; __t != __end_; ++__t, ++__i)
2483 *0fca6ea1SDimitry Andric    *__t ^= std::__get(__v, __i);
2484 0b57cec5SDimitry Andric  return *this;
2485 0b57cec5SDimitry Andric}
2486 0b57cec5SDimitry Andric
2487 0b57cec5SDimitry Andrictemplate <class _Tp>
2488 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
2489 cb14a3feSDimitry Andricinline valarray<_Tp>& valarray<_Tp>::operator|=(const _Expr& __v) {
2490 0b57cec5SDimitry Andric  size_t __i = 0;
2491 0b57cec5SDimitry Andric  for (value_type* __t = __begin_; __t != __end_; ++__t, ++__i)
2492 *0fca6ea1SDimitry Andric    *__t |= std::__get(__v, __i);
2493 0b57cec5SDimitry Andric  return *this;
2494 0b57cec5SDimitry Andric}
2495 0b57cec5SDimitry Andric
2496 0b57cec5SDimitry Andrictemplate <class _Tp>
2497 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
2498 cb14a3feSDimitry Andricinline valarray<_Tp>& valarray<_Tp>::operator&=(const _Expr& __v) {
2499 0b57cec5SDimitry Andric  size_t __i = 0;
2500 0b57cec5SDimitry Andric  for (value_type* __t = __begin_; __t != __end_; ++__t, ++__i)
2501 *0fca6ea1SDimitry Andric    *__t &= std::__get(__v, __i);
2502 0b57cec5SDimitry Andric  return *this;
2503 0b57cec5SDimitry Andric}
2504 0b57cec5SDimitry Andric
2505 0b57cec5SDimitry Andrictemplate <class _Tp>
2506 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
2507 cb14a3feSDimitry Andricinline valarray<_Tp>& valarray<_Tp>::operator<<=(const _Expr& __v) {
2508 0b57cec5SDimitry Andric  size_t __i = 0;
2509 0b57cec5SDimitry Andric  for (value_type* __t = __begin_; __t != __end_; ++__t, ++__i)
2510 *0fca6ea1SDimitry Andric    *__t <<= std::__get(__v, __i);
2511 0b57cec5SDimitry Andric  return *this;
2512 0b57cec5SDimitry Andric}
2513 0b57cec5SDimitry Andric
2514 0b57cec5SDimitry Andrictemplate <class _Tp>
2515 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
2516 cb14a3feSDimitry Andricinline valarray<_Tp>& valarray<_Tp>::operator>>=(const _Expr& __v) {
2517 0b57cec5SDimitry Andric  size_t __i = 0;
2518 0b57cec5SDimitry Andric  for (value_type* __t = __begin_; __t != __end_; ++__t, ++__i)
2519 *0fca6ea1SDimitry Andric    *__t >>= std::__get(__v, __i);
2520 0b57cec5SDimitry Andric  return *this;
2521 0b57cec5SDimitry Andric}
2522 0b57cec5SDimitry Andric
2523 0b57cec5SDimitry Andrictemplate <class _Tp>
2524 cb14a3feSDimitry Andricinline void valarray<_Tp>::swap(valarray& __v) _NOEXCEPT {
2525 5f757f3fSDimitry Andric  std::swap(__begin_, __v.__begin_);
2526 5f757f3fSDimitry Andric  std::swap(__end_, __v.__end_);
2527 0b57cec5SDimitry Andric}
2528 0b57cec5SDimitry Andric
2529 0b57cec5SDimitry Andrictemplate <class _Tp>
2530 cb14a3feSDimitry Andricinline _Tp valarray<_Tp>::sum() const {
2531 0b57cec5SDimitry Andric  if (__begin_ == __end_)
2532 0b57cec5SDimitry Andric    return value_type();
2533 0b57cec5SDimitry Andric  const value_type* __p = __begin_;
2534 0b57cec5SDimitry Andric  _Tp __r               = *__p;
2535 0b57cec5SDimitry Andric  for (++__p; __p != __end_; ++__p)
2536 0b57cec5SDimitry Andric    __r += *__p;
2537 0b57cec5SDimitry Andric  return __r;
2538 0b57cec5SDimitry Andric}
2539 0b57cec5SDimitry Andric
2540 0b57cec5SDimitry Andrictemplate <class _Tp>
2541 cb14a3feSDimitry Andricinline _Tp valarray<_Tp>::min() const {
2542 0b57cec5SDimitry Andric  if (__begin_ == __end_)
2543 0b57cec5SDimitry Andric    return value_type();
2544 5f757f3fSDimitry Andric  return *std::min_element(__begin_, __end_);
2545 0b57cec5SDimitry Andric}
2546 0b57cec5SDimitry Andric
2547 0b57cec5SDimitry Andrictemplate <class _Tp>
2548 cb14a3feSDimitry Andricinline _Tp valarray<_Tp>::max() const {
2549 0b57cec5SDimitry Andric  if (__begin_ == __end_)
2550 0b57cec5SDimitry Andric    return value_type();
2551 5f757f3fSDimitry Andric  return *std::max_element(__begin_, __end_);
2552 0b57cec5SDimitry Andric}
2553 0b57cec5SDimitry Andric
2554 0b57cec5SDimitry Andrictemplate <class _Tp>
2555 cb14a3feSDimitry Andricvalarray<_Tp> valarray<_Tp>::shift(int __i) const {
2556 0b57cec5SDimitry Andric  valarray<value_type> __r;
2557 0b57cec5SDimitry Andric  size_t __n = size();
2558 cb14a3feSDimitry Andric  if (__n) {
2559 e8d8bef9SDimitry Andric    __r.__begin_ = __r.__end_ = allocator<value_type>().allocate(__n);
2560 0b57cec5SDimitry Andric    const value_type* __sb;
2561 0b57cec5SDimitry Andric    value_type* __tb;
2562 0b57cec5SDimitry Andric    value_type* __te;
2563 cb14a3feSDimitry Andric    if (__i >= 0) {
2564 5f757f3fSDimitry Andric      __i  = std::min(__i, static_cast<int>(__n));
2565 0b57cec5SDimitry Andric      __sb = __begin_ + __i;
2566 0b57cec5SDimitry Andric      __tb = __r.__begin_;
2567 0b57cec5SDimitry Andric      __te = __r.__begin_ + (__n - __i);
2568 cb14a3feSDimitry Andric    } else {
2569 5f757f3fSDimitry Andric      __i  = std::min(-__i, static_cast<int>(__n));
2570 0b57cec5SDimitry Andric      __sb = __begin_;
2571 0b57cec5SDimitry Andric      __tb = __r.__begin_ + __i;
2572 0b57cec5SDimitry Andric      __te = __r.__begin_ + __n;
2573 0b57cec5SDimitry Andric    }
2574 0b57cec5SDimitry Andric    for (; __r.__end_ != __tb; ++__r.__end_)
2575 e8d8bef9SDimitry Andric      ::new ((void*)__r.__end_) value_type();
2576 0b57cec5SDimitry Andric    for (; __r.__end_ != __te; ++__r.__end_, ++__sb)
2577 e8d8bef9SDimitry Andric      ::new ((void*)__r.__end_) value_type(*__sb);
2578 0b57cec5SDimitry Andric    for (__te = __r.__begin_ + __n; __r.__end_ != __te; ++__r.__end_)
2579 e8d8bef9SDimitry Andric      ::new ((void*)__r.__end_) value_type();
2580 0b57cec5SDimitry Andric  }
2581 0b57cec5SDimitry Andric  return __r;
2582 0b57cec5SDimitry Andric}
2583 0b57cec5SDimitry Andric
2584 0b57cec5SDimitry Andrictemplate <class _Tp>
2585 cb14a3feSDimitry Andricvalarray<_Tp> valarray<_Tp>::cshift(int __i) const {
2586 0b57cec5SDimitry Andric  valarray<value_type> __r;
2587 0b57cec5SDimitry Andric  size_t __n = size();
2588 cb14a3feSDimitry Andric  if (__n) {
2589 e8d8bef9SDimitry Andric    __r.__begin_ = __r.__end_ = allocator<value_type>().allocate(__n);
2590 0b57cec5SDimitry Andric    __i %= static_cast<int>(__n);
2591 0b57cec5SDimitry Andric    const value_type* __m = __i >= 0 ? __begin_ + __i : __end_ + __i;
2592 0b57cec5SDimitry Andric    for (const value_type* __s = __m; __s != __end_; ++__r.__end_, ++__s)
2593 e8d8bef9SDimitry Andric      ::new ((void*)__r.__end_) value_type(*__s);
2594 0b57cec5SDimitry Andric    for (const value_type* __s = __begin_; __s != __m; ++__r.__end_, ++__s)
2595 e8d8bef9SDimitry Andric      ::new ((void*)__r.__end_) value_type(*__s);
2596 0b57cec5SDimitry Andric  }
2597 0b57cec5SDimitry Andric  return __r;
2598 0b57cec5SDimitry Andric}
2599 0b57cec5SDimitry Andric
2600 0b57cec5SDimitry Andrictemplate <class _Tp>
2601 cb14a3feSDimitry Andricvalarray<_Tp> valarray<_Tp>::apply(value_type __f(value_type)) const {
2602 0b57cec5SDimitry Andric  valarray<value_type> __r;
2603 0b57cec5SDimitry Andric  size_t __n = size();
2604 cb14a3feSDimitry Andric  if (__n) {
2605 e8d8bef9SDimitry Andric    __r.__begin_ = __r.__end_ = allocator<value_type>().allocate(__n);
2606 0b57cec5SDimitry Andric    for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n)
2607 e8d8bef9SDimitry Andric      ::new ((void*)__r.__end_) value_type(__f(*__p));
2608 0b57cec5SDimitry Andric  }
2609 0b57cec5SDimitry Andric  return __r;
2610 0b57cec5SDimitry Andric}
2611 0b57cec5SDimitry Andric
2612 0b57cec5SDimitry Andrictemplate <class _Tp>
2613 cb14a3feSDimitry Andricvalarray<_Tp> valarray<_Tp>::apply(value_type __f(const value_type&)) const {
2614 0b57cec5SDimitry Andric  valarray<value_type> __r;
2615 0b57cec5SDimitry Andric  size_t __n = size();
2616 cb14a3feSDimitry Andric  if (__n) {
2617 e8d8bef9SDimitry Andric    __r.__begin_ = __r.__end_ = allocator<value_type>().allocate(__n);
2618 0b57cec5SDimitry Andric    for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n)
2619 e8d8bef9SDimitry Andric      ::new ((void*)__r.__end_) value_type(__f(*__p));
2620 0b57cec5SDimitry Andric  }
2621 0b57cec5SDimitry Andric  return __r;
2622 0b57cec5SDimitry Andric}
2623 0b57cec5SDimitry Andric
2624 0b57cec5SDimitry Andrictemplate <class _Tp>
2625 cb14a3feSDimitry Andricinline void valarray<_Tp>::__clear(size_t __capacity) {
2626 cb14a3feSDimitry Andric  if (__begin_ != nullptr) {
2627 0b57cec5SDimitry Andric    while (__end_ != __begin_)
2628 0b57cec5SDimitry Andric      (--__end_)->~value_type();
2629 e8d8bef9SDimitry Andric    allocator<value_type>().deallocate(__begin_, __capacity);
2630 0b57cec5SDimitry Andric    __begin_ = __end_ = nullptr;
2631 0b57cec5SDimitry Andric  }
2632 0b57cec5SDimitry Andric}
2633 0b57cec5SDimitry Andric
2634 0b57cec5SDimitry Andrictemplate <class _Tp>
2635 cb14a3feSDimitry Andricvoid valarray<_Tp>::resize(size_t __n, value_type __x) {
2636 0b57cec5SDimitry Andric  __clear(size());
2637 cb14a3feSDimitry Andric  if (__n) {
2638 e8d8bef9SDimitry Andric    __begin_ = __end_ = allocator<value_type>().allocate(__n);
2639 06c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
2640 cb14a3feSDimitry Andric    try {
2641 06c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
2642 0b57cec5SDimitry Andric      for (size_t __n_left = __n; __n_left; --__n_left, ++__end_)
2643 e8d8bef9SDimitry Andric        ::new ((void*)__end_) value_type(__x);
2644 06c3fb27SDimitry Andric#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
2645 cb14a3feSDimitry Andric    } catch (...) {
2646 0b57cec5SDimitry Andric      __clear(__n);
2647 0b57cec5SDimitry Andric      throw;
2648 0b57cec5SDimitry Andric    }
2649 06c3fb27SDimitry Andric#endif // _LIBCPP_HAS_NO_EXCEPTIONS
2650 0b57cec5SDimitry Andric  }
2651 0b57cec5SDimitry Andric}
2652 0b57cec5SDimitry Andric
2653 0b57cec5SDimitry Andrictemplate <class _Tp>
2654 cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI void swap(valarray<_Tp>& __x, valarray<_Tp>& __y) _NOEXCEPT {
2655 0b57cec5SDimitry Andric  __x.swap(__y);
2656 0b57cec5SDimitry Andric}
2657 0b57cec5SDimitry Andric
2658 cb14a3feSDimitry Andrictemplate <class _Expr1,
2659 cb14a3feSDimitry Andric          class _Expr2,
2660 cb14a3feSDimitry Andric          __enable_if_t<__is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, int> = 0>
2661 cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI __val_expr<_BinaryOp<multiplies<typename _Expr1::value_type>, _Expr1, _Expr2> >
2662 cb14a3feSDimitry Andricoperator*(const _Expr1& __x, const _Expr2& __y) {
2663 0b57cec5SDimitry Andric  typedef typename _Expr1::value_type value_type;
2664 0b57cec5SDimitry Andric  typedef _BinaryOp<multiplies<value_type>, _Expr1, _Expr2> _Op;
2665 0b57cec5SDimitry Andric  return __val_expr<_Op>(_Op(multiplies<value_type>(), __x, __y));
2666 0b57cec5SDimitry Andric}
2667 0b57cec5SDimitry Andric
2668 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
2669 5f757f3fSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI
2670 cb14a3feSDimitry Andric__val_expr<_BinaryOp<multiplies<typename _Expr::value_type>, _Expr, __scalar_expr<typename _Expr::value_type> > >
2671 cb14a3feSDimitry Andricoperator*(const _Expr& __x, const typename _Expr::value_type& __y) {
2672 0b57cec5SDimitry Andric  typedef typename _Expr::value_type value_type;
2673 0b57cec5SDimitry Andric  typedef _BinaryOp<multiplies<value_type>, _Expr, __scalar_expr<value_type> > _Op;
2674 cb14a3feSDimitry Andric  return __val_expr<_Op>(_Op(multiplies<value_type>(), __x, __scalar_expr<value_type>(__y, __x.size())));
2675 0b57cec5SDimitry Andric}
2676 0b57cec5SDimitry Andric
2677 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
2678 5f757f3fSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI
2679 cb14a3feSDimitry Andric__val_expr<_BinaryOp<multiplies<typename _Expr::value_type>, __scalar_expr<typename _Expr::value_type>, _Expr> >
2680 cb14a3feSDimitry Andricoperator*(const typename _Expr::value_type& __x, const _Expr& __y) {
2681 0b57cec5SDimitry Andric  typedef typename _Expr::value_type value_type;
2682 0b57cec5SDimitry Andric  typedef _BinaryOp<multiplies<value_type>, __scalar_expr<value_type>, _Expr> _Op;
2683 cb14a3feSDimitry Andric  return __val_expr<_Op>(_Op(multiplies<value_type>(), __scalar_expr<value_type>(__x, __y.size()), __y));
2684 0b57cec5SDimitry Andric}
2685 0b57cec5SDimitry Andric
2686 cb14a3feSDimitry Andrictemplate <class _Expr1,
2687 cb14a3feSDimitry Andric          class _Expr2,
2688 cb14a3feSDimitry Andric          __enable_if_t<__is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, int> = 0>
2689 cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI __val_expr<_BinaryOp<divides<typename _Expr1::value_type>, _Expr1, _Expr2> >
2690 cb14a3feSDimitry Andricoperator/(const _Expr1& __x, const _Expr2& __y) {
2691 0b57cec5SDimitry Andric  typedef typename _Expr1::value_type value_type;
2692 0b57cec5SDimitry Andric  typedef _BinaryOp<divides<value_type>, _Expr1, _Expr2> _Op;
2693 0b57cec5SDimitry Andric  return __val_expr<_Op>(_Op(divides<value_type>(), __x, __y));
2694 0b57cec5SDimitry Andric}
2695 0b57cec5SDimitry Andric
2696 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
2697 5f757f3fSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI
2698 cb14a3feSDimitry Andric__val_expr<_BinaryOp<divides<typename _Expr::value_type>, _Expr, __scalar_expr<typename _Expr::value_type> > >
2699 cb14a3feSDimitry Andricoperator/(const _Expr& __x, const typename _Expr::value_type& __y) {
2700 0b57cec5SDimitry Andric  typedef typename _Expr::value_type value_type;
2701 0b57cec5SDimitry Andric  typedef _BinaryOp<divides<value_type>, _Expr, __scalar_expr<value_type> > _Op;
2702 cb14a3feSDimitry Andric  return __val_expr<_Op>(_Op(divides<value_type>(), __x, __scalar_expr<value_type>(__y, __x.size())));
2703 0b57cec5SDimitry Andric}
2704 0b57cec5SDimitry Andric
2705 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
2706 5f757f3fSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI
2707 cb14a3feSDimitry Andric__val_expr<_BinaryOp<divides<typename _Expr::value_type>, __scalar_expr<typename _Expr::value_type>, _Expr> >
2708 cb14a3feSDimitry Andricoperator/(const typename _Expr::value_type& __x, const _Expr& __y) {
2709 0b57cec5SDimitry Andric  typedef typename _Expr::value_type value_type;
2710 0b57cec5SDimitry Andric  typedef _BinaryOp<divides<value_type>, __scalar_expr<value_type>, _Expr> _Op;
2711 cb14a3feSDimitry Andric  return __val_expr<_Op>(_Op(divides<value_type>(), __scalar_expr<value_type>(__x, __y.size()), __y));
2712 0b57cec5SDimitry Andric}
2713 0b57cec5SDimitry Andric
2714 cb14a3feSDimitry Andrictemplate <class _Expr1,
2715 cb14a3feSDimitry Andric          class _Expr2,
2716 cb14a3feSDimitry Andric          __enable_if_t<__is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, int> = 0>
2717 cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI __val_expr<_BinaryOp<modulus<typename _Expr1::value_type>, _Expr1, _Expr2> >
2718 cb14a3feSDimitry Andricoperator%(const _Expr1& __x, const _Expr2& __y) {
2719 0b57cec5SDimitry Andric  typedef typename _Expr1::value_type value_type;
2720 0b57cec5SDimitry Andric  typedef _BinaryOp<modulus<value_type>, _Expr1, _Expr2> _Op;
2721 0b57cec5SDimitry Andric  return __val_expr<_Op>(_Op(modulus<value_type>(), __x, __y));
2722 0b57cec5SDimitry Andric}
2723 0b57cec5SDimitry Andric
2724 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
2725 5f757f3fSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI
2726 cb14a3feSDimitry Andric__val_expr<_BinaryOp<modulus<typename _Expr::value_type>, _Expr, __scalar_expr<typename _Expr::value_type> > >
2727 cb14a3feSDimitry Andricoperator%(const _Expr& __x, const typename _Expr::value_type& __y) {
2728 0b57cec5SDimitry Andric  typedef typename _Expr::value_type value_type;
2729 0b57cec5SDimitry Andric  typedef _BinaryOp<modulus<value_type>, _Expr, __scalar_expr<value_type> > _Op;
2730 cb14a3feSDimitry Andric  return __val_expr<_Op>(_Op(modulus<value_type>(), __x, __scalar_expr<value_type>(__y, __x.size())));
2731 0b57cec5SDimitry Andric}
2732 0b57cec5SDimitry Andric
2733 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
2734 5f757f3fSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI
2735 cb14a3feSDimitry Andric__val_expr<_BinaryOp<modulus<typename _Expr::value_type>, __scalar_expr<typename _Expr::value_type>, _Expr> >
2736 cb14a3feSDimitry Andricoperator%(const typename _Expr::value_type& __x, const _Expr& __y) {
2737 0b57cec5SDimitry Andric  typedef typename _Expr::value_type value_type;
2738 0b57cec5SDimitry Andric  typedef _BinaryOp<modulus<value_type>, __scalar_expr<value_type>, _Expr> _Op;
2739 cb14a3feSDimitry Andric  return __val_expr<_Op>(_Op(modulus<value_type>(), __scalar_expr<value_type>(__x, __y.size()), __y));
2740 0b57cec5SDimitry Andric}
2741 0b57cec5SDimitry Andric
2742 cb14a3feSDimitry Andrictemplate <class _Expr1,
2743 cb14a3feSDimitry Andric          class _Expr2,
2744 cb14a3feSDimitry Andric          __enable_if_t<__is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, int> = 0>
2745 cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI __val_expr<_BinaryOp<plus<typename _Expr1::value_type>, _Expr1, _Expr2> >
2746 cb14a3feSDimitry Andricoperator+(const _Expr1& __x, const _Expr2& __y) {
2747 0b57cec5SDimitry Andric  typedef typename _Expr1::value_type value_type;
2748 0b57cec5SDimitry Andric  typedef _BinaryOp<plus<value_type>, _Expr1, _Expr2> _Op;
2749 0b57cec5SDimitry Andric  return __val_expr<_Op>(_Op(plus<value_type>(), __x, __y));
2750 0b57cec5SDimitry Andric}
2751 0b57cec5SDimitry Andric
2752 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
2753 5f757f3fSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI
2754 cb14a3feSDimitry Andric__val_expr<_BinaryOp<plus<typename _Expr::value_type>, _Expr, __scalar_expr<typename _Expr::value_type> > >
2755 cb14a3feSDimitry Andricoperator+(const _Expr& __x, const typename _Expr::value_type& __y) {
2756 0b57cec5SDimitry Andric  typedef typename _Expr::value_type value_type;
2757 0b57cec5SDimitry Andric  typedef _BinaryOp<plus<value_type>, _Expr, __scalar_expr<value_type> > _Op;
2758 cb14a3feSDimitry Andric  return __val_expr<_Op>(_Op(plus<value_type>(), __x, __scalar_expr<value_type>(__y, __x.size())));
2759 0b57cec5SDimitry Andric}
2760 0b57cec5SDimitry Andric
2761 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
2762 5f757f3fSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI
2763 cb14a3feSDimitry Andric__val_expr<_BinaryOp<plus<typename _Expr::value_type>, __scalar_expr<typename _Expr::value_type>, _Expr> >
2764 cb14a3feSDimitry Andricoperator+(const typename _Expr::value_type& __x, const _Expr& __y) {
2765 0b57cec5SDimitry Andric  typedef typename _Expr::value_type value_type;
2766 0b57cec5SDimitry Andric  typedef _BinaryOp<plus<value_type>, __scalar_expr<value_type>, _Expr> _Op;
2767 cb14a3feSDimitry Andric  return __val_expr<_Op>(_Op(plus<value_type>(), __scalar_expr<value_type>(__x, __y.size()), __y));
2768 0b57cec5SDimitry Andric}
2769 0b57cec5SDimitry Andric
2770 cb14a3feSDimitry Andrictemplate <class _Expr1,
2771 cb14a3feSDimitry Andric          class _Expr2,
2772 cb14a3feSDimitry Andric          __enable_if_t<__is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, int> = 0>
2773 cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI __val_expr<_BinaryOp<minus<typename _Expr1::value_type>, _Expr1, _Expr2> >
2774 cb14a3feSDimitry Andricoperator-(const _Expr1& __x, const _Expr2& __y) {
2775 0b57cec5SDimitry Andric  typedef typename _Expr1::value_type value_type;
2776 0b57cec5SDimitry Andric  typedef _BinaryOp<minus<value_type>, _Expr1, _Expr2> _Op;
2777 0b57cec5SDimitry Andric  return __val_expr<_Op>(_Op(minus<value_type>(), __x, __y));
2778 0b57cec5SDimitry Andric}
2779 0b57cec5SDimitry Andric
2780 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
2781 5f757f3fSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI
2782 cb14a3feSDimitry Andric__val_expr<_BinaryOp<minus<typename _Expr::value_type>, _Expr, __scalar_expr<typename _Expr::value_type> > >
2783 cb14a3feSDimitry Andricoperator-(const _Expr& __x, const typename _Expr::value_type& __y) {
2784 0b57cec5SDimitry Andric  typedef typename _Expr::value_type value_type;
2785 0b57cec5SDimitry Andric  typedef _BinaryOp<minus<value_type>, _Expr, __scalar_expr<value_type> > _Op;
2786 cb14a3feSDimitry Andric  return __val_expr<_Op>(_Op(minus<value_type>(), __x, __scalar_expr<value_type>(__y, __x.size())));
2787 0b57cec5SDimitry Andric}
2788 0b57cec5SDimitry Andric
2789 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
2790 5f757f3fSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI
2791 cb14a3feSDimitry Andric__val_expr<_BinaryOp<minus<typename _Expr::value_type>, __scalar_expr<typename _Expr::value_type>, _Expr> >
2792 cb14a3feSDimitry Andricoperator-(const typename _Expr::value_type& __x, const _Expr& __y) {
2793 0b57cec5SDimitry Andric  typedef typename _Expr::value_type value_type;
2794 0b57cec5SDimitry Andric  typedef _BinaryOp<minus<value_type>, __scalar_expr<value_type>, _Expr> _Op;
2795 cb14a3feSDimitry Andric  return __val_expr<_Op>(_Op(minus<value_type>(), __scalar_expr<value_type>(__x, __y.size()), __y));
2796 0b57cec5SDimitry Andric}
2797 0b57cec5SDimitry Andric
2798 cb14a3feSDimitry Andrictemplate <class _Expr1,
2799 cb14a3feSDimitry Andric          class _Expr2,
2800 cb14a3feSDimitry Andric          __enable_if_t<__is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, int> = 0>
2801 cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI __val_expr<_BinaryOp<bit_xor<typename _Expr1::value_type>, _Expr1, _Expr2> >
2802 cb14a3feSDimitry Andricoperator^(const _Expr1& __x, const _Expr2& __y) {
2803 0b57cec5SDimitry Andric  typedef typename _Expr1::value_type value_type;
2804 0b57cec5SDimitry Andric  typedef _BinaryOp<bit_xor<value_type>, _Expr1, _Expr2> _Op;
2805 0b57cec5SDimitry Andric  return __val_expr<_Op>(_Op(bit_xor<value_type>(), __x, __y));
2806 0b57cec5SDimitry Andric}
2807 0b57cec5SDimitry Andric
2808 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
2809 5f757f3fSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI
2810 cb14a3feSDimitry Andric__val_expr<_BinaryOp<bit_xor<typename _Expr::value_type>, _Expr, __scalar_expr<typename _Expr::value_type> > >
2811 cb14a3feSDimitry Andricoperator^(const _Expr& __x, const typename _Expr::value_type& __y) {
2812 0b57cec5SDimitry Andric  typedef typename _Expr::value_type value_type;
2813 0b57cec5SDimitry Andric  typedef _BinaryOp<bit_xor<value_type>, _Expr, __scalar_expr<value_type> > _Op;
2814 cb14a3feSDimitry Andric  return __val_expr<_Op>(_Op(bit_xor<value_type>(), __x, __scalar_expr<value_type>(__y, __x.size())));
2815 0b57cec5SDimitry Andric}
2816 0b57cec5SDimitry Andric
2817 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
2818 5f757f3fSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI
2819 cb14a3feSDimitry Andric__val_expr<_BinaryOp<bit_xor<typename _Expr::value_type>, __scalar_expr<typename _Expr::value_type>, _Expr> >
2820 cb14a3feSDimitry Andricoperator^(const typename _Expr::value_type& __x, const _Expr& __y) {
2821 0b57cec5SDimitry Andric  typedef typename _Expr::value_type value_type;
2822 0b57cec5SDimitry Andric  typedef _BinaryOp<bit_xor<value_type>, __scalar_expr<value_type>, _Expr> _Op;
2823 cb14a3feSDimitry Andric  return __val_expr<_Op>(_Op(bit_xor<value_type>(), __scalar_expr<value_type>(__x, __y.size()), __y));
2824 0b57cec5SDimitry Andric}
2825 0b57cec5SDimitry Andric
2826 cb14a3feSDimitry Andrictemplate <class _Expr1,
2827 cb14a3feSDimitry Andric          class _Expr2,
2828 cb14a3feSDimitry Andric          __enable_if_t<__is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, int> = 0>
2829 cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI __val_expr<_BinaryOp<bit_and<typename _Expr1::value_type>, _Expr1, _Expr2> >
2830 cb14a3feSDimitry Andricoperator&(const _Expr1& __x, const _Expr2& __y) {
2831 0b57cec5SDimitry Andric  typedef typename _Expr1::value_type value_type;
2832 0b57cec5SDimitry Andric  typedef _BinaryOp<bit_and<value_type>, _Expr1, _Expr2> _Op;
2833 0b57cec5SDimitry Andric  return __val_expr<_Op>(_Op(bit_and<value_type>(), __x, __y));
2834 0b57cec5SDimitry Andric}
2835 0b57cec5SDimitry Andric
2836 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
2837 5f757f3fSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI
2838 cb14a3feSDimitry Andric__val_expr<_BinaryOp<bit_and<typename _Expr::value_type>, _Expr, __scalar_expr<typename _Expr::value_type> > >
2839 cb14a3feSDimitry Andricoperator&(const _Expr& __x, const typename _Expr::value_type& __y) {
2840 0b57cec5SDimitry Andric  typedef typename _Expr::value_type value_type;
2841 0b57cec5SDimitry Andric  typedef _BinaryOp<bit_and<value_type>, _Expr, __scalar_expr<value_type> > _Op;
2842 cb14a3feSDimitry Andric  return __val_expr<_Op>(_Op(bit_and<value_type>(), __x, __scalar_expr<value_type>(__y, __x.size())));
2843 0b57cec5SDimitry Andric}
2844 0b57cec5SDimitry Andric
2845 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
2846 5f757f3fSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI
2847 cb14a3feSDimitry Andric__val_expr<_BinaryOp<bit_and<typename _Expr::value_type>, __scalar_expr<typename _Expr::value_type>, _Expr> >
2848 cb14a3feSDimitry Andricoperator&(const typename _Expr::value_type& __x, const _Expr& __y) {
2849 0b57cec5SDimitry Andric  typedef typename _Expr::value_type value_type;
2850 0b57cec5SDimitry Andric  typedef _BinaryOp<bit_and<value_type>, __scalar_expr<value_type>, _Expr> _Op;
2851 cb14a3feSDimitry Andric  return __val_expr<_Op>(_Op(bit_and<value_type>(), __scalar_expr<value_type>(__x, __y.size()), __y));
2852 0b57cec5SDimitry Andric}
2853 0b57cec5SDimitry Andric
2854 cb14a3feSDimitry Andrictemplate <class _Expr1,
2855 cb14a3feSDimitry Andric          class _Expr2,
2856 cb14a3feSDimitry Andric          __enable_if_t<__is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, int> = 0>
2857 cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI __val_expr<_BinaryOp<bit_or<typename _Expr1::value_type>, _Expr1, _Expr2> >
2858 cb14a3feSDimitry Andricoperator|(const _Expr1& __x, const _Expr2& __y) {
2859 0b57cec5SDimitry Andric  typedef typename _Expr1::value_type value_type;
2860 0b57cec5SDimitry Andric  typedef _BinaryOp<bit_or<value_type>, _Expr1, _Expr2> _Op;
2861 0b57cec5SDimitry Andric  return __val_expr<_Op>(_Op(bit_or<value_type>(), __x, __y));
2862 0b57cec5SDimitry Andric}
2863 0b57cec5SDimitry Andric
2864 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
2865 5f757f3fSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI
2866 cb14a3feSDimitry Andric__val_expr<_BinaryOp<bit_or<typename _Expr::value_type>, _Expr, __scalar_expr<typename _Expr::value_type> > >
2867 cb14a3feSDimitry Andricoperator|(const _Expr& __x, const typename _Expr::value_type& __y) {
2868 0b57cec5SDimitry Andric  typedef typename _Expr::value_type value_type;
2869 0b57cec5SDimitry Andric  typedef _BinaryOp<bit_or<value_type>, _Expr, __scalar_expr<value_type> > _Op;
2870 cb14a3feSDimitry Andric  return __val_expr<_Op>(_Op(bit_or<value_type>(), __x, __scalar_expr<value_type>(__y, __x.size())));
2871 0b57cec5SDimitry Andric}
2872 0b57cec5SDimitry Andric
2873 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
2874 5f757f3fSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI
2875 cb14a3feSDimitry Andric__val_expr<_BinaryOp<bit_or<typename _Expr::value_type>, __scalar_expr<typename _Expr::value_type>, _Expr> >
2876 cb14a3feSDimitry Andricoperator|(const typename _Expr::value_type& __x, const _Expr& __y) {
2877 0b57cec5SDimitry Andric  typedef typename _Expr::value_type value_type;
2878 0b57cec5SDimitry Andric  typedef _BinaryOp<bit_or<value_type>, __scalar_expr<value_type>, _Expr> _Op;
2879 cb14a3feSDimitry Andric  return __val_expr<_Op>(_Op(bit_or<value_type>(), __scalar_expr<value_type>(__x, __y.size()), __y));
2880 0b57cec5SDimitry Andric}
2881 0b57cec5SDimitry Andric
2882 cb14a3feSDimitry Andrictemplate <class _Expr1,
2883 cb14a3feSDimitry Andric          class _Expr2,
2884 cb14a3feSDimitry Andric          __enable_if_t<__is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, int> = 0>
2885 cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI __val_expr<_BinaryOp<__bit_shift_left<typename _Expr1::value_type>, _Expr1, _Expr2> >
2886 cb14a3feSDimitry Andricoperator<<(const _Expr1& __x, const _Expr2& __y) {
2887 0b57cec5SDimitry Andric  typedef typename _Expr1::value_type value_type;
2888 0b57cec5SDimitry Andric  typedef _BinaryOp<__bit_shift_left<value_type>, _Expr1, _Expr2> _Op;
2889 0b57cec5SDimitry Andric  return __val_expr<_Op>(_Op(__bit_shift_left<value_type>(), __x, __y));
2890 0b57cec5SDimitry Andric}
2891 0b57cec5SDimitry Andric
2892 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
2893 *0fca6ea1SDimitry Andricinline _LIBCPP_HIDE_FROM_ABI
2894 *0fca6ea1SDimitry Andric__val_expr< _BinaryOp<__bit_shift_left<typename _Expr::value_type>, _Expr, __scalar_expr<typename _Expr::value_type> > >
2895 cb14a3feSDimitry Andricoperator<<(const _Expr& __x, const typename _Expr::value_type& __y) {
2896 0b57cec5SDimitry Andric  typedef typename _Expr::value_type value_type;
2897 0b57cec5SDimitry Andric  typedef _BinaryOp<__bit_shift_left<value_type>, _Expr, __scalar_expr<value_type> > _Op;
2898 cb14a3feSDimitry Andric  return __val_expr<_Op>(_Op(__bit_shift_left<value_type>(), __x, __scalar_expr<value_type>(__y, __x.size())));
2899 0b57cec5SDimitry Andric}
2900 0b57cec5SDimitry Andric
2901 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
2902 *0fca6ea1SDimitry Andricinline _LIBCPP_HIDE_FROM_ABI
2903 *0fca6ea1SDimitry Andric__val_expr< _BinaryOp<__bit_shift_left<typename _Expr::value_type>, __scalar_expr<typename _Expr::value_type>, _Expr> >
2904 cb14a3feSDimitry Andricoperator<<(const typename _Expr::value_type& __x, const _Expr& __y) {
2905 0b57cec5SDimitry Andric  typedef typename _Expr::value_type value_type;
2906 0b57cec5SDimitry Andric  typedef _BinaryOp<__bit_shift_left<value_type>, __scalar_expr<value_type>, _Expr> _Op;
2907 cb14a3feSDimitry Andric  return __val_expr<_Op>(_Op(__bit_shift_left<value_type>(), __scalar_expr<value_type>(__x, __y.size()), __y));
2908 0b57cec5SDimitry Andric}
2909 0b57cec5SDimitry Andric
2910 cb14a3feSDimitry Andrictemplate <class _Expr1,
2911 cb14a3feSDimitry Andric          class _Expr2,
2912 cb14a3feSDimitry Andric          __enable_if_t<__is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, int> = 0>
2913 cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI __val_expr<_BinaryOp<__bit_shift_right<typename _Expr1::value_type>, _Expr1, _Expr2> >
2914 cb14a3feSDimitry Andricoperator>>(const _Expr1& __x, const _Expr2& __y) {
2915 0b57cec5SDimitry Andric  typedef typename _Expr1::value_type value_type;
2916 0b57cec5SDimitry Andric  typedef _BinaryOp<__bit_shift_right<value_type>, _Expr1, _Expr2> _Op;
2917 0b57cec5SDimitry Andric  return __val_expr<_Op>(_Op(__bit_shift_right<value_type>(), __x, __y));
2918 0b57cec5SDimitry Andric}
2919 0b57cec5SDimitry Andric
2920 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
2921 cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI __val_expr<
2922 cb14a3feSDimitry Andric    _BinaryOp<__bit_shift_right<typename _Expr::value_type>, _Expr, __scalar_expr<typename _Expr::value_type> > >
2923 cb14a3feSDimitry Andricoperator>>(const _Expr& __x, const typename _Expr::value_type& __y) {
2924 0b57cec5SDimitry Andric  typedef typename _Expr::value_type value_type;
2925 0b57cec5SDimitry Andric  typedef _BinaryOp<__bit_shift_right<value_type>, _Expr, __scalar_expr<value_type> > _Op;
2926 cb14a3feSDimitry Andric  return __val_expr<_Op>(_Op(__bit_shift_right<value_type>(), __x, __scalar_expr<value_type>(__y, __x.size())));
2927 0b57cec5SDimitry Andric}
2928 0b57cec5SDimitry Andric
2929 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
2930 *0fca6ea1SDimitry Andricinline _LIBCPP_HIDE_FROM_ABI
2931 *0fca6ea1SDimitry Andric__val_expr< _BinaryOp<__bit_shift_right<typename _Expr::value_type>, __scalar_expr<typename _Expr::value_type>, _Expr> >
2932 cb14a3feSDimitry Andricoperator>>(const typename _Expr::value_type& __x, const _Expr& __y) {
2933 0b57cec5SDimitry Andric  typedef typename _Expr::value_type value_type;
2934 0b57cec5SDimitry Andric  typedef _BinaryOp<__bit_shift_right<value_type>, __scalar_expr<value_type>, _Expr> _Op;
2935 cb14a3feSDimitry Andric  return __val_expr<_Op>(_Op(__bit_shift_right<value_type>(), __scalar_expr<value_type>(__x, __y.size()), __y));
2936 0b57cec5SDimitry Andric}
2937 0b57cec5SDimitry Andric
2938 cb14a3feSDimitry Andrictemplate <class _Expr1,
2939 cb14a3feSDimitry Andric          class _Expr2,
2940 cb14a3feSDimitry Andric          __enable_if_t<__is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, int> = 0>
2941 cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI __val_expr<_BinaryOp<logical_and<typename _Expr1::value_type>, _Expr1, _Expr2> >
2942 cb14a3feSDimitry Andricoperator&&(const _Expr1& __x, const _Expr2& __y) {
2943 0b57cec5SDimitry Andric  typedef typename _Expr1::value_type value_type;
2944 0b57cec5SDimitry Andric  typedef _BinaryOp<logical_and<value_type>, _Expr1, _Expr2> _Op;
2945 0b57cec5SDimitry Andric  return __val_expr<_Op>(_Op(logical_and<value_type>(), __x, __y));
2946 0b57cec5SDimitry Andric}
2947 0b57cec5SDimitry Andric
2948 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
2949 5f757f3fSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI
2950 cb14a3feSDimitry Andric__val_expr<_BinaryOp<logical_and<typename _Expr::value_type>, _Expr, __scalar_expr<typename _Expr::value_type> > >
2951 cb14a3feSDimitry Andricoperator&&(const _Expr& __x, const typename _Expr::value_type& __y) {
2952 0b57cec5SDimitry Andric  typedef typename _Expr::value_type value_type;
2953 0b57cec5SDimitry Andric  typedef _BinaryOp<logical_and<value_type>, _Expr, __scalar_expr<value_type> > _Op;
2954 cb14a3feSDimitry Andric  return __val_expr<_Op>(_Op(logical_and<value_type>(), __x, __scalar_expr<value_type>(__y, __x.size())));
2955 0b57cec5SDimitry Andric}
2956 0b57cec5SDimitry Andric
2957 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
2958 5f757f3fSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI
2959 cb14a3feSDimitry Andric__val_expr<_BinaryOp<logical_and<typename _Expr::value_type>, __scalar_expr<typename _Expr::value_type>, _Expr> >
2960 cb14a3feSDimitry Andricoperator&&(const typename _Expr::value_type& __x, const _Expr& __y) {
2961 0b57cec5SDimitry Andric  typedef typename _Expr::value_type value_type;
2962 0b57cec5SDimitry Andric  typedef _BinaryOp<logical_and<value_type>, __scalar_expr<value_type>, _Expr> _Op;
2963 cb14a3feSDimitry Andric  return __val_expr<_Op>(_Op(logical_and<value_type>(), __scalar_expr<value_type>(__x, __y.size()), __y));
2964 0b57cec5SDimitry Andric}
2965 0b57cec5SDimitry Andric
2966 cb14a3feSDimitry Andrictemplate <class _Expr1,
2967 cb14a3feSDimitry Andric          class _Expr2,
2968 cb14a3feSDimitry Andric          __enable_if_t<__is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, int> = 0>
2969 cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI __val_expr<_BinaryOp<logical_or<typename _Expr1::value_type>, _Expr1, _Expr2> >
2970 cb14a3feSDimitry Andricoperator||(const _Expr1& __x, const _Expr2& __y) {
2971 0b57cec5SDimitry Andric  typedef typename _Expr1::value_type value_type;
2972 0b57cec5SDimitry Andric  typedef _BinaryOp<logical_or<value_type>, _Expr1, _Expr2> _Op;
2973 0b57cec5SDimitry Andric  return __val_expr<_Op>(_Op(logical_or<value_type>(), __x, __y));
2974 0b57cec5SDimitry Andric}
2975 0b57cec5SDimitry Andric
2976 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
2977 5f757f3fSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI
2978 cb14a3feSDimitry Andric__val_expr<_BinaryOp<logical_or<typename _Expr::value_type>, _Expr, __scalar_expr<typename _Expr::value_type> > >
2979 cb14a3feSDimitry Andricoperator||(const _Expr& __x, const typename _Expr::value_type& __y) {
2980 0b57cec5SDimitry Andric  typedef typename _Expr::value_type value_type;
2981 0b57cec5SDimitry Andric  typedef _BinaryOp<logical_or<value_type>, _Expr, __scalar_expr<value_type> > _Op;
2982 cb14a3feSDimitry Andric  return __val_expr<_Op>(_Op(logical_or<value_type>(), __x, __scalar_expr<value_type>(__y, __x.size())));
2983 0b57cec5SDimitry Andric}
2984 0b57cec5SDimitry Andric
2985 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
2986 5f757f3fSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI
2987 cb14a3feSDimitry Andric__val_expr<_BinaryOp<logical_or<typename _Expr::value_type>, __scalar_expr<typename _Expr::value_type>, _Expr> >
2988 cb14a3feSDimitry Andricoperator||(const typename _Expr::value_type& __x, const _Expr& __y) {
2989 0b57cec5SDimitry Andric  typedef typename _Expr::value_type value_type;
2990 0b57cec5SDimitry Andric  typedef _BinaryOp<logical_or<value_type>, __scalar_expr<value_type>, _Expr> _Op;
2991 cb14a3feSDimitry Andric  return __val_expr<_Op>(_Op(logical_or<value_type>(), __scalar_expr<value_type>(__x, __y.size()), __y));
2992 0b57cec5SDimitry Andric}
2993 0b57cec5SDimitry Andric
2994 cb14a3feSDimitry Andrictemplate <class _Expr1,
2995 cb14a3feSDimitry Andric          class _Expr2,
2996 cb14a3feSDimitry Andric          __enable_if_t<__is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, int> = 0>
2997 cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI __val_expr<_BinaryOp<equal_to<typename _Expr1::value_type>, _Expr1, _Expr2> >
2998 cb14a3feSDimitry Andricoperator==(const _Expr1& __x, const _Expr2& __y) {
2999 0b57cec5SDimitry Andric  typedef typename _Expr1::value_type value_type;
3000 0b57cec5SDimitry Andric  typedef _BinaryOp<equal_to<value_type>, _Expr1, _Expr2> _Op;
3001 0b57cec5SDimitry Andric  return __val_expr<_Op>(_Op(equal_to<value_type>(), __x, __y));
3002 0b57cec5SDimitry Andric}
3003 0b57cec5SDimitry Andric
3004 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
3005 5f757f3fSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI
3006 cb14a3feSDimitry Andric__val_expr<_BinaryOp<equal_to<typename _Expr::value_type>, _Expr, __scalar_expr<typename _Expr::value_type> > >
3007 cb14a3feSDimitry Andricoperator==(const _Expr& __x, const typename _Expr::value_type& __y) {
3008 0b57cec5SDimitry Andric  typedef typename _Expr::value_type value_type;
3009 0b57cec5SDimitry Andric  typedef _BinaryOp<equal_to<value_type>, _Expr, __scalar_expr<value_type> > _Op;
3010 cb14a3feSDimitry Andric  return __val_expr<_Op>(_Op(equal_to<value_type>(), __x, __scalar_expr<value_type>(__y, __x.size())));
3011 0b57cec5SDimitry Andric}
3012 0b57cec5SDimitry Andric
3013 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
3014 5f757f3fSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI
3015 cb14a3feSDimitry Andric__val_expr<_BinaryOp<equal_to<typename _Expr::value_type>, __scalar_expr<typename _Expr::value_type>, _Expr> >
3016 cb14a3feSDimitry Andricoperator==(const typename _Expr::value_type& __x, const _Expr& __y) {
3017 0b57cec5SDimitry Andric  typedef typename _Expr::value_type value_type;
3018 0b57cec5SDimitry Andric  typedef _BinaryOp<equal_to<value_type>, __scalar_expr<value_type>, _Expr> _Op;
3019 cb14a3feSDimitry Andric  return __val_expr<_Op>(_Op(equal_to<value_type>(), __scalar_expr<value_type>(__x, __y.size()), __y));
3020 0b57cec5SDimitry Andric}
3021 0b57cec5SDimitry Andric
3022 cb14a3feSDimitry Andrictemplate <class _Expr1,
3023 cb14a3feSDimitry Andric          class _Expr2,
3024 cb14a3feSDimitry Andric          __enable_if_t<__is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, int> = 0>
3025 cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI __val_expr<_BinaryOp<not_equal_to<typename _Expr1::value_type>, _Expr1, _Expr2> >
3026 cb14a3feSDimitry Andricoperator!=(const _Expr1& __x, const _Expr2& __y) {
3027 0b57cec5SDimitry Andric  typedef typename _Expr1::value_type value_type;
3028 0b57cec5SDimitry Andric  typedef _BinaryOp<not_equal_to<value_type>, _Expr1, _Expr2> _Op;
3029 0b57cec5SDimitry Andric  return __val_expr<_Op>(_Op(not_equal_to<value_type>(), __x, __y));
3030 0b57cec5SDimitry Andric}
3031 0b57cec5SDimitry Andric
3032 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
3033 5f757f3fSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI
3034 cb14a3feSDimitry Andric__val_expr<_BinaryOp<not_equal_to<typename _Expr::value_type>, _Expr, __scalar_expr<typename _Expr::value_type> > >
3035 cb14a3feSDimitry Andricoperator!=(const _Expr& __x, const typename _Expr::value_type& __y) {
3036 0b57cec5SDimitry Andric  typedef typename _Expr::value_type value_type;
3037 0b57cec5SDimitry Andric  typedef _BinaryOp<not_equal_to<value_type>, _Expr, __scalar_expr<value_type> > _Op;
3038 cb14a3feSDimitry Andric  return __val_expr<_Op>(_Op(not_equal_to<value_type>(), __x, __scalar_expr<value_type>(__y, __x.size())));
3039 0b57cec5SDimitry Andric}
3040 0b57cec5SDimitry Andric
3041 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
3042 5f757f3fSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI
3043 cb14a3feSDimitry Andric__val_expr<_BinaryOp<not_equal_to<typename _Expr::value_type>, __scalar_expr<typename _Expr::value_type>, _Expr> >
3044 cb14a3feSDimitry Andricoperator!=(const typename _Expr::value_type& __x, const _Expr& __y) {
3045 0b57cec5SDimitry Andric  typedef typename _Expr::value_type value_type;
3046 0b57cec5SDimitry Andric  typedef _BinaryOp<not_equal_to<value_type>, __scalar_expr<value_type>, _Expr> _Op;
3047 cb14a3feSDimitry Andric  return __val_expr<_Op>(_Op(not_equal_to<value_type>(), __scalar_expr<value_type>(__x, __y.size()), __y));
3048 0b57cec5SDimitry Andric}
3049 0b57cec5SDimitry Andric
3050 cb14a3feSDimitry Andrictemplate <class _Expr1,
3051 cb14a3feSDimitry Andric          class _Expr2,
3052 cb14a3feSDimitry Andric          __enable_if_t<__is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, int> = 0>
3053 cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI __val_expr<_BinaryOp<less<typename _Expr1::value_type>, _Expr1, _Expr2> >
3054 cb14a3feSDimitry Andricoperator<(const _Expr1& __x, const _Expr2& __y) {
3055 0b57cec5SDimitry Andric  typedef typename _Expr1::value_type value_type;
3056 0b57cec5SDimitry Andric  typedef _BinaryOp<less<value_type>, _Expr1, _Expr2> _Op;
3057 0b57cec5SDimitry Andric  return __val_expr<_Op>(_Op(less<value_type>(), __x, __y));
3058 0b57cec5SDimitry Andric}
3059 0b57cec5SDimitry Andric
3060 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
3061 5f757f3fSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI
3062 cb14a3feSDimitry Andric__val_expr<_BinaryOp<less<typename _Expr::value_type>, _Expr, __scalar_expr<typename _Expr::value_type> > >
3063 cb14a3feSDimitry Andricoperator<(const _Expr& __x, const typename _Expr::value_type& __y) {
3064 0b57cec5SDimitry Andric  typedef typename _Expr::value_type value_type;
3065 0b57cec5SDimitry Andric  typedef _BinaryOp<less<value_type>, _Expr, __scalar_expr<value_type> > _Op;
3066 cb14a3feSDimitry Andric  return __val_expr<_Op>(_Op(less<value_type>(), __x, __scalar_expr<value_type>(__y, __x.size())));
3067 0b57cec5SDimitry Andric}
3068 0b57cec5SDimitry Andric
3069 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
3070 5f757f3fSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI
3071 cb14a3feSDimitry Andric__val_expr<_BinaryOp<less<typename _Expr::value_type>, __scalar_expr<typename _Expr::value_type>, _Expr> >
3072 cb14a3feSDimitry Andricoperator<(const typename _Expr::value_type& __x, const _Expr& __y) {
3073 0b57cec5SDimitry Andric  typedef typename _Expr::value_type value_type;
3074 0b57cec5SDimitry Andric  typedef _BinaryOp<less<value_type>, __scalar_expr<value_type>, _Expr> _Op;
3075 cb14a3feSDimitry Andric  return __val_expr<_Op>(_Op(less<value_type>(), __scalar_expr<value_type>(__x, __y.size()), __y));
3076 0b57cec5SDimitry Andric}
3077 0b57cec5SDimitry Andric
3078 cb14a3feSDimitry Andrictemplate <class _Expr1,
3079 cb14a3feSDimitry Andric          class _Expr2,
3080 cb14a3feSDimitry Andric          __enable_if_t<__is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, int> = 0>
3081 cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI __val_expr<_BinaryOp<greater<typename _Expr1::value_type>, _Expr1, _Expr2> >
3082 cb14a3feSDimitry Andricoperator>(const _Expr1& __x, const _Expr2& __y) {
3083 0b57cec5SDimitry Andric  typedef typename _Expr1::value_type value_type;
3084 0b57cec5SDimitry Andric  typedef _BinaryOp<greater<value_type>, _Expr1, _Expr2> _Op;
3085 0b57cec5SDimitry Andric  return __val_expr<_Op>(_Op(greater<value_type>(), __x, __y));
3086 0b57cec5SDimitry Andric}
3087 0b57cec5SDimitry Andric
3088 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
3089 5f757f3fSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI
3090 cb14a3feSDimitry Andric__val_expr<_BinaryOp<greater<typename _Expr::value_type>, _Expr, __scalar_expr<typename _Expr::value_type> > >
3091 cb14a3feSDimitry Andricoperator>(const _Expr& __x, const typename _Expr::value_type& __y) {
3092 0b57cec5SDimitry Andric  typedef typename _Expr::value_type value_type;
3093 0b57cec5SDimitry Andric  typedef _BinaryOp<greater<value_type>, _Expr, __scalar_expr<value_type> > _Op;
3094 cb14a3feSDimitry Andric  return __val_expr<_Op>(_Op(greater<value_type>(), __x, __scalar_expr<value_type>(__y, __x.size())));
3095 0b57cec5SDimitry Andric}
3096 0b57cec5SDimitry Andric
3097 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
3098 5f757f3fSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI
3099 cb14a3feSDimitry Andric__val_expr<_BinaryOp<greater<typename _Expr::value_type>, __scalar_expr<typename _Expr::value_type>, _Expr> >
3100 cb14a3feSDimitry Andricoperator>(const typename _Expr::value_type& __x, const _Expr& __y) {
3101 0b57cec5SDimitry Andric  typedef typename _Expr::value_type value_type;
3102 0b57cec5SDimitry Andric  typedef _BinaryOp<greater<value_type>, __scalar_expr<value_type>, _Expr> _Op;
3103 cb14a3feSDimitry Andric  return __val_expr<_Op>(_Op(greater<value_type>(), __scalar_expr<value_type>(__x, __y.size()), __y));
3104 0b57cec5SDimitry Andric}
3105 0b57cec5SDimitry Andric
3106 cb14a3feSDimitry Andrictemplate <class _Expr1,
3107 cb14a3feSDimitry Andric          class _Expr2,
3108 cb14a3feSDimitry Andric          __enable_if_t<__is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, int> = 0>
3109 cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI __val_expr<_BinaryOp<less_equal<typename _Expr1::value_type>, _Expr1, _Expr2> >
3110 cb14a3feSDimitry Andricoperator<=(const _Expr1& __x, const _Expr2& __y) {
3111 0b57cec5SDimitry Andric  typedef typename _Expr1::value_type value_type;
3112 0b57cec5SDimitry Andric  typedef _BinaryOp<less_equal<value_type>, _Expr1, _Expr2> _Op;
3113 0b57cec5SDimitry Andric  return __val_expr<_Op>(_Op(less_equal<value_type>(), __x, __y));
3114 0b57cec5SDimitry Andric}
3115 0b57cec5SDimitry Andric
3116 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
3117 5f757f3fSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI
3118 cb14a3feSDimitry Andric__val_expr<_BinaryOp<less_equal<typename _Expr::value_type>, _Expr, __scalar_expr<typename _Expr::value_type> > >
3119 cb14a3feSDimitry Andricoperator<=(const _Expr& __x, const typename _Expr::value_type& __y) {
3120 0b57cec5SDimitry Andric  typedef typename _Expr::value_type value_type;
3121 0b57cec5SDimitry Andric  typedef _BinaryOp<less_equal<value_type>, _Expr, __scalar_expr<value_type> > _Op;
3122 cb14a3feSDimitry Andric  return __val_expr<_Op>(_Op(less_equal<value_type>(), __x, __scalar_expr<value_type>(__y, __x.size())));
3123 0b57cec5SDimitry Andric}
3124 0b57cec5SDimitry Andric
3125 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
3126 5f757f3fSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI
3127 cb14a3feSDimitry Andric__val_expr<_BinaryOp<less_equal<typename _Expr::value_type>, __scalar_expr<typename _Expr::value_type>, _Expr> >
3128 cb14a3feSDimitry Andricoperator<=(const typename _Expr::value_type& __x, const _Expr& __y) {
3129 0b57cec5SDimitry Andric  typedef typename _Expr::value_type value_type;
3130 0b57cec5SDimitry Andric  typedef _BinaryOp<less_equal<value_type>, __scalar_expr<value_type>, _Expr> _Op;
3131 cb14a3feSDimitry Andric  return __val_expr<_Op>(_Op(less_equal<value_type>(), __scalar_expr<value_type>(__x, __y.size()), __y));
3132 0b57cec5SDimitry Andric}
3133 0b57cec5SDimitry Andric
3134 cb14a3feSDimitry Andrictemplate <class _Expr1,
3135 cb14a3feSDimitry Andric          class _Expr2,
3136 cb14a3feSDimitry Andric          __enable_if_t<__is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, int> = 0>
3137 cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI __val_expr<_BinaryOp<greater_equal<typename _Expr1::value_type>, _Expr1, _Expr2> >
3138 cb14a3feSDimitry Andricoperator>=(const _Expr1& __x, const _Expr2& __y) {
3139 0b57cec5SDimitry Andric  typedef typename _Expr1::value_type value_type;
3140 0b57cec5SDimitry Andric  typedef _BinaryOp<greater_equal<value_type>, _Expr1, _Expr2> _Op;
3141 0b57cec5SDimitry Andric  return __val_expr<_Op>(_Op(greater_equal<value_type>(), __x, __y));
3142 0b57cec5SDimitry Andric}
3143 0b57cec5SDimitry Andric
3144 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
3145 5f757f3fSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI
3146 cb14a3feSDimitry Andric__val_expr<_BinaryOp<greater_equal<typename _Expr::value_type>, _Expr, __scalar_expr<typename _Expr::value_type> > >
3147 cb14a3feSDimitry Andricoperator>=(const _Expr& __x, const typename _Expr::value_type& __y) {
3148 0b57cec5SDimitry Andric  typedef typename _Expr::value_type value_type;
3149 0b57cec5SDimitry Andric  typedef _BinaryOp<greater_equal<value_type>, _Expr, __scalar_expr<value_type> > _Op;
3150 cb14a3feSDimitry Andric  return __val_expr<_Op>(_Op(greater_equal<value_type>(), __x, __scalar_expr<value_type>(__y, __x.size())));
3151 0b57cec5SDimitry Andric}
3152 0b57cec5SDimitry Andric
3153 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
3154 5f757f3fSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI
3155 cb14a3feSDimitry Andric__val_expr<_BinaryOp<greater_equal<typename _Expr::value_type>, __scalar_expr<typename _Expr::value_type>, _Expr> >
3156 cb14a3feSDimitry Andricoperator>=(const typename _Expr::value_type& __x, const _Expr& __y) {
3157 0b57cec5SDimitry Andric  typedef typename _Expr::value_type value_type;
3158 0b57cec5SDimitry Andric  typedef _BinaryOp<greater_equal<value_type>, __scalar_expr<value_type>, _Expr> _Op;
3159 cb14a3feSDimitry Andric  return __val_expr<_Op>(_Op(greater_equal<value_type>(), __scalar_expr<value_type>(__x, __y.size()), __y));
3160 0b57cec5SDimitry Andric}
3161 0b57cec5SDimitry Andric
3162 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
3163 cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI __val_expr<_UnaryOp<__abs_expr<typename _Expr::value_type>, _Expr> >
3164 cb14a3feSDimitry Andricabs(const _Expr& __x) {
3165 0b57cec5SDimitry Andric  typedef typename _Expr::value_type value_type;
3166 0b57cec5SDimitry Andric  typedef _UnaryOp<__abs_expr<value_type>, _Expr> _Op;
3167 0b57cec5SDimitry Andric  return __val_expr<_Op>(_Op(__abs_expr<value_type>(), __x));
3168 0b57cec5SDimitry Andric}
3169 0b57cec5SDimitry Andric
3170 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
3171 cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI __val_expr<_UnaryOp<__acos_expr<typename _Expr::value_type>, _Expr> >
3172 cb14a3feSDimitry Andricacos(const _Expr& __x) {
3173 0b57cec5SDimitry Andric  typedef typename _Expr::value_type value_type;
3174 0b57cec5SDimitry Andric  typedef _UnaryOp<__acos_expr<value_type>, _Expr> _Op;
3175 0b57cec5SDimitry Andric  return __val_expr<_Op>(_Op(__acos_expr<value_type>(), __x));
3176 0b57cec5SDimitry Andric}
3177 0b57cec5SDimitry Andric
3178 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
3179 cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI __val_expr<_UnaryOp<__asin_expr<typename _Expr::value_type>, _Expr> >
3180 cb14a3feSDimitry Andricasin(const _Expr& __x) {
3181 0b57cec5SDimitry Andric  typedef typename _Expr::value_type value_type;
3182 0b57cec5SDimitry Andric  typedef _UnaryOp<__asin_expr<value_type>, _Expr> _Op;
3183 0b57cec5SDimitry Andric  return __val_expr<_Op>(_Op(__asin_expr<value_type>(), __x));
3184 0b57cec5SDimitry Andric}
3185 0b57cec5SDimitry Andric
3186 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
3187 cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI __val_expr<_UnaryOp<__atan_expr<typename _Expr::value_type>, _Expr> >
3188 cb14a3feSDimitry Andricatan(const _Expr& __x) {
3189 0b57cec5SDimitry Andric  typedef typename _Expr::value_type value_type;
3190 0b57cec5SDimitry Andric  typedef _UnaryOp<__atan_expr<value_type>, _Expr> _Op;
3191 0b57cec5SDimitry Andric  return __val_expr<_Op>(_Op(__atan_expr<value_type>(), __x));
3192 0b57cec5SDimitry Andric}
3193 0b57cec5SDimitry Andric
3194 cb14a3feSDimitry Andrictemplate <class _Expr1,
3195 cb14a3feSDimitry Andric          class _Expr2,
3196 cb14a3feSDimitry Andric          __enable_if_t<__is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, int> = 0>
3197 cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI __val_expr<_BinaryOp<__atan2_expr<typename _Expr1::value_type>, _Expr1, _Expr2> >
3198 cb14a3feSDimitry Andricatan2(const _Expr1& __x, const _Expr2& __y) {
3199 0b57cec5SDimitry Andric  typedef typename _Expr1::value_type value_type;
3200 0b57cec5SDimitry Andric  typedef _BinaryOp<__atan2_expr<value_type>, _Expr1, _Expr2> _Op;
3201 0b57cec5SDimitry Andric  return __val_expr<_Op>(_Op(__atan2_expr<value_type>(), __x, __y));
3202 0b57cec5SDimitry Andric}
3203 0b57cec5SDimitry Andric
3204 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
3205 5f757f3fSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI
3206 cb14a3feSDimitry Andric__val_expr<_BinaryOp<__atan2_expr<typename _Expr::value_type>, _Expr, __scalar_expr<typename _Expr::value_type> > >
3207 cb14a3feSDimitry Andricatan2(const _Expr& __x, const typename _Expr::value_type& __y) {
3208 0b57cec5SDimitry Andric  typedef typename _Expr::value_type value_type;
3209 0b57cec5SDimitry Andric  typedef _BinaryOp<__atan2_expr<value_type>, _Expr, __scalar_expr<value_type> > _Op;
3210 cb14a3feSDimitry Andric  return __val_expr<_Op>(_Op(__atan2_expr<value_type>(), __x, __scalar_expr<value_type>(__y, __x.size())));
3211 0b57cec5SDimitry Andric}
3212 0b57cec5SDimitry Andric
3213 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
3214 5f757f3fSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI
3215 cb14a3feSDimitry Andric__val_expr<_BinaryOp<__atan2_expr<typename _Expr::value_type>, __scalar_expr<typename _Expr::value_type>, _Expr> >
3216 cb14a3feSDimitry Andricatan2(const typename _Expr::value_type& __x, const _Expr& __y) {
3217 0b57cec5SDimitry Andric  typedef typename _Expr::value_type value_type;
3218 0b57cec5SDimitry Andric  typedef _BinaryOp<__atan2_expr<value_type>, __scalar_expr<value_type>, _Expr> _Op;
3219 cb14a3feSDimitry Andric  return __val_expr<_Op>(_Op(__atan2_expr<value_type>(), __scalar_expr<value_type>(__x, __y.size()), __y));
3220 0b57cec5SDimitry Andric}
3221 0b57cec5SDimitry Andric
3222 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
3223 cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI __val_expr<_UnaryOp<__cos_expr<typename _Expr::value_type>, _Expr> >
3224 cb14a3feSDimitry Andriccos(const _Expr& __x) {
3225 0b57cec5SDimitry Andric  typedef typename _Expr::value_type value_type;
3226 0b57cec5SDimitry Andric  typedef _UnaryOp<__cos_expr<value_type>, _Expr> _Op;
3227 0b57cec5SDimitry Andric  return __val_expr<_Op>(_Op(__cos_expr<value_type>(), __x));
3228 0b57cec5SDimitry Andric}
3229 0b57cec5SDimitry Andric
3230 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
3231 cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI __val_expr<_UnaryOp<__cosh_expr<typename _Expr::value_type>, _Expr> >
3232 cb14a3feSDimitry Andriccosh(const _Expr& __x) {
3233 0b57cec5SDimitry Andric  typedef typename _Expr::value_type value_type;
3234 0b57cec5SDimitry Andric  typedef _UnaryOp<__cosh_expr<value_type>, _Expr> _Op;
3235 0b57cec5SDimitry Andric  return __val_expr<_Op>(_Op(__cosh_expr<value_type>(), __x));
3236 0b57cec5SDimitry Andric}
3237 0b57cec5SDimitry Andric
3238 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
3239 cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI __val_expr<_UnaryOp<__exp_expr<typename _Expr::value_type>, _Expr> >
3240 cb14a3feSDimitry Andricexp(const _Expr& __x) {
3241 0b57cec5SDimitry Andric  typedef typename _Expr::value_type value_type;
3242 0b57cec5SDimitry Andric  typedef _UnaryOp<__exp_expr<value_type>, _Expr> _Op;
3243 0b57cec5SDimitry Andric  return __val_expr<_Op>(_Op(__exp_expr<value_type>(), __x));
3244 0b57cec5SDimitry Andric}
3245 0b57cec5SDimitry Andric
3246 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
3247 cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI __val_expr<_UnaryOp<__log_expr<typename _Expr::value_type>, _Expr> >
3248 cb14a3feSDimitry Andriclog(const _Expr& __x) {
3249 0b57cec5SDimitry Andric  typedef typename _Expr::value_type value_type;
3250 0b57cec5SDimitry Andric  typedef _UnaryOp<__log_expr<value_type>, _Expr> _Op;
3251 0b57cec5SDimitry Andric  return __val_expr<_Op>(_Op(__log_expr<value_type>(), __x));
3252 0b57cec5SDimitry Andric}
3253 0b57cec5SDimitry Andric
3254 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
3255 cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI __val_expr<_UnaryOp<__log10_expr<typename _Expr::value_type>, _Expr> >
3256 cb14a3feSDimitry Andriclog10(const _Expr& __x) {
3257 0b57cec5SDimitry Andric  typedef typename _Expr::value_type value_type;
3258 0b57cec5SDimitry Andric  typedef _UnaryOp<__log10_expr<value_type>, _Expr> _Op;
3259 0b57cec5SDimitry Andric  return __val_expr<_Op>(_Op(__log10_expr<value_type>(), __x));
3260 0b57cec5SDimitry Andric}
3261 0b57cec5SDimitry Andric
3262 cb14a3feSDimitry Andrictemplate <class _Expr1,
3263 cb14a3feSDimitry Andric          class _Expr2,
3264 cb14a3feSDimitry Andric          __enable_if_t<__is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, int> = 0>
3265 cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI __val_expr<_BinaryOp<__pow_expr<typename _Expr1::value_type>, _Expr1, _Expr2> >
3266 cb14a3feSDimitry Andricpow(const _Expr1& __x, const _Expr2& __y) {
3267 0b57cec5SDimitry Andric  typedef typename _Expr1::value_type value_type;
3268 0b57cec5SDimitry Andric  typedef _BinaryOp<__pow_expr<value_type>, _Expr1, _Expr2> _Op;
3269 0b57cec5SDimitry Andric  return __val_expr<_Op>(_Op(__pow_expr<value_type>(), __x, __y));
3270 0b57cec5SDimitry Andric}
3271 0b57cec5SDimitry Andric
3272 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
3273 5f757f3fSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI
3274 cb14a3feSDimitry Andric__val_expr<_BinaryOp<__pow_expr<typename _Expr::value_type>, _Expr, __scalar_expr<typename _Expr::value_type> > >
3275 cb14a3feSDimitry Andricpow(const _Expr& __x, const typename _Expr::value_type& __y) {
3276 0b57cec5SDimitry Andric  typedef typename _Expr::value_type value_type;
3277 0b57cec5SDimitry Andric  typedef _BinaryOp<__pow_expr<value_type>, _Expr, __scalar_expr<value_type> > _Op;
3278 cb14a3feSDimitry Andric  return __val_expr<_Op>(_Op(__pow_expr<value_type>(), __x, __scalar_expr<value_type>(__y, __x.size())));
3279 0b57cec5SDimitry Andric}
3280 0b57cec5SDimitry Andric
3281 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
3282 5f757f3fSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI
3283 cb14a3feSDimitry Andric__val_expr<_BinaryOp<__pow_expr<typename _Expr::value_type>, __scalar_expr<typename _Expr::value_type>, _Expr> >
3284 cb14a3feSDimitry Andricpow(const typename _Expr::value_type& __x, const _Expr& __y) {
3285 0b57cec5SDimitry Andric  typedef typename _Expr::value_type value_type;
3286 0b57cec5SDimitry Andric  typedef _BinaryOp<__pow_expr<value_type>, __scalar_expr<value_type>, _Expr> _Op;
3287 cb14a3feSDimitry Andric  return __val_expr<_Op>(_Op(__pow_expr<value_type>(), __scalar_expr<value_type>(__x, __y.size()), __y));
3288 0b57cec5SDimitry Andric}
3289 0b57cec5SDimitry Andric
3290 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
3291 cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI __val_expr<_UnaryOp<__sin_expr<typename _Expr::value_type>, _Expr> >
3292 cb14a3feSDimitry Andricsin(const _Expr& __x) {
3293 0b57cec5SDimitry Andric  typedef typename _Expr::value_type value_type;
3294 0b57cec5SDimitry Andric  typedef _UnaryOp<__sin_expr<value_type>, _Expr> _Op;
3295 0b57cec5SDimitry Andric  return __val_expr<_Op>(_Op(__sin_expr<value_type>(), __x));
3296 0b57cec5SDimitry Andric}
3297 0b57cec5SDimitry Andric
3298 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
3299 cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI __val_expr<_UnaryOp<__sinh_expr<typename _Expr::value_type>, _Expr> >
3300 cb14a3feSDimitry Andricsinh(const _Expr& __x) {
3301 0b57cec5SDimitry Andric  typedef typename _Expr::value_type value_type;
3302 0b57cec5SDimitry Andric  typedef _UnaryOp<__sinh_expr<value_type>, _Expr> _Op;
3303 0b57cec5SDimitry Andric  return __val_expr<_Op>(_Op(__sinh_expr<value_type>(), __x));
3304 0b57cec5SDimitry Andric}
3305 0b57cec5SDimitry Andric
3306 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
3307 cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI __val_expr<_UnaryOp<__sqrt_expr<typename _Expr::value_type>, _Expr> >
3308 cb14a3feSDimitry Andricsqrt(const _Expr& __x) {
3309 0b57cec5SDimitry Andric  typedef typename _Expr::value_type value_type;
3310 0b57cec5SDimitry Andric  typedef _UnaryOp<__sqrt_expr<value_type>, _Expr> _Op;
3311 0b57cec5SDimitry Andric  return __val_expr<_Op>(_Op(__sqrt_expr<value_type>(), __x));
3312 0b57cec5SDimitry Andric}
3313 0b57cec5SDimitry Andric
3314 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
3315 cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI __val_expr<_UnaryOp<__tan_expr<typename _Expr::value_type>, _Expr> >
3316 cb14a3feSDimitry Andrictan(const _Expr& __x) {
3317 0b57cec5SDimitry Andric  typedef typename _Expr::value_type value_type;
3318 0b57cec5SDimitry Andric  typedef _UnaryOp<__tan_expr<value_type>, _Expr> _Op;
3319 0b57cec5SDimitry Andric  return __val_expr<_Op>(_Op(__tan_expr<value_type>(), __x));
3320 0b57cec5SDimitry Andric}
3321 0b57cec5SDimitry Andric
3322 5f757f3fSDimitry Andrictemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
3323 cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI __val_expr<_UnaryOp<__tanh_expr<typename _Expr::value_type>, _Expr> >
3324 cb14a3feSDimitry Andrictanh(const _Expr& __x) {
3325 0b57cec5SDimitry Andric  typedef typename _Expr::value_type value_type;
3326 0b57cec5SDimitry Andric  typedef _UnaryOp<__tanh_expr<value_type>, _Expr> _Op;
3327 0b57cec5SDimitry Andric  return __val_expr<_Op>(_Op(__tanh_expr<value_type>(), __x));
3328 0b57cec5SDimitry Andric}
3329 0b57cec5SDimitry Andric
3330 0b57cec5SDimitry Andrictemplate <class _Tp>
3331 cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI _Tp* begin(valarray<_Tp>& __v) {
3332 0b57cec5SDimitry Andric  return __v.__begin_;
3333 0b57cec5SDimitry Andric}
3334 0b57cec5SDimitry Andric
3335 0b57cec5SDimitry Andrictemplate <class _Tp>
3336 cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI const _Tp* begin(const valarray<_Tp>& __v) {
3337 0b57cec5SDimitry Andric  return __v.__begin_;
3338 0b57cec5SDimitry Andric}
3339 0b57cec5SDimitry Andric
3340 0b57cec5SDimitry Andrictemplate <class _Tp>
3341 cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI _Tp* end(valarray<_Tp>& __v) {
3342 0b57cec5SDimitry Andric  return __v.__end_;
3343 0b57cec5SDimitry Andric}
3344 0b57cec5SDimitry Andric
3345 0b57cec5SDimitry Andrictemplate <class _Tp>
3346 cb14a3feSDimitry Andricinline _LIBCPP_HIDE_FROM_ABI const _Tp* end(const valarray<_Tp>& __v) {
3347 0b57cec5SDimitry Andric  return __v.__end_;
3348 0b57cec5SDimitry Andric}
3349 0b57cec5SDimitry Andric
3350 0b57cec5SDimitry Andric_LIBCPP_END_NAMESPACE_STD
3351 0b57cec5SDimitry Andric
3352 0b57cec5SDimitry Andric_LIBCPP_POP_MACROS
3353 0b57cec5SDimitry Andric
3354 bdd1243dSDimitry Andric#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
3355 bdd1243dSDimitry Andric#  include <algorithm>
3356 bdd1243dSDimitry Andric#  include <concepts>
3357 06c3fb27SDimitry Andric#  include <cstdlib>
3358 bdd1243dSDimitry Andric#  include <cstring>
3359 bdd1243dSDimitry Andric#  include <functional>
3360 06c3fb27SDimitry Andric#  include <stdexcept>
3361 06c3fb27SDimitry Andric#  include <type_traits>
3362 bdd1243dSDimitry Andric#endif
3363 bdd1243dSDimitry Andric
3364 0b57cec5SDimitry Andric#endif // _LIBCPP_VALARRAY
3365