blob: ff745d30122d68c383599a026b55554e83116f90 [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
364#include <initializer_list>
365
Howard Hinnantaaaa52b2011-10-17 20:05:10 +0000366#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
Arthur O'Dwyer6eeaa002022-02-01 20:16:40 -0500367# pragma GCC system_header
Howard Hinnantaaaa52b2011-10-17 20:05:10 +0000368#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +0000369
Eric Fiselierf4433a32017-05-31 22:07:49 +0000370_LIBCPP_PUSH_MACROS
371#include <__undef_macros>
372
Howard Hinnantc51e1022010-05-11 19:42:16 +0000373_LIBCPP_BEGIN_NAMESPACE_STD
374
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000375template<class _Tp> class _LIBCPP_TEMPLATE_VIS valarray;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000376
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000377class _LIBCPP_TEMPLATE_VIS slice
Howard Hinnantc51e1022010-05-11 19:42:16 +0000378{
379 size_t __start_;
380 size_t __size_;
381 size_t __stride_;
382public:
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000383 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000384 slice()
385 : __start_(0),
386 __size_(0),
387 __stride_(0)
388 {}
389
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000390 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000391 slice(size_t __start, size_t __size, size_t __stride)
392 : __start_(__start),
393 __size_(__size),
394 __stride_(__stride)
395 {}
396
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000397 _LIBCPP_INLINE_VISIBILITY size_t start() const {return __start_;}
398 _LIBCPP_INLINE_VISIBILITY size_t size() const {return __size_;}
399 _LIBCPP_INLINE_VISIBILITY size_t stride() const {return __stride_;}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000400};
401
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000402template <class _Tp> class _LIBCPP_TEMPLATE_VIS slice_array;
Howard Hinnant8331b762013-03-06 23:30:19 +0000403class _LIBCPP_TYPE_VIS gslice;
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000404template <class _Tp> class _LIBCPP_TEMPLATE_VIS gslice_array;
405template <class _Tp> class _LIBCPP_TEMPLATE_VIS mask_array;
406template <class _Tp> class _LIBCPP_TEMPLATE_VIS indirect_array;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000407
408template <class _Tp>
Howard Hinnanta54386e2012-09-14 00:39:16 +0000409_LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000410_Tp*
411begin(valarray<_Tp>& __v);
412
413template <class _Tp>
Howard Hinnanta54386e2012-09-14 00:39:16 +0000414_LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000415const _Tp*
416begin(const valarray<_Tp>& __v);
417
418template <class _Tp>
Howard Hinnanta54386e2012-09-14 00:39:16 +0000419_LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000420_Tp*
421end(valarray<_Tp>& __v);
422
423template <class _Tp>
Howard Hinnanta54386e2012-09-14 00:39:16 +0000424_LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000425const _Tp*
426end(const valarray<_Tp>& __v);
427
428template <class _Op, class _A0>
429struct _UnaryOp
430{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400431 typedef typename _Op::__result_type __result_type;
Arthur O'Dwyer0b6c2482021-05-31 11:33:51 -0400432 typedef typename decay<__result_type>::type value_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000433
434 _Op __op_;
435 _A0 __a0_;
436
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000437 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000438 _UnaryOp(const _Op& __op, const _A0& __a0) : __op_(__op), __a0_(__a0) {}
439
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000440 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400441 __result_type operator[](size_t __i) const {return __op_(__a0_[__i]);}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000442
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000443 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000444 size_t size() const {return __a0_.size();}
445};
446
447template <class _Op, class _A0, class _A1>
448struct _BinaryOp
449{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400450 typedef typename _Op::__result_type __result_type;
Arthur O'Dwyer0b6c2482021-05-31 11:33:51 -0400451 typedef typename decay<__result_type>::type value_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000452
453 _Op __op_;
454 _A0 __a0_;
455 _A1 __a1_;
456
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000457 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000458 _BinaryOp(const _Op& __op, const _A0& __a0, const _A1& __a1)
459 : __op_(__op), __a0_(__a0), __a1_(__a1) {}
460
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000461 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer0b6c2482021-05-31 11:33:51 -0400462 __result_type operator[](size_t __i) const {return __op_(__a0_[__i], __a1_[__i]);}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000463
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000464 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000465 size_t size() const {return __a0_.size();}
466};
467
468template <class _Tp>
469class __scalar_expr
470{
471public:
472 typedef _Tp value_type;
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400473 typedef const _Tp& __result_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000474private:
475 const value_type& __t_;
476 size_t __s_;
477public:
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000478 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000479 explicit __scalar_expr(const value_type& __t, size_t __s) : __t_(__t), __s_(__s) {}
480
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000481 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400482 __result_type operator[](size_t) const {return __t_;}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000483
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000484 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000485 size_t size() const {return __s_;}
486};
487
488template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400489struct __unary_plus
Howard Hinnantc51e1022010-05-11 19:42:16 +0000490{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400491 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000492 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000493 _Tp operator()(const _Tp& __x) const
494 {return +__x;}
495};
496
497template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400498struct __bit_not
Howard Hinnantc51e1022010-05-11 19:42:16 +0000499{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400500 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000501 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000502 _Tp operator()(const _Tp& __x) const
503 {return ~__x;}
504};
505
506template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400507struct __bit_shift_left
Howard Hinnantc51e1022010-05-11 19:42:16 +0000508{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400509 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000510 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000511 _Tp operator()(const _Tp& __x, const _Tp& __y) const
512 {return __x << __y;}
513};
514
515template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400516struct __bit_shift_right
Howard Hinnantc51e1022010-05-11 19:42:16 +0000517{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400518 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000519 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000520 _Tp operator()(const _Tp& __x, const _Tp& __y) const
521 {return __x >> __y;}
522};
523
Howard Hinnantc834c512011-11-29 18:15:50 +0000524template <class _Tp, class _Fp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400525struct __apply_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000526{
527private:
Howard Hinnantc834c512011-11-29 18:15:50 +0000528 _Fp __f_;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000529public:
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400530 typedef _Tp __result_type;
531
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000532 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc834c512011-11-29 18:15:50 +0000533 explicit __apply_expr(_Fp __f) : __f_(__f) {}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000534
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000535 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000536 _Tp operator()(const _Tp& __x) const
537 {return __f_(__x);}
538};
539
540template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400541struct __abs_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000542{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400543 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000544 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000545 _Tp operator()(const _Tp& __x) const
546 {return abs(__x);}
547};
548
549template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400550struct __acos_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000551{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400552 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000553 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000554 _Tp operator()(const _Tp& __x) const
555 {return acos(__x);}
556};
557
558template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400559struct __asin_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000560{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400561 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000562 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000563 _Tp operator()(const _Tp& __x) const
564 {return asin(__x);}
565};
566
567template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400568struct __atan_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000569{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400570 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000571 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000572 _Tp operator()(const _Tp& __x) const
573 {return atan(__x);}
574};
575
576template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400577struct __atan2_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000578{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400579 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000580 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000581 _Tp operator()(const _Tp& __x, const _Tp& __y) const
582 {return atan2(__x, __y);}
583};
584
585template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400586struct __cos_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000587{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400588 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000589 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000590 _Tp operator()(const _Tp& __x) const
591 {return cos(__x);}
592};
593
594template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400595struct __cosh_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000596{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400597 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000598 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000599 _Tp operator()(const _Tp& __x) const
600 {return cosh(__x);}
601};
602
603template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400604struct __exp_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000605{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400606 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000607 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000608 _Tp operator()(const _Tp& __x) const
609 {return exp(__x);}
610};
611
612template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400613struct __log_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000614{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400615 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000616 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000617 _Tp operator()(const _Tp& __x) const
618 {return log(__x);}
619};
620
621template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400622struct __log10_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000623{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400624 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000625 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000626 _Tp operator()(const _Tp& __x) const
627 {return log10(__x);}
628};
629
630template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400631struct __pow_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000632{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400633 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000634 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000635 _Tp operator()(const _Tp& __x, const _Tp& __y) const
636 {return pow(__x, __y);}
637};
638
639template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400640struct __sin_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000641{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400642 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000643 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000644 _Tp operator()(const _Tp& __x) const
645 {return sin(__x);}
646};
647
648template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400649struct __sinh_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000650{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400651 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000652 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000653 _Tp operator()(const _Tp& __x) const
654 {return sinh(__x);}
655};
656
657template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400658struct __sqrt_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000659{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400660 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000661 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000662 _Tp operator()(const _Tp& __x) const
663 {return sqrt(__x);}
664};
665
666template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400667struct __tan_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000668{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400669 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000670 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000671 _Tp operator()(const _Tp& __x) const
672 {return tan(__x);}
673};
674
675template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400676struct __tanh_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000677{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400678 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000679 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000680 _Tp operator()(const _Tp& __x) const
681 {return tanh(__x);}
682};
683
684template <class _ValExpr>
685class __slice_expr
686{
687 typedef typename remove_reference<_ValExpr>::type _RmExpr;
688public:
689 typedef typename _RmExpr::value_type value_type;
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400690 typedef value_type __result_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000691
692private:
693 _ValExpr __expr_;
694 size_t __start_;
695 size_t __size_;
696 size_t __stride_;
697
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000698 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000699 __slice_expr(const slice& __sl, const _RmExpr& __e)
700 : __expr_(__e),
701 __start_(__sl.start()),
702 __size_(__sl.size()),
703 __stride_(__sl.stride())
704 {}
705public:
706
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000707 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400708 __result_type operator[](size_t __i) const
Howard Hinnantc51e1022010-05-11 19:42:16 +0000709 {return __expr_[__start_ + __i * __stride_];}
710
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000711 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000712 size_t size() const {return __size_;}
713
Eric Fiselier7b31ed02019-04-02 08:05:23 +0000714 template <class> friend class __val_expr;
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000715 template <class> friend class _LIBCPP_TEMPLATE_VIS valarray;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000716};
717
718template <class _ValExpr>
719class __mask_expr;
720
721template <class _ValExpr>
722class __indirect_expr;
723
724template <class _ValExpr>
725class __shift_expr
726{
727 typedef typename remove_reference<_ValExpr>::type _RmExpr;
728public:
729 typedef typename _RmExpr::value_type value_type;
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400730 typedef value_type __result_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000731
732private:
733 _ValExpr __expr_;
734 size_t __size_;
735 ptrdiff_t __ul_;
736 ptrdiff_t __sn_;
737 ptrdiff_t __n_;
Howard Hinnantc834c512011-11-29 18:15:50 +0000738 static const ptrdiff_t _Np = static_cast<ptrdiff_t>(
Howard Hinnantc51e1022010-05-11 19:42:16 +0000739 sizeof(ptrdiff_t) * __CHAR_BIT__ - 1);
740
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000741 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000742 __shift_expr(int __n, const _RmExpr& __e)
743 : __expr_(__e),
744 __size_(__e.size()),
745 __n_(__n)
746 {
Howard Hinnantc834c512011-11-29 18:15:50 +0000747 ptrdiff_t __neg_n = static_cast<ptrdiff_t>(__n_ >> _Np);
748 __sn_ = __neg_n | static_cast<ptrdiff_t>(static_cast<size_t>(-__n_) >> _Np);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000749 __ul_ = ((__size_ - __n_) & ~__neg_n) | ((__n_ + 1) & __neg_n);
750 }
751public:
752
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000753 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400754 __result_type operator[](size_t __j) const
Howard Hinnantc51e1022010-05-11 19:42:16 +0000755 {
Howard Hinnant28b24882011-12-01 20:21:04 +0000756 ptrdiff_t __i = static_cast<ptrdiff_t>(__j);
Howard Hinnantc834c512011-11-29 18:15:50 +0000757 ptrdiff_t __m = (__sn_ * __i - __ul_) >> _Np;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000758 return (__expr_[(__i + __n_) & __m] & __m) | (value_type() & ~__m);
759 }
760
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000761 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000762 size_t size() const {return __size_;}
763
764 template <class> friend class __val_expr;
765};
766
767template <class _ValExpr>
768class __cshift_expr
769{
770 typedef typename remove_reference<_ValExpr>::type _RmExpr;
771public:
772 typedef typename _RmExpr::value_type value_type;
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400773 typedef value_type __result_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000774
775private:
776 _ValExpr __expr_;
777 size_t __size_;
778 size_t __m_;
779 size_t __o1_;
780 size_t __o2_;
781
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000782 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000783 __cshift_expr(int __n, const _RmExpr& __e)
784 : __expr_(__e),
785 __size_(__e.size())
786 {
787 __n %= static_cast<int>(__size_);
788 if (__n >= 0)
789 {
790 __m_ = __size_ - __n;
791 __o1_ = __n;
792 __o2_ = __n - __size_;
793 }
794 else
795 {
796 __m_ = -__n;
797 __o1_ = __n + __size_;
798 __o2_ = __n;
799 }
800 }
801public:
802
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000803 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400804 __result_type operator[](size_t __i) const
Howard Hinnantc51e1022010-05-11 19:42:16 +0000805 {
806 if (__i < __m_)
807 return __expr_[__i + __o1_];
808 return __expr_[__i + __o2_];
809 }
810
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000811 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000812 size_t size() const {return __size_;}
813
814 template <class> friend class __val_expr;
815};
816
817template<class _ValExpr>
818class __val_expr;
819
820template<class _ValExpr>
821struct __is_val_expr : false_type {};
822
823template<class _ValExpr>
824struct __is_val_expr<__val_expr<_ValExpr> > : true_type {};
825
826template<class _Tp>
827struct __is_val_expr<valarray<_Tp> > : true_type {};
828
829template<class _Tp>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000830class _LIBCPP_TEMPLATE_VIS valarray
Howard Hinnantc51e1022010-05-11 19:42:16 +0000831{
832public:
833 typedef _Tp value_type;
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400834 typedef _Tp __result_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000835
836private:
837 value_type* __begin_;
838 value_type* __end_;
839
840public:
841 // construct/destroy:
Douglas Gregor68902322012-05-19 07:14:17 +0000842 _LIBCPP_INLINE_VISIBILITY
Bruce Mitchener170d8972020-11-24 12:53:53 -0500843 valarray() : __begin_(nullptr), __end_(nullptr) {}
Louis Dionneb4d05d72018-10-16 19:26:23 +0000844 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Eric Fiseliere529a802016-09-16 00:13:55 +0000845 explicit valarray(size_t __n);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000846 _LIBCPP_INLINE_VISIBILITY
Douglas Gregor68902322012-05-19 07:14:17 +0000847 valarray(const value_type& __x, size_t __n);
848 valarray(const value_type* __p, size_t __n);
849 valarray(const valarray& __v);
Eric Fiselier3b0b81f2017-04-19 00:23:45 +0000850#ifndef _LIBCPP_CXX03_LANG
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000851 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant298aed92012-07-21 00:51:28 +0000852 valarray(valarray&& __v) _NOEXCEPT;
Douglas Gregor68902322012-05-19 07:14:17 +0000853 valarray(initializer_list<value_type> __il);
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400854#endif // _LIBCPP_CXX03_LANG
Douglas Gregor68902322012-05-19 07:14:17 +0000855 valarray(const slice_array<value_type>& __sa);
856 valarray(const gslice_array<value_type>& __ga);
857 valarray(const mask_array<value_type>& __ma);
858 valarray(const indirect_array<value_type>& __ia);
Louis Dionneb4d05d72018-10-16 19:26:23 +0000859 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Douglas Gregor68902322012-05-19 07:14:17 +0000860 ~valarray();
Howard Hinnantc51e1022010-05-11 19:42:16 +0000861
862 // assignment:
Douglas Gregor68902322012-05-19 07:14:17 +0000863 valarray& operator=(const valarray& __v);
Eric Fiselier3b0b81f2017-04-19 00:23:45 +0000864#ifndef _LIBCPP_CXX03_LANG
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000865 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant298aed92012-07-21 00:51:28 +0000866 valarray& operator=(valarray&& __v) _NOEXCEPT;
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000867 _LIBCPP_INLINE_VISIBILITY
Douglas Gregor68902322012-05-19 07:14:17 +0000868 valarray& operator=(initializer_list<value_type>);
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400869#endif // _LIBCPP_CXX03_LANG
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000870 _LIBCPP_INLINE_VISIBILITY
Douglas Gregor68902322012-05-19 07:14:17 +0000871 valarray& operator=(const value_type& __x);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000872 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000873 valarray& operator=(const slice_array<value_type>& __sa);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000874 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000875 valarray& operator=(const gslice_array<value_type>& __ga);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000876 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000877 valarray& operator=(const mask_array<value_type>& __ma);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000878 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000879 valarray& operator=(const indirect_array<value_type>& __ia);
Howard Hinnant329cd412011-07-27 23:19:59 +0000880 template <class _ValExpr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000881 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant329cd412011-07-27 23:19:59 +0000882 valarray& operator=(const __val_expr<_ValExpr>& __v);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000883
884 // element access:
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000885 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000886 const value_type& operator[](size_t __i) const {return __begin_[__i];}
887
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000888 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000889 value_type& operator[](size_t __i) {return __begin_[__i];}
890
891 // subset operations:
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000892 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000893 __val_expr<__slice_expr<const valarray&> > operator[](slice __s) const;
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000894 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000895 slice_array<value_type> operator[](slice __s);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000896 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000897 __val_expr<__indirect_expr<const valarray&> > operator[](const gslice& __gs) const;
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000898 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000899 gslice_array<value_type> operator[](const gslice& __gs);
Eric Fiselier3b0b81f2017-04-19 00:23:45 +0000900#ifndef _LIBCPP_CXX03_LANG
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000901 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000902 __val_expr<__indirect_expr<const valarray&> > operator[](gslice&& __gs) const;
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000903 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000904 gslice_array<value_type> operator[](gslice&& __gs);
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400905#endif // _LIBCPP_CXX03_LANG
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000906 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000907 __val_expr<__mask_expr<const valarray&> > operator[](const valarray<bool>& __vb) const;
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000908 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000909 mask_array<value_type> operator[](const valarray<bool>& __vb);
Eric Fiselier3b0b81f2017-04-19 00:23:45 +0000910#ifndef _LIBCPP_CXX03_LANG
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000911 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000912 __val_expr<__mask_expr<const valarray&> > operator[](valarray<bool>&& __vb) const;
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000913 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000914 mask_array<value_type> operator[](valarray<bool>&& __vb);
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400915#endif // _LIBCPP_CXX03_LANG
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000916 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000917 __val_expr<__indirect_expr<const valarray&> > operator[](const valarray<size_t>& __vs) const;
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000918 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000919 indirect_array<value_type> operator[](const valarray<size_t>& __vs);
Eric Fiselier3b0b81f2017-04-19 00:23:45 +0000920#ifndef _LIBCPP_CXX03_LANG
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000921 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000922 __val_expr<__indirect_expr<const valarray&> > operator[](valarray<size_t>&& __vs) const;
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000923 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000924 indirect_array<value_type> operator[](valarray<size_t>&& __vs);
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400925#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000926
927 // unary operators:
Louis Dionne12a2e572022-05-05 12:24:43 -0400928 _LIBCPP_INLINE_VISIBILITY
929 __val_expr<_UnaryOp<__unary_plus<_Tp>, const valarray&> > operator+() const;
930 _LIBCPP_INLINE_VISIBILITY
931 __val_expr<_UnaryOp<negate<_Tp>, const valarray&> > operator-() const;
932 _LIBCPP_INLINE_VISIBILITY
933 __val_expr<_UnaryOp<__bit_not<_Tp>, const valarray&> > operator~() const;
934 _LIBCPP_INLINE_VISIBILITY
935 __val_expr<_UnaryOp<logical_not<_Tp>, const valarray&> > operator!() const;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000936
937 // computed assignment:
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000938 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000939 valarray& operator*= (const value_type& __x);
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);
958
959 template <class _Expr>
960 typename enable_if
961 <
962 __is_val_expr<_Expr>::value,
963 valarray&
964 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000965 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000966 operator*= (const _Expr& __v);
967
968 template <class _Expr>
969 typename enable_if
970 <
971 __is_val_expr<_Expr>::value,
972 valarray&
973 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000974 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000975 operator/= (const _Expr& __v);
976
977 template <class _Expr>
978 typename enable_if
979 <
980 __is_val_expr<_Expr>::value,
981 valarray&
982 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000983 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000984 operator%= (const _Expr& __v);
985
986 template <class _Expr>
987 typename enable_if
988 <
989 __is_val_expr<_Expr>::value,
990 valarray&
991 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000992 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000993 operator+= (const _Expr& __v);
994
995 template <class _Expr>
996 typename enable_if
997 <
998 __is_val_expr<_Expr>::value,
999 valarray&
1000 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001001 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001002 operator-= (const _Expr& __v);
1003
1004 template <class _Expr>
1005 typename enable_if
1006 <
1007 __is_val_expr<_Expr>::value,
1008 valarray&
1009 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001010 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001011 operator^= (const _Expr& __v);
1012
1013 template <class _Expr>
1014 typename enable_if
1015 <
1016 __is_val_expr<_Expr>::value,
1017 valarray&
1018 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001019 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001020 operator|= (const _Expr& __v);
1021
1022 template <class _Expr>
1023 typename enable_if
1024 <
1025 __is_val_expr<_Expr>::value,
1026 valarray&
1027 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001028 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001029 operator&= (const _Expr& __v);
1030
1031 template <class _Expr>
1032 typename enable_if
1033 <
1034 __is_val_expr<_Expr>::value,
1035 valarray&
1036 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001037 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001038 operator<<= (const _Expr& __v);
1039
1040 template <class _Expr>
1041 typename enable_if
1042 <
1043 __is_val_expr<_Expr>::value,
1044 valarray&
1045 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001046 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001047 operator>>= (const _Expr& __v);
1048
1049 // member functions:
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001050 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant298aed92012-07-21 00:51:28 +00001051 void swap(valarray& __v) _NOEXCEPT;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001052
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001053 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant28b24882011-12-01 20:21:04 +00001054 size_t size() const {return static_cast<size_t>(__end_ - __begin_);}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001055
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001056 _LIBCPP_INLINE_VISIBILITY
Douglas Gregor68902322012-05-19 07:14:17 +00001057 value_type sum() const;
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001058 _LIBCPP_INLINE_VISIBILITY
Douglas Gregor68902322012-05-19 07:14:17 +00001059 value_type min() const;
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001060 _LIBCPP_INLINE_VISIBILITY
Douglas Gregor68902322012-05-19 07:14:17 +00001061 value_type max() const;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001062
Douglas Gregor68902322012-05-19 07:14:17 +00001063 valarray shift (int __i) const;
1064 valarray cshift(int __i) const;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001065 valarray apply(value_type __f(value_type)) const;
1066 valarray apply(value_type __f(const value_type&)) const;
1067 void resize(size_t __n, value_type __x = value_type());
1068
1069private:
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00001070 template <class> friend class _LIBCPP_TEMPLATE_VIS valarray;
1071 template <class> friend class _LIBCPP_TEMPLATE_VIS slice_array;
1072 template <class> friend class _LIBCPP_TEMPLATE_VIS gslice_array;
1073 template <class> friend class _LIBCPP_TEMPLATE_VIS mask_array;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001074 template <class> friend class __mask_expr;
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00001075 template <class> friend class _LIBCPP_TEMPLATE_VIS indirect_array;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001076 template <class> friend class __indirect_expr;
1077 template <class> friend class __val_expr;
1078
1079 template <class _Up>
1080 friend
1081 _Up*
1082 begin(valarray<_Up>& __v);
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001083
Howard Hinnantc51e1022010-05-11 19:42:16 +00001084 template <class _Up>
1085 friend
1086 const _Up*
1087 begin(const valarray<_Up>& __v);
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001088
Howard Hinnantc51e1022010-05-11 19:42:16 +00001089 template <class _Up>
1090 friend
1091 _Up*
1092 end(valarray<_Up>& __v);
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001093
Howard Hinnantc51e1022010-05-11 19:42:16 +00001094 template <class _Up>
1095 friend
1096 const _Up*
1097 end(const valarray<_Up>& __v);
Mikhail Maltsev59de6f82018-02-08 11:33:48 +00001098
Eric Fiseliera119c322018-10-25 17:43:26 +00001099 _LIBCPP_INLINE_VISIBILITY
Eric Fiselier2856ef82018-10-25 17:21:30 +00001100 void __clear(size_t __capacity);
Mikhail Maltsev59de6f82018-02-08 11:33:48 +00001101 valarray& __assign_range(const value_type* __f, const value_type* __l);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001102};
1103
Konstantin Varlamovebb31192021-10-28 00:36:19 -07001104#if _LIBCPP_STD_VER > 14
1105template<class _Tp, size_t _Size>
1106valarray(const _Tp(&)[_Size], size_t) -> valarray<_Tp>;
1107#endif
1108
Louis Dionnedc496ec2021-06-08 17:25:08 -04001109extern template _LIBCPP_FUNC_VIS void valarray<size_t>::resize(size_t, size_t);
Howard Hinnanta37d3cf2013-08-12 18:38:34 +00001110
Howard Hinnantc51e1022010-05-11 19:42:16 +00001111template <class _Op, class _Tp>
1112struct _UnaryOp<_Op, valarray<_Tp> >
1113{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04001114 typedef typename _Op::__result_type __result_type;
Arthur O'Dwyer0b6c2482021-05-31 11:33:51 -04001115 typedef typename decay<__result_type>::type value_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001116
1117 _Op __op_;
1118 const valarray<_Tp>& __a0_;
1119
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001120 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001121 _UnaryOp(const _Op& __op, const valarray<_Tp>& __a0) : __op_(__op), __a0_(__a0) {}
1122
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001123 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04001124 __result_type operator[](size_t __i) const {return __op_(__a0_[__i]);}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001125
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001126 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001127 size_t size() const {return __a0_.size();}
1128};
1129
1130template <class _Op, class _Tp, class _A1>
1131struct _BinaryOp<_Op, valarray<_Tp>, _A1>
1132{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04001133 typedef typename _Op::__result_type __result_type;
Arthur O'Dwyer0b6c2482021-05-31 11:33:51 -04001134 typedef typename decay<__result_type>::type value_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001135
1136 _Op __op_;
1137 const valarray<_Tp>& __a0_;
1138 _A1 __a1_;
1139
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001140 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001141 _BinaryOp(const _Op& __op, const valarray<_Tp>& __a0, const _A1& __a1)
1142 : __op_(__op), __a0_(__a0), __a1_(__a1) {}
1143
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001144 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer0b6c2482021-05-31 11:33:51 -04001145 __result_type operator[](size_t __i) const {return __op_(__a0_[__i], __a1_[__i]);}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001146
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001147 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001148 size_t size() const {return __a0_.size();}
1149};
1150
1151template <class _Op, class _A0, class _Tp>
1152struct _BinaryOp<_Op, _A0, valarray<_Tp> >
1153{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04001154 typedef typename _Op::__result_type __result_type;
Arthur O'Dwyer0b6c2482021-05-31 11:33:51 -04001155 typedef typename decay<__result_type>::type value_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001156
1157 _Op __op_;
1158 _A0 __a0_;
1159 const valarray<_Tp>& __a1_;
1160
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001161 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001162 _BinaryOp(const _Op& __op, const _A0& __a0, const valarray<_Tp>& __a1)
1163 : __op_(__op), __a0_(__a0), __a1_(__a1) {}
1164
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001165 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer0b6c2482021-05-31 11:33:51 -04001166 __result_type operator[](size_t __i) const {return __op_(__a0_[__i], __a1_[__i]);}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001167
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001168 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001169 size_t size() const {return __a0_.size();}
1170};
1171
1172template <class _Op, class _Tp>
1173struct _BinaryOp<_Op, valarray<_Tp>, valarray<_Tp> >
1174{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04001175 typedef typename _Op::__result_type __result_type;
Arthur O'Dwyer0b6c2482021-05-31 11:33:51 -04001176 typedef typename decay<__result_type>::type value_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001177
1178 _Op __op_;
1179 const valarray<_Tp>& __a0_;
1180 const valarray<_Tp>& __a1_;
1181
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001182 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001183 _BinaryOp(const _Op& __op, const valarray<_Tp>& __a0, const valarray<_Tp>& __a1)
1184 : __op_(__op), __a0_(__a0), __a1_(__a1) {}
1185
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001186 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer0b6c2482021-05-31 11:33:51 -04001187 __result_type operator[](size_t __i) const {return __op_(__a0_[__i], __a1_[__i]);}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001188
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001189 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001190 size_t size() const {return __a0_.size();}
1191};
1192
1193// slice_array
1194
1195template <class _Tp>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00001196class _LIBCPP_TEMPLATE_VIS slice_array
Howard Hinnantc51e1022010-05-11 19:42:16 +00001197{
1198public:
1199 typedef _Tp value_type;
1200
1201private:
1202 value_type* __vp_;
1203 size_t __size_;
1204 size_t __stride_;
1205
1206public:
1207 template <class _Expr>
1208 typename enable_if
1209 <
1210 __is_val_expr<_Expr>::value,
1211 void
1212 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001213 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001214 operator=(const _Expr& __v) const;
1215
1216 template <class _Expr>
1217 typename enable_if
1218 <
1219 __is_val_expr<_Expr>::value,
1220 void
1221 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001222 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001223 operator*=(const _Expr& __v) const;
1224
1225 template <class _Expr>
1226 typename enable_if
1227 <
1228 __is_val_expr<_Expr>::value,
1229 void
1230 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001231 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001232 operator/=(const _Expr& __v) const;
1233
1234 template <class _Expr>
1235 typename enable_if
1236 <
1237 __is_val_expr<_Expr>::value,
1238 void
1239 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001240 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001241 operator%=(const _Expr& __v) const;
1242
1243 template <class _Expr>
1244 typename enable_if
1245 <
1246 __is_val_expr<_Expr>::value,
1247 void
1248 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001249 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001250 operator+=(const _Expr& __v) const;
1251
1252 template <class _Expr>
1253 typename enable_if
1254 <
1255 __is_val_expr<_Expr>::value,
1256 void
1257 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001258 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001259 operator-=(const _Expr& __v) const;
1260
1261 template <class _Expr>
1262 typename enable_if
1263 <
1264 __is_val_expr<_Expr>::value,
1265 void
1266 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001267 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001268 operator^=(const _Expr& __v) const;
1269
1270 template <class _Expr>
1271 typename enable_if
1272 <
1273 __is_val_expr<_Expr>::value,
1274 void
1275 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001276 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001277 operator&=(const _Expr& __v) const;
1278
1279 template <class _Expr>
1280 typename enable_if
1281 <
1282 __is_val_expr<_Expr>::value,
1283 void
1284 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001285 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001286 operator|=(const _Expr& __v) const;
1287
1288 template <class _Expr>
1289 typename enable_if
1290 <
1291 __is_val_expr<_Expr>::value,
1292 void
1293 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001294 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001295 operator<<=(const _Expr& __v) const;
1296
1297 template <class _Expr>
1298 typename enable_if
1299 <
1300 __is_val_expr<_Expr>::value,
1301 void
1302 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001303 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001304 operator>>=(const _Expr& __v) const;
1305
Eric Fiselierb9f37ca2019-12-12 20:48:11 -05001306 slice_array(slice_array const&) = default;
1307
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001308 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001309 const slice_array& operator=(const slice_array& __sa) const;
1310
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001311 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001312 void operator=(const value_type& __x) const;
1313
zoecarver79fa7502020-12-02 10:49:20 -08001314 _LIBCPP_INLINE_VISIBILITY
1315 void operator=(const valarray<value_type>& __va) const;
1316
Howard Hinnantc51e1022010-05-11 19:42:16 +00001317private:
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001318 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001319 slice_array(const slice& __sl, const valarray<value_type>& __v)
1320 : __vp_(const_cast<value_type*>(__v.__begin_ + __sl.start())),
1321 __size_(__sl.size()),
1322 __stride_(__sl.stride())
1323 {}
1324
1325 template <class> friend class valarray;
1326 template <class> friend class sliceExpr;
1327};
1328
1329template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001330inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001331const slice_array<_Tp>&
1332slice_array<_Tp>::operator=(const slice_array& __sa) const
1333{
1334 value_type* __t = __vp_;
1335 const value_type* __s = __sa.__vp_;
1336 for (size_t __n = __size_; __n; --__n, __t += __stride_, __s += __sa.__stride_)
1337 *__t = *__s;
Eric Fiselier3b80ce92014-08-12 00:06:58 +00001338 return *this;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001339}
1340
1341template <class _Tp>
1342template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001343inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001344typename enable_if
1345<
1346 __is_val_expr<_Expr>::value,
1347 void
1348>::type
1349slice_array<_Tp>::operator=(const _Expr& __v) const
1350{
1351 value_type* __t = __vp_;
1352 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1353 *__t = __v[__i];
1354}
1355
1356template <class _Tp>
zoecarver79fa7502020-12-02 10:49:20 -08001357inline void
1358slice_array<_Tp>::operator=(const valarray<value_type>& __va) const
1359{
1360 value_type* __t = __vp_;
1361 for (size_t __i = 0; __i < __va.size(); ++__i, __t += __stride_)
1362 *__t = __va[__i];
1363}
1364
1365template <class _Tp>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001366template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001367inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001368typename enable_if
1369<
1370 __is_val_expr<_Expr>::value,
1371 void
1372>::type
1373slice_array<_Tp>::operator*=(const _Expr& __v) const
1374{
1375 value_type* __t = __vp_;
1376 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1377 *__t *= __v[__i];
1378}
1379
1380template <class _Tp>
1381template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001382inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001383typename enable_if
1384<
1385 __is_val_expr<_Expr>::value,
1386 void
1387>::type
1388slice_array<_Tp>::operator/=(const _Expr& __v) const
1389{
1390 value_type* __t = __vp_;
1391 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1392 *__t /= __v[__i];
1393}
1394
1395template <class _Tp>
1396template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001397inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001398typename enable_if
1399<
1400 __is_val_expr<_Expr>::value,
1401 void
1402>::type
1403slice_array<_Tp>::operator%=(const _Expr& __v) const
1404{
1405 value_type* __t = __vp_;
1406 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1407 *__t %= __v[__i];
1408}
1409
1410template <class _Tp>
1411template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001412inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001413typename enable_if
1414<
1415 __is_val_expr<_Expr>::value,
1416 void
1417>::type
1418slice_array<_Tp>::operator+=(const _Expr& __v) const
1419{
1420 value_type* __t = __vp_;
1421 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1422 *__t += __v[__i];
1423}
1424
1425template <class _Tp>
1426template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001427inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001428typename enable_if
1429<
1430 __is_val_expr<_Expr>::value,
1431 void
1432>::type
1433slice_array<_Tp>::operator-=(const _Expr& __v) const
1434{
1435 value_type* __t = __vp_;
1436 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1437 *__t -= __v[__i];
1438}
1439
1440template <class _Tp>
1441template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001442inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001443typename enable_if
1444<
1445 __is_val_expr<_Expr>::value,
1446 void
1447>::type
1448slice_array<_Tp>::operator^=(const _Expr& __v) const
1449{
1450 value_type* __t = __vp_;
1451 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1452 *__t ^= __v[__i];
1453}
1454
1455template <class _Tp>
1456template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001457inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001458typename enable_if
1459<
1460 __is_val_expr<_Expr>::value,
1461 void
1462>::type
1463slice_array<_Tp>::operator&=(const _Expr& __v) const
1464{
1465 value_type* __t = __vp_;
1466 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1467 *__t &= __v[__i];
1468}
1469
1470template <class _Tp>
1471template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001472inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001473typename enable_if
1474<
1475 __is_val_expr<_Expr>::value,
1476 void
1477>::type
1478slice_array<_Tp>::operator|=(const _Expr& __v) const
1479{
1480 value_type* __t = __vp_;
1481 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1482 *__t |= __v[__i];
1483}
1484
1485template <class _Tp>
1486template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001487inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001488typename enable_if
1489<
1490 __is_val_expr<_Expr>::value,
1491 void
1492>::type
1493slice_array<_Tp>::operator<<=(const _Expr& __v) const
1494{
1495 value_type* __t = __vp_;
1496 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1497 *__t <<= __v[__i];
1498}
1499
1500template <class _Tp>
1501template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001502inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001503typename enable_if
1504<
1505 __is_val_expr<_Expr>::value,
1506 void
1507>::type
1508slice_array<_Tp>::operator>>=(const _Expr& __v) const
1509{
1510 value_type* __t = __vp_;
1511 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1512 *__t >>= __v[__i];
1513}
1514
1515template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001516inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001517void
1518slice_array<_Tp>::operator=(const value_type& __x) const
1519{
1520 value_type* __t = __vp_;
1521 for (size_t __n = __size_; __n; --__n, __t += __stride_)
1522 *__t = __x;
1523}
1524
1525// gslice
1526
Howard Hinnant8331b762013-03-06 23:30:19 +00001527class _LIBCPP_TYPE_VIS gslice
Howard Hinnantc51e1022010-05-11 19:42:16 +00001528{
1529 valarray<size_t> __size_;
1530 valarray<size_t> __stride_;
1531 valarray<size_t> __1d_;
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001532
Howard Hinnantc51e1022010-05-11 19:42:16 +00001533public:
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001534 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001535 gslice() {}
Douglas Gregor68902322012-05-19 07:14:17 +00001536
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001537 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001538 gslice(size_t __start, const valarray<size_t>& __size,
1539 const valarray<size_t>& __stride)
1540 : __size_(__size),
1541 __stride_(__stride)
1542 {__init(__start);}
1543
Eric Fiselier3b0b81f2017-04-19 00:23:45 +00001544#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001545
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001546 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001547 gslice(size_t __start, const valarray<size_t>& __size,
1548 valarray<size_t>&& __stride)
1549 : __size_(__size),
Corentin Jabotcfb8a912022-02-24 19:54:00 -05001550 __stride_(std::move(__stride))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001551 {__init(__start);}
1552
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001553 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001554 gslice(size_t __start, valarray<size_t>&& __size,
1555 const valarray<size_t>& __stride)
Corentin Jabotcfb8a912022-02-24 19:54:00 -05001556 : __size_(std::move(__size)),
Howard Hinnantc51e1022010-05-11 19:42:16 +00001557 __stride_(__stride)
1558 {__init(__start);}
1559
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001560 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001561 gslice(size_t __start, valarray<size_t>&& __size,
1562 valarray<size_t>&& __stride)
Corentin Jabotcfb8a912022-02-24 19:54:00 -05001563 : __size_(std::move(__size)),
1564 __stride_(std::move(__stride))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001565 {__init(__start);}
1566
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001567#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001568
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001569 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001570 size_t start() const {return __1d_.size() ? __1d_[0] : 0;}
1571
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001572 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001573 valarray<size_t> size() const {return __size_;}
1574
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001575 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001576 valarray<size_t> stride() const {return __stride_;}
1577
1578private:
1579 void __init(size_t __start);
1580
1581 template <class> friend class gslice_array;
1582 template <class> friend class valarray;
1583 template <class> friend class __val_expr;
1584};
1585
1586// gslice_array
1587
1588template <class _Tp>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00001589class _LIBCPP_TEMPLATE_VIS gslice_array
Howard Hinnantc51e1022010-05-11 19:42:16 +00001590{
1591public:
1592 typedef _Tp value_type;
1593
1594private:
1595 value_type* __vp_;
1596 valarray<size_t> __1d_;
1597
1598public:
1599 template <class _Expr>
1600 typename enable_if
1601 <
1602 __is_val_expr<_Expr>::value,
1603 void
1604 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001605 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001606 operator=(const _Expr& __v) const;
1607
1608 template <class _Expr>
1609 typename enable_if
1610 <
1611 __is_val_expr<_Expr>::value,
1612 void
1613 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001614 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001615 operator*=(const _Expr& __v) const;
1616
1617 template <class _Expr>
1618 typename enable_if
1619 <
1620 __is_val_expr<_Expr>::value,
1621 void
1622 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001623 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001624 operator/=(const _Expr& __v) const;
1625
1626 template <class _Expr>
1627 typename enable_if
1628 <
1629 __is_val_expr<_Expr>::value,
1630 void
1631 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001632 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001633 operator%=(const _Expr& __v) const;
1634
1635 template <class _Expr>
1636 typename enable_if
1637 <
1638 __is_val_expr<_Expr>::value,
1639 void
1640 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001641 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001642 operator+=(const _Expr& __v) const;
1643
1644 template <class _Expr>
1645 typename enable_if
1646 <
1647 __is_val_expr<_Expr>::value,
1648 void
1649 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001650 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001651 operator-=(const _Expr& __v) const;
1652
1653 template <class _Expr>
1654 typename enable_if
1655 <
1656 __is_val_expr<_Expr>::value,
1657 void
1658 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001659 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001660 operator^=(const _Expr& __v) const;
1661
1662 template <class _Expr>
1663 typename enable_if
1664 <
1665 __is_val_expr<_Expr>::value,
1666 void
1667 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001668 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001669 operator&=(const _Expr& __v) const;
1670
1671 template <class _Expr>
1672 typename enable_if
1673 <
1674 __is_val_expr<_Expr>::value,
1675 void
1676 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001677 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001678 operator|=(const _Expr& __v) const;
1679
1680 template <class _Expr>
1681 typename enable_if
1682 <
1683 __is_val_expr<_Expr>::value,
1684 void
1685 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001686 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001687 operator<<=(const _Expr& __v) const;
1688
1689 template <class _Expr>
1690 typename enable_if
1691 <
1692 __is_val_expr<_Expr>::value,
1693 void
1694 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001695 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001696 operator>>=(const _Expr& __v) const;
1697
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001698 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001699 const gslice_array& operator=(const gslice_array& __ga) const;
1700
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001701 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001702 void operator=(const value_type& __x) const;
1703
Eric Fiselierb9f37ca2019-12-12 20:48:11 -05001704 gslice_array(const gslice_array&) = default;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001705
1706private:
Howard Hinnantc51e1022010-05-11 19:42:16 +00001707 gslice_array(const gslice& __gs, const valarray<value_type>& __v)
1708 : __vp_(const_cast<value_type*>(__v.__begin_)),
1709 __1d_(__gs.__1d_)
1710 {}
1711
Eric Fiselier3b0b81f2017-04-19 00:23:45 +00001712#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001713 gslice_array(gslice&& __gs, const valarray<value_type>& __v)
1714 : __vp_(const_cast<value_type*>(__v.__begin_)),
Corentin Jabotcfb8a912022-02-24 19:54:00 -05001715 __1d_(std::move(__gs.__1d_))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001716 {}
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001717#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001718
1719 template <class> friend class valarray;
1720};
1721
1722template <class _Tp>
1723template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001724inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001725typename enable_if
1726<
1727 __is_val_expr<_Expr>::value,
1728 void
1729>::type
1730gslice_array<_Tp>::operator=(const _Expr& __v) const
1731{
1732 typedef const size_t* _Ip;
1733 size_t __j = 0;
1734 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1735 __vp_[*__i] = __v[__j];
1736}
1737
1738template <class _Tp>
1739template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001740inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001741typename enable_if
1742<
1743 __is_val_expr<_Expr>::value,
1744 void
1745>::type
1746gslice_array<_Tp>::operator*=(const _Expr& __v) const
1747{
1748 typedef const size_t* _Ip;
1749 size_t __j = 0;
1750 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1751 __vp_[*__i] *= __v[__j];
1752}
1753
1754template <class _Tp>
1755template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001756inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001757typename enable_if
1758<
1759 __is_val_expr<_Expr>::value,
1760 void
1761>::type
1762gslice_array<_Tp>::operator/=(const _Expr& __v) const
1763{
1764 typedef const size_t* _Ip;
1765 size_t __j = 0;
1766 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1767 __vp_[*__i] /= __v[__j];
1768}
1769
1770template <class _Tp>
1771template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001772inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001773typename enable_if
1774<
1775 __is_val_expr<_Expr>::value,
1776 void
1777>::type
1778gslice_array<_Tp>::operator%=(const _Expr& __v) const
1779{
1780 typedef const size_t* _Ip;
1781 size_t __j = 0;
1782 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1783 __vp_[*__i] %= __v[__j];
1784}
1785
1786template <class _Tp>
1787template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001788inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001789typename enable_if
1790<
1791 __is_val_expr<_Expr>::value,
1792 void
1793>::type
1794gslice_array<_Tp>::operator+=(const _Expr& __v) const
1795{
1796 typedef const size_t* _Ip;
1797 size_t __j = 0;
1798 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1799 __vp_[*__i] += __v[__j];
1800}
1801
1802template <class _Tp>
1803template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001804inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001805typename enable_if
1806<
1807 __is_val_expr<_Expr>::value,
1808 void
1809>::type
1810gslice_array<_Tp>::operator-=(const _Expr& __v) const
1811{
1812 typedef const size_t* _Ip;
1813 size_t __j = 0;
1814 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1815 __vp_[*__i] -= __v[__j];
1816}
1817
1818template <class _Tp>
1819template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001820inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001821typename enable_if
1822<
1823 __is_val_expr<_Expr>::value,
1824 void
1825>::type
1826gslice_array<_Tp>::operator^=(const _Expr& __v) const
1827{
1828 typedef const size_t* _Ip;
1829 size_t __j = 0;
1830 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1831 __vp_[*__i] ^= __v[__j];
1832}
1833
1834template <class _Tp>
1835template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001836inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001837typename enable_if
1838<
1839 __is_val_expr<_Expr>::value,
1840 void
1841>::type
1842gslice_array<_Tp>::operator&=(const _Expr& __v) const
1843{
1844 typedef const size_t* _Ip;
1845 size_t __j = 0;
1846 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1847 __vp_[*__i] &= __v[__j];
1848}
1849
1850template <class _Tp>
1851template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001852inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001853typename enable_if
1854<
1855 __is_val_expr<_Expr>::value,
1856 void
1857>::type
1858gslice_array<_Tp>::operator|=(const _Expr& __v) const
1859{
1860 typedef const size_t* _Ip;
1861 size_t __j = 0;
1862 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1863 __vp_[*__i] |= __v[__j];
1864}
1865
1866template <class _Tp>
1867template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001868inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001869typename enable_if
1870<
1871 __is_val_expr<_Expr>::value,
1872 void
1873>::type
1874gslice_array<_Tp>::operator<<=(const _Expr& __v) const
1875{
1876 typedef const size_t* _Ip;
1877 size_t __j = 0;
1878 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1879 __vp_[*__i] <<= __v[__j];
1880}
1881
1882template <class _Tp>
1883template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001884inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001885typename enable_if
1886<
1887 __is_val_expr<_Expr>::value,
1888 void
1889>::type
1890gslice_array<_Tp>::operator>>=(const _Expr& __v) const
1891{
1892 typedef const size_t* _Ip;
1893 size_t __j = 0;
1894 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1895 __vp_[*__i] >>= __v[__j];
1896}
1897
1898template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001899inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001900const gslice_array<_Tp>&
1901gslice_array<_Tp>::operator=(const gslice_array& __ga) const
1902{
1903 typedef const size_t* _Ip;
1904 const value_type* __s = __ga.__vp_;
1905 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_, __j = __ga.__1d_.__begin_;
1906 __i != __e; ++__i, ++__j)
1907 __vp_[*__i] = __s[*__j];
1908 return *this;
1909}
1910
1911template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001912inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001913void
1914gslice_array<_Tp>::operator=(const value_type& __x) const
1915{
1916 typedef const size_t* _Ip;
1917 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i)
1918 __vp_[*__i] = __x;
1919}
1920
1921// mask_array
1922
1923template <class _Tp>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00001924class _LIBCPP_TEMPLATE_VIS mask_array
Howard Hinnantc51e1022010-05-11 19:42:16 +00001925{
1926public:
1927 typedef _Tp value_type;
1928
1929private:
1930 value_type* __vp_;
1931 valarray<size_t> __1d_;
1932
1933public:
1934 template <class _Expr>
1935 typename enable_if
1936 <
1937 __is_val_expr<_Expr>::value,
1938 void
1939 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001940 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001941 operator=(const _Expr& __v) const;
1942
1943 template <class _Expr>
1944 typename enable_if
1945 <
1946 __is_val_expr<_Expr>::value,
1947 void
1948 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001949 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001950 operator*=(const _Expr& __v) const;
1951
1952 template <class _Expr>
1953 typename enable_if
1954 <
1955 __is_val_expr<_Expr>::value,
1956 void
1957 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001958 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001959 operator/=(const _Expr& __v) const;
1960
1961 template <class _Expr>
1962 typename enable_if
1963 <
1964 __is_val_expr<_Expr>::value,
1965 void
1966 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001967 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001968 operator%=(const _Expr& __v) const;
1969
1970 template <class _Expr>
1971 typename enable_if
1972 <
1973 __is_val_expr<_Expr>::value,
1974 void
1975 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001976 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001977 operator+=(const _Expr& __v) const;
1978
1979 template <class _Expr>
1980 typename enable_if
1981 <
1982 __is_val_expr<_Expr>::value,
1983 void
1984 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001985 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001986 operator-=(const _Expr& __v) const;
1987
1988 template <class _Expr>
1989 typename enable_if
1990 <
1991 __is_val_expr<_Expr>::value,
1992 void
1993 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001994 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001995 operator^=(const _Expr& __v) const;
1996
1997 template <class _Expr>
1998 typename enable_if
1999 <
2000 __is_val_expr<_Expr>::value,
2001 void
2002 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002003 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002004 operator&=(const _Expr& __v) const;
2005
2006 template <class _Expr>
2007 typename enable_if
2008 <
2009 __is_val_expr<_Expr>::value,
2010 void
2011 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002012 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002013 operator|=(const _Expr& __v) const;
2014
2015 template <class _Expr>
2016 typename enable_if
2017 <
2018 __is_val_expr<_Expr>::value,
2019 void
2020 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002021 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002022 operator<<=(const _Expr& __v) const;
2023
2024 template <class _Expr>
2025 typename enable_if
2026 <
2027 __is_val_expr<_Expr>::value,
2028 void
2029 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002030 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002031 operator>>=(const _Expr& __v) const;
2032
Eric Fiselierb9f37ca2019-12-12 20:48:11 -05002033 mask_array(const mask_array&) = default;
2034
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002035 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002036 const mask_array& operator=(const mask_array& __ma) const;
2037
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002038 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002039 void operator=(const value_type& __x) const;
2040
Howard Hinnantc51e1022010-05-11 19:42:16 +00002041private:
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002042 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002043 mask_array(const valarray<bool>& __vb, const valarray<value_type>& __v)
2044 : __vp_(const_cast<value_type*>(__v.__begin_)),
Howard Hinnant28b24882011-12-01 20:21:04 +00002045 __1d_(static_cast<size_t>(count(__vb.__begin_, __vb.__end_, true)))
Howard Hinnantc51e1022010-05-11 19:42:16 +00002046 {
2047 size_t __j = 0;
2048 for (size_t __i = 0; __i < __vb.size(); ++__i)
2049 if (__vb[__i])
2050 __1d_[__j++] = __i;
2051 }
2052
2053 template <class> friend class valarray;
2054};
2055
2056template <class _Tp>
2057template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002058inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002059typename enable_if
2060<
2061 __is_val_expr<_Expr>::value,
2062 void
2063>::type
2064mask_array<_Tp>::operator=(const _Expr& __v) const
2065{
2066 size_t __n = __1d_.size();
2067 for (size_t __i = 0; __i < __n; ++__i)
2068 __vp_[__1d_[__i]] = __v[__i];
2069}
2070
2071template <class _Tp>
2072template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002073inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002074typename enable_if
2075<
2076 __is_val_expr<_Expr>::value,
2077 void
2078>::type
2079mask_array<_Tp>::operator*=(const _Expr& __v) const
2080{
2081 size_t __n = __1d_.size();
2082 for (size_t __i = 0; __i < __n; ++__i)
2083 __vp_[__1d_[__i]] *= __v[__i];
2084}
2085
2086template <class _Tp>
2087template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002088inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002089typename enable_if
2090<
2091 __is_val_expr<_Expr>::value,
2092 void
2093>::type
2094mask_array<_Tp>::operator/=(const _Expr& __v) const
2095{
2096 size_t __n = __1d_.size();
2097 for (size_t __i = 0; __i < __n; ++__i)
2098 __vp_[__1d_[__i]] /= __v[__i];
2099}
2100
2101template <class _Tp>
2102template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002103inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002104typename enable_if
2105<
2106 __is_val_expr<_Expr>::value,
2107 void
2108>::type
2109mask_array<_Tp>::operator%=(const _Expr& __v) const
2110{
2111 size_t __n = __1d_.size();
2112 for (size_t __i = 0; __i < __n; ++__i)
2113 __vp_[__1d_[__i]] %= __v[__i];
2114}
2115
2116template <class _Tp>
2117template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002118inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002119typename enable_if
2120<
2121 __is_val_expr<_Expr>::value,
2122 void
2123>::type
2124mask_array<_Tp>::operator+=(const _Expr& __v) const
2125{
2126 size_t __n = __1d_.size();
2127 for (size_t __i = 0; __i < __n; ++__i)
2128 __vp_[__1d_[__i]] += __v[__i];
2129}
2130
2131template <class _Tp>
2132template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002133inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002134typename enable_if
2135<
2136 __is_val_expr<_Expr>::value,
2137 void
2138>::type
2139mask_array<_Tp>::operator-=(const _Expr& __v) const
2140{
2141 size_t __n = __1d_.size();
2142 for (size_t __i = 0; __i < __n; ++__i)
2143 __vp_[__1d_[__i]] -= __v[__i];
2144}
2145
2146template <class _Tp>
2147template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002148inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002149typename enable_if
2150<
2151 __is_val_expr<_Expr>::value,
2152 void
2153>::type
2154mask_array<_Tp>::operator^=(const _Expr& __v) const
2155{
2156 size_t __n = __1d_.size();
2157 for (size_t __i = 0; __i < __n; ++__i)
2158 __vp_[__1d_[__i]] ^= __v[__i];
2159}
2160
2161template <class _Tp>
2162template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002163inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002164typename enable_if
2165<
2166 __is_val_expr<_Expr>::value,
2167 void
2168>::type
2169mask_array<_Tp>::operator&=(const _Expr& __v) const
2170{
2171 size_t __n = __1d_.size();
2172 for (size_t __i = 0; __i < __n; ++__i)
2173 __vp_[__1d_[__i]] &= __v[__i];
2174}
2175
2176template <class _Tp>
2177template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002178inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002179typename enable_if
2180<
2181 __is_val_expr<_Expr>::value,
2182 void
2183>::type
2184mask_array<_Tp>::operator|=(const _Expr& __v) const
2185{
2186 size_t __n = __1d_.size();
2187 for (size_t __i = 0; __i < __n; ++__i)
2188 __vp_[__1d_[__i]] |= __v[__i];
2189}
2190
2191template <class _Tp>
2192template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002193inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002194typename enable_if
2195<
2196 __is_val_expr<_Expr>::value,
2197 void
2198>::type
2199mask_array<_Tp>::operator<<=(const _Expr& __v) const
2200{
2201 size_t __n = __1d_.size();
2202 for (size_t __i = 0; __i < __n; ++__i)
2203 __vp_[__1d_[__i]] <<= __v[__i];
2204}
2205
2206template <class _Tp>
2207template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002208inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002209typename enable_if
2210<
2211 __is_val_expr<_Expr>::value,
2212 void
2213>::type
2214mask_array<_Tp>::operator>>=(const _Expr& __v) const
2215{
2216 size_t __n = __1d_.size();
2217 for (size_t __i = 0; __i < __n; ++__i)
2218 __vp_[__1d_[__i]] >>= __v[__i];
2219}
2220
2221template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002222inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002223const mask_array<_Tp>&
2224mask_array<_Tp>::operator=(const mask_array& __ma) const
2225{
2226 size_t __n = __1d_.size();
2227 for (size_t __i = 0; __i < __n; ++__i)
2228 __vp_[__1d_[__i]] = __ma.__vp_[__1d_[__i]];
Eric Fiselier3b80ce92014-08-12 00:06:58 +00002229 return *this;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002230}
2231
2232template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002233inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002234void
2235mask_array<_Tp>::operator=(const value_type& __x) const
2236{
2237 size_t __n = __1d_.size();
2238 for (size_t __i = 0; __i < __n; ++__i)
2239 __vp_[__1d_[__i]] = __x;
2240}
2241
2242template <class _ValExpr>
2243class __mask_expr
2244{
2245 typedef typename remove_reference<_ValExpr>::type _RmExpr;
2246public:
2247 typedef typename _RmExpr::value_type value_type;
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002248 typedef value_type __result_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002249
2250private:
2251 _ValExpr __expr_;
2252 valarray<size_t> __1d_;
2253
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002254 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002255 __mask_expr(const valarray<bool>& __vb, const _RmExpr& __e)
2256 : __expr_(__e),
Howard Hinnant28b24882011-12-01 20:21:04 +00002257 __1d_(static_cast<size_t>(count(__vb.__begin_, __vb.__end_, true)))
Howard Hinnantc51e1022010-05-11 19:42:16 +00002258 {
2259 size_t __j = 0;
2260 for (size_t __i = 0; __i < __vb.size(); ++__i)
2261 if (__vb[__i])
2262 __1d_[__j++] = __i;
2263 }
2264
2265public:
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002266 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002267 __result_type operator[](size_t __i) const
Howard Hinnantc51e1022010-05-11 19:42:16 +00002268 {return __expr_[__1d_[__i]];}
2269
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002270 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002271 size_t size() const {return __1d_.size();}
2272
Eric Fiselier7b31ed02019-04-02 08:05:23 +00002273 template <class> friend class __val_expr;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002274 template <class> friend class valarray;
2275};
2276
2277// indirect_array
2278
2279template <class _Tp>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00002280class _LIBCPP_TEMPLATE_VIS indirect_array
Howard Hinnantc51e1022010-05-11 19:42:16 +00002281{
2282public:
2283 typedef _Tp value_type;
2284
2285private:
2286 value_type* __vp_;
2287 valarray<size_t> __1d_;
2288
2289public:
2290 template <class _Expr>
2291 typename enable_if
2292 <
2293 __is_val_expr<_Expr>::value,
2294 void
2295 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002296 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002297 operator=(const _Expr& __v) const;
2298
2299 template <class _Expr>
2300 typename enable_if
2301 <
2302 __is_val_expr<_Expr>::value,
2303 void
2304 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002305 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002306 operator*=(const _Expr& __v) const;
2307
2308 template <class _Expr>
2309 typename enable_if
2310 <
2311 __is_val_expr<_Expr>::value,
2312 void
2313 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002314 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002315 operator/=(const _Expr& __v) const;
2316
2317 template <class _Expr>
2318 typename enable_if
2319 <
2320 __is_val_expr<_Expr>::value,
2321 void
2322 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002323 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002324 operator%=(const _Expr& __v) const;
2325
2326 template <class _Expr>
2327 typename enable_if
2328 <
2329 __is_val_expr<_Expr>::value,
2330 void
2331 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002332 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002333 operator+=(const _Expr& __v) const;
2334
2335 template <class _Expr>
2336 typename enable_if
2337 <
2338 __is_val_expr<_Expr>::value,
2339 void
2340 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002341 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002342 operator-=(const _Expr& __v) const;
2343
2344 template <class _Expr>
2345 typename enable_if
2346 <
2347 __is_val_expr<_Expr>::value,
2348 void
2349 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002350 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002351 operator^=(const _Expr& __v) const;
2352
2353 template <class _Expr>
2354 typename enable_if
2355 <
2356 __is_val_expr<_Expr>::value,
2357 void
2358 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002359 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002360 operator&=(const _Expr& __v) const;
2361
2362 template <class _Expr>
2363 typename enable_if
2364 <
2365 __is_val_expr<_Expr>::value,
2366 void
2367 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002368 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002369 operator|=(const _Expr& __v) const;
2370
2371 template <class _Expr>
2372 typename enable_if
2373 <
2374 __is_val_expr<_Expr>::value,
2375 void
2376 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002377 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002378 operator<<=(const _Expr& __v) const;
2379
2380 template <class _Expr>
2381 typename enable_if
2382 <
2383 __is_val_expr<_Expr>::value,
2384 void
2385 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002386 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002387 operator>>=(const _Expr& __v) const;
2388
Eric Fiselierb9f37ca2019-12-12 20:48:11 -05002389 indirect_array(const indirect_array&) = default;
2390
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002391 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002392 const indirect_array& operator=(const indirect_array& __ia) const;
2393
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002394 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002395 void operator=(const value_type& __x) const;
2396
Howard Hinnantc51e1022010-05-11 19:42:16 +00002397private:
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002398 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002399 indirect_array(const valarray<size_t>& __ia, const valarray<value_type>& __v)
2400 : __vp_(const_cast<value_type*>(__v.__begin_)),
2401 __1d_(__ia)
2402 {}
2403
Eric Fiselier3b0b81f2017-04-19 00:23:45 +00002404#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00002405
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002406 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002407 indirect_array(valarray<size_t>&& __ia, const valarray<value_type>& __v)
2408 : __vp_(const_cast<value_type*>(__v.__begin_)),
Corentin Jabotcfb8a912022-02-24 19:54:00 -05002409 __1d_(std::move(__ia))
Howard Hinnantc51e1022010-05-11 19:42:16 +00002410 {}
2411
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002412#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00002413
2414 template <class> friend class valarray;
2415};
2416
2417template <class _Tp>
2418template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002419inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002420typename enable_if
2421<
2422 __is_val_expr<_Expr>::value,
2423 void
2424>::type
2425indirect_array<_Tp>::operator=(const _Expr& __v) const
2426{
2427 size_t __n = __1d_.size();
2428 for (size_t __i = 0; __i < __n; ++__i)
2429 __vp_[__1d_[__i]] = __v[__i];
2430}
2431
2432template <class _Tp>
2433template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002434inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002435typename enable_if
2436<
2437 __is_val_expr<_Expr>::value,
2438 void
2439>::type
2440indirect_array<_Tp>::operator*=(const _Expr& __v) const
2441{
2442 size_t __n = __1d_.size();
2443 for (size_t __i = 0; __i < __n; ++__i)
2444 __vp_[__1d_[__i]] *= __v[__i];
2445}
2446
2447template <class _Tp>
2448template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002449inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002450typename enable_if
2451<
2452 __is_val_expr<_Expr>::value,
2453 void
2454>::type
2455indirect_array<_Tp>::operator/=(const _Expr& __v) const
2456{
2457 size_t __n = __1d_.size();
2458 for (size_t __i = 0; __i < __n; ++__i)
2459 __vp_[__1d_[__i]] /= __v[__i];
2460}
2461
2462template <class _Tp>
2463template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002464inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002465typename enable_if
2466<
2467 __is_val_expr<_Expr>::value,
2468 void
2469>::type
2470indirect_array<_Tp>::operator%=(const _Expr& __v) const
2471{
2472 size_t __n = __1d_.size();
2473 for (size_t __i = 0; __i < __n; ++__i)
2474 __vp_[__1d_[__i]] %= __v[__i];
2475}
2476
2477template <class _Tp>
2478template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002479inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002480typename enable_if
2481<
2482 __is_val_expr<_Expr>::value,
2483 void
2484>::type
2485indirect_array<_Tp>::operator+=(const _Expr& __v) const
2486{
2487 size_t __n = __1d_.size();
2488 for (size_t __i = 0; __i < __n; ++__i)
2489 __vp_[__1d_[__i]] += __v[__i];
2490}
2491
2492template <class _Tp>
2493template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002494inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002495typename enable_if
2496<
2497 __is_val_expr<_Expr>::value,
2498 void
2499>::type
2500indirect_array<_Tp>::operator-=(const _Expr& __v) const
2501{
2502 size_t __n = __1d_.size();
2503 for (size_t __i = 0; __i < __n; ++__i)
2504 __vp_[__1d_[__i]] -= __v[__i];
2505}
2506
2507template <class _Tp>
2508template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002509inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002510typename enable_if
2511<
2512 __is_val_expr<_Expr>::value,
2513 void
2514>::type
2515indirect_array<_Tp>::operator^=(const _Expr& __v) const
2516{
2517 size_t __n = __1d_.size();
2518 for (size_t __i = 0; __i < __n; ++__i)
2519 __vp_[__1d_[__i]] ^= __v[__i];
2520}
2521
2522template <class _Tp>
2523template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002524inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002525typename enable_if
2526<
2527 __is_val_expr<_Expr>::value,
2528 void
2529>::type
2530indirect_array<_Tp>::operator&=(const _Expr& __v) const
2531{
2532 size_t __n = __1d_.size();
2533 for (size_t __i = 0; __i < __n; ++__i)
2534 __vp_[__1d_[__i]] &= __v[__i];
2535}
2536
2537template <class _Tp>
2538template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002539inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002540typename enable_if
2541<
2542 __is_val_expr<_Expr>::value,
2543 void
2544>::type
2545indirect_array<_Tp>::operator|=(const _Expr& __v) const
2546{
2547 size_t __n = __1d_.size();
2548 for (size_t __i = 0; __i < __n; ++__i)
2549 __vp_[__1d_[__i]] |= __v[__i];
2550}
2551
2552template <class _Tp>
2553template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002554inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002555typename enable_if
2556<
2557 __is_val_expr<_Expr>::value,
2558 void
2559>::type
2560indirect_array<_Tp>::operator<<=(const _Expr& __v) const
2561{
2562 size_t __n = __1d_.size();
2563 for (size_t __i = 0; __i < __n; ++__i)
2564 __vp_[__1d_[__i]] <<= __v[__i];
2565}
2566
2567template <class _Tp>
2568template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002569inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002570typename enable_if
2571<
2572 __is_val_expr<_Expr>::value,
2573 void
2574>::type
2575indirect_array<_Tp>::operator>>=(const _Expr& __v) const
2576{
2577 size_t __n = __1d_.size();
2578 for (size_t __i = 0; __i < __n; ++__i)
2579 __vp_[__1d_[__i]] >>= __v[__i];
2580}
2581
2582template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002583inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002584const indirect_array<_Tp>&
2585indirect_array<_Tp>::operator=(const indirect_array& __ia) const
2586{
2587 typedef const size_t* _Ip;
2588 const value_type* __s = __ia.__vp_;
2589 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_, __j = __ia.__1d_.__begin_;
2590 __i != __e; ++__i, ++__j)
2591 __vp_[*__i] = __s[*__j];
2592 return *this;
2593}
2594
2595template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002596inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002597void
2598indirect_array<_Tp>::operator=(const value_type& __x) const
2599{
2600 typedef const size_t* _Ip;
2601 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i)
2602 __vp_[*__i] = __x;
2603}
2604
2605template <class _ValExpr>
2606class __indirect_expr
2607{
2608 typedef typename remove_reference<_ValExpr>::type _RmExpr;
2609public:
2610 typedef typename _RmExpr::value_type value_type;
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002611 typedef value_type __result_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002612
2613private:
2614 _ValExpr __expr_;
2615 valarray<size_t> __1d_;
2616
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002617 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002618 __indirect_expr(const valarray<size_t>& __ia, const _RmExpr& __e)
2619 : __expr_(__e),
2620 __1d_(__ia)
2621 {}
2622
Eric Fiselier3b0b81f2017-04-19 00:23:45 +00002623#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00002624
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002625 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002626 __indirect_expr(valarray<size_t>&& __ia, const _RmExpr& __e)
2627 : __expr_(__e),
Corentin Jabotcfb8a912022-02-24 19:54:00 -05002628 __1d_(std::move(__ia))
Howard Hinnantc51e1022010-05-11 19:42:16 +00002629 {}
2630
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002631#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00002632
2633public:
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002634 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002635 __result_type operator[](size_t __i) const
Howard Hinnantc51e1022010-05-11 19:42:16 +00002636 {return __expr_[__1d_[__i]];}
2637
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002638 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002639 size_t size() const {return __1d_.size();}
2640
Eric Fiselier7b31ed02019-04-02 08:05:23 +00002641 template <class> friend class __val_expr;
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00002642 template <class> friend class _LIBCPP_TEMPLATE_VIS valarray;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002643};
2644
2645template<class _ValExpr>
2646class __val_expr
2647{
2648 typedef typename remove_reference<_ValExpr>::type _RmExpr;
2649
2650 _ValExpr __expr_;
2651public:
2652 typedef typename _RmExpr::value_type value_type;
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002653 typedef typename _RmExpr::__result_type __result_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002654
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002655 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002656 explicit __val_expr(const _RmExpr& __e) : __expr_(__e) {}
2657
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002658 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002659 __result_type operator[](size_t __i) const
Howard Hinnantc51e1022010-05-11 19:42:16 +00002660 {return __expr_[__i];}
2661
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002662 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002663 __val_expr<__slice_expr<_ValExpr> > operator[](slice __s) const
Eric Fiselier7b31ed02019-04-02 08:05:23 +00002664 {
2665 typedef __slice_expr<_ValExpr> _NewExpr;
2666 return __val_expr< _NewExpr >(_NewExpr(__s, __expr_));
2667 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00002668
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002669 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002670 __val_expr<__indirect_expr<_ValExpr> > operator[](const gslice& __gs) const
Eric Fiselier7b31ed02019-04-02 08:05:23 +00002671 {
2672 typedef __indirect_expr<_ValExpr> _NewExpr;
2673 return __val_expr<_NewExpr >(_NewExpr(__gs.__1d_, __expr_));
2674 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00002675
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002676 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002677 __val_expr<__mask_expr<_ValExpr> > operator[](const valarray<bool>& __vb) const
Eric Fiselier7b31ed02019-04-02 08:05:23 +00002678 {
2679 typedef __mask_expr<_ValExpr> _NewExpr;
2680 return __val_expr< _NewExpr >( _NewExpr(__vb, __expr_));
2681 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00002682
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002683 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002684 __val_expr<__indirect_expr<_ValExpr> > operator[](const valarray<size_t>& __vs) const
Eric Fiselier7b31ed02019-04-02 08:05:23 +00002685 {
2686 typedef __indirect_expr<_ValExpr> _NewExpr;
2687 return __val_expr< _NewExpr >(_NewExpr(__vs, __expr_));
2688 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00002689
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002690 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002691 __val_expr<_UnaryOp<__unary_plus<value_type>, _ValExpr> >
2692 operator+() const
2693 {
2694 typedef _UnaryOp<__unary_plus<value_type>, _ValExpr> _NewExpr;
2695 return __val_expr<_NewExpr>(_NewExpr(__unary_plus<value_type>(), __expr_));
2696 }
2697
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002698 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002699 __val_expr<_UnaryOp<negate<value_type>, _ValExpr> >
2700 operator-() const
2701 {
2702 typedef _UnaryOp<negate<value_type>, _ValExpr> _NewExpr;
2703 return __val_expr<_NewExpr>(_NewExpr(negate<value_type>(), __expr_));
2704 }
2705
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002706 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002707 __val_expr<_UnaryOp<__bit_not<value_type>, _ValExpr> >
2708 operator~() const
2709 {
2710 typedef _UnaryOp<__bit_not<value_type>, _ValExpr> _NewExpr;
2711 return __val_expr<_NewExpr>(_NewExpr(__bit_not<value_type>(), __expr_));
2712 }
2713
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002714 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002715 __val_expr<_UnaryOp<logical_not<value_type>, _ValExpr> >
2716 operator!() const
2717 {
2718 typedef _UnaryOp<logical_not<value_type>, _ValExpr> _NewExpr;
2719 return __val_expr<_NewExpr>(_NewExpr(logical_not<value_type>(), __expr_));
2720 }
2721
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002722 operator valarray<__result_type>() const;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002723
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002724 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002725 size_t size() const {return __expr_.size();}
2726
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002727 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002728 __result_type sum() const
Howard Hinnantc51e1022010-05-11 19:42:16 +00002729 {
2730 size_t __n = __expr_.size();
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002731 __result_type __r = __n ? __expr_[0] : __result_type();
Howard Hinnantc51e1022010-05-11 19:42:16 +00002732 for (size_t __i = 1; __i < __n; ++__i)
2733 __r += __expr_[__i];
2734 return __r;
2735 }
2736
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002737 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002738 __result_type min() const
Howard Hinnantc51e1022010-05-11 19:42:16 +00002739 {
2740 size_t __n = size();
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002741 __result_type __r = __n ? (*this)[0] : __result_type();
Howard Hinnantc51e1022010-05-11 19:42:16 +00002742 for (size_t __i = 1; __i < __n; ++__i)
2743 {
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002744 __result_type __x = __expr_[__i];
Howard Hinnantc51e1022010-05-11 19:42:16 +00002745 if (__x < __r)
2746 __r = __x;
2747 }
2748 return __r;
2749 }
2750
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002751 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002752 __result_type max() const
Howard Hinnantc51e1022010-05-11 19:42:16 +00002753 {
2754 size_t __n = size();
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002755 __result_type __r = __n ? (*this)[0] : __result_type();
Howard Hinnantc51e1022010-05-11 19:42:16 +00002756 for (size_t __i = 1; __i < __n; ++__i)
2757 {
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002758 __result_type __x = __expr_[__i];
Howard Hinnantc51e1022010-05-11 19:42:16 +00002759 if (__r < __x)
2760 __r = __x;
2761 }
2762 return __r;
2763 }
2764
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002765 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002766 __val_expr<__shift_expr<_ValExpr> > shift (int __i) const
2767 {return __val_expr<__shift_expr<_ValExpr> >(__shift_expr<_ValExpr>(__i, __expr_));}
2768
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002769 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002770 __val_expr<__cshift_expr<_ValExpr> > cshift(int __i) const
2771 {return __val_expr<__cshift_expr<_ValExpr> >(__cshift_expr<_ValExpr>(__i, __expr_));}
2772
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002773 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002774 __val_expr<_UnaryOp<__apply_expr<value_type, value_type(*)(value_type)>, _ValExpr> >
2775 apply(value_type __f(value_type)) const
2776 {
2777 typedef __apply_expr<value_type, value_type(*)(value_type)> _Op;
2778 typedef _UnaryOp<_Op, _ValExpr> _NewExpr;
2779 return __val_expr<_NewExpr>(_NewExpr(_Op(__f), __expr_));
2780 }
2781
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002782 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002783 __val_expr<_UnaryOp<__apply_expr<value_type, value_type(*)(const value_type&)>, _ValExpr> >
2784 apply(value_type __f(const value_type&)) const
2785 {
2786 typedef __apply_expr<value_type, value_type(*)(const value_type&)> _Op;
2787 typedef _UnaryOp<_Op, _ValExpr> _NewExpr;
2788 return __val_expr<_NewExpr>(_NewExpr(_Op(__f), __expr_));
2789 }
2790};
2791
2792template<class _ValExpr>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002793__val_expr<_ValExpr>::operator valarray<__val_expr::__result_type>() const
Howard Hinnantc51e1022010-05-11 19:42:16 +00002794{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002795 valarray<__result_type> __r;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002796 size_t __n = __expr_.size();
2797 if (__n)
2798 {
2799 __r.__begin_ =
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002800 __r.__end_ = allocator<__result_type>().allocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002801 for (size_t __i = 0; __i != __n; ++__r.__end_, ++__i)
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002802 ::new ((void*)__r.__end_) __result_type(__expr_[__i]);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002803 }
2804 return __r;
2805}
2806
2807// valarray
2808
2809template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002810inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002811valarray<_Tp>::valarray(size_t __n)
Bruce Mitchener170d8972020-11-24 12:53:53 -05002812 : __begin_(nullptr),
2813 __end_(nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002814{
Mikhail Maltsev59de6f82018-02-08 11:33:48 +00002815 if (__n)
2816 {
Louis Dionne5ffe5152020-09-28 15:47:49 -04002817 __begin_ = __end_ = allocator<value_type>().allocate(__n);
Mikhail Maltsev59de6f82018-02-08 11:33:48 +00002818#ifndef _LIBCPP_NO_EXCEPTIONS
2819 try
2820 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002821#endif // _LIBCPP_NO_EXCEPTIONS
Eric Fiselier2856ef82018-10-25 17:21:30 +00002822 for (size_t __n_left = __n; __n_left; --__n_left, ++__end_)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05002823 ::new ((void*)__end_) value_type();
Mikhail Maltsev59de6f82018-02-08 11:33:48 +00002824#ifndef _LIBCPP_NO_EXCEPTIONS
2825 }
2826 catch (...)
2827 {
Eric Fiselier2856ef82018-10-25 17:21:30 +00002828 __clear(__n);
Mikhail Maltsev59de6f82018-02-08 11:33:48 +00002829 throw;
2830 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002831#endif // _LIBCPP_NO_EXCEPTIONS
Mikhail Maltsev59de6f82018-02-08 11:33:48 +00002832 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00002833}
2834
2835template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002836inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002837valarray<_Tp>::valarray(const value_type& __x, size_t __n)
Bruce Mitchener170d8972020-11-24 12:53:53 -05002838 : __begin_(nullptr),
2839 __end_(nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002840{
2841 resize(__n, __x);
2842}
2843
2844template <class _Tp>
2845valarray<_Tp>::valarray(const value_type* __p, size_t __n)
Bruce Mitchener170d8972020-11-24 12:53:53 -05002846 : __begin_(nullptr),
2847 __end_(nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002848{
2849 if (__n)
2850 {
Louis Dionne5ffe5152020-09-28 15:47:49 -04002851 __begin_ = __end_ = allocator<value_type>().allocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002852#ifndef _LIBCPP_NO_EXCEPTIONS
2853 try
2854 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002855#endif // _LIBCPP_NO_EXCEPTIONS
Eric Fiselier2856ef82018-10-25 17:21:30 +00002856 for (size_t __n_left = __n; __n_left; ++__end_, ++__p, --__n_left)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05002857 ::new ((void*)__end_) value_type(*__p);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002858#ifndef _LIBCPP_NO_EXCEPTIONS
2859 }
2860 catch (...)
2861 {
Eric Fiselier2856ef82018-10-25 17:21:30 +00002862 __clear(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002863 throw;
2864 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002865#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00002866 }
2867}
2868
2869template <class _Tp>
2870valarray<_Tp>::valarray(const valarray& __v)
Bruce Mitchener170d8972020-11-24 12:53:53 -05002871 : __begin_(nullptr),
2872 __end_(nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002873{
2874 if (__v.size())
2875 {
Louis Dionne5ffe5152020-09-28 15:47:49 -04002876 __begin_ = __end_ = allocator<value_type>().allocate(__v.size());
Howard Hinnantc51e1022010-05-11 19:42:16 +00002877#ifndef _LIBCPP_NO_EXCEPTIONS
2878 try
2879 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002880#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00002881 for (value_type* __p = __v.__begin_; __p != __v.__end_; ++__end_, ++__p)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05002882 ::new ((void*)__end_) value_type(*__p);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002883#ifndef _LIBCPP_NO_EXCEPTIONS
2884 }
2885 catch (...)
2886 {
Eric Fiselier2856ef82018-10-25 17:21:30 +00002887 __clear(__v.size());
Howard Hinnantc51e1022010-05-11 19:42:16 +00002888 throw;
2889 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002890#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00002891 }
2892}
2893
Eric Fiselier3b0b81f2017-04-19 00:23:45 +00002894#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00002895
2896template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002897inline
Howard Hinnant298aed92012-07-21 00:51:28 +00002898valarray<_Tp>::valarray(valarray&& __v) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00002899 : __begin_(__v.__begin_),
2900 __end_(__v.__end_)
2901{
2902 __v.__begin_ = __v.__end_ = nullptr;
2903}
2904
2905template <class _Tp>
2906valarray<_Tp>::valarray(initializer_list<value_type> __il)
Bruce Mitchener170d8972020-11-24 12:53:53 -05002907 : __begin_(nullptr),
2908 __end_(nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002909{
Eric Fiselier2856ef82018-10-25 17:21:30 +00002910 const size_t __n = __il.size();
Howard Hinnantc51e1022010-05-11 19:42:16 +00002911 if (__n)
2912 {
Louis Dionne5ffe5152020-09-28 15:47:49 -04002913 __begin_ = __end_ = allocator<value_type>().allocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002914#ifndef _LIBCPP_NO_EXCEPTIONS
2915 try
2916 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002917#endif // _LIBCPP_NO_EXCEPTIONS
Eric Fiselier2856ef82018-10-25 17:21:30 +00002918 size_t __n_left = __n;
2919 for (const value_type* __p = __il.begin(); __n_left; ++__end_, ++__p, --__n_left)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05002920 ::new ((void*)__end_) value_type(*__p);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002921#ifndef _LIBCPP_NO_EXCEPTIONS
2922 }
2923 catch (...)
2924 {
Eric Fiselier2856ef82018-10-25 17:21:30 +00002925 __clear(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002926 throw;
2927 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002928#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00002929 }
2930}
2931
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002932#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00002933
2934template <class _Tp>
2935valarray<_Tp>::valarray(const slice_array<value_type>& __sa)
Bruce Mitchener170d8972020-11-24 12:53:53 -05002936 : __begin_(nullptr),
2937 __end_(nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002938{
Eric Fiselier2856ef82018-10-25 17:21:30 +00002939 const size_t __n = __sa.__size_;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002940 if (__n)
2941 {
Louis Dionne5ffe5152020-09-28 15:47:49 -04002942 __begin_ = __end_ = allocator<value_type>().allocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002943#ifndef _LIBCPP_NO_EXCEPTIONS
2944 try
2945 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002946#endif // _LIBCPP_NO_EXCEPTIONS
Eric Fiselier2856ef82018-10-25 17:21:30 +00002947 size_t __n_left = __n;
2948 for (const value_type* __p = __sa.__vp_; __n_left; ++__end_, __p += __sa.__stride_, --__n_left)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05002949 ::new ((void*)__end_) value_type(*__p);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002950#ifndef _LIBCPP_NO_EXCEPTIONS
2951 }
2952 catch (...)
2953 {
Eric Fiselier2856ef82018-10-25 17:21:30 +00002954 __clear(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002955 throw;
2956 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002957#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00002958 }
2959}
2960
2961template <class _Tp>
2962valarray<_Tp>::valarray(const gslice_array<value_type>& __ga)
Bruce Mitchener170d8972020-11-24 12:53:53 -05002963 : __begin_(nullptr),
2964 __end_(nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002965{
Eric Fiselier2856ef82018-10-25 17:21:30 +00002966 const size_t __n = __ga.__1d_.size();
Howard Hinnantc51e1022010-05-11 19:42:16 +00002967 if (__n)
2968 {
Louis Dionne5ffe5152020-09-28 15:47:49 -04002969 __begin_ = __end_ = allocator<value_type>().allocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002970#ifndef _LIBCPP_NO_EXCEPTIONS
2971 try
2972 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002973#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00002974 typedef const size_t* _Ip;
2975 const value_type* __s = __ga.__vp_;
2976 for (_Ip __i = __ga.__1d_.__begin_, __e = __ga.__1d_.__end_;
2977 __i != __e; ++__i, ++__end_)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05002978 ::new ((void*)__end_) value_type(__s[*__i]);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002979#ifndef _LIBCPP_NO_EXCEPTIONS
2980 }
2981 catch (...)
2982 {
Eric Fiselier2856ef82018-10-25 17:21:30 +00002983 __clear(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002984 throw;
2985 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002986#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00002987 }
2988}
2989
2990template <class _Tp>
2991valarray<_Tp>::valarray(const mask_array<value_type>& __ma)
Bruce Mitchener170d8972020-11-24 12:53:53 -05002992 : __begin_(nullptr),
2993 __end_(nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002994{
Eric Fiselier2856ef82018-10-25 17:21:30 +00002995 const size_t __n = __ma.__1d_.size();
Howard Hinnantc51e1022010-05-11 19:42:16 +00002996 if (__n)
2997 {
Louis Dionne5ffe5152020-09-28 15:47:49 -04002998 __begin_ = __end_ = allocator<value_type>().allocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002999#ifndef _LIBCPP_NO_EXCEPTIONS
3000 try
3001 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04003002#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00003003 typedef const size_t* _Ip;
3004 const value_type* __s = __ma.__vp_;
3005 for (_Ip __i = __ma.__1d_.__begin_, __e = __ma.__1d_.__end_;
3006 __i != __e; ++__i, ++__end_)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05003007 ::new ((void*)__end_) value_type(__s[*__i]);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003008#ifndef _LIBCPP_NO_EXCEPTIONS
3009 }
3010 catch (...)
3011 {
Eric Fiselier2856ef82018-10-25 17:21:30 +00003012 __clear(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003013 throw;
3014 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04003015#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00003016 }
3017}
3018
3019template <class _Tp>
3020valarray<_Tp>::valarray(const indirect_array<value_type>& __ia)
Bruce Mitchener170d8972020-11-24 12:53:53 -05003021 : __begin_(nullptr),
3022 __end_(nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00003023{
Eric Fiselier2856ef82018-10-25 17:21:30 +00003024 const size_t __n = __ia.__1d_.size();
Howard Hinnantc51e1022010-05-11 19:42:16 +00003025 if (__n)
3026 {
Louis Dionne5ffe5152020-09-28 15:47:49 -04003027 __begin_ = __end_ = allocator<value_type>().allocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003028#ifndef _LIBCPP_NO_EXCEPTIONS
3029 try
3030 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04003031#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00003032 typedef const size_t* _Ip;
3033 const value_type* __s = __ia.__vp_;
3034 for (_Ip __i = __ia.__1d_.__begin_, __e = __ia.__1d_.__end_;
3035 __i != __e; ++__i, ++__end_)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05003036 ::new ((void*)__end_) value_type(__s[*__i]);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003037#ifndef _LIBCPP_NO_EXCEPTIONS
3038 }
3039 catch (...)
3040 {
Eric Fiselier2856ef82018-10-25 17:21:30 +00003041 __clear(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003042 throw;
3043 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04003044#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00003045 }
3046}
3047
3048template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003049inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003050valarray<_Tp>::~valarray()
3051{
Eric Fiselier2856ef82018-10-25 17:21:30 +00003052 __clear(size());
Mikhail Maltsev59de6f82018-02-08 11:33:48 +00003053}
3054
3055template <class _Tp>
3056valarray<_Tp>&
3057valarray<_Tp>::__assign_range(const value_type* __f, const value_type* __l)
3058{
3059 size_t __n = __l - __f;
3060 if (size() != __n)
3061 {
Eric Fiselier2856ef82018-10-25 17:21:30 +00003062 __clear(size());
Louis Dionne5ffe5152020-09-28 15:47:49 -04003063 __begin_ = allocator<value_type>().allocate(__n);
Mikhail Maltsev59de6f82018-02-08 11:33:48 +00003064 __end_ = __begin_ + __n;
3065 _VSTD::uninitialized_copy(__f, __l, __begin_);
3066 } else {
3067 _VSTD::copy(__f, __l, __begin_);
3068 }
3069 return *this;
Howard Hinnantc51e1022010-05-11 19:42:16 +00003070}
3071
3072template <class _Tp>
3073valarray<_Tp>&
3074valarray<_Tp>::operator=(const valarray& __v)
3075{
Mark de Wever357a1fc2021-09-28 19:15:18 +02003076 if (this != _VSTD::addressof(__v))
Mikhail Maltsev59de6f82018-02-08 11:33:48 +00003077 return __assign_range(__v.__begin_, __v.__end_);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003078 return *this;
3079}
3080
Eric Fiselier3b0b81f2017-04-19 00:23:45 +00003081#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00003082
3083template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003084inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003085valarray<_Tp>&
Howard Hinnant298aed92012-07-21 00:51:28 +00003086valarray<_Tp>::operator=(valarray&& __v) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00003087{
Eric Fiselier2856ef82018-10-25 17:21:30 +00003088 __clear(size());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003089 __begin_ = __v.__begin_;
3090 __end_ = __v.__end_;
3091 __v.__begin_ = nullptr;
3092 __v.__end_ = nullptr;
3093 return *this;
3094}
3095
3096template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003097inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003098valarray<_Tp>&
3099valarray<_Tp>::operator=(initializer_list<value_type> __il)
3100{
Mikhail Maltsev59de6f82018-02-08 11:33:48 +00003101 return __assign_range(__il.begin(), __il.end());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003102}
3103
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04003104#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00003105
3106template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003107inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003108valarray<_Tp>&
3109valarray<_Tp>::operator=(const value_type& __x)
3110{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003111 _VSTD::fill(__begin_, __end_, __x);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003112 return *this;
3113}
3114
3115template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003116inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003117valarray<_Tp>&
3118valarray<_Tp>::operator=(const slice_array<value_type>& __sa)
3119{
3120 value_type* __t = __begin_;
3121 const value_type* __s = __sa.__vp_;
3122 for (size_t __n = __sa.__size_; __n; --__n, __s += __sa.__stride_, ++__t)
3123 *__t = *__s;
3124 return *this;
3125}
3126
3127template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003128inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003129valarray<_Tp>&
3130valarray<_Tp>::operator=(const gslice_array<value_type>& __ga)
3131{
3132 typedef const size_t* _Ip;
3133 value_type* __t = __begin_;
3134 const value_type* __s = __ga.__vp_;
3135 for (_Ip __i = __ga.__1d_.__begin_, __e = __ga.__1d_.__end_;
3136 __i != __e; ++__i, ++__t)
3137 *__t = __s[*__i];
3138 return *this;
3139}
3140
3141template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003142inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003143valarray<_Tp>&
3144valarray<_Tp>::operator=(const mask_array<value_type>& __ma)
3145{
3146 typedef const size_t* _Ip;
3147 value_type* __t = __begin_;
3148 const value_type* __s = __ma.__vp_;
3149 for (_Ip __i = __ma.__1d_.__begin_, __e = __ma.__1d_.__end_;
3150 __i != __e; ++__i, ++__t)
3151 *__t = __s[*__i];
3152 return *this;
3153}
3154
3155template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003156inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003157valarray<_Tp>&
3158valarray<_Tp>::operator=(const indirect_array<value_type>& __ia)
3159{
3160 typedef const size_t* _Ip;
3161 value_type* __t = __begin_;
3162 const value_type* __s = __ia.__vp_;
3163 for (_Ip __i = __ia.__1d_.__begin_, __e = __ia.__1d_.__end_;
3164 __i != __e; ++__i, ++__t)
3165 *__t = __s[*__i];
3166 return *this;
3167}
3168
3169template <class _Tp>
Howard Hinnant329cd412011-07-27 23:19:59 +00003170template <class _ValExpr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003171inline
Howard Hinnant329cd412011-07-27 23:19:59 +00003172valarray<_Tp>&
3173valarray<_Tp>::operator=(const __val_expr<_ValExpr>& __v)
3174{
3175 size_t __n = __v.size();
3176 if (size() != __n)
3177 resize(__n);
3178 value_type* __t = __begin_;
3179 for (size_t __i = 0; __i != __n; ++__t, ++__i)
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04003180 *__t = __result_type(__v[__i]);
Howard Hinnant329cd412011-07-27 23:19:59 +00003181 return *this;
3182}
3183
3184template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003185inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003186__val_expr<__slice_expr<const valarray<_Tp>&> >
3187valarray<_Tp>::operator[](slice __s) const
3188{
3189 return __val_expr<__slice_expr<const valarray&> >(__slice_expr<const valarray&>(__s, *this));
3190}
3191
3192template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003193inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003194slice_array<_Tp>
3195valarray<_Tp>::operator[](slice __s)
3196{
3197 return slice_array<value_type>(__s, *this);
3198}
3199
3200template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003201inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003202__val_expr<__indirect_expr<const valarray<_Tp>&> >
3203valarray<_Tp>::operator[](const gslice& __gs) const
3204{
3205 return __val_expr<__indirect_expr<const valarray&> >(__indirect_expr<const valarray&>(__gs.__1d_, *this));
3206}
3207
3208template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003209inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003210gslice_array<_Tp>
3211valarray<_Tp>::operator[](const gslice& __gs)
3212{
3213 return gslice_array<value_type>(__gs, *this);
3214}
3215
Eric Fiselier3b0b81f2017-04-19 00:23:45 +00003216#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00003217
3218template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003219inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003220__val_expr<__indirect_expr<const valarray<_Tp>&> >
3221valarray<_Tp>::operator[](gslice&& __gs) const
3222{
Corentin Jabotcfb8a912022-02-24 19:54:00 -05003223 return __val_expr<__indirect_expr<const valarray&> >(__indirect_expr<const valarray&>(std::move(__gs.__1d_), *this));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003224}
3225
3226template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003227inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003228gslice_array<_Tp>
3229valarray<_Tp>::operator[](gslice&& __gs)
3230{
Corentin Jabotcfb8a912022-02-24 19:54:00 -05003231 return gslice_array<value_type>(std::move(__gs), *this);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003232}
3233
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04003234#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00003235
3236template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003237inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003238__val_expr<__mask_expr<const valarray<_Tp>&> >
3239valarray<_Tp>::operator[](const valarray<bool>& __vb) const
3240{
3241 return __val_expr<__mask_expr<const valarray&> >(__mask_expr<const valarray&>(__vb, *this));
3242}
3243
3244template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003245inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003246mask_array<_Tp>
3247valarray<_Tp>::operator[](const valarray<bool>& __vb)
3248{
3249 return mask_array<value_type>(__vb, *this);
3250}
3251
Eric Fiselier3b0b81f2017-04-19 00:23:45 +00003252#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00003253
3254template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003255inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003256__val_expr<__mask_expr<const valarray<_Tp>&> >
3257valarray<_Tp>::operator[](valarray<bool>&& __vb) const
3258{
Corentin Jabotcfb8a912022-02-24 19:54:00 -05003259 return __val_expr<__mask_expr<const valarray&> >(__mask_expr<const valarray&>(std::move(__vb), *this));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003260}
3261
3262template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003263inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003264mask_array<_Tp>
3265valarray<_Tp>::operator[](valarray<bool>&& __vb)
3266{
Corentin Jabotcfb8a912022-02-24 19:54:00 -05003267 return mask_array<value_type>(std::move(__vb), *this);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003268}
3269
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04003270#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00003271
3272template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003273inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003274__val_expr<__indirect_expr<const valarray<_Tp>&> >
3275valarray<_Tp>::operator[](const valarray<size_t>& __vs) const
3276{
3277 return __val_expr<__indirect_expr<const valarray&> >(__indirect_expr<const valarray&>(__vs, *this));
3278}
3279
3280template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003281inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003282indirect_array<_Tp>
3283valarray<_Tp>::operator[](const valarray<size_t>& __vs)
3284{
3285 return indirect_array<value_type>(__vs, *this);
3286}
3287
Eric Fiselier3b0b81f2017-04-19 00:23:45 +00003288#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00003289
3290template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003291inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003292__val_expr<__indirect_expr<const valarray<_Tp>&> >
3293valarray<_Tp>::operator[](valarray<size_t>&& __vs) const
3294{
Corentin Jabotcfb8a912022-02-24 19:54:00 -05003295 return __val_expr<__indirect_expr<const valarray&> >(__indirect_expr<const valarray&>(std::move(__vs), *this));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003296}
3297
3298template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003299inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003300indirect_array<_Tp>
3301valarray<_Tp>::operator[](valarray<size_t>&& __vs)
3302{
Corentin Jabotcfb8a912022-02-24 19:54:00 -05003303 return indirect_array<value_type>(std::move(__vs), *this);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003304}
3305
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04003306#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00003307
3308template <class _Tp>
Louis Dionne12a2e572022-05-05 12:24:43 -04003309inline
3310__val_expr<_UnaryOp<__unary_plus<_Tp>, const valarray<_Tp>&> >
Howard Hinnantc51e1022010-05-11 19:42:16 +00003311valarray<_Tp>::operator+() const
3312{
Louis Dionne12a2e572022-05-05 12:24:43 -04003313 using _Op = _UnaryOp<__unary_plus<_Tp>, const valarray<_Tp>&>;
3314 return __val_expr<_Op>(_Op(__unary_plus<_Tp>(), *this));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003315}
3316
3317template <class _Tp>
Louis Dionne12a2e572022-05-05 12:24:43 -04003318inline
3319__val_expr<_UnaryOp<negate<_Tp>, const valarray<_Tp>&> >
Howard Hinnantc51e1022010-05-11 19:42:16 +00003320valarray<_Tp>::operator-() const
3321{
Louis Dionne12a2e572022-05-05 12:24:43 -04003322 using _Op = _UnaryOp<negate<_Tp>, const valarray<_Tp>&>;
3323 return __val_expr<_Op>(_Op(negate<_Tp>(), *this));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003324}
3325
3326template <class _Tp>
Louis Dionne12a2e572022-05-05 12:24:43 -04003327inline
3328__val_expr<_UnaryOp<__bit_not<_Tp>, const valarray<_Tp>&> >
Howard Hinnantc51e1022010-05-11 19:42:16 +00003329valarray<_Tp>::operator~() const
3330{
Louis Dionne12a2e572022-05-05 12:24:43 -04003331 using _Op = _UnaryOp<__bit_not<_Tp>, const valarray<_Tp>&>;
3332 return __val_expr<_Op>(_Op(__bit_not<_Tp>(), *this));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003333}
3334
3335template <class _Tp>
Louis Dionne12a2e572022-05-05 12:24:43 -04003336inline
3337__val_expr<_UnaryOp<logical_not<_Tp>, const valarray<_Tp>&> >
Howard Hinnantc51e1022010-05-11 19:42:16 +00003338valarray<_Tp>::operator!() const
3339{
Louis Dionne12a2e572022-05-05 12:24:43 -04003340 using _Op = _UnaryOp<logical_not<_Tp>, const valarray<_Tp>&>;
3341 return __val_expr<_Op>(_Op(logical_not<_Tp>(), *this));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003342}
3343
3344template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003345inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003346valarray<_Tp>&
3347valarray<_Tp>::operator*=(const value_type& __x)
3348{
3349 for (value_type* __p = __begin_; __p != __end_; ++__p)
3350 *__p *= __x;
3351 return *this;
3352}
3353
3354template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003355inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003356valarray<_Tp>&
3357valarray<_Tp>::operator/=(const value_type& __x)
3358{
3359 for (value_type* __p = __begin_; __p != __end_; ++__p)
3360 *__p /= __x;
3361 return *this;
3362}
3363
3364template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003365inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003366valarray<_Tp>&
3367valarray<_Tp>::operator%=(const value_type& __x)
3368{
3369 for (value_type* __p = __begin_; __p != __end_; ++__p)
3370 *__p %= __x;
3371 return *this;
3372}
3373
3374template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003375inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003376valarray<_Tp>&
3377valarray<_Tp>::operator+=(const value_type& __x)
3378{
3379 for (value_type* __p = __begin_; __p != __end_; ++__p)
3380 *__p += __x;
3381 return *this;
3382}
3383
3384template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003385inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003386valarray<_Tp>&
3387valarray<_Tp>::operator-=(const value_type& __x)
3388{
3389 for (value_type* __p = __begin_; __p != __end_; ++__p)
3390 *__p -= __x;
3391 return *this;
3392}
3393
3394template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003395inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003396valarray<_Tp>&
3397valarray<_Tp>::operator^=(const value_type& __x)
3398{
3399 for (value_type* __p = __begin_; __p != __end_; ++__p)
3400 *__p ^= __x;
3401 return *this;
3402}
3403
3404template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003405inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003406valarray<_Tp>&
3407valarray<_Tp>::operator&=(const value_type& __x)
3408{
3409 for (value_type* __p = __begin_; __p != __end_; ++__p)
3410 *__p &= __x;
3411 return *this;
3412}
3413
3414template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003415inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003416valarray<_Tp>&
3417valarray<_Tp>::operator|=(const value_type& __x)
3418{
3419 for (value_type* __p = __begin_; __p != __end_; ++__p)
3420 *__p |= __x;
3421 return *this;
3422}
3423
3424template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003425inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003426valarray<_Tp>&
3427valarray<_Tp>::operator<<=(const value_type& __x)
3428{
3429 for (value_type* __p = __begin_; __p != __end_; ++__p)
3430 *__p <<= __x;
3431 return *this;
3432}
3433
3434template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003435inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003436valarray<_Tp>&
3437valarray<_Tp>::operator>>=(const value_type& __x)
3438{
3439 for (value_type* __p = __begin_; __p != __end_; ++__p)
3440 *__p >>= __x;
3441 return *this;
3442}
3443
3444template <class _Tp>
3445template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003446inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003447typename enable_if
3448<
3449 __is_val_expr<_Expr>::value,
3450 valarray<_Tp>&
3451>::type
3452valarray<_Tp>::operator*=(const _Expr& __v)
3453{
3454 size_t __i = 0;
3455 for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3456 *__t *= __v[__i];
3457 return *this;
3458}
3459
3460template <class _Tp>
3461template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003462inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003463typename enable_if
3464<
3465 __is_val_expr<_Expr>::value,
3466 valarray<_Tp>&
3467>::type
3468valarray<_Tp>::operator/=(const _Expr& __v)
3469{
3470 size_t __i = 0;
3471 for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3472 *__t /= __v[__i];
3473 return *this;
3474}
3475
3476template <class _Tp>
3477template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003478inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003479typename enable_if
3480<
3481 __is_val_expr<_Expr>::value,
3482 valarray<_Tp>&
3483>::type
3484valarray<_Tp>::operator%=(const _Expr& __v)
3485{
3486 size_t __i = 0;
3487 for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3488 *__t %= __v[__i];
3489 return *this;
3490}
3491
3492template <class _Tp>
3493template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003494inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003495typename enable_if
3496<
3497 __is_val_expr<_Expr>::value,
3498 valarray<_Tp>&
3499>::type
3500valarray<_Tp>::operator+=(const _Expr& __v)
3501{
3502 size_t __i = 0;
3503 for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3504 *__t += __v[__i];
3505 return *this;
3506}
3507
3508template <class _Tp>
3509template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003510inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003511typename enable_if
3512<
3513 __is_val_expr<_Expr>::value,
3514 valarray<_Tp>&
3515>::type
3516valarray<_Tp>::operator-=(const _Expr& __v)
3517{
3518 size_t __i = 0;
3519 for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3520 *__t -= __v[__i];
3521 return *this;
3522}
3523
3524template <class _Tp>
3525template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003526inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003527typename enable_if
3528<
3529 __is_val_expr<_Expr>::value,
3530 valarray<_Tp>&
3531>::type
3532valarray<_Tp>::operator^=(const _Expr& __v)
3533{
3534 size_t __i = 0;
3535 for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3536 *__t ^= __v[__i];
3537 return *this;
3538}
3539
3540template <class _Tp>
3541template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003542inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003543typename enable_if
3544<
3545 __is_val_expr<_Expr>::value,
3546 valarray<_Tp>&
3547>::type
3548valarray<_Tp>::operator|=(const _Expr& __v)
3549{
3550 size_t __i = 0;
3551 for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3552 *__t |= __v[__i];
3553 return *this;
3554}
3555
3556template <class _Tp>
3557template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003558inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003559typename enable_if
3560<
3561 __is_val_expr<_Expr>::value,
3562 valarray<_Tp>&
3563>::type
3564valarray<_Tp>::operator&=(const _Expr& __v)
3565{
3566 size_t __i = 0;
3567 for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3568 *__t &= __v[__i];
3569 return *this;
3570}
3571
3572template <class _Tp>
3573template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003574inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003575typename enable_if
3576<
3577 __is_val_expr<_Expr>::value,
3578 valarray<_Tp>&
3579>::type
3580valarray<_Tp>::operator<<=(const _Expr& __v)
3581{
3582 size_t __i = 0;
3583 for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3584 *__t <<= __v[__i];
3585 return *this;
3586}
3587
3588template <class _Tp>
3589template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003590inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003591typename enable_if
3592<
3593 __is_val_expr<_Expr>::value,
3594 valarray<_Tp>&
3595>::type
3596valarray<_Tp>::operator>>=(const _Expr& __v)
3597{
3598 size_t __i = 0;
3599 for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3600 *__t >>= __v[__i];
3601 return *this;
3602}
3603
3604template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003605inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003606void
Howard Hinnant298aed92012-07-21 00:51:28 +00003607valarray<_Tp>::swap(valarray& __v) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00003608{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003609 _VSTD::swap(__begin_, __v.__begin_);
3610 _VSTD::swap(__end_, __v.__end_);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003611}
3612
3613template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003614inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003615_Tp
3616valarray<_Tp>::sum() const
3617{
3618 if (__begin_ == __end_)
3619 return value_type();
3620 const value_type* __p = __begin_;
3621 _Tp __r = *__p;
3622 for (++__p; __p != __end_; ++__p)
3623 __r += *__p;
3624 return __r;
3625}
3626
3627template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003628inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003629_Tp
3630valarray<_Tp>::min() const
3631{
3632 if (__begin_ == __end_)
3633 return value_type();
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003634 return *_VSTD::min_element(__begin_, __end_);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003635}
3636
3637template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003638inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003639_Tp
3640valarray<_Tp>::max() const
3641{
3642 if (__begin_ == __end_)
3643 return value_type();
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003644 return *_VSTD::max_element(__begin_, __end_);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003645}
3646
3647template <class _Tp>
3648valarray<_Tp>
3649valarray<_Tp>::shift(int __i) const
3650{
3651 valarray<value_type> __r;
3652 size_t __n = size();
3653 if (__n)
3654 {
Louis Dionne5ffe5152020-09-28 15:47:49 -04003655 __r.__begin_ = __r.__end_ = allocator<value_type>().allocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003656 const value_type* __sb;
3657 value_type* __tb;
3658 value_type* __te;
3659 if (__i >= 0)
3660 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003661 __i = _VSTD::min(__i, static_cast<int>(__n));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003662 __sb = __begin_ + __i;
3663 __tb = __r.__begin_;
3664 __te = __r.__begin_ + (__n - __i);
3665 }
3666 else
3667 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003668 __i = _VSTD::min(-__i, static_cast<int>(__n));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003669 __sb = __begin_;
3670 __tb = __r.__begin_ + __i;
3671 __te = __r.__begin_ + __n;
3672 }
3673 for (; __r.__end_ != __tb; ++__r.__end_)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05003674 ::new ((void*)__r.__end_) value_type();
Howard Hinnantc51e1022010-05-11 19:42:16 +00003675 for (; __r.__end_ != __te; ++__r.__end_, ++__sb)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05003676 ::new ((void*)__r.__end_) value_type(*__sb);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003677 for (__te = __r.__begin_ + __n; __r.__end_ != __te; ++__r.__end_)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05003678 ::new ((void*)__r.__end_) value_type();
Howard Hinnantc51e1022010-05-11 19:42:16 +00003679 }
3680 return __r;
3681}
3682
3683template <class _Tp>
3684valarray<_Tp>
3685valarray<_Tp>::cshift(int __i) const
3686{
3687 valarray<value_type> __r;
3688 size_t __n = size();
3689 if (__n)
3690 {
Louis Dionne5ffe5152020-09-28 15:47:49 -04003691 __r.__begin_ = __r.__end_ = allocator<value_type>().allocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003692 __i %= static_cast<int>(__n);
3693 const value_type* __m = __i >= 0 ? __begin_ + __i : __end_ + __i;
3694 for (const value_type* __s = __m; __s != __end_; ++__r.__end_, ++__s)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05003695 ::new ((void*)__r.__end_) value_type(*__s);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003696 for (const value_type* __s = __begin_; __s != __m; ++__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 }
3699 return __r;
3700}
3701
3702template <class _Tp>
3703valarray<_Tp>
3704valarray<_Tp>::apply(value_type __f(value_type)) const
3705{
3706 valarray<value_type> __r;
3707 size_t __n = size();
3708 if (__n)
3709 {
Louis Dionne5ffe5152020-09-28 15:47:49 -04003710 __r.__begin_ = __r.__end_ = allocator<value_type>().allocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003711 for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05003712 ::new ((void*)__r.__end_) value_type(__f(*__p));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003713 }
3714 return __r;
3715}
3716
3717template <class _Tp>
3718valarray<_Tp>
3719valarray<_Tp>::apply(value_type __f(const value_type&)) const
3720{
3721 valarray<value_type> __r;
3722 size_t __n = size();
3723 if (__n)
3724 {
Louis Dionne5ffe5152020-09-28 15:47:49 -04003725 __r.__begin_ = __r.__end_ = allocator<value_type>().allocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003726 for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05003727 ::new ((void*)__r.__end_) value_type(__f(*__p));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003728 }
3729 return __r;
3730}
3731
3732template <class _Tp>
Eric Fiseliera119c322018-10-25 17:43:26 +00003733inline
Eric Fiselier2856ef82018-10-25 17:21:30 +00003734void valarray<_Tp>::__clear(size_t __capacity)
Howard Hinnantc51e1022010-05-11 19:42:16 +00003735{
Eric Fiselier2856ef82018-10-25 17:21:30 +00003736 if (__begin_ != nullptr)
3737 {
3738 while (__end_ != __begin_)
3739 (--__end_)->~value_type();
Louis Dionne5ffe5152020-09-28 15:47:49 -04003740 allocator<value_type>().deallocate(__begin_, __capacity);
Eric Fiselier2856ef82018-10-25 17:21:30 +00003741 __begin_ = __end_ = nullptr;
3742 }
Mikhail Maltsev59de6f82018-02-08 11:33:48 +00003743}
3744
3745template <class _Tp>
3746void
3747valarray<_Tp>::resize(size_t __n, value_type __x)
3748{
Eric Fiselier2856ef82018-10-25 17:21:30 +00003749 __clear(size());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003750 if (__n)
3751 {
Louis Dionne5ffe5152020-09-28 15:47:49 -04003752 __begin_ = __end_ = allocator<value_type>().allocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003753#ifndef _LIBCPP_NO_EXCEPTIONS
3754 try
3755 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04003756#endif // _LIBCPP_NO_EXCEPTIONS
Eric Fiselier2856ef82018-10-25 17:21:30 +00003757 for (size_t __n_left = __n; __n_left; --__n_left, ++__end_)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05003758 ::new ((void*)__end_) value_type(__x);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003759#ifndef _LIBCPP_NO_EXCEPTIONS
3760 }
3761 catch (...)
3762 {
Eric Fiselier2856ef82018-10-25 17:21:30 +00003763 __clear(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003764 throw;
3765 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04003766#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00003767 }
3768}
3769
3770template<class _Tp>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003771inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003772void
Howard Hinnant298aed92012-07-21 00:51:28 +00003773swap(valarray<_Tp>& __x, valarray<_Tp>& __y) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00003774{
3775 __x.swap(__y);
3776}
3777
3778template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003779inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003780typename enable_if
3781<
3782 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
3783 __val_expr<_BinaryOp<multiplies<typename _Expr1::value_type>, _Expr1, _Expr2> >
3784>::type
3785operator*(const _Expr1& __x, const _Expr2& __y)
3786{
3787 typedef typename _Expr1::value_type value_type;
3788 typedef _BinaryOp<multiplies<value_type>, _Expr1, _Expr2> _Op;
3789 return __val_expr<_Op>(_Op(multiplies<value_type>(), __x, __y));
3790}
3791
3792template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003793inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003794typename enable_if
3795<
3796 __is_val_expr<_Expr>::value,
3797 __val_expr<_BinaryOp<multiplies<typename _Expr::value_type>,
3798 _Expr, __scalar_expr<typename _Expr::value_type> > >
3799>::type
3800operator*(const _Expr& __x, const typename _Expr::value_type& __y)
3801{
3802 typedef typename _Expr::value_type value_type;
3803 typedef _BinaryOp<multiplies<value_type>, _Expr, __scalar_expr<value_type> > _Op;
3804 return __val_expr<_Op>(_Op(multiplies<value_type>(),
3805 __x, __scalar_expr<value_type>(__y, __x.size())));
3806}
3807
3808template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003809inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003810typename enable_if
3811<
3812 __is_val_expr<_Expr>::value,
3813 __val_expr<_BinaryOp<multiplies<typename _Expr::value_type>,
3814 __scalar_expr<typename _Expr::value_type>, _Expr> >
3815>::type
3816operator*(const typename _Expr::value_type& __x, const _Expr& __y)
3817{
3818 typedef typename _Expr::value_type value_type;
3819 typedef _BinaryOp<multiplies<value_type>, __scalar_expr<value_type>, _Expr> _Op;
3820 return __val_expr<_Op>(_Op(multiplies<value_type>(),
3821 __scalar_expr<value_type>(__x, __y.size()), __y));
3822}
3823
3824template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003825inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003826typename enable_if
3827<
3828 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
3829 __val_expr<_BinaryOp<divides<typename _Expr1::value_type>, _Expr1, _Expr2> >
3830>::type
3831operator/(const _Expr1& __x, const _Expr2& __y)
3832{
3833 typedef typename _Expr1::value_type value_type;
3834 typedef _BinaryOp<divides<value_type>, _Expr1, _Expr2> _Op;
3835 return __val_expr<_Op>(_Op(divides<value_type>(), __x, __y));
3836}
3837
3838template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003839inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003840typename enable_if
3841<
3842 __is_val_expr<_Expr>::value,
3843 __val_expr<_BinaryOp<divides<typename _Expr::value_type>,
3844 _Expr, __scalar_expr<typename _Expr::value_type> > >
3845>::type
3846operator/(const _Expr& __x, const typename _Expr::value_type& __y)
3847{
3848 typedef typename _Expr::value_type value_type;
3849 typedef _BinaryOp<divides<value_type>, _Expr, __scalar_expr<value_type> > _Op;
3850 return __val_expr<_Op>(_Op(divides<value_type>(),
3851 __x, __scalar_expr<value_type>(__y, __x.size())));
3852}
3853
3854template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003855inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003856typename enable_if
3857<
3858 __is_val_expr<_Expr>::value,
3859 __val_expr<_BinaryOp<divides<typename _Expr::value_type>,
3860 __scalar_expr<typename _Expr::value_type>, _Expr> >
3861>::type
3862operator/(const typename _Expr::value_type& __x, const _Expr& __y)
3863{
3864 typedef typename _Expr::value_type value_type;
3865 typedef _BinaryOp<divides<value_type>, __scalar_expr<value_type>, _Expr> _Op;
3866 return __val_expr<_Op>(_Op(divides<value_type>(),
3867 __scalar_expr<value_type>(__x, __y.size()), __y));
3868}
3869
3870template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003871inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003872typename enable_if
3873<
3874 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
3875 __val_expr<_BinaryOp<modulus<typename _Expr1::value_type>, _Expr1, _Expr2> >
3876>::type
3877operator%(const _Expr1& __x, const _Expr2& __y)
3878{
3879 typedef typename _Expr1::value_type value_type;
3880 typedef _BinaryOp<modulus<value_type>, _Expr1, _Expr2> _Op;
3881 return __val_expr<_Op>(_Op(modulus<value_type>(), __x, __y));
3882}
3883
3884template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003885inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003886typename enable_if
3887<
3888 __is_val_expr<_Expr>::value,
3889 __val_expr<_BinaryOp<modulus<typename _Expr::value_type>,
3890 _Expr, __scalar_expr<typename _Expr::value_type> > >
3891>::type
3892operator%(const _Expr& __x, const typename _Expr::value_type& __y)
3893{
3894 typedef typename _Expr::value_type value_type;
3895 typedef _BinaryOp<modulus<value_type>, _Expr, __scalar_expr<value_type> > _Op;
3896 return __val_expr<_Op>(_Op(modulus<value_type>(),
3897 __x, __scalar_expr<value_type>(__y, __x.size())));
3898}
3899
3900template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003901inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003902typename enable_if
3903<
3904 __is_val_expr<_Expr>::value,
3905 __val_expr<_BinaryOp<modulus<typename _Expr::value_type>,
3906 __scalar_expr<typename _Expr::value_type>, _Expr> >
3907>::type
3908operator%(const typename _Expr::value_type& __x, const _Expr& __y)
3909{
3910 typedef typename _Expr::value_type value_type;
3911 typedef _BinaryOp<modulus<value_type>, __scalar_expr<value_type>, _Expr> _Op;
3912 return __val_expr<_Op>(_Op(modulus<value_type>(),
3913 __scalar_expr<value_type>(__x, __y.size()), __y));
3914}
3915
3916template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003917inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003918typename enable_if
3919<
3920 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
3921 __val_expr<_BinaryOp<plus<typename _Expr1::value_type>, _Expr1, _Expr2> >
3922>::type
3923operator+(const _Expr1& __x, const _Expr2& __y)
3924{
3925 typedef typename _Expr1::value_type value_type;
3926 typedef _BinaryOp<plus<value_type>, _Expr1, _Expr2> _Op;
3927 return __val_expr<_Op>(_Op(plus<value_type>(), __x, __y));
3928}
3929
3930template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003931inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003932typename enable_if
3933<
3934 __is_val_expr<_Expr>::value,
3935 __val_expr<_BinaryOp<plus<typename _Expr::value_type>,
3936 _Expr, __scalar_expr<typename _Expr::value_type> > >
3937>::type
3938operator+(const _Expr& __x, const typename _Expr::value_type& __y)
3939{
3940 typedef typename _Expr::value_type value_type;
3941 typedef _BinaryOp<plus<value_type>, _Expr, __scalar_expr<value_type> > _Op;
3942 return __val_expr<_Op>(_Op(plus<value_type>(),
3943 __x, __scalar_expr<value_type>(__y, __x.size())));
3944}
3945
3946template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003947inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003948typename enable_if
3949<
3950 __is_val_expr<_Expr>::value,
3951 __val_expr<_BinaryOp<plus<typename _Expr::value_type>,
3952 __scalar_expr<typename _Expr::value_type>, _Expr> >
3953>::type
3954operator+(const typename _Expr::value_type& __x, const _Expr& __y)
3955{
3956 typedef typename _Expr::value_type value_type;
3957 typedef _BinaryOp<plus<value_type>, __scalar_expr<value_type>, _Expr> _Op;
3958 return __val_expr<_Op>(_Op(plus<value_type>(),
3959 __scalar_expr<value_type>(__x, __y.size()), __y));
3960}
3961
3962template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003963inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003964typename enable_if
3965<
3966 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
3967 __val_expr<_BinaryOp<minus<typename _Expr1::value_type>, _Expr1, _Expr2> >
3968>::type
3969operator-(const _Expr1& __x, const _Expr2& __y)
3970{
3971 typedef typename _Expr1::value_type value_type;
3972 typedef _BinaryOp<minus<value_type>, _Expr1, _Expr2> _Op;
3973 return __val_expr<_Op>(_Op(minus<value_type>(), __x, __y));
3974}
3975
3976template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003977inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003978typename enable_if
3979<
3980 __is_val_expr<_Expr>::value,
3981 __val_expr<_BinaryOp<minus<typename _Expr::value_type>,
3982 _Expr, __scalar_expr<typename _Expr::value_type> > >
3983>::type
3984operator-(const _Expr& __x, const typename _Expr::value_type& __y)
3985{
3986 typedef typename _Expr::value_type value_type;
3987 typedef _BinaryOp<minus<value_type>, _Expr, __scalar_expr<value_type> > _Op;
3988 return __val_expr<_Op>(_Op(minus<value_type>(),
3989 __x, __scalar_expr<value_type>(__y, __x.size())));
3990}
3991
3992template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003993inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003994typename enable_if
3995<
3996 __is_val_expr<_Expr>::value,
3997 __val_expr<_BinaryOp<minus<typename _Expr::value_type>,
3998 __scalar_expr<typename _Expr::value_type>, _Expr> >
3999>::type
4000operator-(const typename _Expr::value_type& __x, const _Expr& __y)
4001{
4002 typedef typename _Expr::value_type value_type;
4003 typedef _BinaryOp<minus<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4004 return __val_expr<_Op>(_Op(minus<value_type>(),
4005 __scalar_expr<value_type>(__x, __y.size()), __y));
4006}
4007
4008template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004009inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004010typename enable_if
4011<
4012 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4013 __val_expr<_BinaryOp<bit_xor<typename _Expr1::value_type>, _Expr1, _Expr2> >
4014>::type
4015operator^(const _Expr1& __x, const _Expr2& __y)
4016{
4017 typedef typename _Expr1::value_type value_type;
4018 typedef _BinaryOp<bit_xor<value_type>, _Expr1, _Expr2> _Op;
4019 return __val_expr<_Op>(_Op(bit_xor<value_type>(), __x, __y));
4020}
4021
4022template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004023inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004024typename enable_if
4025<
4026 __is_val_expr<_Expr>::value,
4027 __val_expr<_BinaryOp<bit_xor<typename _Expr::value_type>,
4028 _Expr, __scalar_expr<typename _Expr::value_type> > >
4029>::type
4030operator^(const _Expr& __x, const typename _Expr::value_type& __y)
4031{
4032 typedef typename _Expr::value_type value_type;
4033 typedef _BinaryOp<bit_xor<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4034 return __val_expr<_Op>(_Op(bit_xor<value_type>(),
4035 __x, __scalar_expr<value_type>(__y, __x.size())));
4036}
4037
4038template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004039inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004040typename enable_if
4041<
4042 __is_val_expr<_Expr>::value,
4043 __val_expr<_BinaryOp<bit_xor<typename _Expr::value_type>,
4044 __scalar_expr<typename _Expr::value_type>, _Expr> >
4045>::type
4046operator^(const typename _Expr::value_type& __x, const _Expr& __y)
4047{
4048 typedef typename _Expr::value_type value_type;
4049 typedef _BinaryOp<bit_xor<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4050 return __val_expr<_Op>(_Op(bit_xor<value_type>(),
4051 __scalar_expr<value_type>(__x, __y.size()), __y));
4052}
4053
4054template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004055inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004056typename enable_if
4057<
4058 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4059 __val_expr<_BinaryOp<bit_and<typename _Expr1::value_type>, _Expr1, _Expr2> >
4060>::type
4061operator&(const _Expr1& __x, const _Expr2& __y)
4062{
4063 typedef typename _Expr1::value_type value_type;
4064 typedef _BinaryOp<bit_and<value_type>, _Expr1, _Expr2> _Op;
4065 return __val_expr<_Op>(_Op(bit_and<value_type>(), __x, __y));
4066}
4067
4068template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004069inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004070typename enable_if
4071<
4072 __is_val_expr<_Expr>::value,
4073 __val_expr<_BinaryOp<bit_and<typename _Expr::value_type>,
4074 _Expr, __scalar_expr<typename _Expr::value_type> > >
4075>::type
4076operator&(const _Expr& __x, const typename _Expr::value_type& __y)
4077{
4078 typedef typename _Expr::value_type value_type;
4079 typedef _BinaryOp<bit_and<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4080 return __val_expr<_Op>(_Op(bit_and<value_type>(),
4081 __x, __scalar_expr<value_type>(__y, __x.size())));
4082}
4083
4084template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004085inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004086typename enable_if
4087<
4088 __is_val_expr<_Expr>::value,
4089 __val_expr<_BinaryOp<bit_and<typename _Expr::value_type>,
4090 __scalar_expr<typename _Expr::value_type>, _Expr> >
4091>::type
4092operator&(const typename _Expr::value_type& __x, const _Expr& __y)
4093{
4094 typedef typename _Expr::value_type value_type;
4095 typedef _BinaryOp<bit_and<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4096 return __val_expr<_Op>(_Op(bit_and<value_type>(),
4097 __scalar_expr<value_type>(__x, __y.size()), __y));
4098}
4099
4100template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004101inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004102typename enable_if
4103<
4104 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4105 __val_expr<_BinaryOp<bit_or<typename _Expr1::value_type>, _Expr1, _Expr2> >
4106>::type
4107operator|(const _Expr1& __x, const _Expr2& __y)
4108{
4109 typedef typename _Expr1::value_type value_type;
4110 typedef _BinaryOp<bit_or<value_type>, _Expr1, _Expr2> _Op;
4111 return __val_expr<_Op>(_Op(bit_or<value_type>(), __x, __y));
4112}
4113
4114template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004115inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004116typename enable_if
4117<
4118 __is_val_expr<_Expr>::value,
4119 __val_expr<_BinaryOp<bit_or<typename _Expr::value_type>,
4120 _Expr, __scalar_expr<typename _Expr::value_type> > >
4121>::type
4122operator|(const _Expr& __x, const typename _Expr::value_type& __y)
4123{
4124 typedef typename _Expr::value_type value_type;
4125 typedef _BinaryOp<bit_or<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4126 return __val_expr<_Op>(_Op(bit_or<value_type>(),
4127 __x, __scalar_expr<value_type>(__y, __x.size())));
4128}
4129
4130template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004131inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004132typename enable_if
4133<
4134 __is_val_expr<_Expr>::value,
4135 __val_expr<_BinaryOp<bit_or<typename _Expr::value_type>,
4136 __scalar_expr<typename _Expr::value_type>, _Expr> >
4137>::type
4138operator|(const typename _Expr::value_type& __x, const _Expr& __y)
4139{
4140 typedef typename _Expr::value_type value_type;
4141 typedef _BinaryOp<bit_or<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4142 return __val_expr<_Op>(_Op(bit_or<value_type>(),
4143 __scalar_expr<value_type>(__x, __y.size()), __y));
4144}
4145
4146template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004147inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004148typename enable_if
4149<
4150 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4151 __val_expr<_BinaryOp<__bit_shift_left<typename _Expr1::value_type>, _Expr1, _Expr2> >
4152>::type
4153operator<<(const _Expr1& __x, const _Expr2& __y)
4154{
4155 typedef typename _Expr1::value_type value_type;
4156 typedef _BinaryOp<__bit_shift_left<value_type>, _Expr1, _Expr2> _Op;
4157 return __val_expr<_Op>(_Op(__bit_shift_left<value_type>(), __x, __y));
4158}
4159
4160template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004161inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004162typename enable_if
4163<
4164 __is_val_expr<_Expr>::value,
4165 __val_expr<_BinaryOp<__bit_shift_left<typename _Expr::value_type>,
4166 _Expr, __scalar_expr<typename _Expr::value_type> > >
4167>::type
4168operator<<(const _Expr& __x, const typename _Expr::value_type& __y)
4169{
4170 typedef typename _Expr::value_type value_type;
4171 typedef _BinaryOp<__bit_shift_left<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4172 return __val_expr<_Op>(_Op(__bit_shift_left<value_type>(),
4173 __x, __scalar_expr<value_type>(__y, __x.size())));
4174}
4175
4176template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004177inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004178typename enable_if
4179<
4180 __is_val_expr<_Expr>::value,
4181 __val_expr<_BinaryOp<__bit_shift_left<typename _Expr::value_type>,
4182 __scalar_expr<typename _Expr::value_type>, _Expr> >
4183>::type
4184operator<<(const typename _Expr::value_type& __x, const _Expr& __y)
4185{
4186 typedef typename _Expr::value_type value_type;
4187 typedef _BinaryOp<__bit_shift_left<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4188 return __val_expr<_Op>(_Op(__bit_shift_left<value_type>(),
4189 __scalar_expr<value_type>(__x, __y.size()), __y));
4190}
4191
4192template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004193inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004194typename enable_if
4195<
4196 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4197 __val_expr<_BinaryOp<__bit_shift_right<typename _Expr1::value_type>, _Expr1, _Expr2> >
4198>::type
4199operator>>(const _Expr1& __x, const _Expr2& __y)
4200{
4201 typedef typename _Expr1::value_type value_type;
4202 typedef _BinaryOp<__bit_shift_right<value_type>, _Expr1, _Expr2> _Op;
4203 return __val_expr<_Op>(_Op(__bit_shift_right<value_type>(), __x, __y));
4204}
4205
4206template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004207inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004208typename enable_if
4209<
4210 __is_val_expr<_Expr>::value,
4211 __val_expr<_BinaryOp<__bit_shift_right<typename _Expr::value_type>,
4212 _Expr, __scalar_expr<typename _Expr::value_type> > >
4213>::type
4214operator>>(const _Expr& __x, const typename _Expr::value_type& __y)
4215{
4216 typedef typename _Expr::value_type value_type;
4217 typedef _BinaryOp<__bit_shift_right<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4218 return __val_expr<_Op>(_Op(__bit_shift_right<value_type>(),
4219 __x, __scalar_expr<value_type>(__y, __x.size())));
4220}
4221
4222template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004223inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004224typename enable_if
4225<
4226 __is_val_expr<_Expr>::value,
4227 __val_expr<_BinaryOp<__bit_shift_right<typename _Expr::value_type>,
4228 __scalar_expr<typename _Expr::value_type>, _Expr> >
4229>::type
4230operator>>(const typename _Expr::value_type& __x, const _Expr& __y)
4231{
4232 typedef typename _Expr::value_type value_type;
4233 typedef _BinaryOp<__bit_shift_right<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4234 return __val_expr<_Op>(_Op(__bit_shift_right<value_type>(),
4235 __scalar_expr<value_type>(__x, __y.size()), __y));
4236}
4237
4238template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004239inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004240typename enable_if
4241<
4242 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4243 __val_expr<_BinaryOp<logical_and<typename _Expr1::value_type>, _Expr1, _Expr2> >
4244>::type
4245operator&&(const _Expr1& __x, const _Expr2& __y)
4246{
4247 typedef typename _Expr1::value_type value_type;
4248 typedef _BinaryOp<logical_and<value_type>, _Expr1, _Expr2> _Op;
4249 return __val_expr<_Op>(_Op(logical_and<value_type>(), __x, __y));
4250}
4251
4252template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004253inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004254typename enable_if
4255<
4256 __is_val_expr<_Expr>::value,
4257 __val_expr<_BinaryOp<logical_and<typename _Expr::value_type>,
4258 _Expr, __scalar_expr<typename _Expr::value_type> > >
4259>::type
4260operator&&(const _Expr& __x, const typename _Expr::value_type& __y)
4261{
4262 typedef typename _Expr::value_type value_type;
4263 typedef _BinaryOp<logical_and<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4264 return __val_expr<_Op>(_Op(logical_and<value_type>(),
4265 __x, __scalar_expr<value_type>(__y, __x.size())));
4266}
4267
4268template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004269inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004270typename enable_if
4271<
4272 __is_val_expr<_Expr>::value,
4273 __val_expr<_BinaryOp<logical_and<typename _Expr::value_type>,
4274 __scalar_expr<typename _Expr::value_type>, _Expr> >
4275>::type
4276operator&&(const typename _Expr::value_type& __x, const _Expr& __y)
4277{
4278 typedef typename _Expr::value_type value_type;
4279 typedef _BinaryOp<logical_and<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4280 return __val_expr<_Op>(_Op(logical_and<value_type>(),
4281 __scalar_expr<value_type>(__x, __y.size()), __y));
4282}
4283
4284template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004285inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004286typename enable_if
4287<
4288 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4289 __val_expr<_BinaryOp<logical_or<typename _Expr1::value_type>, _Expr1, _Expr2> >
4290>::type
4291operator||(const _Expr1& __x, const _Expr2& __y)
4292{
4293 typedef typename _Expr1::value_type value_type;
4294 typedef _BinaryOp<logical_or<value_type>, _Expr1, _Expr2> _Op;
4295 return __val_expr<_Op>(_Op(logical_or<value_type>(), __x, __y));
4296}
4297
4298template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004299inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004300typename enable_if
4301<
4302 __is_val_expr<_Expr>::value,
4303 __val_expr<_BinaryOp<logical_or<typename _Expr::value_type>,
4304 _Expr, __scalar_expr<typename _Expr::value_type> > >
4305>::type
4306operator||(const _Expr& __x, const typename _Expr::value_type& __y)
4307{
4308 typedef typename _Expr::value_type value_type;
4309 typedef _BinaryOp<logical_or<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4310 return __val_expr<_Op>(_Op(logical_or<value_type>(),
4311 __x, __scalar_expr<value_type>(__y, __x.size())));
4312}
4313
4314template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004315inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004316typename enable_if
4317<
4318 __is_val_expr<_Expr>::value,
4319 __val_expr<_BinaryOp<logical_or<typename _Expr::value_type>,
4320 __scalar_expr<typename _Expr::value_type>, _Expr> >
4321>::type
4322operator||(const typename _Expr::value_type& __x, const _Expr& __y)
4323{
4324 typedef typename _Expr::value_type value_type;
4325 typedef _BinaryOp<logical_or<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4326 return __val_expr<_Op>(_Op(logical_or<value_type>(),
4327 __scalar_expr<value_type>(__x, __y.size()), __y));
4328}
4329
4330template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004331inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004332typename enable_if
4333<
4334 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4335 __val_expr<_BinaryOp<equal_to<typename _Expr1::value_type>, _Expr1, _Expr2> >
4336>::type
4337operator==(const _Expr1& __x, const _Expr2& __y)
4338{
4339 typedef typename _Expr1::value_type value_type;
4340 typedef _BinaryOp<equal_to<value_type>, _Expr1, _Expr2> _Op;
4341 return __val_expr<_Op>(_Op(equal_to<value_type>(), __x, __y));
4342}
4343
4344template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004345inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004346typename enable_if
4347<
4348 __is_val_expr<_Expr>::value,
4349 __val_expr<_BinaryOp<equal_to<typename _Expr::value_type>,
4350 _Expr, __scalar_expr<typename _Expr::value_type> > >
4351>::type
4352operator==(const _Expr& __x, const typename _Expr::value_type& __y)
4353{
4354 typedef typename _Expr::value_type value_type;
4355 typedef _BinaryOp<equal_to<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4356 return __val_expr<_Op>(_Op(equal_to<value_type>(),
4357 __x, __scalar_expr<value_type>(__y, __x.size())));
4358}
4359
4360template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004361inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004362typename enable_if
4363<
4364 __is_val_expr<_Expr>::value,
4365 __val_expr<_BinaryOp<equal_to<typename _Expr::value_type>,
4366 __scalar_expr<typename _Expr::value_type>, _Expr> >
4367>::type
4368operator==(const typename _Expr::value_type& __x, const _Expr& __y)
4369{
4370 typedef typename _Expr::value_type value_type;
4371 typedef _BinaryOp<equal_to<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4372 return __val_expr<_Op>(_Op(equal_to<value_type>(),
4373 __scalar_expr<value_type>(__x, __y.size()), __y));
4374}
4375
4376template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004377inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004378typename enable_if
4379<
4380 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4381 __val_expr<_BinaryOp<not_equal_to<typename _Expr1::value_type>, _Expr1, _Expr2> >
4382>::type
4383operator!=(const _Expr1& __x, const _Expr2& __y)
4384{
4385 typedef typename _Expr1::value_type value_type;
4386 typedef _BinaryOp<not_equal_to<value_type>, _Expr1, _Expr2> _Op;
4387 return __val_expr<_Op>(_Op(not_equal_to<value_type>(), __x, __y));
4388}
4389
4390template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004391inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004392typename enable_if
4393<
4394 __is_val_expr<_Expr>::value,
4395 __val_expr<_BinaryOp<not_equal_to<typename _Expr::value_type>,
4396 _Expr, __scalar_expr<typename _Expr::value_type> > >
4397>::type
4398operator!=(const _Expr& __x, const typename _Expr::value_type& __y)
4399{
4400 typedef typename _Expr::value_type value_type;
4401 typedef _BinaryOp<not_equal_to<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4402 return __val_expr<_Op>(_Op(not_equal_to<value_type>(),
4403 __x, __scalar_expr<value_type>(__y, __x.size())));
4404}
4405
4406template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004407inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004408typename enable_if
4409<
4410 __is_val_expr<_Expr>::value,
4411 __val_expr<_BinaryOp<not_equal_to<typename _Expr::value_type>,
4412 __scalar_expr<typename _Expr::value_type>, _Expr> >
4413>::type
4414operator!=(const typename _Expr::value_type& __x, const _Expr& __y)
4415{
4416 typedef typename _Expr::value_type value_type;
4417 typedef _BinaryOp<not_equal_to<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4418 return __val_expr<_Op>(_Op(not_equal_to<value_type>(),
4419 __scalar_expr<value_type>(__x, __y.size()), __y));
4420}
4421
4422template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004423inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004424typename enable_if
4425<
4426 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4427 __val_expr<_BinaryOp<less<typename _Expr1::value_type>, _Expr1, _Expr2> >
4428>::type
4429operator<(const _Expr1& __x, const _Expr2& __y)
4430{
4431 typedef typename _Expr1::value_type value_type;
4432 typedef _BinaryOp<less<value_type>, _Expr1, _Expr2> _Op;
4433 return __val_expr<_Op>(_Op(less<value_type>(), __x, __y));
4434}
4435
4436template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004437inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004438typename enable_if
4439<
4440 __is_val_expr<_Expr>::value,
4441 __val_expr<_BinaryOp<less<typename _Expr::value_type>,
4442 _Expr, __scalar_expr<typename _Expr::value_type> > >
4443>::type
4444operator<(const _Expr& __x, const typename _Expr::value_type& __y)
4445{
4446 typedef typename _Expr::value_type value_type;
4447 typedef _BinaryOp<less<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4448 return __val_expr<_Op>(_Op(less<value_type>(),
4449 __x, __scalar_expr<value_type>(__y, __x.size())));
4450}
4451
4452template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004453inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004454typename enable_if
4455<
4456 __is_val_expr<_Expr>::value,
4457 __val_expr<_BinaryOp<less<typename _Expr::value_type>,
4458 __scalar_expr<typename _Expr::value_type>, _Expr> >
4459>::type
4460operator<(const typename _Expr::value_type& __x, const _Expr& __y)
4461{
4462 typedef typename _Expr::value_type value_type;
4463 typedef _BinaryOp<less<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4464 return __val_expr<_Op>(_Op(less<value_type>(),
4465 __scalar_expr<value_type>(__x, __y.size()), __y));
4466}
4467
4468template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004469inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004470typename enable_if
4471<
4472 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4473 __val_expr<_BinaryOp<greater<typename _Expr1::value_type>, _Expr1, _Expr2> >
4474>::type
4475operator>(const _Expr1& __x, const _Expr2& __y)
4476{
4477 typedef typename _Expr1::value_type value_type;
4478 typedef _BinaryOp<greater<value_type>, _Expr1, _Expr2> _Op;
4479 return __val_expr<_Op>(_Op(greater<value_type>(), __x, __y));
4480}
4481
4482template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004483inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004484typename enable_if
4485<
4486 __is_val_expr<_Expr>::value,
4487 __val_expr<_BinaryOp<greater<typename _Expr::value_type>,
4488 _Expr, __scalar_expr<typename _Expr::value_type> > >
4489>::type
4490operator>(const _Expr& __x, const typename _Expr::value_type& __y)
4491{
4492 typedef typename _Expr::value_type value_type;
4493 typedef _BinaryOp<greater<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4494 return __val_expr<_Op>(_Op(greater<value_type>(),
4495 __x, __scalar_expr<value_type>(__y, __x.size())));
4496}
4497
4498template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004499inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004500typename enable_if
4501<
4502 __is_val_expr<_Expr>::value,
4503 __val_expr<_BinaryOp<greater<typename _Expr::value_type>,
4504 __scalar_expr<typename _Expr::value_type>, _Expr> >
4505>::type
4506operator>(const typename _Expr::value_type& __x, const _Expr& __y)
4507{
4508 typedef typename _Expr::value_type value_type;
4509 typedef _BinaryOp<greater<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4510 return __val_expr<_Op>(_Op(greater<value_type>(),
4511 __scalar_expr<value_type>(__x, __y.size()), __y));
4512}
4513
4514template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004515inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004516typename enable_if
4517<
4518 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4519 __val_expr<_BinaryOp<less_equal<typename _Expr1::value_type>, _Expr1, _Expr2> >
4520>::type
4521operator<=(const _Expr1& __x, const _Expr2& __y)
4522{
4523 typedef typename _Expr1::value_type value_type;
4524 typedef _BinaryOp<less_equal<value_type>, _Expr1, _Expr2> _Op;
4525 return __val_expr<_Op>(_Op(less_equal<value_type>(), __x, __y));
4526}
4527
4528template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004529inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004530typename enable_if
4531<
4532 __is_val_expr<_Expr>::value,
4533 __val_expr<_BinaryOp<less_equal<typename _Expr::value_type>,
4534 _Expr, __scalar_expr<typename _Expr::value_type> > >
4535>::type
4536operator<=(const _Expr& __x, const typename _Expr::value_type& __y)
4537{
4538 typedef typename _Expr::value_type value_type;
4539 typedef _BinaryOp<less_equal<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4540 return __val_expr<_Op>(_Op(less_equal<value_type>(),
4541 __x, __scalar_expr<value_type>(__y, __x.size())));
4542}
4543
4544template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004545inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004546typename enable_if
4547<
4548 __is_val_expr<_Expr>::value,
4549 __val_expr<_BinaryOp<less_equal<typename _Expr::value_type>,
4550 __scalar_expr<typename _Expr::value_type>, _Expr> >
4551>::type
4552operator<=(const typename _Expr::value_type& __x, const _Expr& __y)
4553{
4554 typedef typename _Expr::value_type value_type;
4555 typedef _BinaryOp<less_equal<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4556 return __val_expr<_Op>(_Op(less_equal<value_type>(),
4557 __scalar_expr<value_type>(__x, __y.size()), __y));
4558}
4559
4560template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004561inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004562typename enable_if
4563<
4564 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4565 __val_expr<_BinaryOp<greater_equal<typename _Expr1::value_type>, _Expr1, _Expr2> >
4566>::type
4567operator>=(const _Expr1& __x, const _Expr2& __y)
4568{
4569 typedef typename _Expr1::value_type value_type;
4570 typedef _BinaryOp<greater_equal<value_type>, _Expr1, _Expr2> _Op;
4571 return __val_expr<_Op>(_Op(greater_equal<value_type>(), __x, __y));
4572}
4573
4574template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004575inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004576typename enable_if
4577<
4578 __is_val_expr<_Expr>::value,
4579 __val_expr<_BinaryOp<greater_equal<typename _Expr::value_type>,
4580 _Expr, __scalar_expr<typename _Expr::value_type> > >
4581>::type
4582operator>=(const _Expr& __x, const typename _Expr::value_type& __y)
4583{
4584 typedef typename _Expr::value_type value_type;
4585 typedef _BinaryOp<greater_equal<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4586 return __val_expr<_Op>(_Op(greater_equal<value_type>(),
4587 __x, __scalar_expr<value_type>(__y, __x.size())));
4588}
4589
4590template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004591inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004592typename enable_if
4593<
4594 __is_val_expr<_Expr>::value,
4595 __val_expr<_BinaryOp<greater_equal<typename _Expr::value_type>,
4596 __scalar_expr<typename _Expr::value_type>, _Expr> >
4597>::type
4598operator>=(const typename _Expr::value_type& __x, const _Expr& __y)
4599{
4600 typedef typename _Expr::value_type value_type;
4601 typedef _BinaryOp<greater_equal<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4602 return __val_expr<_Op>(_Op(greater_equal<value_type>(),
4603 __scalar_expr<value_type>(__x, __y.size()), __y));
4604}
4605
4606template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004607inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004608typename enable_if
4609<
4610 __is_val_expr<_Expr>::value,
4611 __val_expr<_UnaryOp<__abs_expr<typename _Expr::value_type>, _Expr> >
4612>::type
4613abs(const _Expr& __x)
4614{
4615 typedef typename _Expr::value_type value_type;
4616 typedef _UnaryOp<__abs_expr<value_type>, _Expr> _Op;
4617 return __val_expr<_Op>(_Op(__abs_expr<value_type>(), __x));
4618}
4619
4620template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004621inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004622typename enable_if
4623<
4624 __is_val_expr<_Expr>::value,
4625 __val_expr<_UnaryOp<__acos_expr<typename _Expr::value_type>, _Expr> >
4626>::type
4627acos(const _Expr& __x)
4628{
4629 typedef typename _Expr::value_type value_type;
4630 typedef _UnaryOp<__acos_expr<value_type>, _Expr> _Op;
4631 return __val_expr<_Op>(_Op(__acos_expr<value_type>(), __x));
4632}
4633
4634template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004635inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004636typename enable_if
4637<
4638 __is_val_expr<_Expr>::value,
4639 __val_expr<_UnaryOp<__asin_expr<typename _Expr::value_type>, _Expr> >
4640>::type
4641asin(const _Expr& __x)
4642{
4643 typedef typename _Expr::value_type value_type;
4644 typedef _UnaryOp<__asin_expr<value_type>, _Expr> _Op;
4645 return __val_expr<_Op>(_Op(__asin_expr<value_type>(), __x));
4646}
4647
4648template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004649inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004650typename enable_if
4651<
4652 __is_val_expr<_Expr>::value,
4653 __val_expr<_UnaryOp<__atan_expr<typename _Expr::value_type>, _Expr> >
4654>::type
4655atan(const _Expr& __x)
4656{
4657 typedef typename _Expr::value_type value_type;
4658 typedef _UnaryOp<__atan_expr<value_type>, _Expr> _Op;
4659 return __val_expr<_Op>(_Op(__atan_expr<value_type>(), __x));
4660}
4661
4662template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004663inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004664typename enable_if
4665<
4666 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4667 __val_expr<_BinaryOp<__atan2_expr<typename _Expr1::value_type>, _Expr1, _Expr2> >
4668>::type
4669atan2(const _Expr1& __x, const _Expr2& __y)
4670{
4671 typedef typename _Expr1::value_type value_type;
4672 typedef _BinaryOp<__atan2_expr<value_type>, _Expr1, _Expr2> _Op;
4673 return __val_expr<_Op>(_Op(__atan2_expr<value_type>(), __x, __y));
4674}
4675
4676template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004677inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004678typename enable_if
4679<
4680 __is_val_expr<_Expr>::value,
4681 __val_expr<_BinaryOp<__atan2_expr<typename _Expr::value_type>,
4682 _Expr, __scalar_expr<typename _Expr::value_type> > >
4683>::type
4684atan2(const _Expr& __x, const typename _Expr::value_type& __y)
4685{
4686 typedef typename _Expr::value_type value_type;
4687 typedef _BinaryOp<__atan2_expr<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4688 return __val_expr<_Op>(_Op(__atan2_expr<value_type>(),
4689 __x, __scalar_expr<value_type>(__y, __x.size())));
4690}
4691
4692template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004693inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004694typename enable_if
4695<
4696 __is_val_expr<_Expr>::value,
4697 __val_expr<_BinaryOp<__atan2_expr<typename _Expr::value_type>,
4698 __scalar_expr<typename _Expr::value_type>, _Expr> >
4699>::type
4700atan2(const typename _Expr::value_type& __x, const _Expr& __y)
4701{
4702 typedef typename _Expr::value_type value_type;
4703 typedef _BinaryOp<__atan2_expr<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4704 return __val_expr<_Op>(_Op(__atan2_expr<value_type>(),
4705 __scalar_expr<value_type>(__x, __y.size()), __y));
4706}
4707
4708template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004709inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004710typename enable_if
4711<
4712 __is_val_expr<_Expr>::value,
4713 __val_expr<_UnaryOp<__cos_expr<typename _Expr::value_type>, _Expr> >
4714>::type
4715cos(const _Expr& __x)
4716{
4717 typedef typename _Expr::value_type value_type;
4718 typedef _UnaryOp<__cos_expr<value_type>, _Expr> _Op;
4719 return __val_expr<_Op>(_Op(__cos_expr<value_type>(), __x));
4720}
4721
4722template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004723inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004724typename enable_if
4725<
4726 __is_val_expr<_Expr>::value,
4727 __val_expr<_UnaryOp<__cosh_expr<typename _Expr::value_type>, _Expr> >
4728>::type
4729cosh(const _Expr& __x)
4730{
4731 typedef typename _Expr::value_type value_type;
4732 typedef _UnaryOp<__cosh_expr<value_type>, _Expr> _Op;
4733 return __val_expr<_Op>(_Op(__cosh_expr<value_type>(), __x));
4734}
4735
4736template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004737inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004738typename enable_if
4739<
4740 __is_val_expr<_Expr>::value,
4741 __val_expr<_UnaryOp<__exp_expr<typename _Expr::value_type>, _Expr> >
4742>::type
4743exp(const _Expr& __x)
4744{
4745 typedef typename _Expr::value_type value_type;
4746 typedef _UnaryOp<__exp_expr<value_type>, _Expr> _Op;
4747 return __val_expr<_Op>(_Op(__exp_expr<value_type>(), __x));
4748}
4749
4750template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004751inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004752typename enable_if
4753<
4754 __is_val_expr<_Expr>::value,
4755 __val_expr<_UnaryOp<__log_expr<typename _Expr::value_type>, _Expr> >
4756>::type
4757log(const _Expr& __x)
4758{
4759 typedef typename _Expr::value_type value_type;
4760 typedef _UnaryOp<__log_expr<value_type>, _Expr> _Op;
4761 return __val_expr<_Op>(_Op(__log_expr<value_type>(), __x));
4762}
4763
4764template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004765inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004766typename enable_if
4767<
4768 __is_val_expr<_Expr>::value,
4769 __val_expr<_UnaryOp<__log10_expr<typename _Expr::value_type>, _Expr> >
4770>::type
4771log10(const _Expr& __x)
4772{
4773 typedef typename _Expr::value_type value_type;
4774 typedef _UnaryOp<__log10_expr<value_type>, _Expr> _Op;
4775 return __val_expr<_Op>(_Op(__log10_expr<value_type>(), __x));
4776}
4777
4778template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004779inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004780typename enable_if
4781<
4782 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4783 __val_expr<_BinaryOp<__pow_expr<typename _Expr1::value_type>, _Expr1, _Expr2> >
4784>::type
4785pow(const _Expr1& __x, const _Expr2& __y)
4786{
4787 typedef typename _Expr1::value_type value_type;
4788 typedef _BinaryOp<__pow_expr<value_type>, _Expr1, _Expr2> _Op;
4789 return __val_expr<_Op>(_Op(__pow_expr<value_type>(), __x, __y));
4790}
4791
4792template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004793inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004794typename enable_if
4795<
4796 __is_val_expr<_Expr>::value,
4797 __val_expr<_BinaryOp<__pow_expr<typename _Expr::value_type>,
4798 _Expr, __scalar_expr<typename _Expr::value_type> > >
4799>::type
4800pow(const _Expr& __x, const typename _Expr::value_type& __y)
4801{
4802 typedef typename _Expr::value_type value_type;
4803 typedef _BinaryOp<__pow_expr<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4804 return __val_expr<_Op>(_Op(__pow_expr<value_type>(),
4805 __x, __scalar_expr<value_type>(__y, __x.size())));
4806}
4807
4808template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004809inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004810typename enable_if
4811<
4812 __is_val_expr<_Expr>::value,
4813 __val_expr<_BinaryOp<__pow_expr<typename _Expr::value_type>,
4814 __scalar_expr<typename _Expr::value_type>, _Expr> >
4815>::type
4816pow(const typename _Expr::value_type& __x, const _Expr& __y)
4817{
4818 typedef typename _Expr::value_type value_type;
4819 typedef _BinaryOp<__pow_expr<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4820 return __val_expr<_Op>(_Op(__pow_expr<value_type>(),
4821 __scalar_expr<value_type>(__x, __y.size()), __y));
4822}
4823
4824template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004825inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004826typename enable_if
4827<
4828 __is_val_expr<_Expr>::value,
4829 __val_expr<_UnaryOp<__sin_expr<typename _Expr::value_type>, _Expr> >
4830>::type
4831sin(const _Expr& __x)
4832{
4833 typedef typename _Expr::value_type value_type;
4834 typedef _UnaryOp<__sin_expr<value_type>, _Expr> _Op;
4835 return __val_expr<_Op>(_Op(__sin_expr<value_type>(), __x));
4836}
4837
4838template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004839inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004840typename enable_if
4841<
4842 __is_val_expr<_Expr>::value,
4843 __val_expr<_UnaryOp<__sinh_expr<typename _Expr::value_type>, _Expr> >
4844>::type
4845sinh(const _Expr& __x)
4846{
4847 typedef typename _Expr::value_type value_type;
4848 typedef _UnaryOp<__sinh_expr<value_type>, _Expr> _Op;
4849 return __val_expr<_Op>(_Op(__sinh_expr<value_type>(), __x));
4850}
4851
4852template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004853inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004854typename enable_if
4855<
4856 __is_val_expr<_Expr>::value,
4857 __val_expr<_UnaryOp<__sqrt_expr<typename _Expr::value_type>, _Expr> >
4858>::type
4859sqrt(const _Expr& __x)
4860{
4861 typedef typename _Expr::value_type value_type;
4862 typedef _UnaryOp<__sqrt_expr<value_type>, _Expr> _Op;
4863 return __val_expr<_Op>(_Op(__sqrt_expr<value_type>(), __x));
4864}
4865
4866template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004867inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004868typename enable_if
4869<
4870 __is_val_expr<_Expr>::value,
4871 __val_expr<_UnaryOp<__tan_expr<typename _Expr::value_type>, _Expr> >
4872>::type
4873tan(const _Expr& __x)
4874{
4875 typedef typename _Expr::value_type value_type;
4876 typedef _UnaryOp<__tan_expr<value_type>, _Expr> _Op;
4877 return __val_expr<_Op>(_Op(__tan_expr<value_type>(), __x));
4878}
4879
4880template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004881inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004882typename enable_if
4883<
4884 __is_val_expr<_Expr>::value,
4885 __val_expr<_UnaryOp<__tanh_expr<typename _Expr::value_type>, _Expr> >
4886>::type
4887tanh(const _Expr& __x)
4888{
4889 typedef typename _Expr::value_type value_type;
4890 typedef _UnaryOp<__tanh_expr<value_type>, _Expr> _Op;
4891 return __val_expr<_Op>(_Op(__tanh_expr<value_type>(), __x));
4892}
4893
4894template <class _Tp>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004895inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004896_Tp*
4897begin(valarray<_Tp>& __v)
4898{
4899 return __v.__begin_;
4900}
4901
4902template <class _Tp>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004903inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004904const _Tp*
4905begin(const valarray<_Tp>& __v)
4906{
4907 return __v.__begin_;
4908}
4909
4910template <class _Tp>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004911inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004912_Tp*
4913end(valarray<_Tp>& __v)
4914{
4915 return __v.__end_;
4916}
4917
4918template <class _Tp>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004919inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004920const _Tp*
4921end(const valarray<_Tp>& __v)
4922{
4923 return __v.__end_;
4924}
4925
Howard Hinnantc51e1022010-05-11 19:42:16 +00004926_LIBCPP_END_NAMESPACE_STD
4927
Eric Fiselierf4433a32017-05-31 22:07:49 +00004928_LIBCPP_POP_MACROS
4929
Mark de Weveree5fe272022-09-02 17:53:28 +02004930#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
4931# include <algorithm>
4932# include <functional>
4933#endif
4934
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04004935#endif // _LIBCPP_VALARRAY