blob: 6c33d0531cb8855ed36613d17212c39ae783cbef [file] [log] [blame]
Howard Hinnantc51e1022010-05-11 19:42:16 +00001// -*- C++ -*-
Louis Dionne9bd93882021-11-17 16:25:01 -05002//===----------------------------------------------------------------------===//
Howard Hinnantc51e1022010-05-11 19:42:16 +00003//
Chandler Carruthd2012102019-01-19 10:56:40 +00004// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5// See https://llvm.org/LICENSE.txt for license information.
6// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
Howard Hinnantc51e1022010-05-11 19:42:16 +00007//
8//===----------------------------------------------------------------------===//
9
10#ifndef _LIBCPP_VALARRAY
11#define _LIBCPP_VALARRAY
12
13/*
14 valarray synopsis
15
16namespace std
17{
18
19template<class T>
20class valarray
21{
22public:
23 typedef T value_type;
24
25 // construct/destroy:
26 valarray();
27 explicit valarray(size_t n);
28 valarray(const value_type& x, size_t n);
29 valarray(const value_type* px, size_t n);
30 valarray(const valarray& v);
Howard Hinnant298aed92012-07-21 00:51:28 +000031 valarray(valarray&& v) noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +000032 valarray(const slice_array<value_type>& sa);
33 valarray(const gslice_array<value_type>& ga);
34 valarray(const mask_array<value_type>& ma);
35 valarray(const indirect_array<value_type>& ia);
36 valarray(initializer_list<value_type> il);
37 ~valarray();
38
39 // assignment:
40 valarray& operator=(const valarray& v);
Howard Hinnant298aed92012-07-21 00:51:28 +000041 valarray& operator=(valarray&& v) noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +000042 valarray& operator=(initializer_list<value_type> il);
43 valarray& operator=(const value_type& x);
44 valarray& operator=(const slice_array<value_type>& sa);
45 valarray& operator=(const gslice_array<value_type>& ga);
46 valarray& operator=(const mask_array<value_type>& ma);
47 valarray& operator=(const indirect_array<value_type>& ia);
48
49 // element access:
50 const value_type& operator[](size_t i) const;
51 value_type& operator[](size_t i);
52
53 // subset operations:
54 valarray operator[](slice s) const;
55 slice_array<value_type> operator[](slice s);
56 valarray operator[](const gslice& gs) const;
57 gslice_array<value_type> operator[](const gslice& gs);
58 valarray operator[](const valarray<bool>& vb) const;
59 mask_array<value_type> operator[](const valarray<bool>& vb);
60 valarray operator[](const valarray<size_t>& vs) const;
61 indirect_array<value_type> operator[](const valarray<size_t>& vs);
62
63 // unary operators:
64 valarray operator+() const;
65 valarray operator-() const;
66 valarray operator~() const;
67 valarray<bool> operator!() const;
68
69 // computed assignment:
70 valarray& operator*= (const value_type& x);
71 valarray& operator/= (const value_type& x);
72 valarray& operator%= (const value_type& x);
73 valarray& operator+= (const value_type& x);
74 valarray& operator-= (const value_type& x);
75 valarray& operator^= (const value_type& x);
76 valarray& operator&= (const value_type& x);
77 valarray& operator|= (const value_type& x);
78 valarray& operator<<=(const value_type& x);
79 valarray& operator>>=(const value_type& x);
80
81 valarray& operator*= (const valarray& v);
82 valarray& operator/= (const valarray& v);
83 valarray& operator%= (const valarray& v);
84 valarray& operator+= (const valarray& v);
85 valarray& operator-= (const valarray& v);
86 valarray& operator^= (const valarray& v);
87 valarray& operator|= (const valarray& v);
88 valarray& operator&= (const valarray& v);
89 valarray& operator<<=(const valarray& v);
90 valarray& operator>>=(const valarray& v);
91
92 // member functions:
Howard Hinnant298aed92012-07-21 00:51:28 +000093 void swap(valarray& v) noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +000094
95 size_t size() const;
96
97 value_type sum() const;
98 value_type min() const;
99 value_type max() const;
100
101 valarray shift (int i) const;
102 valarray cshift(int i) const;
103 valarray apply(value_type f(value_type)) const;
104 valarray apply(value_type f(const value_type&)) const;
105 void resize(size_t n, value_type x = value_type());
106};
107
Konstantin Varlamovebb31192021-10-28 00:36:19 -0700108template<class T, size_t cnt> valarray(const T(&)[cnt], size_t) -> valarray<T>;
109
Howard Hinnantc51e1022010-05-11 19:42:16 +0000110class slice
111{
112public:
113 slice();
114 slice(size_t start, size_t size, size_t stride);
115
116 size_t start() const;
117 size_t size() const;
118 size_t stride() const;
119};
120
121template <class T>
122class slice_array
123{
124public:
125 typedef T value_type;
126
127 const slice_array& operator=(const slice_array& sa) const;
128 void operator= (const valarray<value_type>& v) const;
129 void operator*= (const valarray<value_type>& v) const;
130 void operator/= (const valarray<value_type>& v) const;
131 void operator%= (const valarray<value_type>& v) const;
132 void operator+= (const valarray<value_type>& v) const;
133 void operator-= (const valarray<value_type>& v) const;
134 void operator^= (const valarray<value_type>& v) const;
135 void operator&= (const valarray<value_type>& v) const;
136 void operator|= (const valarray<value_type>& v) const;
137 void operator<<=(const valarray<value_type>& v) const;
138 void operator>>=(const valarray<value_type>& v) const;
139
140 void operator=(const value_type& x) const;
zoecarver79fa7502020-12-02 10:49:20 -0800141 void operator=(const valarray<T>& val_arr) const;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000142
143 slice_array() = delete;
144};
145
146class gslice
147{
148public:
149 gslice();
150 gslice(size_t start, const valarray<size_t>& size,
151 const valarray<size_t>& stride);
152
153 size_t start() const;
154 valarray<size_t> size() const;
155 valarray<size_t> stride() const;
156};
157
158template <class T>
159class gslice_array
160{
161public:
162 typedef T value_type;
163
164 void operator= (const valarray<value_type>& v) const;
165 void operator*= (const valarray<value_type>& v) const;
166 void operator/= (const valarray<value_type>& v) const;
167 void operator%= (const valarray<value_type>& v) const;
168 void operator+= (const valarray<value_type>& v) const;
169 void operator-= (const valarray<value_type>& v) const;
170 void operator^= (const valarray<value_type>& v) const;
171 void operator&= (const valarray<value_type>& v) const;
172 void operator|= (const valarray<value_type>& v) const;
173 void operator<<=(const valarray<value_type>& v) const;
174 void operator>>=(const valarray<value_type>& v) const;
175
176 gslice_array(const gslice_array& ga);
177 ~gslice_array();
178 const gslice_array& operator=(const gslice_array& ga) const;
179 void operator=(const value_type& x) const;
180
181 gslice_array() = delete;
182};
183
184template <class T>
185class mask_array
186{
187public:
188 typedef T value_type;
189
190 void operator= (const valarray<value_type>& v) const;
191 void operator*= (const valarray<value_type>& v) const;
192 void operator/= (const valarray<value_type>& v) const;
193 void operator%= (const valarray<value_type>& v) const;
194 void operator+= (const valarray<value_type>& v) const;
195 void operator-= (const valarray<value_type>& v) const;
196 void operator^= (const valarray<value_type>& v) const;
197 void operator&= (const valarray<value_type>& v) const;
198 void operator|= (const valarray<value_type>& v) const;
199 void operator<<=(const valarray<value_type>& v) const;
200 void operator>>=(const valarray<value_type>& v) const;
201
202 mask_array(const mask_array& ma);
203 ~mask_array();
204 const mask_array& operator=(const mask_array& ma) const;
205 void operator=(const value_type& x) const;
206
207 mask_array() = delete;
208};
209
210template <class T>
211class indirect_array
212{
213public:
214 typedef T value_type;
215
216 void operator= (const valarray<value_type>& v) const;
217 void operator*= (const valarray<value_type>& v) const;
218 void operator/= (const valarray<value_type>& v) const;
219 void operator%= (const valarray<value_type>& v) const;
220 void operator+= (const valarray<value_type>& v) const;
221 void operator-= (const valarray<value_type>& v) const;
222 void operator^= (const valarray<value_type>& v) const;
223 void operator&= (const valarray<value_type>& v) const;
224 void operator|= (const valarray<value_type>& v) const;
225 void operator<<=(const valarray<value_type>& v) const;
226 void operator>>=(const valarray<value_type>& v) const;
227
228 indirect_array(const indirect_array& ia);
229 ~indirect_array();
230 const indirect_array& operator=(const indirect_array& ia) const;
231 void operator=(const value_type& x) const;
232
233 indirect_array() = delete;
234};
235
Howard Hinnant298aed92012-07-21 00:51:28 +0000236template<class T> void swap(valarray<T>& x, valarray<T>& y) noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000237
238template<class T> valarray<T> operator* (const valarray<T>& x, const valarray<T>& y);
239template<class T> valarray<T> operator* (const valarray<T>& x, const T& y);
240template<class T> valarray<T> operator* (const T& x, const valarray<T>& y);
241
242template<class T> valarray<T> operator/ (const valarray<T>& x, const valarray<T>& y);
243template<class T> valarray<T> operator/ (const valarray<T>& x, const T& y);
244template<class T> valarray<T> operator/ (const T& x, const valarray<T>& y);
245
246template<class T> valarray<T> operator% (const valarray<T>& x, const valarray<T>& y);
247template<class T> valarray<T> operator% (const valarray<T>& x, const T& y);
248template<class T> valarray<T> operator% (const T& x, const valarray<T>& y);
249
250template<class T> valarray<T> operator+ (const valarray<T>& x, const valarray<T>& y);
251template<class T> valarray<T> operator+ (const valarray<T>& x, const T& y);
252template<class T> valarray<T> operator+ (const T& x, const valarray<T>& y);
253
254template<class T> valarray<T> operator- (const valarray<T>& x, const valarray<T>& y);
255template<class T> valarray<T> operator- (const valarray<T>& x, const T& y);
256template<class T> valarray<T> operator- (const T& x, const valarray<T>& y);
257
258template<class T> valarray<T> operator^ (const valarray<T>& x, const valarray<T>& y);
259template<class T> valarray<T> operator^ (const valarray<T>& x, const T& y);
260template<class T> valarray<T> operator^ (const T& x, const valarray<T>& y);
261
262template<class T> valarray<T> operator& (const valarray<T>& x, const valarray<T>& y);
263template<class T> valarray<T> operator& (const valarray<T>& x, const T& y);
264template<class T> valarray<T> operator& (const T& x, const valarray<T>& y);
265
266template<class T> valarray<T> operator| (const valarray<T>& x, const valarray<T>& y);
267template<class T> valarray<T> operator| (const valarray<T>& x, const T& y);
268template<class T> valarray<T> operator| (const T& x, const valarray<T>& y);
269
270template<class T> valarray<T> operator<<(const valarray<T>& x, const valarray<T>& y);
271template<class T> valarray<T> operator<<(const valarray<T>& x, const T& y);
272template<class T> valarray<T> operator<<(const T& x, const valarray<T>& y);
273
274template<class T> valarray<T> operator>>(const valarray<T>& x, const valarray<T>& y);
275template<class T> valarray<T> operator>>(const valarray<T>& x, const T& y);
276template<class T> valarray<T> operator>>(const T& x, const valarray<T>& y);
277
278template<class T> valarray<bool> operator&&(const valarray<T>& x, const valarray<T>& y);
279template<class T> valarray<bool> operator&&(const valarray<T>& x, const T& y);
280template<class T> valarray<bool> operator&&(const T& x, const valarray<T>& y);
281
282template<class T> valarray<bool> operator||(const valarray<T>& x, const valarray<T>& y);
283template<class T> valarray<bool> operator||(const valarray<T>& x, const T& y);
284template<class T> valarray<bool> operator||(const T& x, const valarray<T>& y);
285
286template<class T> valarray<bool> operator==(const valarray<T>& x, const valarray<T>& y);
287template<class T> valarray<bool> operator==(const valarray<T>& x, const T& y);
288template<class T> valarray<bool> operator==(const T& x, const valarray<T>& y);
289
290template<class T> valarray<bool> operator!=(const valarray<T>& x, const valarray<T>& y);
291template<class T> valarray<bool> operator!=(const valarray<T>& x, const T& y);
292template<class T> valarray<bool> operator!=(const T& x, const valarray<T>& y);
293
294template<class T> valarray<bool> operator< (const valarray<T>& x, const valarray<T>& y);
295template<class T> valarray<bool> operator< (const valarray<T>& x, const T& y);
296template<class T> valarray<bool> operator< (const T& x, const valarray<T>& y);
297
298template<class T> valarray<bool> operator> (const valarray<T>& x, const valarray<T>& y);
299template<class T> valarray<bool> operator> (const valarray<T>& x, const T& y);
300template<class T> valarray<bool> operator> (const T& x, const valarray<T>& y);
301
302template<class T> valarray<bool> operator<=(const valarray<T>& x, const valarray<T>& y);
303template<class T> valarray<bool> operator<=(const valarray<T>& x, const T& y);
304template<class T> valarray<bool> operator<=(const T& x, const valarray<T>& y);
305
306template<class T> valarray<bool> operator>=(const valarray<T>& x, const valarray<T>& y);
307template<class T> valarray<bool> operator>=(const valarray<T>& x, const T& y);
308template<class T> valarray<bool> operator>=(const T& x, const valarray<T>& y);
309
310template<class T> valarray<T> abs (const valarray<T>& x);
311template<class T> valarray<T> acos (const valarray<T>& x);
312template<class T> valarray<T> asin (const valarray<T>& x);
313template<class T> valarray<T> atan (const valarray<T>& x);
314
315template<class T> valarray<T> atan2(const valarray<T>& x, const valarray<T>& y);
316template<class T> valarray<T> atan2(const valarray<T>& x, const T& y);
317template<class T> valarray<T> atan2(const T& x, const valarray<T>& y);
318
319template<class T> valarray<T> cos (const valarray<T>& x);
320template<class T> valarray<T> cosh (const valarray<T>& x);
321template<class T> valarray<T> exp (const valarray<T>& x);
322template<class T> valarray<T> log (const valarray<T>& x);
323template<class T> valarray<T> log10(const valarray<T>& x);
324
325template<class T> valarray<T> pow(const valarray<T>& x, const valarray<T>& y);
326template<class T> valarray<T> pow(const valarray<T>& x, const T& y);
327template<class T> valarray<T> pow(const T& x, const valarray<T>& y);
328
329template<class T> valarray<T> sin (const valarray<T>& x);
330template<class T> valarray<T> sinh (const valarray<T>& x);
331template<class T> valarray<T> sqrt (const valarray<T>& x);
332template<class T> valarray<T> tan (const valarray<T>& x);
333template<class T> valarray<T> tanh (const valarray<T>& x);
334
335template <class T> unspecified1 begin(valarray<T>& v);
336template <class T> unspecified2 begin(const valarray<T>& v);
337template <class T> unspecified1 end(valarray<T>& v);
338template <class T> unspecified2 end(const valarray<T>& v);
339
340} // std
341
342*/
343
Nikolas Klauserf210d8a2022-02-15 18:18:08 +0100344#include <__algorithm/copy.h>
345#include <__algorithm/count.h>
346#include <__algorithm/fill.h>
347#include <__algorithm/max_element.h>
348#include <__algorithm/min.h>
349#include <__algorithm/min_element.h>
350#include <__algorithm/unwrap_iter.h>
Louis Dionneb4fce352022-03-25 12:55:36 -0400351#include <__assert> // all public C++ headers provide the assertion handler
Howard Hinnantc51e1022010-05-11 19:42:16 +0000352#include <__config>
Nikolas Klauseree2dbc32022-04-17 16:01:38 +0200353#include <__functional/operations.h>
354#include <__memory/allocator.h>
355#include <__memory/uninitialized_algorithms.h>
356#include <__utility/move.h>
357#include <__utility/swap.h>
Arthur O'Dwyeref181602021-05-19 11:57:04 -0400358#include <cmath>
359#include <cstddef>
Richard Smith1f1c1472014-06-04 19:54:15 +0000360#include <new>
Mark de Weverce8f12c2021-12-22 18:14:14 +0100361#include <version>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000362
Nikolas Klausera0e0edb2022-06-16 22:43:46 +0200363// standard-mandated includes
Nikolas Klauser71619e72022-09-22 18:05:08 +0200364
365// [valarray.syn]
Nikolas Klausera0e0edb2022-06-16 22:43:46 +0200366#include <initializer_list>
367
Howard Hinnantaaaa52b2011-10-17 20:05:10 +0000368#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
Arthur O'Dwyer6eeaa002022-02-01 20:16:40 -0500369# pragma GCC system_header
Howard Hinnantaaaa52b2011-10-17 20:05:10 +0000370#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +0000371
Eric Fiselierf4433a32017-05-31 22:07:49 +0000372_LIBCPP_PUSH_MACROS
373#include <__undef_macros>
374
Howard Hinnantc51e1022010-05-11 19:42:16 +0000375_LIBCPP_BEGIN_NAMESPACE_STD
376
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000377template<class _Tp> class _LIBCPP_TEMPLATE_VIS valarray;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000378
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000379class _LIBCPP_TEMPLATE_VIS slice
Howard Hinnantc51e1022010-05-11 19:42:16 +0000380{
381 size_t __start_;
382 size_t __size_;
383 size_t __stride_;
384public:
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000385 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000386 slice()
387 : __start_(0),
388 __size_(0),
389 __stride_(0)
390 {}
391
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000392 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000393 slice(size_t __start, size_t __size, size_t __stride)
394 : __start_(__start),
395 __size_(__size),
396 __stride_(__stride)
397 {}
398
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000399 _LIBCPP_INLINE_VISIBILITY size_t start() const {return __start_;}
400 _LIBCPP_INLINE_VISIBILITY size_t size() const {return __size_;}
401 _LIBCPP_INLINE_VISIBILITY size_t stride() const {return __stride_;}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000402};
403
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000404template <class _Tp> class _LIBCPP_TEMPLATE_VIS slice_array;
Howard Hinnant8331b762013-03-06 23:30:19 +0000405class _LIBCPP_TYPE_VIS gslice;
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000406template <class _Tp> class _LIBCPP_TEMPLATE_VIS gslice_array;
407template <class _Tp> class _LIBCPP_TEMPLATE_VIS mask_array;
408template <class _Tp> class _LIBCPP_TEMPLATE_VIS indirect_array;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000409
410template <class _Tp>
Howard Hinnanta54386e2012-09-14 00:39:16 +0000411_LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000412_Tp*
413begin(valarray<_Tp>& __v);
414
415template <class _Tp>
Howard Hinnanta54386e2012-09-14 00:39:16 +0000416_LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000417const _Tp*
418begin(const valarray<_Tp>& __v);
419
420template <class _Tp>
Howard Hinnanta54386e2012-09-14 00:39:16 +0000421_LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000422_Tp*
423end(valarray<_Tp>& __v);
424
425template <class _Tp>
Howard Hinnanta54386e2012-09-14 00:39:16 +0000426_LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000427const _Tp*
428end(const valarray<_Tp>& __v);
429
430template <class _Op, class _A0>
431struct _UnaryOp
432{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400433 typedef typename _Op::__result_type __result_type;
Arthur O'Dwyer0b6c2482021-05-31 11:33:51 -0400434 typedef typename decay<__result_type>::type value_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000435
436 _Op __op_;
437 _A0 __a0_;
438
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000439 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000440 _UnaryOp(const _Op& __op, const _A0& __a0) : __op_(__op), __a0_(__a0) {}
441
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000442 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400443 __result_type operator[](size_t __i) const {return __op_(__a0_[__i]);}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000444
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000445 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000446 size_t size() const {return __a0_.size();}
447};
448
449template <class _Op, class _A0, class _A1>
450struct _BinaryOp
451{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400452 typedef typename _Op::__result_type __result_type;
Arthur O'Dwyer0b6c2482021-05-31 11:33:51 -0400453 typedef typename decay<__result_type>::type value_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000454
455 _Op __op_;
456 _A0 __a0_;
457 _A1 __a1_;
458
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000459 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000460 _BinaryOp(const _Op& __op, const _A0& __a0, const _A1& __a1)
461 : __op_(__op), __a0_(__a0), __a1_(__a1) {}
462
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000463 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer0b6c2482021-05-31 11:33:51 -0400464 __result_type operator[](size_t __i) const {return __op_(__a0_[__i], __a1_[__i]);}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000465
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000466 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000467 size_t size() const {return __a0_.size();}
468};
469
470template <class _Tp>
471class __scalar_expr
472{
473public:
474 typedef _Tp value_type;
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400475 typedef const _Tp& __result_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000476private:
477 const value_type& __t_;
478 size_t __s_;
479public:
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000480 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000481 explicit __scalar_expr(const value_type& __t, size_t __s) : __t_(__t), __s_(__s) {}
482
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000483 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400484 __result_type operator[](size_t) const {return __t_;}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000485
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000486 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000487 size_t size() const {return __s_;}
488};
489
490template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400491struct __unary_plus
Howard Hinnantc51e1022010-05-11 19:42:16 +0000492{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400493 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000494 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000495 _Tp operator()(const _Tp& __x) const
496 {return +__x;}
497};
498
499template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400500struct __bit_not
Howard Hinnantc51e1022010-05-11 19:42:16 +0000501{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400502 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000503 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000504 _Tp operator()(const _Tp& __x) const
505 {return ~__x;}
506};
507
508template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400509struct __bit_shift_left
Howard Hinnantc51e1022010-05-11 19:42:16 +0000510{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400511 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000512 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000513 _Tp operator()(const _Tp& __x, const _Tp& __y) const
514 {return __x << __y;}
515};
516
517template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400518struct __bit_shift_right
Howard Hinnantc51e1022010-05-11 19:42:16 +0000519{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400520 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000521 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000522 _Tp operator()(const _Tp& __x, const _Tp& __y) const
523 {return __x >> __y;}
524};
525
Howard Hinnantc834c512011-11-29 18:15:50 +0000526template <class _Tp, class _Fp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400527struct __apply_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000528{
529private:
Howard Hinnantc834c512011-11-29 18:15:50 +0000530 _Fp __f_;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000531public:
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400532 typedef _Tp __result_type;
533
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000534 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc834c512011-11-29 18:15:50 +0000535 explicit __apply_expr(_Fp __f) : __f_(__f) {}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000536
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000537 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000538 _Tp operator()(const _Tp& __x) const
539 {return __f_(__x);}
540};
541
542template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400543struct __abs_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000544{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400545 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000546 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000547 _Tp operator()(const _Tp& __x) const
548 {return abs(__x);}
549};
550
551template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400552struct __acos_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000553{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400554 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000555 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000556 _Tp operator()(const _Tp& __x) const
557 {return acos(__x);}
558};
559
560template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400561struct __asin_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000562{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400563 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000564 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000565 _Tp operator()(const _Tp& __x) const
566 {return asin(__x);}
567};
568
569template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400570struct __atan_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000571{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400572 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000573 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000574 _Tp operator()(const _Tp& __x) const
575 {return atan(__x);}
576};
577
578template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400579struct __atan2_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000580{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400581 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000582 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000583 _Tp operator()(const _Tp& __x, const _Tp& __y) const
584 {return atan2(__x, __y);}
585};
586
587template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400588struct __cos_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000589{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400590 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000591 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000592 _Tp operator()(const _Tp& __x) const
593 {return cos(__x);}
594};
595
596template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400597struct __cosh_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000598{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400599 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000600 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000601 _Tp operator()(const _Tp& __x) const
602 {return cosh(__x);}
603};
604
605template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400606struct __exp_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000607{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400608 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000609 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000610 _Tp operator()(const _Tp& __x) const
611 {return exp(__x);}
612};
613
614template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400615struct __log_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000616{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400617 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000618 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000619 _Tp operator()(const _Tp& __x) const
620 {return log(__x);}
621};
622
623template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400624struct __log10_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000625{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400626 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000627 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000628 _Tp operator()(const _Tp& __x) const
629 {return log10(__x);}
630};
631
632template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400633struct __pow_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000634{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400635 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000636 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000637 _Tp operator()(const _Tp& __x, const _Tp& __y) const
638 {return pow(__x, __y);}
639};
640
641template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400642struct __sin_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000643{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400644 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000645 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000646 _Tp operator()(const _Tp& __x) const
647 {return sin(__x);}
648};
649
650template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400651struct __sinh_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000652{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400653 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000654 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000655 _Tp operator()(const _Tp& __x) const
656 {return sinh(__x);}
657};
658
659template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400660struct __sqrt_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000661{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400662 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000663 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000664 _Tp operator()(const _Tp& __x) const
665 {return sqrt(__x);}
666};
667
668template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400669struct __tan_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000670{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400671 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000672 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000673 _Tp operator()(const _Tp& __x) const
674 {return tan(__x);}
675};
676
677template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400678struct __tanh_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000679{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400680 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000681 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000682 _Tp operator()(const _Tp& __x) const
683 {return tanh(__x);}
684};
685
686template <class _ValExpr>
687class __slice_expr
688{
Nikolas Klauserc9e524e2022-09-06 00:33:34 +0200689 typedef __libcpp_remove_reference_t<_ValExpr> _RmExpr;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000690public:
691 typedef typename _RmExpr::value_type value_type;
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400692 typedef value_type __result_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000693
694private:
695 _ValExpr __expr_;
696 size_t __start_;
697 size_t __size_;
698 size_t __stride_;
699
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000700 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000701 __slice_expr(const slice& __sl, const _RmExpr& __e)
702 : __expr_(__e),
703 __start_(__sl.start()),
704 __size_(__sl.size()),
705 __stride_(__sl.stride())
706 {}
707public:
708
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000709 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400710 __result_type operator[](size_t __i) const
Howard Hinnantc51e1022010-05-11 19:42:16 +0000711 {return __expr_[__start_ + __i * __stride_];}
712
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000713 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000714 size_t size() const {return __size_;}
715
Eric Fiselier7b31ed02019-04-02 08:05:23 +0000716 template <class> friend class __val_expr;
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000717 template <class> friend class _LIBCPP_TEMPLATE_VIS valarray;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000718};
719
720template <class _ValExpr>
721class __mask_expr;
722
723template <class _ValExpr>
724class __indirect_expr;
725
726template <class _ValExpr>
727class __shift_expr
728{
Nikolas Klauserc9e524e2022-09-06 00:33:34 +0200729 typedef __libcpp_remove_reference_t<_ValExpr> _RmExpr;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000730public:
731 typedef typename _RmExpr::value_type value_type;
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400732 typedef value_type __result_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000733
734private:
735 _ValExpr __expr_;
736 size_t __size_;
737 ptrdiff_t __ul_;
738 ptrdiff_t __sn_;
739 ptrdiff_t __n_;
Howard Hinnantc834c512011-11-29 18:15:50 +0000740 static const ptrdiff_t _Np = static_cast<ptrdiff_t>(
Howard Hinnantc51e1022010-05-11 19:42:16 +0000741 sizeof(ptrdiff_t) * __CHAR_BIT__ - 1);
742
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000743 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000744 __shift_expr(int __n, const _RmExpr& __e)
745 : __expr_(__e),
746 __size_(__e.size()),
747 __n_(__n)
748 {
Howard Hinnantc834c512011-11-29 18:15:50 +0000749 ptrdiff_t __neg_n = static_cast<ptrdiff_t>(__n_ >> _Np);
750 __sn_ = __neg_n | static_cast<ptrdiff_t>(static_cast<size_t>(-__n_) >> _Np);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000751 __ul_ = ((__size_ - __n_) & ~__neg_n) | ((__n_ + 1) & __neg_n);
752 }
753public:
754
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000755 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400756 __result_type operator[](size_t __j) const
Howard Hinnantc51e1022010-05-11 19:42:16 +0000757 {
Howard Hinnant28b24882011-12-01 20:21:04 +0000758 ptrdiff_t __i = static_cast<ptrdiff_t>(__j);
Howard Hinnantc834c512011-11-29 18:15:50 +0000759 ptrdiff_t __m = (__sn_ * __i - __ul_) >> _Np;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000760 return (__expr_[(__i + __n_) & __m] & __m) | (value_type() & ~__m);
761 }
762
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000763 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000764 size_t size() const {return __size_;}
765
766 template <class> friend class __val_expr;
767};
768
769template <class _ValExpr>
770class __cshift_expr
771{
Nikolas Klauserc9e524e2022-09-06 00:33:34 +0200772 typedef __libcpp_remove_reference_t<_ValExpr> _RmExpr;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000773public:
774 typedef typename _RmExpr::value_type value_type;
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400775 typedef value_type __result_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000776
777private:
778 _ValExpr __expr_;
779 size_t __size_;
780 size_t __m_;
781 size_t __o1_;
782 size_t __o2_;
783
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000784 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000785 __cshift_expr(int __n, const _RmExpr& __e)
786 : __expr_(__e),
787 __size_(__e.size())
788 {
789 __n %= static_cast<int>(__size_);
790 if (__n >= 0)
791 {
792 __m_ = __size_ - __n;
793 __o1_ = __n;
794 __o2_ = __n - __size_;
795 }
796 else
797 {
798 __m_ = -__n;
799 __o1_ = __n + __size_;
800 __o2_ = __n;
801 }
802 }
803public:
804
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000805 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400806 __result_type operator[](size_t __i) const
Howard Hinnantc51e1022010-05-11 19:42:16 +0000807 {
808 if (__i < __m_)
809 return __expr_[__i + __o1_];
810 return __expr_[__i + __o2_];
811 }
812
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000813 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000814 size_t size() const {return __size_;}
815
816 template <class> friend class __val_expr;
817};
818
819template<class _ValExpr>
820class __val_expr;
821
822template<class _ValExpr>
823struct __is_val_expr : false_type {};
824
825template<class _ValExpr>
826struct __is_val_expr<__val_expr<_ValExpr> > : true_type {};
827
828template<class _Tp>
829struct __is_val_expr<valarray<_Tp> > : true_type {};
830
831template<class _Tp>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000832class _LIBCPP_TEMPLATE_VIS valarray
Howard Hinnantc51e1022010-05-11 19:42:16 +0000833{
834public:
835 typedef _Tp value_type;
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400836 typedef _Tp __result_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000837
838private:
839 value_type* __begin_;
840 value_type* __end_;
841
842public:
843 // construct/destroy:
Douglas Gregor68902322012-05-19 07:14:17 +0000844 _LIBCPP_INLINE_VISIBILITY
Bruce Mitchener170d8972020-11-24 12:53:53 -0500845 valarray() : __begin_(nullptr), __end_(nullptr) {}
Louis Dionneb4d05d72018-10-16 19:26:23 +0000846 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Eric Fiseliere529a802016-09-16 00:13:55 +0000847 explicit valarray(size_t __n);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000848 _LIBCPP_INLINE_VISIBILITY
Douglas Gregor68902322012-05-19 07:14:17 +0000849 valarray(const value_type& __x, size_t __n);
850 valarray(const value_type* __p, size_t __n);
851 valarray(const valarray& __v);
Eric Fiselier3b0b81f2017-04-19 00:23:45 +0000852#ifndef _LIBCPP_CXX03_LANG
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000853 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant298aed92012-07-21 00:51:28 +0000854 valarray(valarray&& __v) _NOEXCEPT;
Douglas Gregor68902322012-05-19 07:14:17 +0000855 valarray(initializer_list<value_type> __il);
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400856#endif // _LIBCPP_CXX03_LANG
Douglas Gregor68902322012-05-19 07:14:17 +0000857 valarray(const slice_array<value_type>& __sa);
858 valarray(const gslice_array<value_type>& __ga);
859 valarray(const mask_array<value_type>& __ma);
860 valarray(const indirect_array<value_type>& __ia);
Louis Dionneb4d05d72018-10-16 19:26:23 +0000861 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Douglas Gregor68902322012-05-19 07:14:17 +0000862 ~valarray();
Howard Hinnantc51e1022010-05-11 19:42:16 +0000863
864 // assignment:
Douglas Gregor68902322012-05-19 07:14:17 +0000865 valarray& operator=(const valarray& __v);
Eric Fiselier3b0b81f2017-04-19 00:23:45 +0000866#ifndef _LIBCPP_CXX03_LANG
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000867 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant298aed92012-07-21 00:51:28 +0000868 valarray& operator=(valarray&& __v) _NOEXCEPT;
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000869 _LIBCPP_INLINE_VISIBILITY
Douglas Gregor68902322012-05-19 07:14:17 +0000870 valarray& operator=(initializer_list<value_type>);
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400871#endif // _LIBCPP_CXX03_LANG
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000872 _LIBCPP_INLINE_VISIBILITY
Douglas Gregor68902322012-05-19 07:14:17 +0000873 valarray& operator=(const value_type& __x);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000874 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000875 valarray& operator=(const slice_array<value_type>& __sa);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000876 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000877 valarray& operator=(const gslice_array<value_type>& __ga);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000878 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000879 valarray& operator=(const mask_array<value_type>& __ma);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000880 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000881 valarray& operator=(const indirect_array<value_type>& __ia);
Howard Hinnant329cd412011-07-27 23:19:59 +0000882 template <class _ValExpr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000883 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant329cd412011-07-27 23:19:59 +0000884 valarray& operator=(const __val_expr<_ValExpr>& __v);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000885
886 // element access:
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000887 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000888 const value_type& operator[](size_t __i) const {return __begin_[__i];}
889
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000890 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000891 value_type& operator[](size_t __i) {return __begin_[__i];}
892
893 // subset operations:
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000894 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000895 __val_expr<__slice_expr<const valarray&> > operator[](slice __s) const;
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000896 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000897 slice_array<value_type> operator[](slice __s);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000898 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000899 __val_expr<__indirect_expr<const valarray&> > operator[](const gslice& __gs) const;
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000900 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000901 gslice_array<value_type> operator[](const gslice& __gs);
Eric Fiselier3b0b81f2017-04-19 00:23:45 +0000902#ifndef _LIBCPP_CXX03_LANG
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000903 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000904 __val_expr<__indirect_expr<const valarray&> > operator[](gslice&& __gs) const;
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000905 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000906 gslice_array<value_type> operator[](gslice&& __gs);
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400907#endif // _LIBCPP_CXX03_LANG
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000908 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000909 __val_expr<__mask_expr<const valarray&> > operator[](const valarray<bool>& __vb) const;
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000910 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000911 mask_array<value_type> operator[](const valarray<bool>& __vb);
Eric Fiselier3b0b81f2017-04-19 00:23:45 +0000912#ifndef _LIBCPP_CXX03_LANG
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000913 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000914 __val_expr<__mask_expr<const valarray&> > operator[](valarray<bool>&& __vb) const;
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000915 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000916 mask_array<value_type> operator[](valarray<bool>&& __vb);
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400917#endif // _LIBCPP_CXX03_LANG
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000918 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000919 __val_expr<__indirect_expr<const valarray&> > operator[](const valarray<size_t>& __vs) const;
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000920 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000921 indirect_array<value_type> operator[](const valarray<size_t>& __vs);
Eric Fiselier3b0b81f2017-04-19 00:23:45 +0000922#ifndef _LIBCPP_CXX03_LANG
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000923 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000924 __val_expr<__indirect_expr<const valarray&> > operator[](valarray<size_t>&& __vs) const;
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000925 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000926 indirect_array<value_type> operator[](valarray<size_t>&& __vs);
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400927#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000928
929 // unary operators:
Louis Dionne12a2e572022-05-05 12:24:43 -0400930 _LIBCPP_INLINE_VISIBILITY
931 __val_expr<_UnaryOp<__unary_plus<_Tp>, const valarray&> > operator+() const;
932 _LIBCPP_INLINE_VISIBILITY
933 __val_expr<_UnaryOp<negate<_Tp>, const valarray&> > operator-() const;
934 _LIBCPP_INLINE_VISIBILITY
935 __val_expr<_UnaryOp<__bit_not<_Tp>, const valarray&> > operator~() const;
936 _LIBCPP_INLINE_VISIBILITY
937 __val_expr<_UnaryOp<logical_not<_Tp>, const valarray&> > operator!() const;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000938
939 // computed assignment:
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000940 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000941 valarray& operator*= (const value_type& __x);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000942 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000943 valarray& operator/= (const value_type& __x);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000944 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000945 valarray& operator%= (const value_type& __x);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000946 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000947 valarray& operator+= (const value_type& __x);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000948 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000949 valarray& operator-= (const value_type& __x);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000950 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000951 valarray& operator^= (const value_type& __x);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000952 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000953 valarray& operator&= (const value_type& __x);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000954 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000955 valarray& operator|= (const value_type& __x);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000956 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000957 valarray& operator<<=(const value_type& __x);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000958 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000959 valarray& operator>>=(const value_type& __x);
960
961 template <class _Expr>
962 typename enable_if
963 <
964 __is_val_expr<_Expr>::value,
965 valarray&
966 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000967 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000968 operator*= (const _Expr& __v);
969
970 template <class _Expr>
971 typename enable_if
972 <
973 __is_val_expr<_Expr>::value,
974 valarray&
975 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000976 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000977 operator/= (const _Expr& __v);
978
979 template <class _Expr>
980 typename enable_if
981 <
982 __is_val_expr<_Expr>::value,
983 valarray&
984 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000985 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000986 operator%= (const _Expr& __v);
987
988 template <class _Expr>
989 typename enable_if
990 <
991 __is_val_expr<_Expr>::value,
992 valarray&
993 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000994 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000995 operator+= (const _Expr& __v);
996
997 template <class _Expr>
998 typename enable_if
999 <
1000 __is_val_expr<_Expr>::value,
1001 valarray&
1002 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001003 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001004 operator-= (const _Expr& __v);
1005
1006 template <class _Expr>
1007 typename enable_if
1008 <
1009 __is_val_expr<_Expr>::value,
1010 valarray&
1011 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001012 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001013 operator^= (const _Expr& __v);
1014
1015 template <class _Expr>
1016 typename enable_if
1017 <
1018 __is_val_expr<_Expr>::value,
1019 valarray&
1020 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001021 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001022 operator|= (const _Expr& __v);
1023
1024 template <class _Expr>
1025 typename enable_if
1026 <
1027 __is_val_expr<_Expr>::value,
1028 valarray&
1029 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001030 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001031 operator&= (const _Expr& __v);
1032
1033 template <class _Expr>
1034 typename enable_if
1035 <
1036 __is_val_expr<_Expr>::value,
1037 valarray&
1038 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001039 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001040 operator<<= (const _Expr& __v);
1041
1042 template <class _Expr>
1043 typename enable_if
1044 <
1045 __is_val_expr<_Expr>::value,
1046 valarray&
1047 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001048 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001049 operator>>= (const _Expr& __v);
1050
1051 // member functions:
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001052 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant298aed92012-07-21 00:51:28 +00001053 void swap(valarray& __v) _NOEXCEPT;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001054
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001055 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant28b24882011-12-01 20:21:04 +00001056 size_t size() const {return static_cast<size_t>(__end_ - __begin_);}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001057
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001058 _LIBCPP_INLINE_VISIBILITY
Douglas Gregor68902322012-05-19 07:14:17 +00001059 value_type sum() const;
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001060 _LIBCPP_INLINE_VISIBILITY
Douglas Gregor68902322012-05-19 07:14:17 +00001061 value_type min() const;
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001062 _LIBCPP_INLINE_VISIBILITY
Douglas Gregor68902322012-05-19 07:14:17 +00001063 value_type max() const;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001064
Douglas Gregor68902322012-05-19 07:14:17 +00001065 valarray shift (int __i) const;
1066 valarray cshift(int __i) const;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001067 valarray apply(value_type __f(value_type)) const;
1068 valarray apply(value_type __f(const value_type&)) const;
1069 void resize(size_t __n, value_type __x = value_type());
1070
1071private:
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00001072 template <class> friend class _LIBCPP_TEMPLATE_VIS valarray;
1073 template <class> friend class _LIBCPP_TEMPLATE_VIS slice_array;
1074 template <class> friend class _LIBCPP_TEMPLATE_VIS gslice_array;
1075 template <class> friend class _LIBCPP_TEMPLATE_VIS mask_array;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001076 template <class> friend class __mask_expr;
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00001077 template <class> friend class _LIBCPP_TEMPLATE_VIS indirect_array;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001078 template <class> friend class __indirect_expr;
1079 template <class> friend class __val_expr;
1080
1081 template <class _Up>
1082 friend
1083 _Up*
1084 begin(valarray<_Up>& __v);
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001085
Howard Hinnantc51e1022010-05-11 19:42:16 +00001086 template <class _Up>
1087 friend
1088 const _Up*
1089 begin(const valarray<_Up>& __v);
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001090
Howard Hinnantc51e1022010-05-11 19:42:16 +00001091 template <class _Up>
1092 friend
1093 _Up*
1094 end(valarray<_Up>& __v);
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001095
Howard Hinnantc51e1022010-05-11 19:42:16 +00001096 template <class _Up>
1097 friend
1098 const _Up*
1099 end(const valarray<_Up>& __v);
Mikhail Maltsev59de6f82018-02-08 11:33:48 +00001100
Eric Fiseliera119c322018-10-25 17:43:26 +00001101 _LIBCPP_INLINE_VISIBILITY
Eric Fiselier2856ef82018-10-25 17:21:30 +00001102 void __clear(size_t __capacity);
Mikhail Maltsev59de6f82018-02-08 11:33:48 +00001103 valarray& __assign_range(const value_type* __f, const value_type* __l);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001104};
1105
Konstantin Varlamovebb31192021-10-28 00:36:19 -07001106#if _LIBCPP_STD_VER > 14
1107template<class _Tp, size_t _Size>
1108valarray(const _Tp(&)[_Size], size_t) -> valarray<_Tp>;
1109#endif
1110
Louis Dionnedc496ec2021-06-08 17:25:08 -04001111extern template _LIBCPP_FUNC_VIS void valarray<size_t>::resize(size_t, size_t);
Howard Hinnanta37d3cf2013-08-12 18:38:34 +00001112
Howard Hinnantc51e1022010-05-11 19:42:16 +00001113template <class _Op, class _Tp>
1114struct _UnaryOp<_Op, valarray<_Tp> >
1115{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04001116 typedef typename _Op::__result_type __result_type;
Arthur O'Dwyer0b6c2482021-05-31 11:33:51 -04001117 typedef typename decay<__result_type>::type value_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001118
1119 _Op __op_;
1120 const valarray<_Tp>& __a0_;
1121
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001122 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001123 _UnaryOp(const _Op& __op, const valarray<_Tp>& __a0) : __op_(__op), __a0_(__a0) {}
1124
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001125 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04001126 __result_type operator[](size_t __i) const {return __op_(__a0_[__i]);}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001127
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001128 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001129 size_t size() const {return __a0_.size();}
1130};
1131
1132template <class _Op, class _Tp, class _A1>
1133struct _BinaryOp<_Op, valarray<_Tp>, _A1>
1134{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04001135 typedef typename _Op::__result_type __result_type;
Arthur O'Dwyer0b6c2482021-05-31 11:33:51 -04001136 typedef typename decay<__result_type>::type value_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001137
1138 _Op __op_;
1139 const valarray<_Tp>& __a0_;
1140 _A1 __a1_;
1141
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001142 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001143 _BinaryOp(const _Op& __op, const valarray<_Tp>& __a0, const _A1& __a1)
1144 : __op_(__op), __a0_(__a0), __a1_(__a1) {}
1145
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001146 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer0b6c2482021-05-31 11:33:51 -04001147 __result_type operator[](size_t __i) const {return __op_(__a0_[__i], __a1_[__i]);}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001148
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001149 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001150 size_t size() const {return __a0_.size();}
1151};
1152
1153template <class _Op, class _A0, class _Tp>
1154struct _BinaryOp<_Op, _A0, valarray<_Tp> >
1155{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04001156 typedef typename _Op::__result_type __result_type;
Arthur O'Dwyer0b6c2482021-05-31 11:33:51 -04001157 typedef typename decay<__result_type>::type value_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001158
1159 _Op __op_;
1160 _A0 __a0_;
1161 const valarray<_Tp>& __a1_;
1162
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001163 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001164 _BinaryOp(const _Op& __op, const _A0& __a0, const valarray<_Tp>& __a1)
1165 : __op_(__op), __a0_(__a0), __a1_(__a1) {}
1166
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001167 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer0b6c2482021-05-31 11:33:51 -04001168 __result_type operator[](size_t __i) const {return __op_(__a0_[__i], __a1_[__i]);}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001169
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001170 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001171 size_t size() const {return __a0_.size();}
1172};
1173
1174template <class _Op, class _Tp>
1175struct _BinaryOp<_Op, valarray<_Tp>, valarray<_Tp> >
1176{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04001177 typedef typename _Op::__result_type __result_type;
Arthur O'Dwyer0b6c2482021-05-31 11:33:51 -04001178 typedef typename decay<__result_type>::type value_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001179
1180 _Op __op_;
1181 const valarray<_Tp>& __a0_;
1182 const valarray<_Tp>& __a1_;
1183
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001184 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001185 _BinaryOp(const _Op& __op, const valarray<_Tp>& __a0, const valarray<_Tp>& __a1)
1186 : __op_(__op), __a0_(__a0), __a1_(__a1) {}
1187
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001188 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer0b6c2482021-05-31 11:33:51 -04001189 __result_type operator[](size_t __i) const {return __op_(__a0_[__i], __a1_[__i]);}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001190
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001191 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001192 size_t size() const {return __a0_.size();}
1193};
1194
1195// slice_array
1196
1197template <class _Tp>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00001198class _LIBCPP_TEMPLATE_VIS slice_array
Howard Hinnantc51e1022010-05-11 19:42:16 +00001199{
1200public:
1201 typedef _Tp value_type;
1202
1203private:
1204 value_type* __vp_;
1205 size_t __size_;
1206 size_t __stride_;
1207
1208public:
1209 template <class _Expr>
1210 typename enable_if
1211 <
1212 __is_val_expr<_Expr>::value,
1213 void
1214 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001215 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001216 operator=(const _Expr& __v) const;
1217
1218 template <class _Expr>
1219 typename enable_if
1220 <
1221 __is_val_expr<_Expr>::value,
1222 void
1223 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001224 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001225 operator*=(const _Expr& __v) const;
1226
1227 template <class _Expr>
1228 typename enable_if
1229 <
1230 __is_val_expr<_Expr>::value,
1231 void
1232 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001233 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001234 operator/=(const _Expr& __v) const;
1235
1236 template <class _Expr>
1237 typename enable_if
1238 <
1239 __is_val_expr<_Expr>::value,
1240 void
1241 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001242 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001243 operator%=(const _Expr& __v) const;
1244
1245 template <class _Expr>
1246 typename enable_if
1247 <
1248 __is_val_expr<_Expr>::value,
1249 void
1250 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001251 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001252 operator+=(const _Expr& __v) const;
1253
1254 template <class _Expr>
1255 typename enable_if
1256 <
1257 __is_val_expr<_Expr>::value,
1258 void
1259 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001260 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001261 operator-=(const _Expr& __v) const;
1262
1263 template <class _Expr>
1264 typename enable_if
1265 <
1266 __is_val_expr<_Expr>::value,
1267 void
1268 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001269 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001270 operator^=(const _Expr& __v) const;
1271
1272 template <class _Expr>
1273 typename enable_if
1274 <
1275 __is_val_expr<_Expr>::value,
1276 void
1277 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001278 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001279 operator&=(const _Expr& __v) const;
1280
1281 template <class _Expr>
1282 typename enable_if
1283 <
1284 __is_val_expr<_Expr>::value,
1285 void
1286 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001287 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001288 operator|=(const _Expr& __v) const;
1289
1290 template <class _Expr>
1291 typename enable_if
1292 <
1293 __is_val_expr<_Expr>::value,
1294 void
1295 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001296 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001297 operator<<=(const _Expr& __v) const;
1298
1299 template <class _Expr>
1300 typename enable_if
1301 <
1302 __is_val_expr<_Expr>::value,
1303 void
1304 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001305 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001306 operator>>=(const _Expr& __v) const;
1307
Eric Fiselierb9f37ca2019-12-12 20:48:11 -05001308 slice_array(slice_array const&) = default;
1309
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001310 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001311 const slice_array& operator=(const slice_array& __sa) const;
1312
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001313 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001314 void operator=(const value_type& __x) const;
1315
zoecarver79fa7502020-12-02 10:49:20 -08001316 _LIBCPP_INLINE_VISIBILITY
1317 void operator=(const valarray<value_type>& __va) const;
1318
Howard Hinnantc51e1022010-05-11 19:42:16 +00001319private:
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001320 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001321 slice_array(const slice& __sl, const valarray<value_type>& __v)
1322 : __vp_(const_cast<value_type*>(__v.__begin_ + __sl.start())),
1323 __size_(__sl.size()),
1324 __stride_(__sl.stride())
1325 {}
1326
1327 template <class> friend class valarray;
1328 template <class> friend class sliceExpr;
1329};
1330
1331template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001332inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001333const slice_array<_Tp>&
1334slice_array<_Tp>::operator=(const slice_array& __sa) const
1335{
1336 value_type* __t = __vp_;
1337 const value_type* __s = __sa.__vp_;
1338 for (size_t __n = __size_; __n; --__n, __t += __stride_, __s += __sa.__stride_)
1339 *__t = *__s;
Eric Fiselier3b80ce92014-08-12 00:06:58 +00001340 return *this;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001341}
1342
1343template <class _Tp>
1344template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001345inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001346typename enable_if
1347<
1348 __is_val_expr<_Expr>::value,
1349 void
1350>::type
1351slice_array<_Tp>::operator=(const _Expr& __v) const
1352{
1353 value_type* __t = __vp_;
1354 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1355 *__t = __v[__i];
1356}
1357
1358template <class _Tp>
zoecarver79fa7502020-12-02 10:49:20 -08001359inline void
1360slice_array<_Tp>::operator=(const valarray<value_type>& __va) const
1361{
1362 value_type* __t = __vp_;
1363 for (size_t __i = 0; __i < __va.size(); ++__i, __t += __stride_)
1364 *__t = __va[__i];
1365}
1366
1367template <class _Tp>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001368template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001369inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001370typename enable_if
1371<
1372 __is_val_expr<_Expr>::value,
1373 void
1374>::type
1375slice_array<_Tp>::operator*=(const _Expr& __v) const
1376{
1377 value_type* __t = __vp_;
1378 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1379 *__t *= __v[__i];
1380}
1381
1382template <class _Tp>
1383template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001384inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001385typename enable_if
1386<
1387 __is_val_expr<_Expr>::value,
1388 void
1389>::type
1390slice_array<_Tp>::operator/=(const _Expr& __v) const
1391{
1392 value_type* __t = __vp_;
1393 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1394 *__t /= __v[__i];
1395}
1396
1397template <class _Tp>
1398template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001399inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001400typename enable_if
1401<
1402 __is_val_expr<_Expr>::value,
1403 void
1404>::type
1405slice_array<_Tp>::operator%=(const _Expr& __v) const
1406{
1407 value_type* __t = __vp_;
1408 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1409 *__t %= __v[__i];
1410}
1411
1412template <class _Tp>
1413template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001414inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001415typename enable_if
1416<
1417 __is_val_expr<_Expr>::value,
1418 void
1419>::type
1420slice_array<_Tp>::operator+=(const _Expr& __v) const
1421{
1422 value_type* __t = __vp_;
1423 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1424 *__t += __v[__i];
1425}
1426
1427template <class _Tp>
1428template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001429inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001430typename enable_if
1431<
1432 __is_val_expr<_Expr>::value,
1433 void
1434>::type
1435slice_array<_Tp>::operator-=(const _Expr& __v) const
1436{
1437 value_type* __t = __vp_;
1438 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1439 *__t -= __v[__i];
1440}
1441
1442template <class _Tp>
1443template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001444inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001445typename enable_if
1446<
1447 __is_val_expr<_Expr>::value,
1448 void
1449>::type
1450slice_array<_Tp>::operator^=(const _Expr& __v) const
1451{
1452 value_type* __t = __vp_;
1453 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1454 *__t ^= __v[__i];
1455}
1456
1457template <class _Tp>
1458template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001459inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001460typename enable_if
1461<
1462 __is_val_expr<_Expr>::value,
1463 void
1464>::type
1465slice_array<_Tp>::operator&=(const _Expr& __v) const
1466{
1467 value_type* __t = __vp_;
1468 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1469 *__t &= __v[__i];
1470}
1471
1472template <class _Tp>
1473template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001474inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001475typename enable_if
1476<
1477 __is_val_expr<_Expr>::value,
1478 void
1479>::type
1480slice_array<_Tp>::operator|=(const _Expr& __v) const
1481{
1482 value_type* __t = __vp_;
1483 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1484 *__t |= __v[__i];
1485}
1486
1487template <class _Tp>
1488template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001489inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001490typename enable_if
1491<
1492 __is_val_expr<_Expr>::value,
1493 void
1494>::type
1495slice_array<_Tp>::operator<<=(const _Expr& __v) const
1496{
1497 value_type* __t = __vp_;
1498 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1499 *__t <<= __v[__i];
1500}
1501
1502template <class _Tp>
1503template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001504inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001505typename enable_if
1506<
1507 __is_val_expr<_Expr>::value,
1508 void
1509>::type
1510slice_array<_Tp>::operator>>=(const _Expr& __v) const
1511{
1512 value_type* __t = __vp_;
1513 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1514 *__t >>= __v[__i];
1515}
1516
1517template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001518inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001519void
1520slice_array<_Tp>::operator=(const value_type& __x) const
1521{
1522 value_type* __t = __vp_;
1523 for (size_t __n = __size_; __n; --__n, __t += __stride_)
1524 *__t = __x;
1525}
1526
1527// gslice
1528
Howard Hinnant8331b762013-03-06 23:30:19 +00001529class _LIBCPP_TYPE_VIS gslice
Howard Hinnantc51e1022010-05-11 19:42:16 +00001530{
1531 valarray<size_t> __size_;
1532 valarray<size_t> __stride_;
1533 valarray<size_t> __1d_;
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001534
Howard Hinnantc51e1022010-05-11 19:42:16 +00001535public:
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001536 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001537 gslice() {}
Douglas Gregor68902322012-05-19 07:14:17 +00001538
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001539 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001540 gslice(size_t __start, const valarray<size_t>& __size,
1541 const valarray<size_t>& __stride)
1542 : __size_(__size),
1543 __stride_(__stride)
1544 {__init(__start);}
1545
Eric Fiselier3b0b81f2017-04-19 00:23:45 +00001546#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001547
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001548 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001549 gslice(size_t __start, const valarray<size_t>& __size,
1550 valarray<size_t>&& __stride)
1551 : __size_(__size),
Corentin Jabotcfb8a912022-02-24 19:54:00 -05001552 __stride_(std::move(__stride))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001553 {__init(__start);}
1554
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001555 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001556 gslice(size_t __start, valarray<size_t>&& __size,
1557 const valarray<size_t>& __stride)
Corentin Jabotcfb8a912022-02-24 19:54:00 -05001558 : __size_(std::move(__size)),
Howard Hinnantc51e1022010-05-11 19:42:16 +00001559 __stride_(__stride)
1560 {__init(__start);}
1561
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001562 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001563 gslice(size_t __start, valarray<size_t>&& __size,
1564 valarray<size_t>&& __stride)
Corentin Jabotcfb8a912022-02-24 19:54:00 -05001565 : __size_(std::move(__size)),
1566 __stride_(std::move(__stride))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001567 {__init(__start);}
1568
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001569#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001570
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001571 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001572 size_t start() const {return __1d_.size() ? __1d_[0] : 0;}
1573
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001574 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001575 valarray<size_t> size() const {return __size_;}
1576
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001577 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001578 valarray<size_t> stride() const {return __stride_;}
1579
1580private:
1581 void __init(size_t __start);
1582
1583 template <class> friend class gslice_array;
1584 template <class> friend class valarray;
1585 template <class> friend class __val_expr;
1586};
1587
1588// gslice_array
1589
1590template <class _Tp>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00001591class _LIBCPP_TEMPLATE_VIS gslice_array
Howard Hinnantc51e1022010-05-11 19:42:16 +00001592{
1593public:
1594 typedef _Tp value_type;
1595
1596private:
1597 value_type* __vp_;
1598 valarray<size_t> __1d_;
1599
1600public:
1601 template <class _Expr>
1602 typename enable_if
1603 <
1604 __is_val_expr<_Expr>::value,
1605 void
1606 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001607 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001608 operator=(const _Expr& __v) const;
1609
1610 template <class _Expr>
1611 typename enable_if
1612 <
1613 __is_val_expr<_Expr>::value,
1614 void
1615 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001616 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001617 operator*=(const _Expr& __v) const;
1618
1619 template <class _Expr>
1620 typename enable_if
1621 <
1622 __is_val_expr<_Expr>::value,
1623 void
1624 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001625 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001626 operator/=(const _Expr& __v) const;
1627
1628 template <class _Expr>
1629 typename enable_if
1630 <
1631 __is_val_expr<_Expr>::value,
1632 void
1633 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001634 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001635 operator%=(const _Expr& __v) const;
1636
1637 template <class _Expr>
1638 typename enable_if
1639 <
1640 __is_val_expr<_Expr>::value,
1641 void
1642 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001643 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001644 operator+=(const _Expr& __v) const;
1645
1646 template <class _Expr>
1647 typename enable_if
1648 <
1649 __is_val_expr<_Expr>::value,
1650 void
1651 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001652 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001653 operator-=(const _Expr& __v) const;
1654
1655 template <class _Expr>
1656 typename enable_if
1657 <
1658 __is_val_expr<_Expr>::value,
1659 void
1660 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001661 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001662 operator^=(const _Expr& __v) const;
1663
1664 template <class _Expr>
1665 typename enable_if
1666 <
1667 __is_val_expr<_Expr>::value,
1668 void
1669 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001670 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001671 operator&=(const _Expr& __v) const;
1672
1673 template <class _Expr>
1674 typename enable_if
1675 <
1676 __is_val_expr<_Expr>::value,
1677 void
1678 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001679 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001680 operator|=(const _Expr& __v) const;
1681
1682 template <class _Expr>
1683 typename enable_if
1684 <
1685 __is_val_expr<_Expr>::value,
1686 void
1687 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001688 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001689 operator<<=(const _Expr& __v) const;
1690
1691 template <class _Expr>
1692 typename enable_if
1693 <
1694 __is_val_expr<_Expr>::value,
1695 void
1696 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001697 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001698 operator>>=(const _Expr& __v) const;
1699
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001700 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001701 const gslice_array& operator=(const gslice_array& __ga) const;
1702
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001703 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001704 void operator=(const value_type& __x) const;
1705
Eric Fiselierb9f37ca2019-12-12 20:48:11 -05001706 gslice_array(const gslice_array&) = default;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001707
1708private:
Howard Hinnantc51e1022010-05-11 19:42:16 +00001709 gslice_array(const gslice& __gs, const valarray<value_type>& __v)
1710 : __vp_(const_cast<value_type*>(__v.__begin_)),
1711 __1d_(__gs.__1d_)
1712 {}
1713
Eric Fiselier3b0b81f2017-04-19 00:23:45 +00001714#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001715 gslice_array(gslice&& __gs, const valarray<value_type>& __v)
1716 : __vp_(const_cast<value_type*>(__v.__begin_)),
Corentin Jabotcfb8a912022-02-24 19:54:00 -05001717 __1d_(std::move(__gs.__1d_))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001718 {}
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001719#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001720
1721 template <class> friend class valarray;
1722};
1723
1724template <class _Tp>
1725template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001726inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001727typename enable_if
1728<
1729 __is_val_expr<_Expr>::value,
1730 void
1731>::type
1732gslice_array<_Tp>::operator=(const _Expr& __v) const
1733{
1734 typedef const size_t* _Ip;
1735 size_t __j = 0;
1736 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1737 __vp_[*__i] = __v[__j];
1738}
1739
1740template <class _Tp>
1741template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001742inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001743typename enable_if
1744<
1745 __is_val_expr<_Expr>::value,
1746 void
1747>::type
1748gslice_array<_Tp>::operator*=(const _Expr& __v) const
1749{
1750 typedef const size_t* _Ip;
1751 size_t __j = 0;
1752 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1753 __vp_[*__i] *= __v[__j];
1754}
1755
1756template <class _Tp>
1757template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001758inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001759typename enable_if
1760<
1761 __is_val_expr<_Expr>::value,
1762 void
1763>::type
1764gslice_array<_Tp>::operator/=(const _Expr& __v) const
1765{
1766 typedef const size_t* _Ip;
1767 size_t __j = 0;
1768 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1769 __vp_[*__i] /= __v[__j];
1770}
1771
1772template <class _Tp>
1773template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001774inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001775typename enable_if
1776<
1777 __is_val_expr<_Expr>::value,
1778 void
1779>::type
1780gslice_array<_Tp>::operator%=(const _Expr& __v) const
1781{
1782 typedef const size_t* _Ip;
1783 size_t __j = 0;
1784 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1785 __vp_[*__i] %= __v[__j];
1786}
1787
1788template <class _Tp>
1789template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001790inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001791typename enable_if
1792<
1793 __is_val_expr<_Expr>::value,
1794 void
1795>::type
1796gslice_array<_Tp>::operator+=(const _Expr& __v) const
1797{
1798 typedef const size_t* _Ip;
1799 size_t __j = 0;
1800 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1801 __vp_[*__i] += __v[__j];
1802}
1803
1804template <class _Tp>
1805template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001806inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001807typename enable_if
1808<
1809 __is_val_expr<_Expr>::value,
1810 void
1811>::type
1812gslice_array<_Tp>::operator-=(const _Expr& __v) const
1813{
1814 typedef const size_t* _Ip;
1815 size_t __j = 0;
1816 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1817 __vp_[*__i] -= __v[__j];
1818}
1819
1820template <class _Tp>
1821template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001822inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001823typename enable_if
1824<
1825 __is_val_expr<_Expr>::value,
1826 void
1827>::type
1828gslice_array<_Tp>::operator^=(const _Expr& __v) const
1829{
1830 typedef const size_t* _Ip;
1831 size_t __j = 0;
1832 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1833 __vp_[*__i] ^= __v[__j];
1834}
1835
1836template <class _Tp>
1837template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001838inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001839typename enable_if
1840<
1841 __is_val_expr<_Expr>::value,
1842 void
1843>::type
1844gslice_array<_Tp>::operator&=(const _Expr& __v) const
1845{
1846 typedef const size_t* _Ip;
1847 size_t __j = 0;
1848 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1849 __vp_[*__i] &= __v[__j];
1850}
1851
1852template <class _Tp>
1853template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001854inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001855typename enable_if
1856<
1857 __is_val_expr<_Expr>::value,
1858 void
1859>::type
1860gslice_array<_Tp>::operator|=(const _Expr& __v) const
1861{
1862 typedef const size_t* _Ip;
1863 size_t __j = 0;
1864 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1865 __vp_[*__i] |= __v[__j];
1866}
1867
1868template <class _Tp>
1869template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001870inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001871typename enable_if
1872<
1873 __is_val_expr<_Expr>::value,
1874 void
1875>::type
1876gslice_array<_Tp>::operator<<=(const _Expr& __v) const
1877{
1878 typedef const size_t* _Ip;
1879 size_t __j = 0;
1880 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1881 __vp_[*__i] <<= __v[__j];
1882}
1883
1884template <class _Tp>
1885template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001886inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001887typename enable_if
1888<
1889 __is_val_expr<_Expr>::value,
1890 void
1891>::type
1892gslice_array<_Tp>::operator>>=(const _Expr& __v) const
1893{
1894 typedef const size_t* _Ip;
1895 size_t __j = 0;
1896 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1897 __vp_[*__i] >>= __v[__j];
1898}
1899
1900template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001901inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001902const gslice_array<_Tp>&
1903gslice_array<_Tp>::operator=(const gslice_array& __ga) const
1904{
1905 typedef const size_t* _Ip;
1906 const value_type* __s = __ga.__vp_;
1907 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_, __j = __ga.__1d_.__begin_;
1908 __i != __e; ++__i, ++__j)
1909 __vp_[*__i] = __s[*__j];
1910 return *this;
1911}
1912
1913template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001914inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001915void
1916gslice_array<_Tp>::operator=(const value_type& __x) const
1917{
1918 typedef const size_t* _Ip;
1919 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i)
1920 __vp_[*__i] = __x;
1921}
1922
1923// mask_array
1924
1925template <class _Tp>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00001926class _LIBCPP_TEMPLATE_VIS mask_array
Howard Hinnantc51e1022010-05-11 19:42:16 +00001927{
1928public:
1929 typedef _Tp value_type;
1930
1931private:
1932 value_type* __vp_;
1933 valarray<size_t> __1d_;
1934
1935public:
1936 template <class _Expr>
1937 typename enable_if
1938 <
1939 __is_val_expr<_Expr>::value,
1940 void
1941 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001942 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001943 operator=(const _Expr& __v) const;
1944
1945 template <class _Expr>
1946 typename enable_if
1947 <
1948 __is_val_expr<_Expr>::value,
1949 void
1950 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001951 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001952 operator*=(const _Expr& __v) const;
1953
1954 template <class _Expr>
1955 typename enable_if
1956 <
1957 __is_val_expr<_Expr>::value,
1958 void
1959 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001960 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001961 operator/=(const _Expr& __v) const;
1962
1963 template <class _Expr>
1964 typename enable_if
1965 <
1966 __is_val_expr<_Expr>::value,
1967 void
1968 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001969 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001970 operator%=(const _Expr& __v) const;
1971
1972 template <class _Expr>
1973 typename enable_if
1974 <
1975 __is_val_expr<_Expr>::value,
1976 void
1977 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001978 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001979 operator+=(const _Expr& __v) const;
1980
1981 template <class _Expr>
1982 typename enable_if
1983 <
1984 __is_val_expr<_Expr>::value,
1985 void
1986 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001987 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001988 operator-=(const _Expr& __v) const;
1989
1990 template <class _Expr>
1991 typename enable_if
1992 <
1993 __is_val_expr<_Expr>::value,
1994 void
1995 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001996 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001997 operator^=(const _Expr& __v) const;
1998
1999 template <class _Expr>
2000 typename enable_if
2001 <
2002 __is_val_expr<_Expr>::value,
2003 void
2004 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002005 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002006 operator&=(const _Expr& __v) const;
2007
2008 template <class _Expr>
2009 typename enable_if
2010 <
2011 __is_val_expr<_Expr>::value,
2012 void
2013 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002014 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002015 operator|=(const _Expr& __v) const;
2016
2017 template <class _Expr>
2018 typename enable_if
2019 <
2020 __is_val_expr<_Expr>::value,
2021 void
2022 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002023 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002024 operator<<=(const _Expr& __v) const;
2025
2026 template <class _Expr>
2027 typename enable_if
2028 <
2029 __is_val_expr<_Expr>::value,
2030 void
2031 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002032 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002033 operator>>=(const _Expr& __v) const;
2034
Eric Fiselierb9f37ca2019-12-12 20:48:11 -05002035 mask_array(const mask_array&) = default;
2036
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002037 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002038 const mask_array& operator=(const mask_array& __ma) const;
2039
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002040 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002041 void operator=(const value_type& __x) const;
2042
Howard Hinnantc51e1022010-05-11 19:42:16 +00002043private:
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002044 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002045 mask_array(const valarray<bool>& __vb, const valarray<value_type>& __v)
2046 : __vp_(const_cast<value_type*>(__v.__begin_)),
Howard Hinnant28b24882011-12-01 20:21:04 +00002047 __1d_(static_cast<size_t>(count(__vb.__begin_, __vb.__end_, true)))
Howard Hinnantc51e1022010-05-11 19:42:16 +00002048 {
2049 size_t __j = 0;
2050 for (size_t __i = 0; __i < __vb.size(); ++__i)
2051 if (__vb[__i])
2052 __1d_[__j++] = __i;
2053 }
2054
2055 template <class> friend class valarray;
2056};
2057
2058template <class _Tp>
2059template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002060inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002061typename enable_if
2062<
2063 __is_val_expr<_Expr>::value,
2064 void
2065>::type
2066mask_array<_Tp>::operator=(const _Expr& __v) const
2067{
2068 size_t __n = __1d_.size();
2069 for (size_t __i = 0; __i < __n; ++__i)
2070 __vp_[__1d_[__i]] = __v[__i];
2071}
2072
2073template <class _Tp>
2074template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002075inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002076typename enable_if
2077<
2078 __is_val_expr<_Expr>::value,
2079 void
2080>::type
2081mask_array<_Tp>::operator*=(const _Expr& __v) const
2082{
2083 size_t __n = __1d_.size();
2084 for (size_t __i = 0; __i < __n; ++__i)
2085 __vp_[__1d_[__i]] *= __v[__i];
2086}
2087
2088template <class _Tp>
2089template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002090inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002091typename enable_if
2092<
2093 __is_val_expr<_Expr>::value,
2094 void
2095>::type
2096mask_array<_Tp>::operator/=(const _Expr& __v) const
2097{
2098 size_t __n = __1d_.size();
2099 for (size_t __i = 0; __i < __n; ++__i)
2100 __vp_[__1d_[__i]] /= __v[__i];
2101}
2102
2103template <class _Tp>
2104template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002105inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002106typename enable_if
2107<
2108 __is_val_expr<_Expr>::value,
2109 void
2110>::type
2111mask_array<_Tp>::operator%=(const _Expr& __v) const
2112{
2113 size_t __n = __1d_.size();
2114 for (size_t __i = 0; __i < __n; ++__i)
2115 __vp_[__1d_[__i]] %= __v[__i];
2116}
2117
2118template <class _Tp>
2119template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002120inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002121typename enable_if
2122<
2123 __is_val_expr<_Expr>::value,
2124 void
2125>::type
2126mask_array<_Tp>::operator+=(const _Expr& __v) const
2127{
2128 size_t __n = __1d_.size();
2129 for (size_t __i = 0; __i < __n; ++__i)
2130 __vp_[__1d_[__i]] += __v[__i];
2131}
2132
2133template <class _Tp>
2134template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002135inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002136typename enable_if
2137<
2138 __is_val_expr<_Expr>::value,
2139 void
2140>::type
2141mask_array<_Tp>::operator-=(const _Expr& __v) const
2142{
2143 size_t __n = __1d_.size();
2144 for (size_t __i = 0; __i < __n; ++__i)
2145 __vp_[__1d_[__i]] -= __v[__i];
2146}
2147
2148template <class _Tp>
2149template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002150inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002151typename enable_if
2152<
2153 __is_val_expr<_Expr>::value,
2154 void
2155>::type
2156mask_array<_Tp>::operator^=(const _Expr& __v) const
2157{
2158 size_t __n = __1d_.size();
2159 for (size_t __i = 0; __i < __n; ++__i)
2160 __vp_[__1d_[__i]] ^= __v[__i];
2161}
2162
2163template <class _Tp>
2164template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002165inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002166typename enable_if
2167<
2168 __is_val_expr<_Expr>::value,
2169 void
2170>::type
2171mask_array<_Tp>::operator&=(const _Expr& __v) const
2172{
2173 size_t __n = __1d_.size();
2174 for (size_t __i = 0; __i < __n; ++__i)
2175 __vp_[__1d_[__i]] &= __v[__i];
2176}
2177
2178template <class _Tp>
2179template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002180inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002181typename enable_if
2182<
2183 __is_val_expr<_Expr>::value,
2184 void
2185>::type
2186mask_array<_Tp>::operator|=(const _Expr& __v) const
2187{
2188 size_t __n = __1d_.size();
2189 for (size_t __i = 0; __i < __n; ++__i)
2190 __vp_[__1d_[__i]] |= __v[__i];
2191}
2192
2193template <class _Tp>
2194template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002195inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002196typename enable_if
2197<
2198 __is_val_expr<_Expr>::value,
2199 void
2200>::type
2201mask_array<_Tp>::operator<<=(const _Expr& __v) const
2202{
2203 size_t __n = __1d_.size();
2204 for (size_t __i = 0; __i < __n; ++__i)
2205 __vp_[__1d_[__i]] <<= __v[__i];
2206}
2207
2208template <class _Tp>
2209template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002210inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002211typename enable_if
2212<
2213 __is_val_expr<_Expr>::value,
2214 void
2215>::type
2216mask_array<_Tp>::operator>>=(const _Expr& __v) const
2217{
2218 size_t __n = __1d_.size();
2219 for (size_t __i = 0; __i < __n; ++__i)
2220 __vp_[__1d_[__i]] >>= __v[__i];
2221}
2222
2223template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002224inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002225const mask_array<_Tp>&
2226mask_array<_Tp>::operator=(const mask_array& __ma) const
2227{
2228 size_t __n = __1d_.size();
2229 for (size_t __i = 0; __i < __n; ++__i)
2230 __vp_[__1d_[__i]] = __ma.__vp_[__1d_[__i]];
Eric Fiselier3b80ce92014-08-12 00:06:58 +00002231 return *this;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002232}
2233
2234template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002235inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002236void
2237mask_array<_Tp>::operator=(const value_type& __x) const
2238{
2239 size_t __n = __1d_.size();
2240 for (size_t __i = 0; __i < __n; ++__i)
2241 __vp_[__1d_[__i]] = __x;
2242}
2243
2244template <class _ValExpr>
2245class __mask_expr
2246{
Nikolas Klauserc9e524e2022-09-06 00:33:34 +02002247 typedef __libcpp_remove_reference_t<_ValExpr> _RmExpr;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002248public:
2249 typedef typename _RmExpr::value_type value_type;
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002250 typedef value_type __result_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002251
2252private:
2253 _ValExpr __expr_;
2254 valarray<size_t> __1d_;
2255
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002256 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002257 __mask_expr(const valarray<bool>& __vb, const _RmExpr& __e)
2258 : __expr_(__e),
Howard Hinnant28b24882011-12-01 20:21:04 +00002259 __1d_(static_cast<size_t>(count(__vb.__begin_, __vb.__end_, true)))
Howard Hinnantc51e1022010-05-11 19:42:16 +00002260 {
2261 size_t __j = 0;
2262 for (size_t __i = 0; __i < __vb.size(); ++__i)
2263 if (__vb[__i])
2264 __1d_[__j++] = __i;
2265 }
2266
2267public:
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002268 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002269 __result_type operator[](size_t __i) const
Howard Hinnantc51e1022010-05-11 19:42:16 +00002270 {return __expr_[__1d_[__i]];}
2271
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002272 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002273 size_t size() const {return __1d_.size();}
2274
Eric Fiselier7b31ed02019-04-02 08:05:23 +00002275 template <class> friend class __val_expr;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002276 template <class> friend class valarray;
2277};
2278
2279// indirect_array
2280
2281template <class _Tp>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00002282class _LIBCPP_TEMPLATE_VIS indirect_array
Howard Hinnantc51e1022010-05-11 19:42:16 +00002283{
2284public:
2285 typedef _Tp value_type;
2286
2287private:
2288 value_type* __vp_;
2289 valarray<size_t> __1d_;
2290
2291public:
2292 template <class _Expr>
2293 typename enable_if
2294 <
2295 __is_val_expr<_Expr>::value,
2296 void
2297 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002298 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002299 operator=(const _Expr& __v) const;
2300
2301 template <class _Expr>
2302 typename enable_if
2303 <
2304 __is_val_expr<_Expr>::value,
2305 void
2306 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002307 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002308 operator*=(const _Expr& __v) const;
2309
2310 template <class _Expr>
2311 typename enable_if
2312 <
2313 __is_val_expr<_Expr>::value,
2314 void
2315 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002316 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002317 operator/=(const _Expr& __v) const;
2318
2319 template <class _Expr>
2320 typename enable_if
2321 <
2322 __is_val_expr<_Expr>::value,
2323 void
2324 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002325 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002326 operator%=(const _Expr& __v) const;
2327
2328 template <class _Expr>
2329 typename enable_if
2330 <
2331 __is_val_expr<_Expr>::value,
2332 void
2333 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002334 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002335 operator+=(const _Expr& __v) const;
2336
2337 template <class _Expr>
2338 typename enable_if
2339 <
2340 __is_val_expr<_Expr>::value,
2341 void
2342 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002343 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002344 operator-=(const _Expr& __v) const;
2345
2346 template <class _Expr>
2347 typename enable_if
2348 <
2349 __is_val_expr<_Expr>::value,
2350 void
2351 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002352 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002353 operator^=(const _Expr& __v) const;
2354
2355 template <class _Expr>
2356 typename enable_if
2357 <
2358 __is_val_expr<_Expr>::value,
2359 void
2360 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002361 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002362 operator&=(const _Expr& __v) const;
2363
2364 template <class _Expr>
2365 typename enable_if
2366 <
2367 __is_val_expr<_Expr>::value,
2368 void
2369 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002370 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002371 operator|=(const _Expr& __v) const;
2372
2373 template <class _Expr>
2374 typename enable_if
2375 <
2376 __is_val_expr<_Expr>::value,
2377 void
2378 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002379 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002380 operator<<=(const _Expr& __v) const;
2381
2382 template <class _Expr>
2383 typename enable_if
2384 <
2385 __is_val_expr<_Expr>::value,
2386 void
2387 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002388 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002389 operator>>=(const _Expr& __v) const;
2390
Eric Fiselierb9f37ca2019-12-12 20:48:11 -05002391 indirect_array(const indirect_array&) = default;
2392
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002393 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002394 const indirect_array& operator=(const indirect_array& __ia) const;
2395
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002396 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002397 void operator=(const value_type& __x) const;
2398
Howard Hinnantc51e1022010-05-11 19:42:16 +00002399private:
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002400 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002401 indirect_array(const valarray<size_t>& __ia, const valarray<value_type>& __v)
2402 : __vp_(const_cast<value_type*>(__v.__begin_)),
2403 __1d_(__ia)
2404 {}
2405
Eric Fiselier3b0b81f2017-04-19 00:23:45 +00002406#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00002407
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002408 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002409 indirect_array(valarray<size_t>&& __ia, const valarray<value_type>& __v)
2410 : __vp_(const_cast<value_type*>(__v.__begin_)),
Corentin Jabotcfb8a912022-02-24 19:54:00 -05002411 __1d_(std::move(__ia))
Howard Hinnantc51e1022010-05-11 19:42:16 +00002412 {}
2413
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002414#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00002415
2416 template <class> friend class valarray;
2417};
2418
2419template <class _Tp>
2420template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002421inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002422typename enable_if
2423<
2424 __is_val_expr<_Expr>::value,
2425 void
2426>::type
2427indirect_array<_Tp>::operator=(const _Expr& __v) const
2428{
2429 size_t __n = __1d_.size();
2430 for (size_t __i = 0; __i < __n; ++__i)
2431 __vp_[__1d_[__i]] = __v[__i];
2432}
2433
2434template <class _Tp>
2435template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002436inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002437typename enable_if
2438<
2439 __is_val_expr<_Expr>::value,
2440 void
2441>::type
2442indirect_array<_Tp>::operator*=(const _Expr& __v) const
2443{
2444 size_t __n = __1d_.size();
2445 for (size_t __i = 0; __i < __n; ++__i)
2446 __vp_[__1d_[__i]] *= __v[__i];
2447}
2448
2449template <class _Tp>
2450template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002451inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002452typename enable_if
2453<
2454 __is_val_expr<_Expr>::value,
2455 void
2456>::type
2457indirect_array<_Tp>::operator/=(const _Expr& __v) const
2458{
2459 size_t __n = __1d_.size();
2460 for (size_t __i = 0; __i < __n; ++__i)
2461 __vp_[__1d_[__i]] /= __v[__i];
2462}
2463
2464template <class _Tp>
2465template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002466inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002467typename enable_if
2468<
2469 __is_val_expr<_Expr>::value,
2470 void
2471>::type
2472indirect_array<_Tp>::operator%=(const _Expr& __v) const
2473{
2474 size_t __n = __1d_.size();
2475 for (size_t __i = 0; __i < __n; ++__i)
2476 __vp_[__1d_[__i]] %= __v[__i];
2477}
2478
2479template <class _Tp>
2480template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002481inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002482typename enable_if
2483<
2484 __is_val_expr<_Expr>::value,
2485 void
2486>::type
2487indirect_array<_Tp>::operator+=(const _Expr& __v) const
2488{
2489 size_t __n = __1d_.size();
2490 for (size_t __i = 0; __i < __n; ++__i)
2491 __vp_[__1d_[__i]] += __v[__i];
2492}
2493
2494template <class _Tp>
2495template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002496inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002497typename enable_if
2498<
2499 __is_val_expr<_Expr>::value,
2500 void
2501>::type
2502indirect_array<_Tp>::operator-=(const _Expr& __v) const
2503{
2504 size_t __n = __1d_.size();
2505 for (size_t __i = 0; __i < __n; ++__i)
2506 __vp_[__1d_[__i]] -= __v[__i];
2507}
2508
2509template <class _Tp>
2510template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002511inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002512typename enable_if
2513<
2514 __is_val_expr<_Expr>::value,
2515 void
2516>::type
2517indirect_array<_Tp>::operator^=(const _Expr& __v) const
2518{
2519 size_t __n = __1d_.size();
2520 for (size_t __i = 0; __i < __n; ++__i)
2521 __vp_[__1d_[__i]] ^= __v[__i];
2522}
2523
2524template <class _Tp>
2525template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002526inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002527typename enable_if
2528<
2529 __is_val_expr<_Expr>::value,
2530 void
2531>::type
2532indirect_array<_Tp>::operator&=(const _Expr& __v) const
2533{
2534 size_t __n = __1d_.size();
2535 for (size_t __i = 0; __i < __n; ++__i)
2536 __vp_[__1d_[__i]] &= __v[__i];
2537}
2538
2539template <class _Tp>
2540template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002541inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002542typename enable_if
2543<
2544 __is_val_expr<_Expr>::value,
2545 void
2546>::type
2547indirect_array<_Tp>::operator|=(const _Expr& __v) const
2548{
2549 size_t __n = __1d_.size();
2550 for (size_t __i = 0; __i < __n; ++__i)
2551 __vp_[__1d_[__i]] |= __v[__i];
2552}
2553
2554template <class _Tp>
2555template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002556inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002557typename enable_if
2558<
2559 __is_val_expr<_Expr>::value,
2560 void
2561>::type
2562indirect_array<_Tp>::operator<<=(const _Expr& __v) const
2563{
2564 size_t __n = __1d_.size();
2565 for (size_t __i = 0; __i < __n; ++__i)
2566 __vp_[__1d_[__i]] <<= __v[__i];
2567}
2568
2569template <class _Tp>
2570template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002571inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002572typename enable_if
2573<
2574 __is_val_expr<_Expr>::value,
2575 void
2576>::type
2577indirect_array<_Tp>::operator>>=(const _Expr& __v) const
2578{
2579 size_t __n = __1d_.size();
2580 for (size_t __i = 0; __i < __n; ++__i)
2581 __vp_[__1d_[__i]] >>= __v[__i];
2582}
2583
2584template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002585inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002586const indirect_array<_Tp>&
2587indirect_array<_Tp>::operator=(const indirect_array& __ia) const
2588{
2589 typedef const size_t* _Ip;
2590 const value_type* __s = __ia.__vp_;
2591 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_, __j = __ia.__1d_.__begin_;
2592 __i != __e; ++__i, ++__j)
2593 __vp_[*__i] = __s[*__j];
2594 return *this;
2595}
2596
2597template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002598inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002599void
2600indirect_array<_Tp>::operator=(const value_type& __x) const
2601{
2602 typedef const size_t* _Ip;
2603 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i)
2604 __vp_[*__i] = __x;
2605}
2606
2607template <class _ValExpr>
2608class __indirect_expr
2609{
Nikolas Klauserc9e524e2022-09-06 00:33:34 +02002610 typedef __libcpp_remove_reference_t<_ValExpr> _RmExpr;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002611public:
2612 typedef typename _RmExpr::value_type value_type;
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002613 typedef value_type __result_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002614
2615private:
2616 _ValExpr __expr_;
2617 valarray<size_t> __1d_;
2618
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002619 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002620 __indirect_expr(const valarray<size_t>& __ia, const _RmExpr& __e)
2621 : __expr_(__e),
2622 __1d_(__ia)
2623 {}
2624
Eric Fiselier3b0b81f2017-04-19 00:23:45 +00002625#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00002626
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002627 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002628 __indirect_expr(valarray<size_t>&& __ia, const _RmExpr& __e)
2629 : __expr_(__e),
Corentin Jabotcfb8a912022-02-24 19:54:00 -05002630 __1d_(std::move(__ia))
Howard Hinnantc51e1022010-05-11 19:42:16 +00002631 {}
2632
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002633#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00002634
2635public:
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002636 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002637 __result_type operator[](size_t __i) const
Howard Hinnantc51e1022010-05-11 19:42:16 +00002638 {return __expr_[__1d_[__i]];}
2639
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002640 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002641 size_t size() const {return __1d_.size();}
2642
Eric Fiselier7b31ed02019-04-02 08:05:23 +00002643 template <class> friend class __val_expr;
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00002644 template <class> friend class _LIBCPP_TEMPLATE_VIS valarray;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002645};
2646
2647template<class _ValExpr>
2648class __val_expr
2649{
Nikolas Klauserc9e524e2022-09-06 00:33:34 +02002650 typedef __libcpp_remove_reference_t<_ValExpr> _RmExpr;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002651
2652 _ValExpr __expr_;
2653public:
2654 typedef typename _RmExpr::value_type value_type;
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002655 typedef typename _RmExpr::__result_type __result_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002656
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002657 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002658 explicit __val_expr(const _RmExpr& __e) : __expr_(__e) {}
2659
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002660 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002661 __result_type operator[](size_t __i) const
Howard Hinnantc51e1022010-05-11 19:42:16 +00002662 {return __expr_[__i];}
2663
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002664 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002665 __val_expr<__slice_expr<_ValExpr> > operator[](slice __s) const
Eric Fiselier7b31ed02019-04-02 08:05:23 +00002666 {
2667 typedef __slice_expr<_ValExpr> _NewExpr;
2668 return __val_expr< _NewExpr >(_NewExpr(__s, __expr_));
2669 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00002670
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002671 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002672 __val_expr<__indirect_expr<_ValExpr> > operator[](const gslice& __gs) const
Eric Fiselier7b31ed02019-04-02 08:05:23 +00002673 {
2674 typedef __indirect_expr<_ValExpr> _NewExpr;
2675 return __val_expr<_NewExpr >(_NewExpr(__gs.__1d_, __expr_));
2676 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00002677
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002678 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002679 __val_expr<__mask_expr<_ValExpr> > operator[](const valarray<bool>& __vb) const
Eric Fiselier7b31ed02019-04-02 08:05:23 +00002680 {
2681 typedef __mask_expr<_ValExpr> _NewExpr;
2682 return __val_expr< _NewExpr >( _NewExpr(__vb, __expr_));
2683 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00002684
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002685 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002686 __val_expr<__indirect_expr<_ValExpr> > operator[](const valarray<size_t>& __vs) const
Eric Fiselier7b31ed02019-04-02 08:05:23 +00002687 {
2688 typedef __indirect_expr<_ValExpr> _NewExpr;
2689 return __val_expr< _NewExpr >(_NewExpr(__vs, __expr_));
2690 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00002691
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002692 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002693 __val_expr<_UnaryOp<__unary_plus<value_type>, _ValExpr> >
2694 operator+() const
2695 {
2696 typedef _UnaryOp<__unary_plus<value_type>, _ValExpr> _NewExpr;
2697 return __val_expr<_NewExpr>(_NewExpr(__unary_plus<value_type>(), __expr_));
2698 }
2699
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002700 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002701 __val_expr<_UnaryOp<negate<value_type>, _ValExpr> >
2702 operator-() const
2703 {
2704 typedef _UnaryOp<negate<value_type>, _ValExpr> _NewExpr;
2705 return __val_expr<_NewExpr>(_NewExpr(negate<value_type>(), __expr_));
2706 }
2707
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002708 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002709 __val_expr<_UnaryOp<__bit_not<value_type>, _ValExpr> >
2710 operator~() const
2711 {
2712 typedef _UnaryOp<__bit_not<value_type>, _ValExpr> _NewExpr;
2713 return __val_expr<_NewExpr>(_NewExpr(__bit_not<value_type>(), __expr_));
2714 }
2715
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002716 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002717 __val_expr<_UnaryOp<logical_not<value_type>, _ValExpr> >
2718 operator!() const
2719 {
2720 typedef _UnaryOp<logical_not<value_type>, _ValExpr> _NewExpr;
2721 return __val_expr<_NewExpr>(_NewExpr(logical_not<value_type>(), __expr_));
2722 }
2723
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002724 operator valarray<__result_type>() const;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002725
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002726 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002727 size_t size() const {return __expr_.size();}
2728
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002729 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002730 __result_type sum() const
Howard Hinnantc51e1022010-05-11 19:42:16 +00002731 {
2732 size_t __n = __expr_.size();
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002733 __result_type __r = __n ? __expr_[0] : __result_type();
Howard Hinnantc51e1022010-05-11 19:42:16 +00002734 for (size_t __i = 1; __i < __n; ++__i)
2735 __r += __expr_[__i];
2736 return __r;
2737 }
2738
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002739 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002740 __result_type min() const
Howard Hinnantc51e1022010-05-11 19:42:16 +00002741 {
2742 size_t __n = size();
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002743 __result_type __r = __n ? (*this)[0] : __result_type();
Howard Hinnantc51e1022010-05-11 19:42:16 +00002744 for (size_t __i = 1; __i < __n; ++__i)
2745 {
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002746 __result_type __x = __expr_[__i];
Howard Hinnantc51e1022010-05-11 19:42:16 +00002747 if (__x < __r)
2748 __r = __x;
2749 }
2750 return __r;
2751 }
2752
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002753 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002754 __result_type max() const
Howard Hinnantc51e1022010-05-11 19:42:16 +00002755 {
2756 size_t __n = size();
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002757 __result_type __r = __n ? (*this)[0] : __result_type();
Howard Hinnantc51e1022010-05-11 19:42:16 +00002758 for (size_t __i = 1; __i < __n; ++__i)
2759 {
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002760 __result_type __x = __expr_[__i];
Howard Hinnantc51e1022010-05-11 19:42:16 +00002761 if (__r < __x)
2762 __r = __x;
2763 }
2764 return __r;
2765 }
2766
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002767 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002768 __val_expr<__shift_expr<_ValExpr> > shift (int __i) const
2769 {return __val_expr<__shift_expr<_ValExpr> >(__shift_expr<_ValExpr>(__i, __expr_));}
2770
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002771 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002772 __val_expr<__cshift_expr<_ValExpr> > cshift(int __i) const
2773 {return __val_expr<__cshift_expr<_ValExpr> >(__cshift_expr<_ValExpr>(__i, __expr_));}
2774
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002775 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002776 __val_expr<_UnaryOp<__apply_expr<value_type, value_type(*)(value_type)>, _ValExpr> >
2777 apply(value_type __f(value_type)) const
2778 {
2779 typedef __apply_expr<value_type, value_type(*)(value_type)> _Op;
2780 typedef _UnaryOp<_Op, _ValExpr> _NewExpr;
2781 return __val_expr<_NewExpr>(_NewExpr(_Op(__f), __expr_));
2782 }
2783
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002784 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002785 __val_expr<_UnaryOp<__apply_expr<value_type, value_type(*)(const value_type&)>, _ValExpr> >
2786 apply(value_type __f(const value_type&)) const
2787 {
2788 typedef __apply_expr<value_type, value_type(*)(const value_type&)> _Op;
2789 typedef _UnaryOp<_Op, _ValExpr> _NewExpr;
2790 return __val_expr<_NewExpr>(_NewExpr(_Op(__f), __expr_));
2791 }
2792};
2793
2794template<class _ValExpr>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002795__val_expr<_ValExpr>::operator valarray<__val_expr::__result_type>() const
Howard Hinnantc51e1022010-05-11 19:42:16 +00002796{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002797 valarray<__result_type> __r;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002798 size_t __n = __expr_.size();
2799 if (__n)
2800 {
2801 __r.__begin_ =
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002802 __r.__end_ = allocator<__result_type>().allocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002803 for (size_t __i = 0; __i != __n; ++__r.__end_, ++__i)
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002804 ::new ((void*)__r.__end_) __result_type(__expr_[__i]);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002805 }
2806 return __r;
2807}
2808
2809// valarray
2810
2811template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002812inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002813valarray<_Tp>::valarray(size_t __n)
Bruce Mitchener170d8972020-11-24 12:53:53 -05002814 : __begin_(nullptr),
2815 __end_(nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002816{
Mikhail Maltsev59de6f82018-02-08 11:33:48 +00002817 if (__n)
2818 {
Louis Dionne5ffe5152020-09-28 15:47:49 -04002819 __begin_ = __end_ = allocator<value_type>().allocate(__n);
Mikhail Maltsev59de6f82018-02-08 11:33:48 +00002820#ifndef _LIBCPP_NO_EXCEPTIONS
2821 try
2822 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002823#endif // _LIBCPP_NO_EXCEPTIONS
Eric Fiselier2856ef82018-10-25 17:21:30 +00002824 for (size_t __n_left = __n; __n_left; --__n_left, ++__end_)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05002825 ::new ((void*)__end_) value_type();
Mikhail Maltsev59de6f82018-02-08 11:33:48 +00002826#ifndef _LIBCPP_NO_EXCEPTIONS
2827 }
2828 catch (...)
2829 {
Eric Fiselier2856ef82018-10-25 17:21:30 +00002830 __clear(__n);
Mikhail Maltsev59de6f82018-02-08 11:33:48 +00002831 throw;
2832 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002833#endif // _LIBCPP_NO_EXCEPTIONS
Mikhail Maltsev59de6f82018-02-08 11:33:48 +00002834 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00002835}
2836
2837template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002838inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002839valarray<_Tp>::valarray(const value_type& __x, size_t __n)
Bruce Mitchener170d8972020-11-24 12:53:53 -05002840 : __begin_(nullptr),
2841 __end_(nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002842{
2843 resize(__n, __x);
2844}
2845
2846template <class _Tp>
2847valarray<_Tp>::valarray(const value_type* __p, size_t __n)
Bruce Mitchener170d8972020-11-24 12:53:53 -05002848 : __begin_(nullptr),
2849 __end_(nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002850{
2851 if (__n)
2852 {
Louis Dionne5ffe5152020-09-28 15:47:49 -04002853 __begin_ = __end_ = allocator<value_type>().allocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002854#ifndef _LIBCPP_NO_EXCEPTIONS
2855 try
2856 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002857#endif // _LIBCPP_NO_EXCEPTIONS
Eric Fiselier2856ef82018-10-25 17:21:30 +00002858 for (size_t __n_left = __n; __n_left; ++__end_, ++__p, --__n_left)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05002859 ::new ((void*)__end_) value_type(*__p);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002860#ifndef _LIBCPP_NO_EXCEPTIONS
2861 }
2862 catch (...)
2863 {
Eric Fiselier2856ef82018-10-25 17:21:30 +00002864 __clear(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002865 throw;
2866 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002867#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00002868 }
2869}
2870
2871template <class _Tp>
2872valarray<_Tp>::valarray(const valarray& __v)
Bruce Mitchener170d8972020-11-24 12:53:53 -05002873 : __begin_(nullptr),
2874 __end_(nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002875{
2876 if (__v.size())
2877 {
Louis Dionne5ffe5152020-09-28 15:47:49 -04002878 __begin_ = __end_ = allocator<value_type>().allocate(__v.size());
Howard Hinnantc51e1022010-05-11 19:42:16 +00002879#ifndef _LIBCPP_NO_EXCEPTIONS
2880 try
2881 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002882#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00002883 for (value_type* __p = __v.__begin_; __p != __v.__end_; ++__end_, ++__p)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05002884 ::new ((void*)__end_) value_type(*__p);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002885#ifndef _LIBCPP_NO_EXCEPTIONS
2886 }
2887 catch (...)
2888 {
Eric Fiselier2856ef82018-10-25 17:21:30 +00002889 __clear(__v.size());
Howard Hinnantc51e1022010-05-11 19:42:16 +00002890 throw;
2891 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002892#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00002893 }
2894}
2895
Eric Fiselier3b0b81f2017-04-19 00:23:45 +00002896#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00002897
2898template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002899inline
Howard Hinnant298aed92012-07-21 00:51:28 +00002900valarray<_Tp>::valarray(valarray&& __v) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00002901 : __begin_(__v.__begin_),
2902 __end_(__v.__end_)
2903{
2904 __v.__begin_ = __v.__end_ = nullptr;
2905}
2906
2907template <class _Tp>
2908valarray<_Tp>::valarray(initializer_list<value_type> __il)
Bruce Mitchener170d8972020-11-24 12:53:53 -05002909 : __begin_(nullptr),
2910 __end_(nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002911{
Eric Fiselier2856ef82018-10-25 17:21:30 +00002912 const size_t __n = __il.size();
Howard Hinnantc51e1022010-05-11 19:42:16 +00002913 if (__n)
2914 {
Louis Dionne5ffe5152020-09-28 15:47:49 -04002915 __begin_ = __end_ = allocator<value_type>().allocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002916#ifndef _LIBCPP_NO_EXCEPTIONS
2917 try
2918 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002919#endif // _LIBCPP_NO_EXCEPTIONS
Eric Fiselier2856ef82018-10-25 17:21:30 +00002920 size_t __n_left = __n;
2921 for (const value_type* __p = __il.begin(); __n_left; ++__end_, ++__p, --__n_left)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05002922 ::new ((void*)__end_) value_type(*__p);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002923#ifndef _LIBCPP_NO_EXCEPTIONS
2924 }
2925 catch (...)
2926 {
Eric Fiselier2856ef82018-10-25 17:21:30 +00002927 __clear(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002928 throw;
2929 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002930#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00002931 }
2932}
2933
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002934#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00002935
2936template <class _Tp>
2937valarray<_Tp>::valarray(const slice_array<value_type>& __sa)
Bruce Mitchener170d8972020-11-24 12:53:53 -05002938 : __begin_(nullptr),
2939 __end_(nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002940{
Eric Fiselier2856ef82018-10-25 17:21:30 +00002941 const size_t __n = __sa.__size_;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002942 if (__n)
2943 {
Louis Dionne5ffe5152020-09-28 15:47:49 -04002944 __begin_ = __end_ = allocator<value_type>().allocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002945#ifndef _LIBCPP_NO_EXCEPTIONS
2946 try
2947 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002948#endif // _LIBCPP_NO_EXCEPTIONS
Eric Fiselier2856ef82018-10-25 17:21:30 +00002949 size_t __n_left = __n;
2950 for (const value_type* __p = __sa.__vp_; __n_left; ++__end_, __p += __sa.__stride_, --__n_left)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05002951 ::new ((void*)__end_) value_type(*__p);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002952#ifndef _LIBCPP_NO_EXCEPTIONS
2953 }
2954 catch (...)
2955 {
Eric Fiselier2856ef82018-10-25 17:21:30 +00002956 __clear(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002957 throw;
2958 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002959#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00002960 }
2961}
2962
2963template <class _Tp>
2964valarray<_Tp>::valarray(const gslice_array<value_type>& __ga)
Bruce Mitchener170d8972020-11-24 12:53:53 -05002965 : __begin_(nullptr),
2966 __end_(nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002967{
Eric Fiselier2856ef82018-10-25 17:21:30 +00002968 const size_t __n = __ga.__1d_.size();
Howard Hinnantc51e1022010-05-11 19:42:16 +00002969 if (__n)
2970 {
Louis Dionne5ffe5152020-09-28 15:47:49 -04002971 __begin_ = __end_ = allocator<value_type>().allocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002972#ifndef _LIBCPP_NO_EXCEPTIONS
2973 try
2974 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002975#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00002976 typedef const size_t* _Ip;
2977 const value_type* __s = __ga.__vp_;
2978 for (_Ip __i = __ga.__1d_.__begin_, __e = __ga.__1d_.__end_;
2979 __i != __e; ++__i, ++__end_)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05002980 ::new ((void*)__end_) value_type(__s[*__i]);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002981#ifndef _LIBCPP_NO_EXCEPTIONS
2982 }
2983 catch (...)
2984 {
Eric Fiselier2856ef82018-10-25 17:21:30 +00002985 __clear(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002986 throw;
2987 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002988#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00002989 }
2990}
2991
2992template <class _Tp>
2993valarray<_Tp>::valarray(const mask_array<value_type>& __ma)
Bruce Mitchener170d8972020-11-24 12:53:53 -05002994 : __begin_(nullptr),
2995 __end_(nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002996{
Eric Fiselier2856ef82018-10-25 17:21:30 +00002997 const size_t __n = __ma.__1d_.size();
Howard Hinnantc51e1022010-05-11 19:42:16 +00002998 if (__n)
2999 {
Louis Dionne5ffe5152020-09-28 15:47:49 -04003000 __begin_ = __end_ = allocator<value_type>().allocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003001#ifndef _LIBCPP_NO_EXCEPTIONS
3002 try
3003 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04003004#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00003005 typedef const size_t* _Ip;
3006 const value_type* __s = __ma.__vp_;
3007 for (_Ip __i = __ma.__1d_.__begin_, __e = __ma.__1d_.__end_;
3008 __i != __e; ++__i, ++__end_)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05003009 ::new ((void*)__end_) value_type(__s[*__i]);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003010#ifndef _LIBCPP_NO_EXCEPTIONS
3011 }
3012 catch (...)
3013 {
Eric Fiselier2856ef82018-10-25 17:21:30 +00003014 __clear(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003015 throw;
3016 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04003017#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00003018 }
3019}
3020
3021template <class _Tp>
3022valarray<_Tp>::valarray(const indirect_array<value_type>& __ia)
Bruce Mitchener170d8972020-11-24 12:53:53 -05003023 : __begin_(nullptr),
3024 __end_(nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00003025{
Eric Fiselier2856ef82018-10-25 17:21:30 +00003026 const size_t __n = __ia.__1d_.size();
Howard Hinnantc51e1022010-05-11 19:42:16 +00003027 if (__n)
3028 {
Louis Dionne5ffe5152020-09-28 15:47:49 -04003029 __begin_ = __end_ = allocator<value_type>().allocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003030#ifndef _LIBCPP_NO_EXCEPTIONS
3031 try
3032 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04003033#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00003034 typedef const size_t* _Ip;
3035 const value_type* __s = __ia.__vp_;
3036 for (_Ip __i = __ia.__1d_.__begin_, __e = __ia.__1d_.__end_;
3037 __i != __e; ++__i, ++__end_)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05003038 ::new ((void*)__end_) value_type(__s[*__i]);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003039#ifndef _LIBCPP_NO_EXCEPTIONS
3040 }
3041 catch (...)
3042 {
Eric Fiselier2856ef82018-10-25 17:21:30 +00003043 __clear(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003044 throw;
3045 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04003046#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00003047 }
3048}
3049
3050template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003051inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003052valarray<_Tp>::~valarray()
3053{
Eric Fiselier2856ef82018-10-25 17:21:30 +00003054 __clear(size());
Mikhail Maltsev59de6f82018-02-08 11:33:48 +00003055}
3056
3057template <class _Tp>
3058valarray<_Tp>&
3059valarray<_Tp>::__assign_range(const value_type* __f, const value_type* __l)
3060{
3061 size_t __n = __l - __f;
3062 if (size() != __n)
3063 {
Eric Fiselier2856ef82018-10-25 17:21:30 +00003064 __clear(size());
Louis Dionne5ffe5152020-09-28 15:47:49 -04003065 __begin_ = allocator<value_type>().allocate(__n);
Mikhail Maltsev59de6f82018-02-08 11:33:48 +00003066 __end_ = __begin_ + __n;
3067 _VSTD::uninitialized_copy(__f, __l, __begin_);
3068 } else {
3069 _VSTD::copy(__f, __l, __begin_);
3070 }
3071 return *this;
Howard Hinnantc51e1022010-05-11 19:42:16 +00003072}
3073
3074template <class _Tp>
3075valarray<_Tp>&
3076valarray<_Tp>::operator=(const valarray& __v)
3077{
Mark de Wever357a1fc2021-09-28 19:15:18 +02003078 if (this != _VSTD::addressof(__v))
Mikhail Maltsev59de6f82018-02-08 11:33:48 +00003079 return __assign_range(__v.__begin_, __v.__end_);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003080 return *this;
3081}
3082
Eric Fiselier3b0b81f2017-04-19 00:23:45 +00003083#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00003084
3085template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003086inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003087valarray<_Tp>&
Howard Hinnant298aed92012-07-21 00:51:28 +00003088valarray<_Tp>::operator=(valarray&& __v) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00003089{
Eric Fiselier2856ef82018-10-25 17:21:30 +00003090 __clear(size());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003091 __begin_ = __v.__begin_;
3092 __end_ = __v.__end_;
3093 __v.__begin_ = nullptr;
3094 __v.__end_ = nullptr;
3095 return *this;
3096}
3097
3098template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003099inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003100valarray<_Tp>&
3101valarray<_Tp>::operator=(initializer_list<value_type> __il)
3102{
Mikhail Maltsev59de6f82018-02-08 11:33:48 +00003103 return __assign_range(__il.begin(), __il.end());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003104}
3105
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04003106#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00003107
3108template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003109inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003110valarray<_Tp>&
3111valarray<_Tp>::operator=(const value_type& __x)
3112{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003113 _VSTD::fill(__begin_, __end_, __x);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003114 return *this;
3115}
3116
3117template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003118inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003119valarray<_Tp>&
3120valarray<_Tp>::operator=(const slice_array<value_type>& __sa)
3121{
3122 value_type* __t = __begin_;
3123 const value_type* __s = __sa.__vp_;
3124 for (size_t __n = __sa.__size_; __n; --__n, __s += __sa.__stride_, ++__t)
3125 *__t = *__s;
3126 return *this;
3127}
3128
3129template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003130inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003131valarray<_Tp>&
3132valarray<_Tp>::operator=(const gslice_array<value_type>& __ga)
3133{
3134 typedef const size_t* _Ip;
3135 value_type* __t = __begin_;
3136 const value_type* __s = __ga.__vp_;
3137 for (_Ip __i = __ga.__1d_.__begin_, __e = __ga.__1d_.__end_;
3138 __i != __e; ++__i, ++__t)
3139 *__t = __s[*__i];
3140 return *this;
3141}
3142
3143template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003144inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003145valarray<_Tp>&
3146valarray<_Tp>::operator=(const mask_array<value_type>& __ma)
3147{
3148 typedef const size_t* _Ip;
3149 value_type* __t = __begin_;
3150 const value_type* __s = __ma.__vp_;
3151 for (_Ip __i = __ma.__1d_.__begin_, __e = __ma.__1d_.__end_;
3152 __i != __e; ++__i, ++__t)
3153 *__t = __s[*__i];
3154 return *this;
3155}
3156
3157template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003158inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003159valarray<_Tp>&
3160valarray<_Tp>::operator=(const indirect_array<value_type>& __ia)
3161{
3162 typedef const size_t* _Ip;
3163 value_type* __t = __begin_;
3164 const value_type* __s = __ia.__vp_;
3165 for (_Ip __i = __ia.__1d_.__begin_, __e = __ia.__1d_.__end_;
3166 __i != __e; ++__i, ++__t)
3167 *__t = __s[*__i];
3168 return *this;
3169}
3170
3171template <class _Tp>
Howard Hinnant329cd412011-07-27 23:19:59 +00003172template <class _ValExpr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003173inline
Howard Hinnant329cd412011-07-27 23:19:59 +00003174valarray<_Tp>&
3175valarray<_Tp>::operator=(const __val_expr<_ValExpr>& __v)
3176{
3177 size_t __n = __v.size();
3178 if (size() != __n)
3179 resize(__n);
3180 value_type* __t = __begin_;
3181 for (size_t __i = 0; __i != __n; ++__t, ++__i)
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04003182 *__t = __result_type(__v[__i]);
Howard Hinnant329cd412011-07-27 23:19:59 +00003183 return *this;
3184}
3185
3186template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003187inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003188__val_expr<__slice_expr<const valarray<_Tp>&> >
3189valarray<_Tp>::operator[](slice __s) const
3190{
3191 return __val_expr<__slice_expr<const valarray&> >(__slice_expr<const valarray&>(__s, *this));
3192}
3193
3194template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003195inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003196slice_array<_Tp>
3197valarray<_Tp>::operator[](slice __s)
3198{
3199 return slice_array<value_type>(__s, *this);
3200}
3201
3202template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003203inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003204__val_expr<__indirect_expr<const valarray<_Tp>&> >
3205valarray<_Tp>::operator[](const gslice& __gs) const
3206{
3207 return __val_expr<__indirect_expr<const valarray&> >(__indirect_expr<const valarray&>(__gs.__1d_, *this));
3208}
3209
3210template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003211inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003212gslice_array<_Tp>
3213valarray<_Tp>::operator[](const gslice& __gs)
3214{
3215 return gslice_array<value_type>(__gs, *this);
3216}
3217
Eric Fiselier3b0b81f2017-04-19 00:23:45 +00003218#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00003219
3220template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003221inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003222__val_expr<__indirect_expr<const valarray<_Tp>&> >
3223valarray<_Tp>::operator[](gslice&& __gs) const
3224{
Corentin Jabotcfb8a912022-02-24 19:54:00 -05003225 return __val_expr<__indirect_expr<const valarray&> >(__indirect_expr<const valarray&>(std::move(__gs.__1d_), *this));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003226}
3227
3228template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003229inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003230gslice_array<_Tp>
3231valarray<_Tp>::operator[](gslice&& __gs)
3232{
Corentin Jabotcfb8a912022-02-24 19:54:00 -05003233 return gslice_array<value_type>(std::move(__gs), *this);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003234}
3235
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04003236#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00003237
3238template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003239inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003240__val_expr<__mask_expr<const valarray<_Tp>&> >
3241valarray<_Tp>::operator[](const valarray<bool>& __vb) const
3242{
3243 return __val_expr<__mask_expr<const valarray&> >(__mask_expr<const valarray&>(__vb, *this));
3244}
3245
3246template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003247inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003248mask_array<_Tp>
3249valarray<_Tp>::operator[](const valarray<bool>& __vb)
3250{
3251 return mask_array<value_type>(__vb, *this);
3252}
3253
Eric Fiselier3b0b81f2017-04-19 00:23:45 +00003254#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00003255
3256template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003257inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003258__val_expr<__mask_expr<const valarray<_Tp>&> >
3259valarray<_Tp>::operator[](valarray<bool>&& __vb) const
3260{
Corentin Jabotcfb8a912022-02-24 19:54:00 -05003261 return __val_expr<__mask_expr<const valarray&> >(__mask_expr<const valarray&>(std::move(__vb), *this));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003262}
3263
3264template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003265inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003266mask_array<_Tp>
3267valarray<_Tp>::operator[](valarray<bool>&& __vb)
3268{
Corentin Jabotcfb8a912022-02-24 19:54:00 -05003269 return mask_array<value_type>(std::move(__vb), *this);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003270}
3271
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04003272#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00003273
3274template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003275inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003276__val_expr<__indirect_expr<const valarray<_Tp>&> >
3277valarray<_Tp>::operator[](const valarray<size_t>& __vs) const
3278{
3279 return __val_expr<__indirect_expr<const valarray&> >(__indirect_expr<const valarray&>(__vs, *this));
3280}
3281
3282template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003283inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003284indirect_array<_Tp>
3285valarray<_Tp>::operator[](const valarray<size_t>& __vs)
3286{
3287 return indirect_array<value_type>(__vs, *this);
3288}
3289
Eric Fiselier3b0b81f2017-04-19 00:23:45 +00003290#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00003291
3292template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003293inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003294__val_expr<__indirect_expr<const valarray<_Tp>&> >
3295valarray<_Tp>::operator[](valarray<size_t>&& __vs) const
3296{
Corentin Jabotcfb8a912022-02-24 19:54:00 -05003297 return __val_expr<__indirect_expr<const valarray&> >(__indirect_expr<const valarray&>(std::move(__vs), *this));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003298}
3299
3300template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003301inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003302indirect_array<_Tp>
3303valarray<_Tp>::operator[](valarray<size_t>&& __vs)
3304{
Corentin Jabotcfb8a912022-02-24 19:54:00 -05003305 return indirect_array<value_type>(std::move(__vs), *this);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003306}
3307
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04003308#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00003309
3310template <class _Tp>
Louis Dionne12a2e572022-05-05 12:24:43 -04003311inline
3312__val_expr<_UnaryOp<__unary_plus<_Tp>, const valarray<_Tp>&> >
Howard Hinnantc51e1022010-05-11 19:42:16 +00003313valarray<_Tp>::operator+() const
3314{
Louis Dionne12a2e572022-05-05 12:24:43 -04003315 using _Op = _UnaryOp<__unary_plus<_Tp>, const valarray<_Tp>&>;
3316 return __val_expr<_Op>(_Op(__unary_plus<_Tp>(), *this));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003317}
3318
3319template <class _Tp>
Louis Dionne12a2e572022-05-05 12:24:43 -04003320inline
3321__val_expr<_UnaryOp<negate<_Tp>, const valarray<_Tp>&> >
Howard Hinnantc51e1022010-05-11 19:42:16 +00003322valarray<_Tp>::operator-() const
3323{
Louis Dionne12a2e572022-05-05 12:24:43 -04003324 using _Op = _UnaryOp<negate<_Tp>, const valarray<_Tp>&>;
3325 return __val_expr<_Op>(_Op(negate<_Tp>(), *this));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003326}
3327
3328template <class _Tp>
Louis Dionne12a2e572022-05-05 12:24:43 -04003329inline
3330__val_expr<_UnaryOp<__bit_not<_Tp>, const valarray<_Tp>&> >
Howard Hinnantc51e1022010-05-11 19:42:16 +00003331valarray<_Tp>::operator~() const
3332{
Louis Dionne12a2e572022-05-05 12:24:43 -04003333 using _Op = _UnaryOp<__bit_not<_Tp>, const valarray<_Tp>&>;
3334 return __val_expr<_Op>(_Op(__bit_not<_Tp>(), *this));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003335}
3336
3337template <class _Tp>
Louis Dionne12a2e572022-05-05 12:24:43 -04003338inline
3339__val_expr<_UnaryOp<logical_not<_Tp>, const valarray<_Tp>&> >
Howard Hinnantc51e1022010-05-11 19:42:16 +00003340valarray<_Tp>::operator!() const
3341{
Louis Dionne12a2e572022-05-05 12:24:43 -04003342 using _Op = _UnaryOp<logical_not<_Tp>, const valarray<_Tp>&>;
3343 return __val_expr<_Op>(_Op(logical_not<_Tp>(), *this));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003344}
3345
3346template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003347inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003348valarray<_Tp>&
3349valarray<_Tp>::operator*=(const value_type& __x)
3350{
3351 for (value_type* __p = __begin_; __p != __end_; ++__p)
3352 *__p *= __x;
3353 return *this;
3354}
3355
3356template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003357inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003358valarray<_Tp>&
3359valarray<_Tp>::operator/=(const value_type& __x)
3360{
3361 for (value_type* __p = __begin_; __p != __end_; ++__p)
3362 *__p /= __x;
3363 return *this;
3364}
3365
3366template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003367inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003368valarray<_Tp>&
3369valarray<_Tp>::operator%=(const value_type& __x)
3370{
3371 for (value_type* __p = __begin_; __p != __end_; ++__p)
3372 *__p %= __x;
3373 return *this;
3374}
3375
3376template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003377inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003378valarray<_Tp>&
3379valarray<_Tp>::operator+=(const value_type& __x)
3380{
3381 for (value_type* __p = __begin_; __p != __end_; ++__p)
3382 *__p += __x;
3383 return *this;
3384}
3385
3386template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003387inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003388valarray<_Tp>&
3389valarray<_Tp>::operator-=(const value_type& __x)
3390{
3391 for (value_type* __p = __begin_; __p != __end_; ++__p)
3392 *__p -= __x;
3393 return *this;
3394}
3395
3396template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003397inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003398valarray<_Tp>&
3399valarray<_Tp>::operator^=(const value_type& __x)
3400{
3401 for (value_type* __p = __begin_; __p != __end_; ++__p)
3402 *__p ^= __x;
3403 return *this;
3404}
3405
3406template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003407inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003408valarray<_Tp>&
3409valarray<_Tp>::operator&=(const value_type& __x)
3410{
3411 for (value_type* __p = __begin_; __p != __end_; ++__p)
3412 *__p &= __x;
3413 return *this;
3414}
3415
3416template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003417inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003418valarray<_Tp>&
3419valarray<_Tp>::operator|=(const value_type& __x)
3420{
3421 for (value_type* __p = __begin_; __p != __end_; ++__p)
3422 *__p |= __x;
3423 return *this;
3424}
3425
3426template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003427inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003428valarray<_Tp>&
3429valarray<_Tp>::operator<<=(const value_type& __x)
3430{
3431 for (value_type* __p = __begin_; __p != __end_; ++__p)
3432 *__p <<= __x;
3433 return *this;
3434}
3435
3436template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003437inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003438valarray<_Tp>&
3439valarray<_Tp>::operator>>=(const value_type& __x)
3440{
3441 for (value_type* __p = __begin_; __p != __end_; ++__p)
3442 *__p >>= __x;
3443 return *this;
3444}
3445
3446template <class _Tp>
3447template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003448inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003449typename enable_if
3450<
3451 __is_val_expr<_Expr>::value,
3452 valarray<_Tp>&
3453>::type
3454valarray<_Tp>::operator*=(const _Expr& __v)
3455{
3456 size_t __i = 0;
3457 for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3458 *__t *= __v[__i];
3459 return *this;
3460}
3461
3462template <class _Tp>
3463template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003464inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003465typename enable_if
3466<
3467 __is_val_expr<_Expr>::value,
3468 valarray<_Tp>&
3469>::type
3470valarray<_Tp>::operator/=(const _Expr& __v)
3471{
3472 size_t __i = 0;
3473 for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3474 *__t /= __v[__i];
3475 return *this;
3476}
3477
3478template <class _Tp>
3479template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003480inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003481typename enable_if
3482<
3483 __is_val_expr<_Expr>::value,
3484 valarray<_Tp>&
3485>::type
3486valarray<_Tp>::operator%=(const _Expr& __v)
3487{
3488 size_t __i = 0;
3489 for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3490 *__t %= __v[__i];
3491 return *this;
3492}
3493
3494template <class _Tp>
3495template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003496inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003497typename enable_if
3498<
3499 __is_val_expr<_Expr>::value,
3500 valarray<_Tp>&
3501>::type
3502valarray<_Tp>::operator+=(const _Expr& __v)
3503{
3504 size_t __i = 0;
3505 for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3506 *__t += __v[__i];
3507 return *this;
3508}
3509
3510template <class _Tp>
3511template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003512inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003513typename enable_if
3514<
3515 __is_val_expr<_Expr>::value,
3516 valarray<_Tp>&
3517>::type
3518valarray<_Tp>::operator-=(const _Expr& __v)
3519{
3520 size_t __i = 0;
3521 for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3522 *__t -= __v[__i];
3523 return *this;
3524}
3525
3526template <class _Tp>
3527template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003528inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003529typename enable_if
3530<
3531 __is_val_expr<_Expr>::value,
3532 valarray<_Tp>&
3533>::type
3534valarray<_Tp>::operator^=(const _Expr& __v)
3535{
3536 size_t __i = 0;
3537 for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3538 *__t ^= __v[__i];
3539 return *this;
3540}
3541
3542template <class _Tp>
3543template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003544inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003545typename enable_if
3546<
3547 __is_val_expr<_Expr>::value,
3548 valarray<_Tp>&
3549>::type
3550valarray<_Tp>::operator|=(const _Expr& __v)
3551{
3552 size_t __i = 0;
3553 for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3554 *__t |= __v[__i];
3555 return *this;
3556}
3557
3558template <class _Tp>
3559template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003560inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003561typename enable_if
3562<
3563 __is_val_expr<_Expr>::value,
3564 valarray<_Tp>&
3565>::type
3566valarray<_Tp>::operator&=(const _Expr& __v)
3567{
3568 size_t __i = 0;
3569 for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3570 *__t &= __v[__i];
3571 return *this;
3572}
3573
3574template <class _Tp>
3575template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003576inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003577typename enable_if
3578<
3579 __is_val_expr<_Expr>::value,
3580 valarray<_Tp>&
3581>::type
3582valarray<_Tp>::operator<<=(const _Expr& __v)
3583{
3584 size_t __i = 0;
3585 for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3586 *__t <<= __v[__i];
3587 return *this;
3588}
3589
3590template <class _Tp>
3591template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003592inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003593typename enable_if
3594<
3595 __is_val_expr<_Expr>::value,
3596 valarray<_Tp>&
3597>::type
3598valarray<_Tp>::operator>>=(const _Expr& __v)
3599{
3600 size_t __i = 0;
3601 for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3602 *__t >>= __v[__i];
3603 return *this;
3604}
3605
3606template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003607inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003608void
Howard Hinnant298aed92012-07-21 00:51:28 +00003609valarray<_Tp>::swap(valarray& __v) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00003610{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003611 _VSTD::swap(__begin_, __v.__begin_);
3612 _VSTD::swap(__end_, __v.__end_);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003613}
3614
3615template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003616inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003617_Tp
3618valarray<_Tp>::sum() const
3619{
3620 if (__begin_ == __end_)
3621 return value_type();
3622 const value_type* __p = __begin_;
3623 _Tp __r = *__p;
3624 for (++__p; __p != __end_; ++__p)
3625 __r += *__p;
3626 return __r;
3627}
3628
3629template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003630inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003631_Tp
3632valarray<_Tp>::min() const
3633{
3634 if (__begin_ == __end_)
3635 return value_type();
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003636 return *_VSTD::min_element(__begin_, __end_);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003637}
3638
3639template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003640inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003641_Tp
3642valarray<_Tp>::max() const
3643{
3644 if (__begin_ == __end_)
3645 return value_type();
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003646 return *_VSTD::max_element(__begin_, __end_);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003647}
3648
3649template <class _Tp>
3650valarray<_Tp>
3651valarray<_Tp>::shift(int __i) const
3652{
3653 valarray<value_type> __r;
3654 size_t __n = size();
3655 if (__n)
3656 {
Louis Dionne5ffe5152020-09-28 15:47:49 -04003657 __r.__begin_ = __r.__end_ = allocator<value_type>().allocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003658 const value_type* __sb;
3659 value_type* __tb;
3660 value_type* __te;
3661 if (__i >= 0)
3662 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003663 __i = _VSTD::min(__i, static_cast<int>(__n));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003664 __sb = __begin_ + __i;
3665 __tb = __r.__begin_;
3666 __te = __r.__begin_ + (__n - __i);
3667 }
3668 else
3669 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003670 __i = _VSTD::min(-__i, static_cast<int>(__n));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003671 __sb = __begin_;
3672 __tb = __r.__begin_ + __i;
3673 __te = __r.__begin_ + __n;
3674 }
3675 for (; __r.__end_ != __tb; ++__r.__end_)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05003676 ::new ((void*)__r.__end_) value_type();
Howard Hinnantc51e1022010-05-11 19:42:16 +00003677 for (; __r.__end_ != __te; ++__r.__end_, ++__sb)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05003678 ::new ((void*)__r.__end_) value_type(*__sb);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003679 for (__te = __r.__begin_ + __n; __r.__end_ != __te; ++__r.__end_)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05003680 ::new ((void*)__r.__end_) value_type();
Howard Hinnantc51e1022010-05-11 19:42:16 +00003681 }
3682 return __r;
3683}
3684
3685template <class _Tp>
3686valarray<_Tp>
3687valarray<_Tp>::cshift(int __i) const
3688{
3689 valarray<value_type> __r;
3690 size_t __n = size();
3691 if (__n)
3692 {
Louis Dionne5ffe5152020-09-28 15:47:49 -04003693 __r.__begin_ = __r.__end_ = allocator<value_type>().allocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003694 __i %= static_cast<int>(__n);
3695 const value_type* __m = __i >= 0 ? __begin_ + __i : __end_ + __i;
3696 for (const value_type* __s = __m; __s != __end_; ++__r.__end_, ++__s)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05003697 ::new ((void*)__r.__end_) value_type(*__s);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003698 for (const value_type* __s = __begin_; __s != __m; ++__r.__end_, ++__s)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05003699 ::new ((void*)__r.__end_) value_type(*__s);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003700 }
3701 return __r;
3702}
3703
3704template <class _Tp>
3705valarray<_Tp>
3706valarray<_Tp>::apply(value_type __f(value_type)) const
3707{
3708 valarray<value_type> __r;
3709 size_t __n = size();
3710 if (__n)
3711 {
Louis Dionne5ffe5152020-09-28 15:47:49 -04003712 __r.__begin_ = __r.__end_ = allocator<value_type>().allocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003713 for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05003714 ::new ((void*)__r.__end_) value_type(__f(*__p));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003715 }
3716 return __r;
3717}
3718
3719template <class _Tp>
3720valarray<_Tp>
3721valarray<_Tp>::apply(value_type __f(const value_type&)) const
3722{
3723 valarray<value_type> __r;
3724 size_t __n = size();
3725 if (__n)
3726 {
Louis Dionne5ffe5152020-09-28 15:47:49 -04003727 __r.__begin_ = __r.__end_ = allocator<value_type>().allocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003728 for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05003729 ::new ((void*)__r.__end_) value_type(__f(*__p));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003730 }
3731 return __r;
3732}
3733
3734template <class _Tp>
Eric Fiseliera119c322018-10-25 17:43:26 +00003735inline
Eric Fiselier2856ef82018-10-25 17:21:30 +00003736void valarray<_Tp>::__clear(size_t __capacity)
Howard Hinnantc51e1022010-05-11 19:42:16 +00003737{
Eric Fiselier2856ef82018-10-25 17:21:30 +00003738 if (__begin_ != nullptr)
3739 {
3740 while (__end_ != __begin_)
3741 (--__end_)->~value_type();
Louis Dionne5ffe5152020-09-28 15:47:49 -04003742 allocator<value_type>().deallocate(__begin_, __capacity);
Eric Fiselier2856ef82018-10-25 17:21:30 +00003743 __begin_ = __end_ = nullptr;
3744 }
Mikhail Maltsev59de6f82018-02-08 11:33:48 +00003745}
3746
3747template <class _Tp>
3748void
3749valarray<_Tp>::resize(size_t __n, value_type __x)
3750{
Eric Fiselier2856ef82018-10-25 17:21:30 +00003751 __clear(size());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003752 if (__n)
3753 {
Louis Dionne5ffe5152020-09-28 15:47:49 -04003754 __begin_ = __end_ = allocator<value_type>().allocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003755#ifndef _LIBCPP_NO_EXCEPTIONS
3756 try
3757 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04003758#endif // _LIBCPP_NO_EXCEPTIONS
Eric Fiselier2856ef82018-10-25 17:21:30 +00003759 for (size_t __n_left = __n; __n_left; --__n_left, ++__end_)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05003760 ::new ((void*)__end_) value_type(__x);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003761#ifndef _LIBCPP_NO_EXCEPTIONS
3762 }
3763 catch (...)
3764 {
Eric Fiselier2856ef82018-10-25 17:21:30 +00003765 __clear(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003766 throw;
3767 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04003768#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00003769 }
3770}
3771
3772template<class _Tp>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003773inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003774void
Howard Hinnant298aed92012-07-21 00:51:28 +00003775swap(valarray<_Tp>& __x, valarray<_Tp>& __y) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00003776{
3777 __x.swap(__y);
3778}
3779
3780template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003781inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003782typename enable_if
3783<
3784 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
3785 __val_expr<_BinaryOp<multiplies<typename _Expr1::value_type>, _Expr1, _Expr2> >
3786>::type
3787operator*(const _Expr1& __x, const _Expr2& __y)
3788{
3789 typedef typename _Expr1::value_type value_type;
3790 typedef _BinaryOp<multiplies<value_type>, _Expr1, _Expr2> _Op;
3791 return __val_expr<_Op>(_Op(multiplies<value_type>(), __x, __y));
3792}
3793
3794template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003795inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003796typename enable_if
3797<
3798 __is_val_expr<_Expr>::value,
3799 __val_expr<_BinaryOp<multiplies<typename _Expr::value_type>,
3800 _Expr, __scalar_expr<typename _Expr::value_type> > >
3801>::type
3802operator*(const _Expr& __x, const typename _Expr::value_type& __y)
3803{
3804 typedef typename _Expr::value_type value_type;
3805 typedef _BinaryOp<multiplies<value_type>, _Expr, __scalar_expr<value_type> > _Op;
3806 return __val_expr<_Op>(_Op(multiplies<value_type>(),
3807 __x, __scalar_expr<value_type>(__y, __x.size())));
3808}
3809
3810template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003811inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003812typename enable_if
3813<
3814 __is_val_expr<_Expr>::value,
3815 __val_expr<_BinaryOp<multiplies<typename _Expr::value_type>,
3816 __scalar_expr<typename _Expr::value_type>, _Expr> >
3817>::type
3818operator*(const typename _Expr::value_type& __x, const _Expr& __y)
3819{
3820 typedef typename _Expr::value_type value_type;
3821 typedef _BinaryOp<multiplies<value_type>, __scalar_expr<value_type>, _Expr> _Op;
3822 return __val_expr<_Op>(_Op(multiplies<value_type>(),
3823 __scalar_expr<value_type>(__x, __y.size()), __y));
3824}
3825
3826template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003827inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003828typename enable_if
3829<
3830 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
3831 __val_expr<_BinaryOp<divides<typename _Expr1::value_type>, _Expr1, _Expr2> >
3832>::type
3833operator/(const _Expr1& __x, const _Expr2& __y)
3834{
3835 typedef typename _Expr1::value_type value_type;
3836 typedef _BinaryOp<divides<value_type>, _Expr1, _Expr2> _Op;
3837 return __val_expr<_Op>(_Op(divides<value_type>(), __x, __y));
3838}
3839
3840template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003841inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003842typename enable_if
3843<
3844 __is_val_expr<_Expr>::value,
3845 __val_expr<_BinaryOp<divides<typename _Expr::value_type>,
3846 _Expr, __scalar_expr<typename _Expr::value_type> > >
3847>::type
3848operator/(const _Expr& __x, const typename _Expr::value_type& __y)
3849{
3850 typedef typename _Expr::value_type value_type;
3851 typedef _BinaryOp<divides<value_type>, _Expr, __scalar_expr<value_type> > _Op;
3852 return __val_expr<_Op>(_Op(divides<value_type>(),
3853 __x, __scalar_expr<value_type>(__y, __x.size())));
3854}
3855
3856template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003857inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003858typename enable_if
3859<
3860 __is_val_expr<_Expr>::value,
3861 __val_expr<_BinaryOp<divides<typename _Expr::value_type>,
3862 __scalar_expr<typename _Expr::value_type>, _Expr> >
3863>::type
3864operator/(const typename _Expr::value_type& __x, const _Expr& __y)
3865{
3866 typedef typename _Expr::value_type value_type;
3867 typedef _BinaryOp<divides<value_type>, __scalar_expr<value_type>, _Expr> _Op;
3868 return __val_expr<_Op>(_Op(divides<value_type>(),
3869 __scalar_expr<value_type>(__x, __y.size()), __y));
3870}
3871
3872template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003873inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003874typename enable_if
3875<
3876 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
3877 __val_expr<_BinaryOp<modulus<typename _Expr1::value_type>, _Expr1, _Expr2> >
3878>::type
3879operator%(const _Expr1& __x, const _Expr2& __y)
3880{
3881 typedef typename _Expr1::value_type value_type;
3882 typedef _BinaryOp<modulus<value_type>, _Expr1, _Expr2> _Op;
3883 return __val_expr<_Op>(_Op(modulus<value_type>(), __x, __y));
3884}
3885
3886template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003887inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003888typename enable_if
3889<
3890 __is_val_expr<_Expr>::value,
3891 __val_expr<_BinaryOp<modulus<typename _Expr::value_type>,
3892 _Expr, __scalar_expr<typename _Expr::value_type> > >
3893>::type
3894operator%(const _Expr& __x, const typename _Expr::value_type& __y)
3895{
3896 typedef typename _Expr::value_type value_type;
3897 typedef _BinaryOp<modulus<value_type>, _Expr, __scalar_expr<value_type> > _Op;
3898 return __val_expr<_Op>(_Op(modulus<value_type>(),
3899 __x, __scalar_expr<value_type>(__y, __x.size())));
3900}
3901
3902template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003903inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003904typename enable_if
3905<
3906 __is_val_expr<_Expr>::value,
3907 __val_expr<_BinaryOp<modulus<typename _Expr::value_type>,
3908 __scalar_expr<typename _Expr::value_type>, _Expr> >
3909>::type
3910operator%(const typename _Expr::value_type& __x, const _Expr& __y)
3911{
3912 typedef typename _Expr::value_type value_type;
3913 typedef _BinaryOp<modulus<value_type>, __scalar_expr<value_type>, _Expr> _Op;
3914 return __val_expr<_Op>(_Op(modulus<value_type>(),
3915 __scalar_expr<value_type>(__x, __y.size()), __y));
3916}
3917
3918template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003919inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003920typename enable_if
3921<
3922 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
3923 __val_expr<_BinaryOp<plus<typename _Expr1::value_type>, _Expr1, _Expr2> >
3924>::type
3925operator+(const _Expr1& __x, const _Expr2& __y)
3926{
3927 typedef typename _Expr1::value_type value_type;
3928 typedef _BinaryOp<plus<value_type>, _Expr1, _Expr2> _Op;
3929 return __val_expr<_Op>(_Op(plus<value_type>(), __x, __y));
3930}
3931
3932template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003933inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003934typename enable_if
3935<
3936 __is_val_expr<_Expr>::value,
3937 __val_expr<_BinaryOp<plus<typename _Expr::value_type>,
3938 _Expr, __scalar_expr<typename _Expr::value_type> > >
3939>::type
3940operator+(const _Expr& __x, const typename _Expr::value_type& __y)
3941{
3942 typedef typename _Expr::value_type value_type;
3943 typedef _BinaryOp<plus<value_type>, _Expr, __scalar_expr<value_type> > _Op;
3944 return __val_expr<_Op>(_Op(plus<value_type>(),
3945 __x, __scalar_expr<value_type>(__y, __x.size())));
3946}
3947
3948template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003949inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003950typename enable_if
3951<
3952 __is_val_expr<_Expr>::value,
3953 __val_expr<_BinaryOp<plus<typename _Expr::value_type>,
3954 __scalar_expr<typename _Expr::value_type>, _Expr> >
3955>::type
3956operator+(const typename _Expr::value_type& __x, const _Expr& __y)
3957{
3958 typedef typename _Expr::value_type value_type;
3959 typedef _BinaryOp<plus<value_type>, __scalar_expr<value_type>, _Expr> _Op;
3960 return __val_expr<_Op>(_Op(plus<value_type>(),
3961 __scalar_expr<value_type>(__x, __y.size()), __y));
3962}
3963
3964template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003965inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003966typename enable_if
3967<
3968 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
3969 __val_expr<_BinaryOp<minus<typename _Expr1::value_type>, _Expr1, _Expr2> >
3970>::type
3971operator-(const _Expr1& __x, const _Expr2& __y)
3972{
3973 typedef typename _Expr1::value_type value_type;
3974 typedef _BinaryOp<minus<value_type>, _Expr1, _Expr2> _Op;
3975 return __val_expr<_Op>(_Op(minus<value_type>(), __x, __y));
3976}
3977
3978template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003979inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003980typename enable_if
3981<
3982 __is_val_expr<_Expr>::value,
3983 __val_expr<_BinaryOp<minus<typename _Expr::value_type>,
3984 _Expr, __scalar_expr<typename _Expr::value_type> > >
3985>::type
3986operator-(const _Expr& __x, const typename _Expr::value_type& __y)
3987{
3988 typedef typename _Expr::value_type value_type;
3989 typedef _BinaryOp<minus<value_type>, _Expr, __scalar_expr<value_type> > _Op;
3990 return __val_expr<_Op>(_Op(minus<value_type>(),
3991 __x, __scalar_expr<value_type>(__y, __x.size())));
3992}
3993
3994template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003995inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003996typename enable_if
3997<
3998 __is_val_expr<_Expr>::value,
3999 __val_expr<_BinaryOp<minus<typename _Expr::value_type>,
4000 __scalar_expr<typename _Expr::value_type>, _Expr> >
4001>::type
4002operator-(const typename _Expr::value_type& __x, const _Expr& __y)
4003{
4004 typedef typename _Expr::value_type value_type;
4005 typedef _BinaryOp<minus<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4006 return __val_expr<_Op>(_Op(minus<value_type>(),
4007 __scalar_expr<value_type>(__x, __y.size()), __y));
4008}
4009
4010template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004011inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004012typename enable_if
4013<
4014 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4015 __val_expr<_BinaryOp<bit_xor<typename _Expr1::value_type>, _Expr1, _Expr2> >
4016>::type
4017operator^(const _Expr1& __x, const _Expr2& __y)
4018{
4019 typedef typename _Expr1::value_type value_type;
4020 typedef _BinaryOp<bit_xor<value_type>, _Expr1, _Expr2> _Op;
4021 return __val_expr<_Op>(_Op(bit_xor<value_type>(), __x, __y));
4022}
4023
4024template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004025inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004026typename enable_if
4027<
4028 __is_val_expr<_Expr>::value,
4029 __val_expr<_BinaryOp<bit_xor<typename _Expr::value_type>,
4030 _Expr, __scalar_expr<typename _Expr::value_type> > >
4031>::type
4032operator^(const _Expr& __x, const typename _Expr::value_type& __y)
4033{
4034 typedef typename _Expr::value_type value_type;
4035 typedef _BinaryOp<bit_xor<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4036 return __val_expr<_Op>(_Op(bit_xor<value_type>(),
4037 __x, __scalar_expr<value_type>(__y, __x.size())));
4038}
4039
4040template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004041inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004042typename enable_if
4043<
4044 __is_val_expr<_Expr>::value,
4045 __val_expr<_BinaryOp<bit_xor<typename _Expr::value_type>,
4046 __scalar_expr<typename _Expr::value_type>, _Expr> >
4047>::type
4048operator^(const typename _Expr::value_type& __x, const _Expr& __y)
4049{
4050 typedef typename _Expr::value_type value_type;
4051 typedef _BinaryOp<bit_xor<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4052 return __val_expr<_Op>(_Op(bit_xor<value_type>(),
4053 __scalar_expr<value_type>(__x, __y.size()), __y));
4054}
4055
4056template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004057inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004058typename enable_if
4059<
4060 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4061 __val_expr<_BinaryOp<bit_and<typename _Expr1::value_type>, _Expr1, _Expr2> >
4062>::type
4063operator&(const _Expr1& __x, const _Expr2& __y)
4064{
4065 typedef typename _Expr1::value_type value_type;
4066 typedef _BinaryOp<bit_and<value_type>, _Expr1, _Expr2> _Op;
4067 return __val_expr<_Op>(_Op(bit_and<value_type>(), __x, __y));
4068}
4069
4070template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004071inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004072typename enable_if
4073<
4074 __is_val_expr<_Expr>::value,
4075 __val_expr<_BinaryOp<bit_and<typename _Expr::value_type>,
4076 _Expr, __scalar_expr<typename _Expr::value_type> > >
4077>::type
4078operator&(const _Expr& __x, const typename _Expr::value_type& __y)
4079{
4080 typedef typename _Expr::value_type value_type;
4081 typedef _BinaryOp<bit_and<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4082 return __val_expr<_Op>(_Op(bit_and<value_type>(),
4083 __x, __scalar_expr<value_type>(__y, __x.size())));
4084}
4085
4086template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004087inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004088typename enable_if
4089<
4090 __is_val_expr<_Expr>::value,
4091 __val_expr<_BinaryOp<bit_and<typename _Expr::value_type>,
4092 __scalar_expr<typename _Expr::value_type>, _Expr> >
4093>::type
4094operator&(const typename _Expr::value_type& __x, const _Expr& __y)
4095{
4096 typedef typename _Expr::value_type value_type;
4097 typedef _BinaryOp<bit_and<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4098 return __val_expr<_Op>(_Op(bit_and<value_type>(),
4099 __scalar_expr<value_type>(__x, __y.size()), __y));
4100}
4101
4102template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004103inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004104typename enable_if
4105<
4106 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4107 __val_expr<_BinaryOp<bit_or<typename _Expr1::value_type>, _Expr1, _Expr2> >
4108>::type
4109operator|(const _Expr1& __x, const _Expr2& __y)
4110{
4111 typedef typename _Expr1::value_type value_type;
4112 typedef _BinaryOp<bit_or<value_type>, _Expr1, _Expr2> _Op;
4113 return __val_expr<_Op>(_Op(bit_or<value_type>(), __x, __y));
4114}
4115
4116template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004117inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004118typename enable_if
4119<
4120 __is_val_expr<_Expr>::value,
4121 __val_expr<_BinaryOp<bit_or<typename _Expr::value_type>,
4122 _Expr, __scalar_expr<typename _Expr::value_type> > >
4123>::type
4124operator|(const _Expr& __x, const typename _Expr::value_type& __y)
4125{
4126 typedef typename _Expr::value_type value_type;
4127 typedef _BinaryOp<bit_or<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4128 return __val_expr<_Op>(_Op(bit_or<value_type>(),
4129 __x, __scalar_expr<value_type>(__y, __x.size())));
4130}
4131
4132template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004133inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004134typename enable_if
4135<
4136 __is_val_expr<_Expr>::value,
4137 __val_expr<_BinaryOp<bit_or<typename _Expr::value_type>,
4138 __scalar_expr<typename _Expr::value_type>, _Expr> >
4139>::type
4140operator|(const typename _Expr::value_type& __x, const _Expr& __y)
4141{
4142 typedef typename _Expr::value_type value_type;
4143 typedef _BinaryOp<bit_or<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4144 return __val_expr<_Op>(_Op(bit_or<value_type>(),
4145 __scalar_expr<value_type>(__x, __y.size()), __y));
4146}
4147
4148template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004149inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004150typename enable_if
4151<
4152 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4153 __val_expr<_BinaryOp<__bit_shift_left<typename _Expr1::value_type>, _Expr1, _Expr2> >
4154>::type
4155operator<<(const _Expr1& __x, const _Expr2& __y)
4156{
4157 typedef typename _Expr1::value_type value_type;
4158 typedef _BinaryOp<__bit_shift_left<value_type>, _Expr1, _Expr2> _Op;
4159 return __val_expr<_Op>(_Op(__bit_shift_left<value_type>(), __x, __y));
4160}
4161
4162template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004163inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004164typename enable_if
4165<
4166 __is_val_expr<_Expr>::value,
4167 __val_expr<_BinaryOp<__bit_shift_left<typename _Expr::value_type>,
4168 _Expr, __scalar_expr<typename _Expr::value_type> > >
4169>::type
4170operator<<(const _Expr& __x, const typename _Expr::value_type& __y)
4171{
4172 typedef typename _Expr::value_type value_type;
4173 typedef _BinaryOp<__bit_shift_left<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4174 return __val_expr<_Op>(_Op(__bit_shift_left<value_type>(),
4175 __x, __scalar_expr<value_type>(__y, __x.size())));
4176}
4177
4178template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004179inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004180typename enable_if
4181<
4182 __is_val_expr<_Expr>::value,
4183 __val_expr<_BinaryOp<__bit_shift_left<typename _Expr::value_type>,
4184 __scalar_expr<typename _Expr::value_type>, _Expr> >
4185>::type
4186operator<<(const typename _Expr::value_type& __x, const _Expr& __y)
4187{
4188 typedef typename _Expr::value_type value_type;
4189 typedef _BinaryOp<__bit_shift_left<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4190 return __val_expr<_Op>(_Op(__bit_shift_left<value_type>(),
4191 __scalar_expr<value_type>(__x, __y.size()), __y));
4192}
4193
4194template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004195inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004196typename enable_if
4197<
4198 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4199 __val_expr<_BinaryOp<__bit_shift_right<typename _Expr1::value_type>, _Expr1, _Expr2> >
4200>::type
4201operator>>(const _Expr1& __x, const _Expr2& __y)
4202{
4203 typedef typename _Expr1::value_type value_type;
4204 typedef _BinaryOp<__bit_shift_right<value_type>, _Expr1, _Expr2> _Op;
4205 return __val_expr<_Op>(_Op(__bit_shift_right<value_type>(), __x, __y));
4206}
4207
4208template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004209inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004210typename enable_if
4211<
4212 __is_val_expr<_Expr>::value,
4213 __val_expr<_BinaryOp<__bit_shift_right<typename _Expr::value_type>,
4214 _Expr, __scalar_expr<typename _Expr::value_type> > >
4215>::type
4216operator>>(const _Expr& __x, const typename _Expr::value_type& __y)
4217{
4218 typedef typename _Expr::value_type value_type;
4219 typedef _BinaryOp<__bit_shift_right<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4220 return __val_expr<_Op>(_Op(__bit_shift_right<value_type>(),
4221 __x, __scalar_expr<value_type>(__y, __x.size())));
4222}
4223
4224template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004225inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004226typename enable_if
4227<
4228 __is_val_expr<_Expr>::value,
4229 __val_expr<_BinaryOp<__bit_shift_right<typename _Expr::value_type>,
4230 __scalar_expr<typename _Expr::value_type>, _Expr> >
4231>::type
4232operator>>(const typename _Expr::value_type& __x, const _Expr& __y)
4233{
4234 typedef typename _Expr::value_type value_type;
4235 typedef _BinaryOp<__bit_shift_right<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4236 return __val_expr<_Op>(_Op(__bit_shift_right<value_type>(),
4237 __scalar_expr<value_type>(__x, __y.size()), __y));
4238}
4239
4240template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004241inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004242typename enable_if
4243<
4244 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4245 __val_expr<_BinaryOp<logical_and<typename _Expr1::value_type>, _Expr1, _Expr2> >
4246>::type
4247operator&&(const _Expr1& __x, const _Expr2& __y)
4248{
4249 typedef typename _Expr1::value_type value_type;
4250 typedef _BinaryOp<logical_and<value_type>, _Expr1, _Expr2> _Op;
4251 return __val_expr<_Op>(_Op(logical_and<value_type>(), __x, __y));
4252}
4253
4254template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004255inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004256typename enable_if
4257<
4258 __is_val_expr<_Expr>::value,
4259 __val_expr<_BinaryOp<logical_and<typename _Expr::value_type>,
4260 _Expr, __scalar_expr<typename _Expr::value_type> > >
4261>::type
4262operator&&(const _Expr& __x, const typename _Expr::value_type& __y)
4263{
4264 typedef typename _Expr::value_type value_type;
4265 typedef _BinaryOp<logical_and<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4266 return __val_expr<_Op>(_Op(logical_and<value_type>(),
4267 __x, __scalar_expr<value_type>(__y, __x.size())));
4268}
4269
4270template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004271inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004272typename enable_if
4273<
4274 __is_val_expr<_Expr>::value,
4275 __val_expr<_BinaryOp<logical_and<typename _Expr::value_type>,
4276 __scalar_expr<typename _Expr::value_type>, _Expr> >
4277>::type
4278operator&&(const typename _Expr::value_type& __x, const _Expr& __y)
4279{
4280 typedef typename _Expr::value_type value_type;
4281 typedef _BinaryOp<logical_and<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4282 return __val_expr<_Op>(_Op(logical_and<value_type>(),
4283 __scalar_expr<value_type>(__x, __y.size()), __y));
4284}
4285
4286template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004287inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004288typename enable_if
4289<
4290 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4291 __val_expr<_BinaryOp<logical_or<typename _Expr1::value_type>, _Expr1, _Expr2> >
4292>::type
4293operator||(const _Expr1& __x, const _Expr2& __y)
4294{
4295 typedef typename _Expr1::value_type value_type;
4296 typedef _BinaryOp<logical_or<value_type>, _Expr1, _Expr2> _Op;
4297 return __val_expr<_Op>(_Op(logical_or<value_type>(), __x, __y));
4298}
4299
4300template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004301inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004302typename enable_if
4303<
4304 __is_val_expr<_Expr>::value,
4305 __val_expr<_BinaryOp<logical_or<typename _Expr::value_type>,
4306 _Expr, __scalar_expr<typename _Expr::value_type> > >
4307>::type
4308operator||(const _Expr& __x, const typename _Expr::value_type& __y)
4309{
4310 typedef typename _Expr::value_type value_type;
4311 typedef _BinaryOp<logical_or<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4312 return __val_expr<_Op>(_Op(logical_or<value_type>(),
4313 __x, __scalar_expr<value_type>(__y, __x.size())));
4314}
4315
4316template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004317inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004318typename enable_if
4319<
4320 __is_val_expr<_Expr>::value,
4321 __val_expr<_BinaryOp<logical_or<typename _Expr::value_type>,
4322 __scalar_expr<typename _Expr::value_type>, _Expr> >
4323>::type
4324operator||(const typename _Expr::value_type& __x, const _Expr& __y)
4325{
4326 typedef typename _Expr::value_type value_type;
4327 typedef _BinaryOp<logical_or<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4328 return __val_expr<_Op>(_Op(logical_or<value_type>(),
4329 __scalar_expr<value_type>(__x, __y.size()), __y));
4330}
4331
4332template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004333inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004334typename enable_if
4335<
4336 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4337 __val_expr<_BinaryOp<equal_to<typename _Expr1::value_type>, _Expr1, _Expr2> >
4338>::type
4339operator==(const _Expr1& __x, const _Expr2& __y)
4340{
4341 typedef typename _Expr1::value_type value_type;
4342 typedef _BinaryOp<equal_to<value_type>, _Expr1, _Expr2> _Op;
4343 return __val_expr<_Op>(_Op(equal_to<value_type>(), __x, __y));
4344}
4345
4346template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004347inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004348typename enable_if
4349<
4350 __is_val_expr<_Expr>::value,
4351 __val_expr<_BinaryOp<equal_to<typename _Expr::value_type>,
4352 _Expr, __scalar_expr<typename _Expr::value_type> > >
4353>::type
4354operator==(const _Expr& __x, const typename _Expr::value_type& __y)
4355{
4356 typedef typename _Expr::value_type value_type;
4357 typedef _BinaryOp<equal_to<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4358 return __val_expr<_Op>(_Op(equal_to<value_type>(),
4359 __x, __scalar_expr<value_type>(__y, __x.size())));
4360}
4361
4362template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004363inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004364typename enable_if
4365<
4366 __is_val_expr<_Expr>::value,
4367 __val_expr<_BinaryOp<equal_to<typename _Expr::value_type>,
4368 __scalar_expr<typename _Expr::value_type>, _Expr> >
4369>::type
4370operator==(const typename _Expr::value_type& __x, const _Expr& __y)
4371{
4372 typedef typename _Expr::value_type value_type;
4373 typedef _BinaryOp<equal_to<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4374 return __val_expr<_Op>(_Op(equal_to<value_type>(),
4375 __scalar_expr<value_type>(__x, __y.size()), __y));
4376}
4377
4378template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004379inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004380typename enable_if
4381<
4382 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4383 __val_expr<_BinaryOp<not_equal_to<typename _Expr1::value_type>, _Expr1, _Expr2> >
4384>::type
4385operator!=(const _Expr1& __x, const _Expr2& __y)
4386{
4387 typedef typename _Expr1::value_type value_type;
4388 typedef _BinaryOp<not_equal_to<value_type>, _Expr1, _Expr2> _Op;
4389 return __val_expr<_Op>(_Op(not_equal_to<value_type>(), __x, __y));
4390}
4391
4392template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004393inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004394typename enable_if
4395<
4396 __is_val_expr<_Expr>::value,
4397 __val_expr<_BinaryOp<not_equal_to<typename _Expr::value_type>,
4398 _Expr, __scalar_expr<typename _Expr::value_type> > >
4399>::type
4400operator!=(const _Expr& __x, const typename _Expr::value_type& __y)
4401{
4402 typedef typename _Expr::value_type value_type;
4403 typedef _BinaryOp<not_equal_to<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4404 return __val_expr<_Op>(_Op(not_equal_to<value_type>(),
4405 __x, __scalar_expr<value_type>(__y, __x.size())));
4406}
4407
4408template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004409inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004410typename enable_if
4411<
4412 __is_val_expr<_Expr>::value,
4413 __val_expr<_BinaryOp<not_equal_to<typename _Expr::value_type>,
4414 __scalar_expr<typename _Expr::value_type>, _Expr> >
4415>::type
4416operator!=(const typename _Expr::value_type& __x, const _Expr& __y)
4417{
4418 typedef typename _Expr::value_type value_type;
4419 typedef _BinaryOp<not_equal_to<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4420 return __val_expr<_Op>(_Op(not_equal_to<value_type>(),
4421 __scalar_expr<value_type>(__x, __y.size()), __y));
4422}
4423
4424template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004425inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004426typename enable_if
4427<
4428 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4429 __val_expr<_BinaryOp<less<typename _Expr1::value_type>, _Expr1, _Expr2> >
4430>::type
4431operator<(const _Expr1& __x, const _Expr2& __y)
4432{
4433 typedef typename _Expr1::value_type value_type;
4434 typedef _BinaryOp<less<value_type>, _Expr1, _Expr2> _Op;
4435 return __val_expr<_Op>(_Op(less<value_type>(), __x, __y));
4436}
4437
4438template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004439inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004440typename enable_if
4441<
4442 __is_val_expr<_Expr>::value,
4443 __val_expr<_BinaryOp<less<typename _Expr::value_type>,
4444 _Expr, __scalar_expr<typename _Expr::value_type> > >
4445>::type
4446operator<(const _Expr& __x, const typename _Expr::value_type& __y)
4447{
4448 typedef typename _Expr::value_type value_type;
4449 typedef _BinaryOp<less<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4450 return __val_expr<_Op>(_Op(less<value_type>(),
4451 __x, __scalar_expr<value_type>(__y, __x.size())));
4452}
4453
4454template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004455inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004456typename enable_if
4457<
4458 __is_val_expr<_Expr>::value,
4459 __val_expr<_BinaryOp<less<typename _Expr::value_type>,
4460 __scalar_expr<typename _Expr::value_type>, _Expr> >
4461>::type
4462operator<(const typename _Expr::value_type& __x, const _Expr& __y)
4463{
4464 typedef typename _Expr::value_type value_type;
4465 typedef _BinaryOp<less<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4466 return __val_expr<_Op>(_Op(less<value_type>(),
4467 __scalar_expr<value_type>(__x, __y.size()), __y));
4468}
4469
4470template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004471inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004472typename enable_if
4473<
4474 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4475 __val_expr<_BinaryOp<greater<typename _Expr1::value_type>, _Expr1, _Expr2> >
4476>::type
4477operator>(const _Expr1& __x, const _Expr2& __y)
4478{
4479 typedef typename _Expr1::value_type value_type;
4480 typedef _BinaryOp<greater<value_type>, _Expr1, _Expr2> _Op;
4481 return __val_expr<_Op>(_Op(greater<value_type>(), __x, __y));
4482}
4483
4484template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004485inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004486typename enable_if
4487<
4488 __is_val_expr<_Expr>::value,
4489 __val_expr<_BinaryOp<greater<typename _Expr::value_type>,
4490 _Expr, __scalar_expr<typename _Expr::value_type> > >
4491>::type
4492operator>(const _Expr& __x, const typename _Expr::value_type& __y)
4493{
4494 typedef typename _Expr::value_type value_type;
4495 typedef _BinaryOp<greater<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4496 return __val_expr<_Op>(_Op(greater<value_type>(),
4497 __x, __scalar_expr<value_type>(__y, __x.size())));
4498}
4499
4500template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004501inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004502typename enable_if
4503<
4504 __is_val_expr<_Expr>::value,
4505 __val_expr<_BinaryOp<greater<typename _Expr::value_type>,
4506 __scalar_expr<typename _Expr::value_type>, _Expr> >
4507>::type
4508operator>(const typename _Expr::value_type& __x, const _Expr& __y)
4509{
4510 typedef typename _Expr::value_type value_type;
4511 typedef _BinaryOp<greater<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4512 return __val_expr<_Op>(_Op(greater<value_type>(),
4513 __scalar_expr<value_type>(__x, __y.size()), __y));
4514}
4515
4516template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004517inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004518typename enable_if
4519<
4520 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4521 __val_expr<_BinaryOp<less_equal<typename _Expr1::value_type>, _Expr1, _Expr2> >
4522>::type
4523operator<=(const _Expr1& __x, const _Expr2& __y)
4524{
4525 typedef typename _Expr1::value_type value_type;
4526 typedef _BinaryOp<less_equal<value_type>, _Expr1, _Expr2> _Op;
4527 return __val_expr<_Op>(_Op(less_equal<value_type>(), __x, __y));
4528}
4529
4530template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004531inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004532typename enable_if
4533<
4534 __is_val_expr<_Expr>::value,
4535 __val_expr<_BinaryOp<less_equal<typename _Expr::value_type>,
4536 _Expr, __scalar_expr<typename _Expr::value_type> > >
4537>::type
4538operator<=(const _Expr& __x, const typename _Expr::value_type& __y)
4539{
4540 typedef typename _Expr::value_type value_type;
4541 typedef _BinaryOp<less_equal<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4542 return __val_expr<_Op>(_Op(less_equal<value_type>(),
4543 __x, __scalar_expr<value_type>(__y, __x.size())));
4544}
4545
4546template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004547inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004548typename enable_if
4549<
4550 __is_val_expr<_Expr>::value,
4551 __val_expr<_BinaryOp<less_equal<typename _Expr::value_type>,
4552 __scalar_expr<typename _Expr::value_type>, _Expr> >
4553>::type
4554operator<=(const typename _Expr::value_type& __x, const _Expr& __y)
4555{
4556 typedef typename _Expr::value_type value_type;
4557 typedef _BinaryOp<less_equal<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4558 return __val_expr<_Op>(_Op(less_equal<value_type>(),
4559 __scalar_expr<value_type>(__x, __y.size()), __y));
4560}
4561
4562template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004563inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004564typename enable_if
4565<
4566 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4567 __val_expr<_BinaryOp<greater_equal<typename _Expr1::value_type>, _Expr1, _Expr2> >
4568>::type
4569operator>=(const _Expr1& __x, const _Expr2& __y)
4570{
4571 typedef typename _Expr1::value_type value_type;
4572 typedef _BinaryOp<greater_equal<value_type>, _Expr1, _Expr2> _Op;
4573 return __val_expr<_Op>(_Op(greater_equal<value_type>(), __x, __y));
4574}
4575
4576template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004577inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004578typename enable_if
4579<
4580 __is_val_expr<_Expr>::value,
4581 __val_expr<_BinaryOp<greater_equal<typename _Expr::value_type>,
4582 _Expr, __scalar_expr<typename _Expr::value_type> > >
4583>::type
4584operator>=(const _Expr& __x, const typename _Expr::value_type& __y)
4585{
4586 typedef typename _Expr::value_type value_type;
4587 typedef _BinaryOp<greater_equal<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4588 return __val_expr<_Op>(_Op(greater_equal<value_type>(),
4589 __x, __scalar_expr<value_type>(__y, __x.size())));
4590}
4591
4592template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004593inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004594typename enable_if
4595<
4596 __is_val_expr<_Expr>::value,
4597 __val_expr<_BinaryOp<greater_equal<typename _Expr::value_type>,
4598 __scalar_expr<typename _Expr::value_type>, _Expr> >
4599>::type
4600operator>=(const typename _Expr::value_type& __x, const _Expr& __y)
4601{
4602 typedef typename _Expr::value_type value_type;
4603 typedef _BinaryOp<greater_equal<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4604 return __val_expr<_Op>(_Op(greater_equal<value_type>(),
4605 __scalar_expr<value_type>(__x, __y.size()), __y));
4606}
4607
4608template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004609inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004610typename enable_if
4611<
4612 __is_val_expr<_Expr>::value,
4613 __val_expr<_UnaryOp<__abs_expr<typename _Expr::value_type>, _Expr> >
4614>::type
4615abs(const _Expr& __x)
4616{
4617 typedef typename _Expr::value_type value_type;
4618 typedef _UnaryOp<__abs_expr<value_type>, _Expr> _Op;
4619 return __val_expr<_Op>(_Op(__abs_expr<value_type>(), __x));
4620}
4621
4622template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004623inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004624typename enable_if
4625<
4626 __is_val_expr<_Expr>::value,
4627 __val_expr<_UnaryOp<__acos_expr<typename _Expr::value_type>, _Expr> >
4628>::type
4629acos(const _Expr& __x)
4630{
4631 typedef typename _Expr::value_type value_type;
4632 typedef _UnaryOp<__acos_expr<value_type>, _Expr> _Op;
4633 return __val_expr<_Op>(_Op(__acos_expr<value_type>(), __x));
4634}
4635
4636template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004637inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004638typename enable_if
4639<
4640 __is_val_expr<_Expr>::value,
4641 __val_expr<_UnaryOp<__asin_expr<typename _Expr::value_type>, _Expr> >
4642>::type
4643asin(const _Expr& __x)
4644{
4645 typedef typename _Expr::value_type value_type;
4646 typedef _UnaryOp<__asin_expr<value_type>, _Expr> _Op;
4647 return __val_expr<_Op>(_Op(__asin_expr<value_type>(), __x));
4648}
4649
4650template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004651inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004652typename enable_if
4653<
4654 __is_val_expr<_Expr>::value,
4655 __val_expr<_UnaryOp<__atan_expr<typename _Expr::value_type>, _Expr> >
4656>::type
4657atan(const _Expr& __x)
4658{
4659 typedef typename _Expr::value_type value_type;
4660 typedef _UnaryOp<__atan_expr<value_type>, _Expr> _Op;
4661 return __val_expr<_Op>(_Op(__atan_expr<value_type>(), __x));
4662}
4663
4664template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004665inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004666typename enable_if
4667<
4668 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4669 __val_expr<_BinaryOp<__atan2_expr<typename _Expr1::value_type>, _Expr1, _Expr2> >
4670>::type
4671atan2(const _Expr1& __x, const _Expr2& __y)
4672{
4673 typedef typename _Expr1::value_type value_type;
4674 typedef _BinaryOp<__atan2_expr<value_type>, _Expr1, _Expr2> _Op;
4675 return __val_expr<_Op>(_Op(__atan2_expr<value_type>(), __x, __y));
4676}
4677
4678template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004679inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004680typename enable_if
4681<
4682 __is_val_expr<_Expr>::value,
4683 __val_expr<_BinaryOp<__atan2_expr<typename _Expr::value_type>,
4684 _Expr, __scalar_expr<typename _Expr::value_type> > >
4685>::type
4686atan2(const _Expr& __x, const typename _Expr::value_type& __y)
4687{
4688 typedef typename _Expr::value_type value_type;
4689 typedef _BinaryOp<__atan2_expr<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4690 return __val_expr<_Op>(_Op(__atan2_expr<value_type>(),
4691 __x, __scalar_expr<value_type>(__y, __x.size())));
4692}
4693
4694template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004695inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004696typename enable_if
4697<
4698 __is_val_expr<_Expr>::value,
4699 __val_expr<_BinaryOp<__atan2_expr<typename _Expr::value_type>,
4700 __scalar_expr<typename _Expr::value_type>, _Expr> >
4701>::type
4702atan2(const typename _Expr::value_type& __x, const _Expr& __y)
4703{
4704 typedef typename _Expr::value_type value_type;
4705 typedef _BinaryOp<__atan2_expr<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4706 return __val_expr<_Op>(_Op(__atan2_expr<value_type>(),
4707 __scalar_expr<value_type>(__x, __y.size()), __y));
4708}
4709
4710template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004711inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004712typename enable_if
4713<
4714 __is_val_expr<_Expr>::value,
4715 __val_expr<_UnaryOp<__cos_expr<typename _Expr::value_type>, _Expr> >
4716>::type
4717cos(const _Expr& __x)
4718{
4719 typedef typename _Expr::value_type value_type;
4720 typedef _UnaryOp<__cos_expr<value_type>, _Expr> _Op;
4721 return __val_expr<_Op>(_Op(__cos_expr<value_type>(), __x));
4722}
4723
4724template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004725inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004726typename enable_if
4727<
4728 __is_val_expr<_Expr>::value,
4729 __val_expr<_UnaryOp<__cosh_expr<typename _Expr::value_type>, _Expr> >
4730>::type
4731cosh(const _Expr& __x)
4732{
4733 typedef typename _Expr::value_type value_type;
4734 typedef _UnaryOp<__cosh_expr<value_type>, _Expr> _Op;
4735 return __val_expr<_Op>(_Op(__cosh_expr<value_type>(), __x));
4736}
4737
4738template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004739inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004740typename enable_if
4741<
4742 __is_val_expr<_Expr>::value,
4743 __val_expr<_UnaryOp<__exp_expr<typename _Expr::value_type>, _Expr> >
4744>::type
4745exp(const _Expr& __x)
4746{
4747 typedef typename _Expr::value_type value_type;
4748 typedef _UnaryOp<__exp_expr<value_type>, _Expr> _Op;
4749 return __val_expr<_Op>(_Op(__exp_expr<value_type>(), __x));
4750}
4751
4752template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004753inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004754typename enable_if
4755<
4756 __is_val_expr<_Expr>::value,
4757 __val_expr<_UnaryOp<__log_expr<typename _Expr::value_type>, _Expr> >
4758>::type
4759log(const _Expr& __x)
4760{
4761 typedef typename _Expr::value_type value_type;
4762 typedef _UnaryOp<__log_expr<value_type>, _Expr> _Op;
4763 return __val_expr<_Op>(_Op(__log_expr<value_type>(), __x));
4764}
4765
4766template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004767inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004768typename enable_if
4769<
4770 __is_val_expr<_Expr>::value,
4771 __val_expr<_UnaryOp<__log10_expr<typename _Expr::value_type>, _Expr> >
4772>::type
4773log10(const _Expr& __x)
4774{
4775 typedef typename _Expr::value_type value_type;
4776 typedef _UnaryOp<__log10_expr<value_type>, _Expr> _Op;
4777 return __val_expr<_Op>(_Op(__log10_expr<value_type>(), __x));
4778}
4779
4780template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004781inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004782typename enable_if
4783<
4784 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4785 __val_expr<_BinaryOp<__pow_expr<typename _Expr1::value_type>, _Expr1, _Expr2> >
4786>::type
4787pow(const _Expr1& __x, const _Expr2& __y)
4788{
4789 typedef typename _Expr1::value_type value_type;
4790 typedef _BinaryOp<__pow_expr<value_type>, _Expr1, _Expr2> _Op;
4791 return __val_expr<_Op>(_Op(__pow_expr<value_type>(), __x, __y));
4792}
4793
4794template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004795inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004796typename enable_if
4797<
4798 __is_val_expr<_Expr>::value,
4799 __val_expr<_BinaryOp<__pow_expr<typename _Expr::value_type>,
4800 _Expr, __scalar_expr<typename _Expr::value_type> > >
4801>::type
4802pow(const _Expr& __x, const typename _Expr::value_type& __y)
4803{
4804 typedef typename _Expr::value_type value_type;
4805 typedef _BinaryOp<__pow_expr<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4806 return __val_expr<_Op>(_Op(__pow_expr<value_type>(),
4807 __x, __scalar_expr<value_type>(__y, __x.size())));
4808}
4809
4810template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004811inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004812typename enable_if
4813<
4814 __is_val_expr<_Expr>::value,
4815 __val_expr<_BinaryOp<__pow_expr<typename _Expr::value_type>,
4816 __scalar_expr<typename _Expr::value_type>, _Expr> >
4817>::type
4818pow(const typename _Expr::value_type& __x, const _Expr& __y)
4819{
4820 typedef typename _Expr::value_type value_type;
4821 typedef _BinaryOp<__pow_expr<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4822 return __val_expr<_Op>(_Op(__pow_expr<value_type>(),
4823 __scalar_expr<value_type>(__x, __y.size()), __y));
4824}
4825
4826template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004827inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004828typename enable_if
4829<
4830 __is_val_expr<_Expr>::value,
4831 __val_expr<_UnaryOp<__sin_expr<typename _Expr::value_type>, _Expr> >
4832>::type
4833sin(const _Expr& __x)
4834{
4835 typedef typename _Expr::value_type value_type;
4836 typedef _UnaryOp<__sin_expr<value_type>, _Expr> _Op;
4837 return __val_expr<_Op>(_Op(__sin_expr<value_type>(), __x));
4838}
4839
4840template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004841inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004842typename enable_if
4843<
4844 __is_val_expr<_Expr>::value,
4845 __val_expr<_UnaryOp<__sinh_expr<typename _Expr::value_type>, _Expr> >
4846>::type
4847sinh(const _Expr& __x)
4848{
4849 typedef typename _Expr::value_type value_type;
4850 typedef _UnaryOp<__sinh_expr<value_type>, _Expr> _Op;
4851 return __val_expr<_Op>(_Op(__sinh_expr<value_type>(), __x));
4852}
4853
4854template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004855inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004856typename enable_if
4857<
4858 __is_val_expr<_Expr>::value,
4859 __val_expr<_UnaryOp<__sqrt_expr<typename _Expr::value_type>, _Expr> >
4860>::type
4861sqrt(const _Expr& __x)
4862{
4863 typedef typename _Expr::value_type value_type;
4864 typedef _UnaryOp<__sqrt_expr<value_type>, _Expr> _Op;
4865 return __val_expr<_Op>(_Op(__sqrt_expr<value_type>(), __x));
4866}
4867
4868template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004869inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004870typename enable_if
4871<
4872 __is_val_expr<_Expr>::value,
4873 __val_expr<_UnaryOp<__tan_expr<typename _Expr::value_type>, _Expr> >
4874>::type
4875tan(const _Expr& __x)
4876{
4877 typedef typename _Expr::value_type value_type;
4878 typedef _UnaryOp<__tan_expr<value_type>, _Expr> _Op;
4879 return __val_expr<_Op>(_Op(__tan_expr<value_type>(), __x));
4880}
4881
4882template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004883inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004884typename enable_if
4885<
4886 __is_val_expr<_Expr>::value,
4887 __val_expr<_UnaryOp<__tanh_expr<typename _Expr::value_type>, _Expr> >
4888>::type
4889tanh(const _Expr& __x)
4890{
4891 typedef typename _Expr::value_type value_type;
4892 typedef _UnaryOp<__tanh_expr<value_type>, _Expr> _Op;
4893 return __val_expr<_Op>(_Op(__tanh_expr<value_type>(), __x));
4894}
4895
4896template <class _Tp>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004897inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004898_Tp*
4899begin(valarray<_Tp>& __v)
4900{
4901 return __v.__begin_;
4902}
4903
4904template <class _Tp>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004905inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004906const _Tp*
4907begin(const valarray<_Tp>& __v)
4908{
4909 return __v.__begin_;
4910}
4911
4912template <class _Tp>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004913inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004914_Tp*
4915end(valarray<_Tp>& __v)
4916{
4917 return __v.__end_;
4918}
4919
4920template <class _Tp>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004921inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004922const _Tp*
4923end(const valarray<_Tp>& __v)
4924{
4925 return __v.__end_;
4926}
4927
Howard Hinnantc51e1022010-05-11 19:42:16 +00004928_LIBCPP_END_NAMESPACE_STD
4929
Eric Fiselierf4433a32017-05-31 22:07:49 +00004930_LIBCPP_POP_MACROS
4931
Mark de Weveree5fe272022-09-02 17:53:28 +02004932#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
4933# include <algorithm>
Nikolas Klauser1e4ae5d2022-11-02 20:27:42 +01004934# include <concepts>
Mark de Weveree5fe272022-09-02 17:53:28 +02004935# include <functional>
4936#endif
4937
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04004938#endif // _LIBCPP_VALARRAY