blob: fc044f48d2a395206c107e94fc7f61741c2ea928 [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>
Nikolas Klauseree2dbc32022-04-17 16:01:38 +0200360#include <functional> // TODO: Remove this include
Arthur O'Dwyeref181602021-05-19 11:57:04 -0400361#include <initializer_list>
Richard Smith1f1c1472014-06-04 19:54:15 +0000362#include <new>
Mark de Weverce8f12c2021-12-22 18:14:14 +0100363#include <version>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000364
Howard Hinnantaaaa52b2011-10-17 20:05:10 +0000365#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
Arthur O'Dwyer6eeaa002022-02-01 20:16:40 -0500366# pragma GCC system_header
Howard Hinnantaaaa52b2011-10-17 20:05:10 +0000367#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +0000368
Eric Fiselierf4433a32017-05-31 22:07:49 +0000369_LIBCPP_PUSH_MACROS
370#include <__undef_macros>
371
Howard Hinnantc51e1022010-05-11 19:42:16 +0000372_LIBCPP_BEGIN_NAMESPACE_STD
373
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000374template<class _Tp> class _LIBCPP_TEMPLATE_VIS valarray;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000375
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000376class _LIBCPP_TEMPLATE_VIS slice
Howard Hinnantc51e1022010-05-11 19:42:16 +0000377{
378 size_t __start_;
379 size_t __size_;
380 size_t __stride_;
381public:
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000382 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000383 slice()
384 : __start_(0),
385 __size_(0),
386 __stride_(0)
387 {}
388
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000389 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000390 slice(size_t __start, size_t __size, size_t __stride)
391 : __start_(__start),
392 __size_(__size),
393 __stride_(__stride)
394 {}
395
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000396 _LIBCPP_INLINE_VISIBILITY size_t start() const {return __start_;}
397 _LIBCPP_INLINE_VISIBILITY size_t size() const {return __size_;}
398 _LIBCPP_INLINE_VISIBILITY size_t stride() const {return __stride_;}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000399};
400
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000401template <class _Tp> class _LIBCPP_TEMPLATE_VIS slice_array;
Howard Hinnant8331b762013-03-06 23:30:19 +0000402class _LIBCPP_TYPE_VIS gslice;
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000403template <class _Tp> class _LIBCPP_TEMPLATE_VIS gslice_array;
404template <class _Tp> class _LIBCPP_TEMPLATE_VIS mask_array;
405template <class _Tp> class _LIBCPP_TEMPLATE_VIS indirect_array;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000406
407template <class _Tp>
Howard Hinnanta54386e2012-09-14 00:39:16 +0000408_LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000409_Tp*
410begin(valarray<_Tp>& __v);
411
412template <class _Tp>
Howard Hinnanta54386e2012-09-14 00:39:16 +0000413_LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000414const _Tp*
415begin(const valarray<_Tp>& __v);
416
417template <class _Tp>
Howard Hinnanta54386e2012-09-14 00:39:16 +0000418_LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000419_Tp*
420end(valarray<_Tp>& __v);
421
422template <class _Tp>
Howard Hinnanta54386e2012-09-14 00:39:16 +0000423_LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000424const _Tp*
425end(const valarray<_Tp>& __v);
426
427template <class _Op, class _A0>
428struct _UnaryOp
429{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400430 typedef typename _Op::__result_type __result_type;
Arthur O'Dwyer0b6c2482021-05-31 11:33:51 -0400431 typedef typename decay<__result_type>::type value_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000432
433 _Op __op_;
434 _A0 __a0_;
435
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000436 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000437 _UnaryOp(const _Op& __op, const _A0& __a0) : __op_(__op), __a0_(__a0) {}
438
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000439 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400440 __result_type operator[](size_t __i) const {return __op_(__a0_[__i]);}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000441
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000442 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000443 size_t size() const {return __a0_.size();}
444};
445
446template <class _Op, class _A0, class _A1>
447struct _BinaryOp
448{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400449 typedef typename _Op::__result_type __result_type;
Arthur O'Dwyer0b6c2482021-05-31 11:33:51 -0400450 typedef typename decay<__result_type>::type value_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000451
452 _Op __op_;
453 _A0 __a0_;
454 _A1 __a1_;
455
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000456 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000457 _BinaryOp(const _Op& __op, const _A0& __a0, const _A1& __a1)
458 : __op_(__op), __a0_(__a0), __a1_(__a1) {}
459
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000460 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer0b6c2482021-05-31 11:33:51 -0400461 __result_type operator[](size_t __i) const {return __op_(__a0_[__i], __a1_[__i]);}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000462
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000463 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000464 size_t size() const {return __a0_.size();}
465};
466
467template <class _Tp>
468class __scalar_expr
469{
470public:
471 typedef _Tp value_type;
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400472 typedef const _Tp& __result_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000473private:
474 const value_type& __t_;
475 size_t __s_;
476public:
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000477 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000478 explicit __scalar_expr(const value_type& __t, size_t __s) : __t_(__t), __s_(__s) {}
479
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000480 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400481 __result_type operator[](size_t) const {return __t_;}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000482
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000483 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000484 size_t size() const {return __s_;}
485};
486
487template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400488struct __unary_plus
Howard Hinnantc51e1022010-05-11 19:42:16 +0000489{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400490 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000491 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000492 _Tp operator()(const _Tp& __x) const
493 {return +__x;}
494};
495
496template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400497struct __bit_not
Howard Hinnantc51e1022010-05-11 19:42:16 +0000498{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400499 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000500 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000501 _Tp operator()(const _Tp& __x) const
502 {return ~__x;}
503};
504
505template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400506struct __bit_shift_left
Howard Hinnantc51e1022010-05-11 19:42:16 +0000507{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400508 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000509 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000510 _Tp operator()(const _Tp& __x, const _Tp& __y) const
511 {return __x << __y;}
512};
513
514template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400515struct __bit_shift_right
Howard Hinnantc51e1022010-05-11 19:42:16 +0000516{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400517 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000518 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000519 _Tp operator()(const _Tp& __x, const _Tp& __y) const
520 {return __x >> __y;}
521};
522
Howard Hinnantc834c512011-11-29 18:15:50 +0000523template <class _Tp, class _Fp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400524struct __apply_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000525{
526private:
Howard Hinnantc834c512011-11-29 18:15:50 +0000527 _Fp __f_;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000528public:
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400529 typedef _Tp __result_type;
530
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000531 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc834c512011-11-29 18:15:50 +0000532 explicit __apply_expr(_Fp __f) : __f_(__f) {}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000533
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000534 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000535 _Tp operator()(const _Tp& __x) const
536 {return __f_(__x);}
537};
538
539template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400540struct __abs_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000541{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400542 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000543 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000544 _Tp operator()(const _Tp& __x) const
545 {return abs(__x);}
546};
547
548template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400549struct __acos_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000550{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400551 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000552 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000553 _Tp operator()(const _Tp& __x) const
554 {return acos(__x);}
555};
556
557template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400558struct __asin_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000559{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400560 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000561 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000562 _Tp operator()(const _Tp& __x) const
563 {return asin(__x);}
564};
565
566template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400567struct __atan_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000568{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400569 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000570 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000571 _Tp operator()(const _Tp& __x) const
572 {return atan(__x);}
573};
574
575template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400576struct __atan2_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000577{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400578 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000579 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000580 _Tp operator()(const _Tp& __x, const _Tp& __y) const
581 {return atan2(__x, __y);}
582};
583
584template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400585struct __cos_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000586{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400587 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000588 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000589 _Tp operator()(const _Tp& __x) const
590 {return cos(__x);}
591};
592
593template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400594struct __cosh_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000595{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400596 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000597 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000598 _Tp operator()(const _Tp& __x) const
599 {return cosh(__x);}
600};
601
602template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400603struct __exp_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000604{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400605 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000606 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000607 _Tp operator()(const _Tp& __x) const
608 {return exp(__x);}
609};
610
611template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400612struct __log_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000613{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400614 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000615 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000616 _Tp operator()(const _Tp& __x) const
617 {return log(__x);}
618};
619
620template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400621struct __log10_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000622{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400623 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000624 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000625 _Tp operator()(const _Tp& __x) const
626 {return log10(__x);}
627};
628
629template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400630struct __pow_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000631{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400632 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000633 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000634 _Tp operator()(const _Tp& __x, const _Tp& __y) const
635 {return pow(__x, __y);}
636};
637
638template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400639struct __sin_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000640{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400641 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000642 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000643 _Tp operator()(const _Tp& __x) const
644 {return sin(__x);}
645};
646
647template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400648struct __sinh_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000649{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400650 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000651 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000652 _Tp operator()(const _Tp& __x) const
653 {return sinh(__x);}
654};
655
656template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400657struct __sqrt_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000658{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400659 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000660 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000661 _Tp operator()(const _Tp& __x) const
662 {return sqrt(__x);}
663};
664
665template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400666struct __tan_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000667{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400668 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000669 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000670 _Tp operator()(const _Tp& __x) const
671 {return tan(__x);}
672};
673
674template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400675struct __tanh_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000676{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400677 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000678 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000679 _Tp operator()(const _Tp& __x) const
680 {return tanh(__x);}
681};
682
683template <class _ValExpr>
684class __slice_expr
685{
686 typedef typename remove_reference<_ValExpr>::type _RmExpr;
687public:
688 typedef typename _RmExpr::value_type value_type;
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400689 typedef value_type __result_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000690
691private:
692 _ValExpr __expr_;
693 size_t __start_;
694 size_t __size_;
695 size_t __stride_;
696
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000697 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000698 __slice_expr(const slice& __sl, const _RmExpr& __e)
699 : __expr_(__e),
700 __start_(__sl.start()),
701 __size_(__sl.size()),
702 __stride_(__sl.stride())
703 {}
704public:
705
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000706 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400707 __result_type operator[](size_t __i) const
Howard Hinnantc51e1022010-05-11 19:42:16 +0000708 {return __expr_[__start_ + __i * __stride_];}
709
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000710 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000711 size_t size() const {return __size_;}
712
Eric Fiselier7b31ed02019-04-02 08:05:23 +0000713 template <class> friend class __val_expr;
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000714 template <class> friend class _LIBCPP_TEMPLATE_VIS valarray;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000715};
716
717template <class _ValExpr>
718class __mask_expr;
719
720template <class _ValExpr>
721class __indirect_expr;
722
723template <class _ValExpr>
724class __shift_expr
725{
726 typedef typename remove_reference<_ValExpr>::type _RmExpr;
727public:
728 typedef typename _RmExpr::value_type value_type;
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400729 typedef value_type __result_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000730
731private:
732 _ValExpr __expr_;
733 size_t __size_;
734 ptrdiff_t __ul_;
735 ptrdiff_t __sn_;
736 ptrdiff_t __n_;
Howard Hinnantc834c512011-11-29 18:15:50 +0000737 static const ptrdiff_t _Np = static_cast<ptrdiff_t>(
Howard Hinnantc51e1022010-05-11 19:42:16 +0000738 sizeof(ptrdiff_t) * __CHAR_BIT__ - 1);
739
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000740 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000741 __shift_expr(int __n, const _RmExpr& __e)
742 : __expr_(__e),
743 __size_(__e.size()),
744 __n_(__n)
745 {
Howard Hinnantc834c512011-11-29 18:15:50 +0000746 ptrdiff_t __neg_n = static_cast<ptrdiff_t>(__n_ >> _Np);
747 __sn_ = __neg_n | static_cast<ptrdiff_t>(static_cast<size_t>(-__n_) >> _Np);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000748 __ul_ = ((__size_ - __n_) & ~__neg_n) | ((__n_ + 1) & __neg_n);
749 }
750public:
751
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000752 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400753 __result_type operator[](size_t __j) const
Howard Hinnantc51e1022010-05-11 19:42:16 +0000754 {
Howard Hinnant28b24882011-12-01 20:21:04 +0000755 ptrdiff_t __i = static_cast<ptrdiff_t>(__j);
Howard Hinnantc834c512011-11-29 18:15:50 +0000756 ptrdiff_t __m = (__sn_ * __i - __ul_) >> _Np;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000757 return (__expr_[(__i + __n_) & __m] & __m) | (value_type() & ~__m);
758 }
759
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000760 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000761 size_t size() const {return __size_;}
762
763 template <class> friend class __val_expr;
764};
765
766template <class _ValExpr>
767class __cshift_expr
768{
769 typedef typename remove_reference<_ValExpr>::type _RmExpr;
770public:
771 typedef typename _RmExpr::value_type value_type;
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400772 typedef value_type __result_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000773
774private:
775 _ValExpr __expr_;
776 size_t __size_;
777 size_t __m_;
778 size_t __o1_;
779 size_t __o2_;
780
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000781 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000782 __cshift_expr(int __n, const _RmExpr& __e)
783 : __expr_(__e),
784 __size_(__e.size())
785 {
786 __n %= static_cast<int>(__size_);
787 if (__n >= 0)
788 {
789 __m_ = __size_ - __n;
790 __o1_ = __n;
791 __o2_ = __n - __size_;
792 }
793 else
794 {
795 __m_ = -__n;
796 __o1_ = __n + __size_;
797 __o2_ = __n;
798 }
799 }
800public:
801
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000802 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400803 __result_type operator[](size_t __i) const
Howard Hinnantc51e1022010-05-11 19:42:16 +0000804 {
805 if (__i < __m_)
806 return __expr_[__i + __o1_];
807 return __expr_[__i + __o2_];
808 }
809
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000810 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000811 size_t size() const {return __size_;}
812
813 template <class> friend class __val_expr;
814};
815
816template<class _ValExpr>
817class __val_expr;
818
819template<class _ValExpr>
820struct __is_val_expr : false_type {};
821
822template<class _ValExpr>
823struct __is_val_expr<__val_expr<_ValExpr> > : true_type {};
824
825template<class _Tp>
826struct __is_val_expr<valarray<_Tp> > : true_type {};
827
828template<class _Tp>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000829class _LIBCPP_TEMPLATE_VIS valarray
Howard Hinnantc51e1022010-05-11 19:42:16 +0000830{
831public:
832 typedef _Tp value_type;
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400833 typedef _Tp __result_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000834
835private:
836 value_type* __begin_;
837 value_type* __end_;
838
839public:
840 // construct/destroy:
Douglas Gregor68902322012-05-19 07:14:17 +0000841 _LIBCPP_INLINE_VISIBILITY
Bruce Mitchener170d8972020-11-24 12:53:53 -0500842 valarray() : __begin_(nullptr), __end_(nullptr) {}
Louis Dionneb4d05d72018-10-16 19:26:23 +0000843 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Eric Fiseliere529a802016-09-16 00:13:55 +0000844 explicit valarray(size_t __n);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000845 _LIBCPP_INLINE_VISIBILITY
Douglas Gregor68902322012-05-19 07:14:17 +0000846 valarray(const value_type& __x, size_t __n);
847 valarray(const value_type* __p, size_t __n);
848 valarray(const valarray& __v);
Eric Fiselier3b0b81f2017-04-19 00:23:45 +0000849#ifndef _LIBCPP_CXX03_LANG
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000850 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant298aed92012-07-21 00:51:28 +0000851 valarray(valarray&& __v) _NOEXCEPT;
Douglas Gregor68902322012-05-19 07:14:17 +0000852 valarray(initializer_list<value_type> __il);
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400853#endif // _LIBCPP_CXX03_LANG
Douglas Gregor68902322012-05-19 07:14:17 +0000854 valarray(const slice_array<value_type>& __sa);
855 valarray(const gslice_array<value_type>& __ga);
856 valarray(const mask_array<value_type>& __ma);
857 valarray(const indirect_array<value_type>& __ia);
Louis Dionneb4d05d72018-10-16 19:26:23 +0000858 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Douglas Gregor68902322012-05-19 07:14:17 +0000859 ~valarray();
Howard Hinnantc51e1022010-05-11 19:42:16 +0000860
861 // assignment:
Douglas Gregor68902322012-05-19 07:14:17 +0000862 valarray& operator=(const valarray& __v);
Eric Fiselier3b0b81f2017-04-19 00:23:45 +0000863#ifndef _LIBCPP_CXX03_LANG
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000864 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant298aed92012-07-21 00:51:28 +0000865 valarray& operator=(valarray&& __v) _NOEXCEPT;
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000866 _LIBCPP_INLINE_VISIBILITY
Douglas Gregor68902322012-05-19 07:14:17 +0000867 valarray& operator=(initializer_list<value_type>);
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400868#endif // _LIBCPP_CXX03_LANG
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000869 _LIBCPP_INLINE_VISIBILITY
Douglas Gregor68902322012-05-19 07:14:17 +0000870 valarray& operator=(const value_type& __x);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000871 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000872 valarray& operator=(const slice_array<value_type>& __sa);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000873 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000874 valarray& operator=(const gslice_array<value_type>& __ga);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000875 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000876 valarray& operator=(const mask_array<value_type>& __ma);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000877 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000878 valarray& operator=(const indirect_array<value_type>& __ia);
Howard Hinnant329cd412011-07-27 23:19:59 +0000879 template <class _ValExpr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000880 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant329cd412011-07-27 23:19:59 +0000881 valarray& operator=(const __val_expr<_ValExpr>& __v);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000882
883 // element access:
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000884 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000885 const value_type& operator[](size_t __i) const {return __begin_[__i];}
886
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000887 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000888 value_type& operator[](size_t __i) {return __begin_[__i];}
889
890 // subset operations:
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000891 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000892 __val_expr<__slice_expr<const valarray&> > operator[](slice __s) const;
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000893 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000894 slice_array<value_type> operator[](slice __s);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000895 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000896 __val_expr<__indirect_expr<const valarray&> > operator[](const gslice& __gs) const;
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000897 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000898 gslice_array<value_type> operator[](const gslice& __gs);
Eric Fiselier3b0b81f2017-04-19 00:23:45 +0000899#ifndef _LIBCPP_CXX03_LANG
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000900 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000901 __val_expr<__indirect_expr<const valarray&> > operator[](gslice&& __gs) const;
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000902 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000903 gslice_array<value_type> operator[](gslice&& __gs);
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400904#endif // _LIBCPP_CXX03_LANG
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000905 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000906 __val_expr<__mask_expr<const valarray&> > operator[](const valarray<bool>& __vb) const;
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000907 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000908 mask_array<value_type> operator[](const valarray<bool>& __vb);
Eric Fiselier3b0b81f2017-04-19 00:23:45 +0000909#ifndef _LIBCPP_CXX03_LANG
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000910 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000911 __val_expr<__mask_expr<const valarray&> > operator[](valarray<bool>&& __vb) const;
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000912 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000913 mask_array<value_type> operator[](valarray<bool>&& __vb);
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400914#endif // _LIBCPP_CXX03_LANG
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000915 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000916 __val_expr<__indirect_expr<const valarray&> > operator[](const valarray<size_t>& __vs) const;
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000917 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000918 indirect_array<value_type> operator[](const valarray<size_t>& __vs);
Eric Fiselier3b0b81f2017-04-19 00:23:45 +0000919#ifndef _LIBCPP_CXX03_LANG
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000920 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000921 __val_expr<__indirect_expr<const valarray&> > operator[](valarray<size_t>&& __vs) const;
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000922 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000923 indirect_array<value_type> operator[](valarray<size_t>&& __vs);
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400924#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000925
926 // unary operators:
Douglas Gregor68902322012-05-19 07:14:17 +0000927 valarray operator+() const;
928 valarray operator-() const;
929 valarray operator~() const;
930 valarray<bool> operator!() const;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000931
932 // computed assignment:
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000933 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000934 valarray& operator*= (const value_type& __x);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000935 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000936 valarray& operator/= (const value_type& __x);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000937 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000938 valarray& operator%= (const value_type& __x);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000939 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000940 valarray& operator+= (const value_type& __x);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000941 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000942 valarray& operator-= (const value_type& __x);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000943 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000944 valarray& operator^= (const value_type& __x);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000945 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000946 valarray& operator&= (const value_type& __x);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000947 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000948 valarray& operator|= (const value_type& __x);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000949 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000950 valarray& operator<<=(const value_type& __x);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000951 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000952 valarray& operator>>=(const value_type& __x);
953
954 template <class _Expr>
955 typename enable_if
956 <
957 __is_val_expr<_Expr>::value,
958 valarray&
959 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000960 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000961 operator*= (const _Expr& __v);
962
963 template <class _Expr>
964 typename enable_if
965 <
966 __is_val_expr<_Expr>::value,
967 valarray&
968 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000969 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000970 operator/= (const _Expr& __v);
971
972 template <class _Expr>
973 typename enable_if
974 <
975 __is_val_expr<_Expr>::value,
976 valarray&
977 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000978 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000979 operator%= (const _Expr& __v);
980
981 template <class _Expr>
982 typename enable_if
983 <
984 __is_val_expr<_Expr>::value,
985 valarray&
986 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000987 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000988 operator+= (const _Expr& __v);
989
990 template <class _Expr>
991 typename enable_if
992 <
993 __is_val_expr<_Expr>::value,
994 valarray&
995 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000996 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000997 operator-= (const _Expr& __v);
998
999 template <class _Expr>
1000 typename enable_if
1001 <
1002 __is_val_expr<_Expr>::value,
1003 valarray&
1004 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001005 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001006 operator^= (const _Expr& __v);
1007
1008 template <class _Expr>
1009 typename enable_if
1010 <
1011 __is_val_expr<_Expr>::value,
1012 valarray&
1013 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001014 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001015 operator|= (const _Expr& __v);
1016
1017 template <class _Expr>
1018 typename enable_if
1019 <
1020 __is_val_expr<_Expr>::value,
1021 valarray&
1022 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001023 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001024 operator&= (const _Expr& __v);
1025
1026 template <class _Expr>
1027 typename enable_if
1028 <
1029 __is_val_expr<_Expr>::value,
1030 valarray&
1031 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001032 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001033 operator<<= (const _Expr& __v);
1034
1035 template <class _Expr>
1036 typename enable_if
1037 <
1038 __is_val_expr<_Expr>::value,
1039 valarray&
1040 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001041 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001042 operator>>= (const _Expr& __v);
1043
1044 // member functions:
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001045 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant298aed92012-07-21 00:51:28 +00001046 void swap(valarray& __v) _NOEXCEPT;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001047
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001048 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant28b24882011-12-01 20:21:04 +00001049 size_t size() const {return static_cast<size_t>(__end_ - __begin_);}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001050
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001051 _LIBCPP_INLINE_VISIBILITY
Douglas Gregor68902322012-05-19 07:14:17 +00001052 value_type sum() const;
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001053 _LIBCPP_INLINE_VISIBILITY
Douglas Gregor68902322012-05-19 07:14:17 +00001054 value_type min() const;
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001055 _LIBCPP_INLINE_VISIBILITY
Douglas Gregor68902322012-05-19 07:14:17 +00001056 value_type max() const;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001057
Douglas Gregor68902322012-05-19 07:14:17 +00001058 valarray shift (int __i) const;
1059 valarray cshift(int __i) const;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001060 valarray apply(value_type __f(value_type)) const;
1061 valarray apply(value_type __f(const value_type&)) const;
1062 void resize(size_t __n, value_type __x = value_type());
1063
1064private:
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00001065 template <class> friend class _LIBCPP_TEMPLATE_VIS valarray;
1066 template <class> friend class _LIBCPP_TEMPLATE_VIS slice_array;
1067 template <class> friend class _LIBCPP_TEMPLATE_VIS gslice_array;
1068 template <class> friend class _LIBCPP_TEMPLATE_VIS mask_array;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001069 template <class> friend class __mask_expr;
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00001070 template <class> friend class _LIBCPP_TEMPLATE_VIS indirect_array;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001071 template <class> friend class __indirect_expr;
1072 template <class> friend class __val_expr;
1073
1074 template <class _Up>
1075 friend
1076 _Up*
1077 begin(valarray<_Up>& __v);
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001078
Howard Hinnantc51e1022010-05-11 19:42:16 +00001079 template <class _Up>
1080 friend
1081 const _Up*
1082 begin(const 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 _Up*
1087 end(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 const _Up*
1092 end(const valarray<_Up>& __v);
Mikhail Maltsev59de6f82018-02-08 11:33:48 +00001093
Eric Fiseliera119c322018-10-25 17:43:26 +00001094 _LIBCPP_INLINE_VISIBILITY
Eric Fiselier2856ef82018-10-25 17:21:30 +00001095 void __clear(size_t __capacity);
Mikhail Maltsev59de6f82018-02-08 11:33:48 +00001096 valarray& __assign_range(const value_type* __f, const value_type* __l);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001097};
1098
Konstantin Varlamovebb31192021-10-28 00:36:19 -07001099#if _LIBCPP_STD_VER > 14
1100template<class _Tp, size_t _Size>
1101valarray(const _Tp(&)[_Size], size_t) -> valarray<_Tp>;
1102#endif
1103
Howard Hinnanta37d3cf2013-08-12 18:38:34 +00001104_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void valarray<size_t>::resize(size_t, size_t))
1105
Howard Hinnantc51e1022010-05-11 19:42:16 +00001106template <class _Op, class _Tp>
1107struct _UnaryOp<_Op, valarray<_Tp> >
1108{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04001109 typedef typename _Op::__result_type __result_type;
Arthur O'Dwyer0b6c2482021-05-31 11:33:51 -04001110 typedef typename decay<__result_type>::type value_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001111
1112 _Op __op_;
1113 const valarray<_Tp>& __a0_;
1114
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001115 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001116 _UnaryOp(const _Op& __op, const valarray<_Tp>& __a0) : __op_(__op), __a0_(__a0) {}
1117
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001118 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04001119 __result_type operator[](size_t __i) const {return __op_(__a0_[__i]);}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001120
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001121 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001122 size_t size() const {return __a0_.size();}
1123};
1124
1125template <class _Op, class _Tp, class _A1>
1126struct _BinaryOp<_Op, valarray<_Tp>, _A1>
1127{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04001128 typedef typename _Op::__result_type __result_type;
Arthur O'Dwyer0b6c2482021-05-31 11:33:51 -04001129 typedef typename decay<__result_type>::type value_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001130
1131 _Op __op_;
1132 const valarray<_Tp>& __a0_;
1133 _A1 __a1_;
1134
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001135 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001136 _BinaryOp(const _Op& __op, const valarray<_Tp>& __a0, const _A1& __a1)
1137 : __op_(__op), __a0_(__a0), __a1_(__a1) {}
1138
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001139 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer0b6c2482021-05-31 11:33:51 -04001140 __result_type operator[](size_t __i) const {return __op_(__a0_[__i], __a1_[__i]);}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001141
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001142 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001143 size_t size() const {return __a0_.size();}
1144};
1145
1146template <class _Op, class _A0, class _Tp>
1147struct _BinaryOp<_Op, _A0, valarray<_Tp> >
1148{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04001149 typedef typename _Op::__result_type __result_type;
Arthur O'Dwyer0b6c2482021-05-31 11:33:51 -04001150 typedef typename decay<__result_type>::type value_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001151
1152 _Op __op_;
1153 _A0 __a0_;
1154 const valarray<_Tp>& __a1_;
1155
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001156 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001157 _BinaryOp(const _Op& __op, const _A0& __a0, const valarray<_Tp>& __a1)
1158 : __op_(__op), __a0_(__a0), __a1_(__a1) {}
1159
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001160 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer0b6c2482021-05-31 11:33:51 -04001161 __result_type operator[](size_t __i) const {return __op_(__a0_[__i], __a1_[__i]);}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001162
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001163 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001164 size_t size() const {return __a0_.size();}
1165};
1166
1167template <class _Op, class _Tp>
1168struct _BinaryOp<_Op, valarray<_Tp>, valarray<_Tp> >
1169{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04001170 typedef typename _Op::__result_type __result_type;
Arthur O'Dwyer0b6c2482021-05-31 11:33:51 -04001171 typedef typename decay<__result_type>::type value_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001172
1173 _Op __op_;
1174 const valarray<_Tp>& __a0_;
1175 const valarray<_Tp>& __a1_;
1176
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001177 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001178 _BinaryOp(const _Op& __op, const valarray<_Tp>& __a0, const valarray<_Tp>& __a1)
1179 : __op_(__op), __a0_(__a0), __a1_(__a1) {}
1180
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001181 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer0b6c2482021-05-31 11:33:51 -04001182 __result_type operator[](size_t __i) const {return __op_(__a0_[__i], __a1_[__i]);}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001183
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001184 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001185 size_t size() const {return __a0_.size();}
1186};
1187
1188// slice_array
1189
1190template <class _Tp>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00001191class _LIBCPP_TEMPLATE_VIS slice_array
Howard Hinnantc51e1022010-05-11 19:42:16 +00001192{
1193public:
1194 typedef _Tp value_type;
1195
1196private:
1197 value_type* __vp_;
1198 size_t __size_;
1199 size_t __stride_;
1200
1201public:
1202 template <class _Expr>
1203 typename enable_if
1204 <
1205 __is_val_expr<_Expr>::value,
1206 void
1207 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001208 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001209 operator=(const _Expr& __v) const;
1210
1211 template <class _Expr>
1212 typename enable_if
1213 <
1214 __is_val_expr<_Expr>::value,
1215 void
1216 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001217 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001218 operator*=(const _Expr& __v) const;
1219
1220 template <class _Expr>
1221 typename enable_if
1222 <
1223 __is_val_expr<_Expr>::value,
1224 void
1225 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001226 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001227 operator/=(const _Expr& __v) const;
1228
1229 template <class _Expr>
1230 typename enable_if
1231 <
1232 __is_val_expr<_Expr>::value,
1233 void
1234 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001235 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001236 operator%=(const _Expr& __v) const;
1237
1238 template <class _Expr>
1239 typename enable_if
1240 <
1241 __is_val_expr<_Expr>::value,
1242 void
1243 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001244 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001245 operator+=(const _Expr& __v) const;
1246
1247 template <class _Expr>
1248 typename enable_if
1249 <
1250 __is_val_expr<_Expr>::value,
1251 void
1252 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001253 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001254 operator-=(const _Expr& __v) const;
1255
1256 template <class _Expr>
1257 typename enable_if
1258 <
1259 __is_val_expr<_Expr>::value,
1260 void
1261 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001262 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001263 operator^=(const _Expr& __v) const;
1264
1265 template <class _Expr>
1266 typename enable_if
1267 <
1268 __is_val_expr<_Expr>::value,
1269 void
1270 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001271 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001272 operator&=(const _Expr& __v) const;
1273
1274 template <class _Expr>
1275 typename enable_if
1276 <
1277 __is_val_expr<_Expr>::value,
1278 void
1279 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001280 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001281 operator|=(const _Expr& __v) const;
1282
1283 template <class _Expr>
1284 typename enable_if
1285 <
1286 __is_val_expr<_Expr>::value,
1287 void
1288 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001289 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001290 operator<<=(const _Expr& __v) const;
1291
1292 template <class _Expr>
1293 typename enable_if
1294 <
1295 __is_val_expr<_Expr>::value,
1296 void
1297 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001298 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001299 operator>>=(const _Expr& __v) const;
1300
Eric Fiselierb9f37ca2019-12-12 20:48:11 -05001301 slice_array(slice_array const&) = default;
1302
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001303 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001304 const slice_array& operator=(const slice_array& __sa) const;
1305
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001306 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001307 void operator=(const value_type& __x) const;
1308
zoecarver79fa7502020-12-02 10:49:20 -08001309 _LIBCPP_INLINE_VISIBILITY
1310 void operator=(const valarray<value_type>& __va) const;
1311
Howard Hinnantc51e1022010-05-11 19:42:16 +00001312private:
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001313 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001314 slice_array(const slice& __sl, const valarray<value_type>& __v)
1315 : __vp_(const_cast<value_type*>(__v.__begin_ + __sl.start())),
1316 __size_(__sl.size()),
1317 __stride_(__sl.stride())
1318 {}
1319
1320 template <class> friend class valarray;
1321 template <class> friend class sliceExpr;
1322};
1323
1324template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001325inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001326const slice_array<_Tp>&
1327slice_array<_Tp>::operator=(const slice_array& __sa) const
1328{
1329 value_type* __t = __vp_;
1330 const value_type* __s = __sa.__vp_;
1331 for (size_t __n = __size_; __n; --__n, __t += __stride_, __s += __sa.__stride_)
1332 *__t = *__s;
Eric Fiselier3b80ce92014-08-12 00:06:58 +00001333 return *this;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001334}
1335
1336template <class _Tp>
1337template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001338inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001339typename enable_if
1340<
1341 __is_val_expr<_Expr>::value,
1342 void
1343>::type
1344slice_array<_Tp>::operator=(const _Expr& __v) const
1345{
1346 value_type* __t = __vp_;
1347 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1348 *__t = __v[__i];
1349}
1350
1351template <class _Tp>
zoecarver79fa7502020-12-02 10:49:20 -08001352inline void
1353slice_array<_Tp>::operator=(const valarray<value_type>& __va) const
1354{
1355 value_type* __t = __vp_;
1356 for (size_t __i = 0; __i < __va.size(); ++__i, __t += __stride_)
1357 *__t = __va[__i];
1358}
1359
1360template <class _Tp>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001361template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001362inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001363typename enable_if
1364<
1365 __is_val_expr<_Expr>::value,
1366 void
1367>::type
1368slice_array<_Tp>::operator*=(const _Expr& __v) const
1369{
1370 value_type* __t = __vp_;
1371 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1372 *__t *= __v[__i];
1373}
1374
1375template <class _Tp>
1376template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001377inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001378typename enable_if
1379<
1380 __is_val_expr<_Expr>::value,
1381 void
1382>::type
1383slice_array<_Tp>::operator/=(const _Expr& __v) const
1384{
1385 value_type* __t = __vp_;
1386 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1387 *__t /= __v[__i];
1388}
1389
1390template <class _Tp>
1391template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001392inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001393typename enable_if
1394<
1395 __is_val_expr<_Expr>::value,
1396 void
1397>::type
1398slice_array<_Tp>::operator%=(const _Expr& __v) const
1399{
1400 value_type* __t = __vp_;
1401 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1402 *__t %= __v[__i];
1403}
1404
1405template <class _Tp>
1406template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001407inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001408typename enable_if
1409<
1410 __is_val_expr<_Expr>::value,
1411 void
1412>::type
1413slice_array<_Tp>::operator+=(const _Expr& __v) const
1414{
1415 value_type* __t = __vp_;
1416 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1417 *__t += __v[__i];
1418}
1419
1420template <class _Tp>
1421template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001422inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001423typename enable_if
1424<
1425 __is_val_expr<_Expr>::value,
1426 void
1427>::type
1428slice_array<_Tp>::operator-=(const _Expr& __v) const
1429{
1430 value_type* __t = __vp_;
1431 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1432 *__t -= __v[__i];
1433}
1434
1435template <class _Tp>
1436template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001437inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001438typename enable_if
1439<
1440 __is_val_expr<_Expr>::value,
1441 void
1442>::type
1443slice_array<_Tp>::operator^=(const _Expr& __v) const
1444{
1445 value_type* __t = __vp_;
1446 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1447 *__t ^= __v[__i];
1448}
1449
1450template <class _Tp>
1451template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001452inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001453typename enable_if
1454<
1455 __is_val_expr<_Expr>::value,
1456 void
1457>::type
1458slice_array<_Tp>::operator&=(const _Expr& __v) const
1459{
1460 value_type* __t = __vp_;
1461 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1462 *__t &= __v[__i];
1463}
1464
1465template <class _Tp>
1466template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001467inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001468typename enable_if
1469<
1470 __is_val_expr<_Expr>::value,
1471 void
1472>::type
1473slice_array<_Tp>::operator|=(const _Expr& __v) const
1474{
1475 value_type* __t = __vp_;
1476 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1477 *__t |= __v[__i];
1478}
1479
1480template <class _Tp>
1481template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001482inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001483typename enable_if
1484<
1485 __is_val_expr<_Expr>::value,
1486 void
1487>::type
1488slice_array<_Tp>::operator<<=(const _Expr& __v) const
1489{
1490 value_type* __t = __vp_;
1491 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1492 *__t <<= __v[__i];
1493}
1494
1495template <class _Tp>
1496template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001497inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001498typename enable_if
1499<
1500 __is_val_expr<_Expr>::value,
1501 void
1502>::type
1503slice_array<_Tp>::operator>>=(const _Expr& __v) const
1504{
1505 value_type* __t = __vp_;
1506 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1507 *__t >>= __v[__i];
1508}
1509
1510template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001511inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001512void
1513slice_array<_Tp>::operator=(const value_type& __x) const
1514{
1515 value_type* __t = __vp_;
1516 for (size_t __n = __size_; __n; --__n, __t += __stride_)
1517 *__t = __x;
1518}
1519
1520// gslice
1521
Howard Hinnant8331b762013-03-06 23:30:19 +00001522class _LIBCPP_TYPE_VIS gslice
Howard Hinnantc51e1022010-05-11 19:42:16 +00001523{
1524 valarray<size_t> __size_;
1525 valarray<size_t> __stride_;
1526 valarray<size_t> __1d_;
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001527
Howard Hinnantc51e1022010-05-11 19:42:16 +00001528public:
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001529 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001530 gslice() {}
Douglas Gregor68902322012-05-19 07:14:17 +00001531
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001532 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001533 gslice(size_t __start, const valarray<size_t>& __size,
1534 const valarray<size_t>& __stride)
1535 : __size_(__size),
1536 __stride_(__stride)
1537 {__init(__start);}
1538
Eric Fiselier3b0b81f2017-04-19 00:23:45 +00001539#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001540
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001541 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001542 gslice(size_t __start, const valarray<size_t>& __size,
1543 valarray<size_t>&& __stride)
1544 : __size_(__size),
Corentin Jabotcfb8a912022-02-24 19:54:00 -05001545 __stride_(std::move(__stride))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001546 {__init(__start);}
1547
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001548 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001549 gslice(size_t __start, valarray<size_t>&& __size,
1550 const valarray<size_t>& __stride)
Corentin Jabotcfb8a912022-02-24 19:54:00 -05001551 : __size_(std::move(__size)),
Howard Hinnantc51e1022010-05-11 19:42:16 +00001552 __stride_(__stride)
1553 {__init(__start);}
1554
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001555 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001556 gslice(size_t __start, valarray<size_t>&& __size,
1557 valarray<size_t>&& __stride)
Corentin Jabotcfb8a912022-02-24 19:54:00 -05001558 : __size_(std::move(__size)),
1559 __stride_(std::move(__stride))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001560 {__init(__start);}
1561
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001562#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001563
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001564 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001565 size_t start() const {return __1d_.size() ? __1d_[0] : 0;}
1566
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001567 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001568 valarray<size_t> size() const {return __size_;}
1569
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001570 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001571 valarray<size_t> stride() const {return __stride_;}
1572
1573private:
1574 void __init(size_t __start);
1575
1576 template <class> friend class gslice_array;
1577 template <class> friend class valarray;
1578 template <class> friend class __val_expr;
1579};
1580
1581// gslice_array
1582
1583template <class _Tp>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00001584class _LIBCPP_TEMPLATE_VIS gslice_array
Howard Hinnantc51e1022010-05-11 19:42:16 +00001585{
1586public:
1587 typedef _Tp value_type;
1588
1589private:
1590 value_type* __vp_;
1591 valarray<size_t> __1d_;
1592
1593public:
1594 template <class _Expr>
1595 typename enable_if
1596 <
1597 __is_val_expr<_Expr>::value,
1598 void
1599 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001600 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001601 operator=(const _Expr& __v) const;
1602
1603 template <class _Expr>
1604 typename enable_if
1605 <
1606 __is_val_expr<_Expr>::value,
1607 void
1608 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001609 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001610 operator*=(const _Expr& __v) const;
1611
1612 template <class _Expr>
1613 typename enable_if
1614 <
1615 __is_val_expr<_Expr>::value,
1616 void
1617 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001618 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001619 operator/=(const _Expr& __v) const;
1620
1621 template <class _Expr>
1622 typename enable_if
1623 <
1624 __is_val_expr<_Expr>::value,
1625 void
1626 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001627 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001628 operator%=(const _Expr& __v) const;
1629
1630 template <class _Expr>
1631 typename enable_if
1632 <
1633 __is_val_expr<_Expr>::value,
1634 void
1635 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001636 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001637 operator+=(const _Expr& __v) const;
1638
1639 template <class _Expr>
1640 typename enable_if
1641 <
1642 __is_val_expr<_Expr>::value,
1643 void
1644 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001645 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001646 operator-=(const _Expr& __v) const;
1647
1648 template <class _Expr>
1649 typename enable_if
1650 <
1651 __is_val_expr<_Expr>::value,
1652 void
1653 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001654 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001655 operator^=(const _Expr& __v) const;
1656
1657 template <class _Expr>
1658 typename enable_if
1659 <
1660 __is_val_expr<_Expr>::value,
1661 void
1662 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001663 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001664 operator&=(const _Expr& __v) const;
1665
1666 template <class _Expr>
1667 typename enable_if
1668 <
1669 __is_val_expr<_Expr>::value,
1670 void
1671 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001672 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001673 operator|=(const _Expr& __v) const;
1674
1675 template <class _Expr>
1676 typename enable_if
1677 <
1678 __is_val_expr<_Expr>::value,
1679 void
1680 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001681 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001682 operator<<=(const _Expr& __v) const;
1683
1684 template <class _Expr>
1685 typename enable_if
1686 <
1687 __is_val_expr<_Expr>::value,
1688 void
1689 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001690 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001691 operator>>=(const _Expr& __v) const;
1692
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001693 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001694 const gslice_array& operator=(const gslice_array& __ga) const;
1695
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001696 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001697 void operator=(const value_type& __x) const;
1698
Eric Fiselierb9f37ca2019-12-12 20:48:11 -05001699 gslice_array(const gslice_array&) = default;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001700
1701private:
Howard Hinnantc51e1022010-05-11 19:42:16 +00001702 gslice_array(const gslice& __gs, const valarray<value_type>& __v)
1703 : __vp_(const_cast<value_type*>(__v.__begin_)),
1704 __1d_(__gs.__1d_)
1705 {}
1706
Eric Fiselier3b0b81f2017-04-19 00:23:45 +00001707#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001708 gslice_array(gslice&& __gs, const valarray<value_type>& __v)
1709 : __vp_(const_cast<value_type*>(__v.__begin_)),
Corentin Jabotcfb8a912022-02-24 19:54:00 -05001710 __1d_(std::move(__gs.__1d_))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001711 {}
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001712#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001713
1714 template <class> friend class valarray;
1715};
1716
1717template <class _Tp>
1718template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001719inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001720typename enable_if
1721<
1722 __is_val_expr<_Expr>::value,
1723 void
1724>::type
1725gslice_array<_Tp>::operator=(const _Expr& __v) const
1726{
1727 typedef const size_t* _Ip;
1728 size_t __j = 0;
1729 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1730 __vp_[*__i] = __v[__j];
1731}
1732
1733template <class _Tp>
1734template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001735inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001736typename enable_if
1737<
1738 __is_val_expr<_Expr>::value,
1739 void
1740>::type
1741gslice_array<_Tp>::operator*=(const _Expr& __v) const
1742{
1743 typedef const size_t* _Ip;
1744 size_t __j = 0;
1745 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1746 __vp_[*__i] *= __v[__j];
1747}
1748
1749template <class _Tp>
1750template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001751inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001752typename enable_if
1753<
1754 __is_val_expr<_Expr>::value,
1755 void
1756>::type
1757gslice_array<_Tp>::operator/=(const _Expr& __v) const
1758{
1759 typedef const size_t* _Ip;
1760 size_t __j = 0;
1761 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1762 __vp_[*__i] /= __v[__j];
1763}
1764
1765template <class _Tp>
1766template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001767inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001768typename enable_if
1769<
1770 __is_val_expr<_Expr>::value,
1771 void
1772>::type
1773gslice_array<_Tp>::operator%=(const _Expr& __v) const
1774{
1775 typedef const size_t* _Ip;
1776 size_t __j = 0;
1777 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1778 __vp_[*__i] %= __v[__j];
1779}
1780
1781template <class _Tp>
1782template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001783inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001784typename enable_if
1785<
1786 __is_val_expr<_Expr>::value,
1787 void
1788>::type
1789gslice_array<_Tp>::operator+=(const _Expr& __v) const
1790{
1791 typedef const size_t* _Ip;
1792 size_t __j = 0;
1793 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1794 __vp_[*__i] += __v[__j];
1795}
1796
1797template <class _Tp>
1798template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001799inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001800typename enable_if
1801<
1802 __is_val_expr<_Expr>::value,
1803 void
1804>::type
1805gslice_array<_Tp>::operator-=(const _Expr& __v) const
1806{
1807 typedef const size_t* _Ip;
1808 size_t __j = 0;
1809 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1810 __vp_[*__i] -= __v[__j];
1811}
1812
1813template <class _Tp>
1814template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001815inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001816typename enable_if
1817<
1818 __is_val_expr<_Expr>::value,
1819 void
1820>::type
1821gslice_array<_Tp>::operator^=(const _Expr& __v) const
1822{
1823 typedef const size_t* _Ip;
1824 size_t __j = 0;
1825 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1826 __vp_[*__i] ^= __v[__j];
1827}
1828
1829template <class _Tp>
1830template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001831inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001832typename enable_if
1833<
1834 __is_val_expr<_Expr>::value,
1835 void
1836>::type
1837gslice_array<_Tp>::operator&=(const _Expr& __v) const
1838{
1839 typedef const size_t* _Ip;
1840 size_t __j = 0;
1841 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1842 __vp_[*__i] &= __v[__j];
1843}
1844
1845template <class _Tp>
1846template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001847inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001848typename enable_if
1849<
1850 __is_val_expr<_Expr>::value,
1851 void
1852>::type
1853gslice_array<_Tp>::operator|=(const _Expr& __v) const
1854{
1855 typedef const size_t* _Ip;
1856 size_t __j = 0;
1857 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1858 __vp_[*__i] |= __v[__j];
1859}
1860
1861template <class _Tp>
1862template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001863inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001864typename enable_if
1865<
1866 __is_val_expr<_Expr>::value,
1867 void
1868>::type
1869gslice_array<_Tp>::operator<<=(const _Expr& __v) const
1870{
1871 typedef const size_t* _Ip;
1872 size_t __j = 0;
1873 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1874 __vp_[*__i] <<= __v[__j];
1875}
1876
1877template <class _Tp>
1878template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001879inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001880typename enable_if
1881<
1882 __is_val_expr<_Expr>::value,
1883 void
1884>::type
1885gslice_array<_Tp>::operator>>=(const _Expr& __v) const
1886{
1887 typedef const size_t* _Ip;
1888 size_t __j = 0;
1889 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1890 __vp_[*__i] >>= __v[__j];
1891}
1892
1893template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001894inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001895const gslice_array<_Tp>&
1896gslice_array<_Tp>::operator=(const gslice_array& __ga) const
1897{
1898 typedef const size_t* _Ip;
1899 const value_type* __s = __ga.__vp_;
1900 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_, __j = __ga.__1d_.__begin_;
1901 __i != __e; ++__i, ++__j)
1902 __vp_[*__i] = __s[*__j];
1903 return *this;
1904}
1905
1906template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001907inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001908void
1909gslice_array<_Tp>::operator=(const value_type& __x) const
1910{
1911 typedef const size_t* _Ip;
1912 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i)
1913 __vp_[*__i] = __x;
1914}
1915
1916// mask_array
1917
1918template <class _Tp>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00001919class _LIBCPP_TEMPLATE_VIS mask_array
Howard Hinnantc51e1022010-05-11 19:42:16 +00001920{
1921public:
1922 typedef _Tp value_type;
1923
1924private:
1925 value_type* __vp_;
1926 valarray<size_t> __1d_;
1927
1928public:
1929 template <class _Expr>
1930 typename enable_if
1931 <
1932 __is_val_expr<_Expr>::value,
1933 void
1934 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001935 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001936 operator=(const _Expr& __v) const;
1937
1938 template <class _Expr>
1939 typename enable_if
1940 <
1941 __is_val_expr<_Expr>::value,
1942 void
1943 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001944 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001945 operator*=(const _Expr& __v) const;
1946
1947 template <class _Expr>
1948 typename enable_if
1949 <
1950 __is_val_expr<_Expr>::value,
1951 void
1952 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001953 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001954 operator/=(const _Expr& __v) const;
1955
1956 template <class _Expr>
1957 typename enable_if
1958 <
1959 __is_val_expr<_Expr>::value,
1960 void
1961 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001962 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001963 operator%=(const _Expr& __v) const;
1964
1965 template <class _Expr>
1966 typename enable_if
1967 <
1968 __is_val_expr<_Expr>::value,
1969 void
1970 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001971 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001972 operator+=(const _Expr& __v) const;
1973
1974 template <class _Expr>
1975 typename enable_if
1976 <
1977 __is_val_expr<_Expr>::value,
1978 void
1979 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001980 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001981 operator-=(const _Expr& __v) const;
1982
1983 template <class _Expr>
1984 typename enable_if
1985 <
1986 __is_val_expr<_Expr>::value,
1987 void
1988 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001989 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001990 operator^=(const _Expr& __v) const;
1991
1992 template <class _Expr>
1993 typename enable_if
1994 <
1995 __is_val_expr<_Expr>::value,
1996 void
1997 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001998 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001999 operator&=(const _Expr& __v) const;
2000
2001 template <class _Expr>
2002 typename enable_if
2003 <
2004 __is_val_expr<_Expr>::value,
2005 void
2006 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002007 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002008 operator|=(const _Expr& __v) const;
2009
2010 template <class _Expr>
2011 typename enable_if
2012 <
2013 __is_val_expr<_Expr>::value,
2014 void
2015 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002016 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002017 operator<<=(const _Expr& __v) const;
2018
2019 template <class _Expr>
2020 typename enable_if
2021 <
2022 __is_val_expr<_Expr>::value,
2023 void
2024 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002025 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002026 operator>>=(const _Expr& __v) const;
2027
Eric Fiselierb9f37ca2019-12-12 20:48:11 -05002028 mask_array(const mask_array&) = default;
2029
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002030 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002031 const mask_array& operator=(const mask_array& __ma) const;
2032
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002033 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002034 void operator=(const value_type& __x) const;
2035
Howard Hinnantc51e1022010-05-11 19:42:16 +00002036private:
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002037 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002038 mask_array(const valarray<bool>& __vb, const valarray<value_type>& __v)
2039 : __vp_(const_cast<value_type*>(__v.__begin_)),
Howard Hinnant28b24882011-12-01 20:21:04 +00002040 __1d_(static_cast<size_t>(count(__vb.__begin_, __vb.__end_, true)))
Howard Hinnantc51e1022010-05-11 19:42:16 +00002041 {
2042 size_t __j = 0;
2043 for (size_t __i = 0; __i < __vb.size(); ++__i)
2044 if (__vb[__i])
2045 __1d_[__j++] = __i;
2046 }
2047
2048 template <class> friend class valarray;
2049};
2050
2051template <class _Tp>
2052template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002053inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002054typename enable_if
2055<
2056 __is_val_expr<_Expr>::value,
2057 void
2058>::type
2059mask_array<_Tp>::operator=(const _Expr& __v) const
2060{
2061 size_t __n = __1d_.size();
2062 for (size_t __i = 0; __i < __n; ++__i)
2063 __vp_[__1d_[__i]] = __v[__i];
2064}
2065
2066template <class _Tp>
2067template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002068inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002069typename enable_if
2070<
2071 __is_val_expr<_Expr>::value,
2072 void
2073>::type
2074mask_array<_Tp>::operator*=(const _Expr& __v) const
2075{
2076 size_t __n = __1d_.size();
2077 for (size_t __i = 0; __i < __n; ++__i)
2078 __vp_[__1d_[__i]] *= __v[__i];
2079}
2080
2081template <class _Tp>
2082template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002083inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002084typename enable_if
2085<
2086 __is_val_expr<_Expr>::value,
2087 void
2088>::type
2089mask_array<_Tp>::operator/=(const _Expr& __v) const
2090{
2091 size_t __n = __1d_.size();
2092 for (size_t __i = 0; __i < __n; ++__i)
2093 __vp_[__1d_[__i]] /= __v[__i];
2094}
2095
2096template <class _Tp>
2097template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002098inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002099typename enable_if
2100<
2101 __is_val_expr<_Expr>::value,
2102 void
2103>::type
2104mask_array<_Tp>::operator%=(const _Expr& __v) const
2105{
2106 size_t __n = __1d_.size();
2107 for (size_t __i = 0; __i < __n; ++__i)
2108 __vp_[__1d_[__i]] %= __v[__i];
2109}
2110
2111template <class _Tp>
2112template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002113inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002114typename enable_if
2115<
2116 __is_val_expr<_Expr>::value,
2117 void
2118>::type
2119mask_array<_Tp>::operator+=(const _Expr& __v) const
2120{
2121 size_t __n = __1d_.size();
2122 for (size_t __i = 0; __i < __n; ++__i)
2123 __vp_[__1d_[__i]] += __v[__i];
2124}
2125
2126template <class _Tp>
2127template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002128inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002129typename enable_if
2130<
2131 __is_val_expr<_Expr>::value,
2132 void
2133>::type
2134mask_array<_Tp>::operator-=(const _Expr& __v) const
2135{
2136 size_t __n = __1d_.size();
2137 for (size_t __i = 0; __i < __n; ++__i)
2138 __vp_[__1d_[__i]] -= __v[__i];
2139}
2140
2141template <class _Tp>
2142template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002143inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002144typename enable_if
2145<
2146 __is_val_expr<_Expr>::value,
2147 void
2148>::type
2149mask_array<_Tp>::operator^=(const _Expr& __v) const
2150{
2151 size_t __n = __1d_.size();
2152 for (size_t __i = 0; __i < __n; ++__i)
2153 __vp_[__1d_[__i]] ^= __v[__i];
2154}
2155
2156template <class _Tp>
2157template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002158inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002159typename enable_if
2160<
2161 __is_val_expr<_Expr>::value,
2162 void
2163>::type
2164mask_array<_Tp>::operator&=(const _Expr& __v) const
2165{
2166 size_t __n = __1d_.size();
2167 for (size_t __i = 0; __i < __n; ++__i)
2168 __vp_[__1d_[__i]] &= __v[__i];
2169}
2170
2171template <class _Tp>
2172template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002173inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002174typename enable_if
2175<
2176 __is_val_expr<_Expr>::value,
2177 void
2178>::type
2179mask_array<_Tp>::operator|=(const _Expr& __v) const
2180{
2181 size_t __n = __1d_.size();
2182 for (size_t __i = 0; __i < __n; ++__i)
2183 __vp_[__1d_[__i]] |= __v[__i];
2184}
2185
2186template <class _Tp>
2187template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002188inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002189typename enable_if
2190<
2191 __is_val_expr<_Expr>::value,
2192 void
2193>::type
2194mask_array<_Tp>::operator<<=(const _Expr& __v) const
2195{
2196 size_t __n = __1d_.size();
2197 for (size_t __i = 0; __i < __n; ++__i)
2198 __vp_[__1d_[__i]] <<= __v[__i];
2199}
2200
2201template <class _Tp>
2202template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002203inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002204typename enable_if
2205<
2206 __is_val_expr<_Expr>::value,
2207 void
2208>::type
2209mask_array<_Tp>::operator>>=(const _Expr& __v) const
2210{
2211 size_t __n = __1d_.size();
2212 for (size_t __i = 0; __i < __n; ++__i)
2213 __vp_[__1d_[__i]] >>= __v[__i];
2214}
2215
2216template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002217inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002218const mask_array<_Tp>&
2219mask_array<_Tp>::operator=(const mask_array& __ma) const
2220{
2221 size_t __n = __1d_.size();
2222 for (size_t __i = 0; __i < __n; ++__i)
2223 __vp_[__1d_[__i]] = __ma.__vp_[__1d_[__i]];
Eric Fiselier3b80ce92014-08-12 00:06:58 +00002224 return *this;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002225}
2226
2227template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002228inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002229void
2230mask_array<_Tp>::operator=(const value_type& __x) const
2231{
2232 size_t __n = __1d_.size();
2233 for (size_t __i = 0; __i < __n; ++__i)
2234 __vp_[__1d_[__i]] = __x;
2235}
2236
2237template <class _ValExpr>
2238class __mask_expr
2239{
2240 typedef typename remove_reference<_ValExpr>::type _RmExpr;
2241public:
2242 typedef typename _RmExpr::value_type value_type;
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002243 typedef value_type __result_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002244
2245private:
2246 _ValExpr __expr_;
2247 valarray<size_t> __1d_;
2248
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002249 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002250 __mask_expr(const valarray<bool>& __vb, const _RmExpr& __e)
2251 : __expr_(__e),
Howard Hinnant28b24882011-12-01 20:21:04 +00002252 __1d_(static_cast<size_t>(count(__vb.__begin_, __vb.__end_, true)))
Howard Hinnantc51e1022010-05-11 19:42:16 +00002253 {
2254 size_t __j = 0;
2255 for (size_t __i = 0; __i < __vb.size(); ++__i)
2256 if (__vb[__i])
2257 __1d_[__j++] = __i;
2258 }
2259
2260public:
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002261 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002262 __result_type operator[](size_t __i) const
Howard Hinnantc51e1022010-05-11 19:42:16 +00002263 {return __expr_[__1d_[__i]];}
2264
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002265 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002266 size_t size() const {return __1d_.size();}
2267
Eric Fiselier7b31ed02019-04-02 08:05:23 +00002268 template <class> friend class __val_expr;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002269 template <class> friend class valarray;
2270};
2271
2272// indirect_array
2273
2274template <class _Tp>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00002275class _LIBCPP_TEMPLATE_VIS indirect_array
Howard Hinnantc51e1022010-05-11 19:42:16 +00002276{
2277public:
2278 typedef _Tp value_type;
2279
2280private:
2281 value_type* __vp_;
2282 valarray<size_t> __1d_;
2283
2284public:
2285 template <class _Expr>
2286 typename enable_if
2287 <
2288 __is_val_expr<_Expr>::value,
2289 void
2290 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002291 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002292 operator=(const _Expr& __v) const;
2293
2294 template <class _Expr>
2295 typename enable_if
2296 <
2297 __is_val_expr<_Expr>::value,
2298 void
2299 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002300 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002301 operator*=(const _Expr& __v) const;
2302
2303 template <class _Expr>
2304 typename enable_if
2305 <
2306 __is_val_expr<_Expr>::value,
2307 void
2308 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002309 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002310 operator/=(const _Expr& __v) const;
2311
2312 template <class _Expr>
2313 typename enable_if
2314 <
2315 __is_val_expr<_Expr>::value,
2316 void
2317 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002318 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002319 operator%=(const _Expr& __v) const;
2320
2321 template <class _Expr>
2322 typename enable_if
2323 <
2324 __is_val_expr<_Expr>::value,
2325 void
2326 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002327 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002328 operator+=(const _Expr& __v) const;
2329
2330 template <class _Expr>
2331 typename enable_if
2332 <
2333 __is_val_expr<_Expr>::value,
2334 void
2335 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002336 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002337 operator-=(const _Expr& __v) const;
2338
2339 template <class _Expr>
2340 typename enable_if
2341 <
2342 __is_val_expr<_Expr>::value,
2343 void
2344 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002345 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002346 operator^=(const _Expr& __v) const;
2347
2348 template <class _Expr>
2349 typename enable_if
2350 <
2351 __is_val_expr<_Expr>::value,
2352 void
2353 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002354 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002355 operator&=(const _Expr& __v) const;
2356
2357 template <class _Expr>
2358 typename enable_if
2359 <
2360 __is_val_expr<_Expr>::value,
2361 void
2362 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002363 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002364 operator|=(const _Expr& __v) const;
2365
2366 template <class _Expr>
2367 typename enable_if
2368 <
2369 __is_val_expr<_Expr>::value,
2370 void
2371 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002372 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002373 operator<<=(const _Expr& __v) const;
2374
2375 template <class _Expr>
2376 typename enable_if
2377 <
2378 __is_val_expr<_Expr>::value,
2379 void
2380 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002381 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002382 operator>>=(const _Expr& __v) const;
2383
Eric Fiselierb9f37ca2019-12-12 20:48:11 -05002384 indirect_array(const indirect_array&) = default;
2385
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002386 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002387 const indirect_array& operator=(const indirect_array& __ia) const;
2388
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002389 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002390 void operator=(const value_type& __x) const;
2391
Howard Hinnantc51e1022010-05-11 19:42:16 +00002392private:
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002393 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002394 indirect_array(const valarray<size_t>& __ia, const valarray<value_type>& __v)
2395 : __vp_(const_cast<value_type*>(__v.__begin_)),
2396 __1d_(__ia)
2397 {}
2398
Eric Fiselier3b0b81f2017-04-19 00:23:45 +00002399#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00002400
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002401 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002402 indirect_array(valarray<size_t>&& __ia, const valarray<value_type>& __v)
2403 : __vp_(const_cast<value_type*>(__v.__begin_)),
Corentin Jabotcfb8a912022-02-24 19:54:00 -05002404 __1d_(std::move(__ia))
Howard Hinnantc51e1022010-05-11 19:42:16 +00002405 {}
2406
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002407#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00002408
2409 template <class> friend class valarray;
2410};
2411
2412template <class _Tp>
2413template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002414inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002415typename enable_if
2416<
2417 __is_val_expr<_Expr>::value,
2418 void
2419>::type
2420indirect_array<_Tp>::operator=(const _Expr& __v) const
2421{
2422 size_t __n = __1d_.size();
2423 for (size_t __i = 0; __i < __n; ++__i)
2424 __vp_[__1d_[__i]] = __v[__i];
2425}
2426
2427template <class _Tp>
2428template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002429inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002430typename enable_if
2431<
2432 __is_val_expr<_Expr>::value,
2433 void
2434>::type
2435indirect_array<_Tp>::operator*=(const _Expr& __v) const
2436{
2437 size_t __n = __1d_.size();
2438 for (size_t __i = 0; __i < __n; ++__i)
2439 __vp_[__1d_[__i]] *= __v[__i];
2440}
2441
2442template <class _Tp>
2443template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002444inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002445typename enable_if
2446<
2447 __is_val_expr<_Expr>::value,
2448 void
2449>::type
2450indirect_array<_Tp>::operator/=(const _Expr& __v) const
2451{
2452 size_t __n = __1d_.size();
2453 for (size_t __i = 0; __i < __n; ++__i)
2454 __vp_[__1d_[__i]] /= __v[__i];
2455}
2456
2457template <class _Tp>
2458template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002459inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002460typename enable_if
2461<
2462 __is_val_expr<_Expr>::value,
2463 void
2464>::type
2465indirect_array<_Tp>::operator%=(const _Expr& __v) const
2466{
2467 size_t __n = __1d_.size();
2468 for (size_t __i = 0; __i < __n; ++__i)
2469 __vp_[__1d_[__i]] %= __v[__i];
2470}
2471
2472template <class _Tp>
2473template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002474inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002475typename enable_if
2476<
2477 __is_val_expr<_Expr>::value,
2478 void
2479>::type
2480indirect_array<_Tp>::operator+=(const _Expr& __v) const
2481{
2482 size_t __n = __1d_.size();
2483 for (size_t __i = 0; __i < __n; ++__i)
2484 __vp_[__1d_[__i]] += __v[__i];
2485}
2486
2487template <class _Tp>
2488template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002489inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002490typename enable_if
2491<
2492 __is_val_expr<_Expr>::value,
2493 void
2494>::type
2495indirect_array<_Tp>::operator-=(const _Expr& __v) const
2496{
2497 size_t __n = __1d_.size();
2498 for (size_t __i = 0; __i < __n; ++__i)
2499 __vp_[__1d_[__i]] -= __v[__i];
2500}
2501
2502template <class _Tp>
2503template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002504inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002505typename enable_if
2506<
2507 __is_val_expr<_Expr>::value,
2508 void
2509>::type
2510indirect_array<_Tp>::operator^=(const _Expr& __v) const
2511{
2512 size_t __n = __1d_.size();
2513 for (size_t __i = 0; __i < __n; ++__i)
2514 __vp_[__1d_[__i]] ^= __v[__i];
2515}
2516
2517template <class _Tp>
2518template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002519inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002520typename enable_if
2521<
2522 __is_val_expr<_Expr>::value,
2523 void
2524>::type
2525indirect_array<_Tp>::operator&=(const _Expr& __v) const
2526{
2527 size_t __n = __1d_.size();
2528 for (size_t __i = 0; __i < __n; ++__i)
2529 __vp_[__1d_[__i]] &= __v[__i];
2530}
2531
2532template <class _Tp>
2533template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002534inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002535typename enable_if
2536<
2537 __is_val_expr<_Expr>::value,
2538 void
2539>::type
2540indirect_array<_Tp>::operator|=(const _Expr& __v) const
2541{
2542 size_t __n = __1d_.size();
2543 for (size_t __i = 0; __i < __n; ++__i)
2544 __vp_[__1d_[__i]] |= __v[__i];
2545}
2546
2547template <class _Tp>
2548template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002549inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002550typename enable_if
2551<
2552 __is_val_expr<_Expr>::value,
2553 void
2554>::type
2555indirect_array<_Tp>::operator<<=(const _Expr& __v) const
2556{
2557 size_t __n = __1d_.size();
2558 for (size_t __i = 0; __i < __n; ++__i)
2559 __vp_[__1d_[__i]] <<= __v[__i];
2560}
2561
2562template <class _Tp>
2563template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002564inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002565typename enable_if
2566<
2567 __is_val_expr<_Expr>::value,
2568 void
2569>::type
2570indirect_array<_Tp>::operator>>=(const _Expr& __v) const
2571{
2572 size_t __n = __1d_.size();
2573 for (size_t __i = 0; __i < __n; ++__i)
2574 __vp_[__1d_[__i]] >>= __v[__i];
2575}
2576
2577template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002578inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002579const indirect_array<_Tp>&
2580indirect_array<_Tp>::operator=(const indirect_array& __ia) const
2581{
2582 typedef const size_t* _Ip;
2583 const value_type* __s = __ia.__vp_;
2584 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_, __j = __ia.__1d_.__begin_;
2585 __i != __e; ++__i, ++__j)
2586 __vp_[*__i] = __s[*__j];
2587 return *this;
2588}
2589
2590template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002591inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002592void
2593indirect_array<_Tp>::operator=(const value_type& __x) const
2594{
2595 typedef const size_t* _Ip;
2596 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i)
2597 __vp_[*__i] = __x;
2598}
2599
2600template <class _ValExpr>
2601class __indirect_expr
2602{
2603 typedef typename remove_reference<_ValExpr>::type _RmExpr;
2604public:
2605 typedef typename _RmExpr::value_type value_type;
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002606 typedef value_type __result_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002607
2608private:
2609 _ValExpr __expr_;
2610 valarray<size_t> __1d_;
2611
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002612 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002613 __indirect_expr(const valarray<size_t>& __ia, const _RmExpr& __e)
2614 : __expr_(__e),
2615 __1d_(__ia)
2616 {}
2617
Eric Fiselier3b0b81f2017-04-19 00:23:45 +00002618#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00002619
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002620 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002621 __indirect_expr(valarray<size_t>&& __ia, const _RmExpr& __e)
2622 : __expr_(__e),
Corentin Jabotcfb8a912022-02-24 19:54:00 -05002623 __1d_(std::move(__ia))
Howard Hinnantc51e1022010-05-11 19:42:16 +00002624 {}
2625
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002626#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00002627
2628public:
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002629 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002630 __result_type operator[](size_t __i) const
Howard Hinnantc51e1022010-05-11 19:42:16 +00002631 {return __expr_[__1d_[__i]];}
2632
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002633 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002634 size_t size() const {return __1d_.size();}
2635
Eric Fiselier7b31ed02019-04-02 08:05:23 +00002636 template <class> friend class __val_expr;
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00002637 template <class> friend class _LIBCPP_TEMPLATE_VIS valarray;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002638};
2639
2640template<class _ValExpr>
2641class __val_expr
2642{
2643 typedef typename remove_reference<_ValExpr>::type _RmExpr;
2644
2645 _ValExpr __expr_;
2646public:
2647 typedef typename _RmExpr::value_type value_type;
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002648 typedef typename _RmExpr::__result_type __result_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002649
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002650 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002651 explicit __val_expr(const _RmExpr& __e) : __expr_(__e) {}
2652
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002653 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002654 __result_type operator[](size_t __i) const
Howard Hinnantc51e1022010-05-11 19:42:16 +00002655 {return __expr_[__i];}
2656
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002657 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002658 __val_expr<__slice_expr<_ValExpr> > operator[](slice __s) const
Eric Fiselier7b31ed02019-04-02 08:05:23 +00002659 {
2660 typedef __slice_expr<_ValExpr> _NewExpr;
2661 return __val_expr< _NewExpr >(_NewExpr(__s, __expr_));
2662 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00002663
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002664 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002665 __val_expr<__indirect_expr<_ValExpr> > operator[](const gslice& __gs) const
Eric Fiselier7b31ed02019-04-02 08:05:23 +00002666 {
2667 typedef __indirect_expr<_ValExpr> _NewExpr;
2668 return __val_expr<_NewExpr >(_NewExpr(__gs.__1d_, __expr_));
2669 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00002670
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002671 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002672 __val_expr<__mask_expr<_ValExpr> > operator[](const valarray<bool>& __vb) const
Eric Fiselier7b31ed02019-04-02 08:05:23 +00002673 {
2674 typedef __mask_expr<_ValExpr> _NewExpr;
2675 return __val_expr< _NewExpr >( _NewExpr(__vb, __expr_));
2676 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00002677
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002678 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002679 __val_expr<__indirect_expr<_ValExpr> > operator[](const valarray<size_t>& __vs) const
Eric Fiselier7b31ed02019-04-02 08:05:23 +00002680 {
2681 typedef __indirect_expr<_ValExpr> _NewExpr;
2682 return __val_expr< _NewExpr >(_NewExpr(__vs, __expr_));
2683 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00002684
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002685 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002686 __val_expr<_UnaryOp<__unary_plus<value_type>, _ValExpr> >
2687 operator+() const
2688 {
2689 typedef _UnaryOp<__unary_plus<value_type>, _ValExpr> _NewExpr;
2690 return __val_expr<_NewExpr>(_NewExpr(__unary_plus<value_type>(), __expr_));
2691 }
2692
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002693 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002694 __val_expr<_UnaryOp<negate<value_type>, _ValExpr> >
2695 operator-() const
2696 {
2697 typedef _UnaryOp<negate<value_type>, _ValExpr> _NewExpr;
2698 return __val_expr<_NewExpr>(_NewExpr(negate<value_type>(), __expr_));
2699 }
2700
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002701 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002702 __val_expr<_UnaryOp<__bit_not<value_type>, _ValExpr> >
2703 operator~() const
2704 {
2705 typedef _UnaryOp<__bit_not<value_type>, _ValExpr> _NewExpr;
2706 return __val_expr<_NewExpr>(_NewExpr(__bit_not<value_type>(), __expr_));
2707 }
2708
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002709 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002710 __val_expr<_UnaryOp<logical_not<value_type>, _ValExpr> >
2711 operator!() const
2712 {
2713 typedef _UnaryOp<logical_not<value_type>, _ValExpr> _NewExpr;
2714 return __val_expr<_NewExpr>(_NewExpr(logical_not<value_type>(), __expr_));
2715 }
2716
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002717 operator valarray<__result_type>() const;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002718
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002719 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002720 size_t size() const {return __expr_.size();}
2721
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002722 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002723 __result_type sum() const
Howard Hinnantc51e1022010-05-11 19:42:16 +00002724 {
2725 size_t __n = __expr_.size();
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002726 __result_type __r = __n ? __expr_[0] : __result_type();
Howard Hinnantc51e1022010-05-11 19:42:16 +00002727 for (size_t __i = 1; __i < __n; ++__i)
2728 __r += __expr_[__i];
2729 return __r;
2730 }
2731
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002732 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002733 __result_type min() const
Howard Hinnantc51e1022010-05-11 19:42:16 +00002734 {
2735 size_t __n = size();
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002736 __result_type __r = __n ? (*this)[0] : __result_type();
Howard Hinnantc51e1022010-05-11 19:42:16 +00002737 for (size_t __i = 1; __i < __n; ++__i)
2738 {
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002739 __result_type __x = __expr_[__i];
Howard Hinnantc51e1022010-05-11 19:42:16 +00002740 if (__x < __r)
2741 __r = __x;
2742 }
2743 return __r;
2744 }
2745
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002746 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002747 __result_type max() const
Howard Hinnantc51e1022010-05-11 19:42:16 +00002748 {
2749 size_t __n = size();
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002750 __result_type __r = __n ? (*this)[0] : __result_type();
Howard Hinnantc51e1022010-05-11 19:42:16 +00002751 for (size_t __i = 1; __i < __n; ++__i)
2752 {
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002753 __result_type __x = __expr_[__i];
Howard Hinnantc51e1022010-05-11 19:42:16 +00002754 if (__r < __x)
2755 __r = __x;
2756 }
2757 return __r;
2758 }
2759
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002760 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002761 __val_expr<__shift_expr<_ValExpr> > shift (int __i) const
2762 {return __val_expr<__shift_expr<_ValExpr> >(__shift_expr<_ValExpr>(__i, __expr_));}
2763
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002764 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002765 __val_expr<__cshift_expr<_ValExpr> > cshift(int __i) const
2766 {return __val_expr<__cshift_expr<_ValExpr> >(__cshift_expr<_ValExpr>(__i, __expr_));}
2767
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002768 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002769 __val_expr<_UnaryOp<__apply_expr<value_type, value_type(*)(value_type)>, _ValExpr> >
2770 apply(value_type __f(value_type)) const
2771 {
2772 typedef __apply_expr<value_type, value_type(*)(value_type)> _Op;
2773 typedef _UnaryOp<_Op, _ValExpr> _NewExpr;
2774 return __val_expr<_NewExpr>(_NewExpr(_Op(__f), __expr_));
2775 }
2776
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002777 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002778 __val_expr<_UnaryOp<__apply_expr<value_type, value_type(*)(const value_type&)>, _ValExpr> >
2779 apply(value_type __f(const value_type&)) const
2780 {
2781 typedef __apply_expr<value_type, value_type(*)(const value_type&)> _Op;
2782 typedef _UnaryOp<_Op, _ValExpr> _NewExpr;
2783 return __val_expr<_NewExpr>(_NewExpr(_Op(__f), __expr_));
2784 }
2785};
2786
2787template<class _ValExpr>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002788__val_expr<_ValExpr>::operator valarray<__val_expr::__result_type>() const
Howard Hinnantc51e1022010-05-11 19:42:16 +00002789{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002790 valarray<__result_type> __r;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002791 size_t __n = __expr_.size();
2792 if (__n)
2793 {
2794 __r.__begin_ =
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002795 __r.__end_ = allocator<__result_type>().allocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002796 for (size_t __i = 0; __i != __n; ++__r.__end_, ++__i)
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002797 ::new ((void*)__r.__end_) __result_type(__expr_[__i]);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002798 }
2799 return __r;
2800}
2801
2802// valarray
2803
2804template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002805inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002806valarray<_Tp>::valarray(size_t __n)
Bruce Mitchener170d8972020-11-24 12:53:53 -05002807 : __begin_(nullptr),
2808 __end_(nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002809{
Mikhail Maltsev59de6f82018-02-08 11:33:48 +00002810 if (__n)
2811 {
Louis Dionne5ffe5152020-09-28 15:47:49 -04002812 __begin_ = __end_ = allocator<value_type>().allocate(__n);
Mikhail Maltsev59de6f82018-02-08 11:33:48 +00002813#ifndef _LIBCPP_NO_EXCEPTIONS
2814 try
2815 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002816#endif // _LIBCPP_NO_EXCEPTIONS
Eric Fiselier2856ef82018-10-25 17:21:30 +00002817 for (size_t __n_left = __n; __n_left; --__n_left, ++__end_)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05002818 ::new ((void*)__end_) value_type();
Mikhail Maltsev59de6f82018-02-08 11:33:48 +00002819#ifndef _LIBCPP_NO_EXCEPTIONS
2820 }
2821 catch (...)
2822 {
Eric Fiselier2856ef82018-10-25 17:21:30 +00002823 __clear(__n);
Mikhail Maltsev59de6f82018-02-08 11:33:48 +00002824 throw;
2825 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002826#endif // _LIBCPP_NO_EXCEPTIONS
Mikhail Maltsev59de6f82018-02-08 11:33:48 +00002827 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00002828}
2829
2830template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002831inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002832valarray<_Tp>::valarray(const value_type& __x, size_t __n)
Bruce Mitchener170d8972020-11-24 12:53:53 -05002833 : __begin_(nullptr),
2834 __end_(nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002835{
2836 resize(__n, __x);
2837}
2838
2839template <class _Tp>
2840valarray<_Tp>::valarray(const value_type* __p, size_t __n)
Bruce Mitchener170d8972020-11-24 12:53:53 -05002841 : __begin_(nullptr),
2842 __end_(nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002843{
2844 if (__n)
2845 {
Louis Dionne5ffe5152020-09-28 15:47:49 -04002846 __begin_ = __end_ = allocator<value_type>().allocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002847#ifndef _LIBCPP_NO_EXCEPTIONS
2848 try
2849 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002850#endif // _LIBCPP_NO_EXCEPTIONS
Eric Fiselier2856ef82018-10-25 17:21:30 +00002851 for (size_t __n_left = __n; __n_left; ++__end_, ++__p, --__n_left)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05002852 ::new ((void*)__end_) value_type(*__p);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002853#ifndef _LIBCPP_NO_EXCEPTIONS
2854 }
2855 catch (...)
2856 {
Eric Fiselier2856ef82018-10-25 17:21:30 +00002857 __clear(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002858 throw;
2859 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002860#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00002861 }
2862}
2863
2864template <class _Tp>
2865valarray<_Tp>::valarray(const valarray& __v)
Bruce Mitchener170d8972020-11-24 12:53:53 -05002866 : __begin_(nullptr),
2867 __end_(nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002868{
2869 if (__v.size())
2870 {
Louis Dionne5ffe5152020-09-28 15:47:49 -04002871 __begin_ = __end_ = allocator<value_type>().allocate(__v.size());
Howard Hinnantc51e1022010-05-11 19:42:16 +00002872#ifndef _LIBCPP_NO_EXCEPTIONS
2873 try
2874 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002875#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00002876 for (value_type* __p = __v.__begin_; __p != __v.__end_; ++__end_, ++__p)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05002877 ::new ((void*)__end_) value_type(*__p);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002878#ifndef _LIBCPP_NO_EXCEPTIONS
2879 }
2880 catch (...)
2881 {
Eric Fiselier2856ef82018-10-25 17:21:30 +00002882 __clear(__v.size());
Howard Hinnantc51e1022010-05-11 19:42:16 +00002883 throw;
2884 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002885#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00002886 }
2887}
2888
Eric Fiselier3b0b81f2017-04-19 00:23:45 +00002889#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00002890
2891template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002892inline
Howard Hinnant298aed92012-07-21 00:51:28 +00002893valarray<_Tp>::valarray(valarray&& __v) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00002894 : __begin_(__v.__begin_),
2895 __end_(__v.__end_)
2896{
2897 __v.__begin_ = __v.__end_ = nullptr;
2898}
2899
2900template <class _Tp>
2901valarray<_Tp>::valarray(initializer_list<value_type> __il)
Bruce Mitchener170d8972020-11-24 12:53:53 -05002902 : __begin_(nullptr),
2903 __end_(nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002904{
Eric Fiselier2856ef82018-10-25 17:21:30 +00002905 const size_t __n = __il.size();
Howard Hinnantc51e1022010-05-11 19:42:16 +00002906 if (__n)
2907 {
Louis Dionne5ffe5152020-09-28 15:47:49 -04002908 __begin_ = __end_ = allocator<value_type>().allocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002909#ifndef _LIBCPP_NO_EXCEPTIONS
2910 try
2911 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002912#endif // _LIBCPP_NO_EXCEPTIONS
Eric Fiselier2856ef82018-10-25 17:21:30 +00002913 size_t __n_left = __n;
2914 for (const value_type* __p = __il.begin(); __n_left; ++__end_, ++__p, --__n_left)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05002915 ::new ((void*)__end_) value_type(*__p);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002916#ifndef _LIBCPP_NO_EXCEPTIONS
2917 }
2918 catch (...)
2919 {
Eric Fiselier2856ef82018-10-25 17:21:30 +00002920 __clear(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002921 throw;
2922 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002923#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00002924 }
2925}
2926
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002927#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00002928
2929template <class _Tp>
2930valarray<_Tp>::valarray(const slice_array<value_type>& __sa)
Bruce Mitchener170d8972020-11-24 12:53:53 -05002931 : __begin_(nullptr),
2932 __end_(nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002933{
Eric Fiselier2856ef82018-10-25 17:21:30 +00002934 const size_t __n = __sa.__size_;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002935 if (__n)
2936 {
Louis Dionne5ffe5152020-09-28 15:47:49 -04002937 __begin_ = __end_ = allocator<value_type>().allocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002938#ifndef _LIBCPP_NO_EXCEPTIONS
2939 try
2940 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002941#endif // _LIBCPP_NO_EXCEPTIONS
Eric Fiselier2856ef82018-10-25 17:21:30 +00002942 size_t __n_left = __n;
2943 for (const value_type* __p = __sa.__vp_; __n_left; ++__end_, __p += __sa.__stride_, --__n_left)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05002944 ::new ((void*)__end_) value_type(*__p);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002945#ifndef _LIBCPP_NO_EXCEPTIONS
2946 }
2947 catch (...)
2948 {
Eric Fiselier2856ef82018-10-25 17:21:30 +00002949 __clear(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002950 throw;
2951 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002952#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00002953 }
2954}
2955
2956template <class _Tp>
2957valarray<_Tp>::valarray(const gslice_array<value_type>& __ga)
Bruce Mitchener170d8972020-11-24 12:53:53 -05002958 : __begin_(nullptr),
2959 __end_(nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002960{
Eric Fiselier2856ef82018-10-25 17:21:30 +00002961 const size_t __n = __ga.__1d_.size();
Howard Hinnantc51e1022010-05-11 19:42:16 +00002962 if (__n)
2963 {
Louis Dionne5ffe5152020-09-28 15:47:49 -04002964 __begin_ = __end_ = allocator<value_type>().allocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002965#ifndef _LIBCPP_NO_EXCEPTIONS
2966 try
2967 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002968#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00002969 typedef const size_t* _Ip;
2970 const value_type* __s = __ga.__vp_;
2971 for (_Ip __i = __ga.__1d_.__begin_, __e = __ga.__1d_.__end_;
2972 __i != __e; ++__i, ++__end_)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05002973 ::new ((void*)__end_) value_type(__s[*__i]);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002974#ifndef _LIBCPP_NO_EXCEPTIONS
2975 }
2976 catch (...)
2977 {
Eric Fiselier2856ef82018-10-25 17:21:30 +00002978 __clear(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002979 throw;
2980 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002981#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00002982 }
2983}
2984
2985template <class _Tp>
2986valarray<_Tp>::valarray(const mask_array<value_type>& __ma)
Bruce Mitchener170d8972020-11-24 12:53:53 -05002987 : __begin_(nullptr),
2988 __end_(nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002989{
Eric Fiselier2856ef82018-10-25 17:21:30 +00002990 const size_t __n = __ma.__1d_.size();
Howard Hinnantc51e1022010-05-11 19:42:16 +00002991 if (__n)
2992 {
Louis Dionne5ffe5152020-09-28 15:47:49 -04002993 __begin_ = __end_ = allocator<value_type>().allocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002994#ifndef _LIBCPP_NO_EXCEPTIONS
2995 try
2996 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002997#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00002998 typedef const size_t* _Ip;
2999 const value_type* __s = __ma.__vp_;
3000 for (_Ip __i = __ma.__1d_.__begin_, __e = __ma.__1d_.__end_;
3001 __i != __e; ++__i, ++__end_)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05003002 ::new ((void*)__end_) value_type(__s[*__i]);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003003#ifndef _LIBCPP_NO_EXCEPTIONS
3004 }
3005 catch (...)
3006 {
Eric Fiselier2856ef82018-10-25 17:21:30 +00003007 __clear(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003008 throw;
3009 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04003010#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00003011 }
3012}
3013
3014template <class _Tp>
3015valarray<_Tp>::valarray(const indirect_array<value_type>& __ia)
Bruce Mitchener170d8972020-11-24 12:53:53 -05003016 : __begin_(nullptr),
3017 __end_(nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00003018{
Eric Fiselier2856ef82018-10-25 17:21:30 +00003019 const size_t __n = __ia.__1d_.size();
Howard Hinnantc51e1022010-05-11 19:42:16 +00003020 if (__n)
3021 {
Louis Dionne5ffe5152020-09-28 15:47:49 -04003022 __begin_ = __end_ = allocator<value_type>().allocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003023#ifndef _LIBCPP_NO_EXCEPTIONS
3024 try
3025 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04003026#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00003027 typedef const size_t* _Ip;
3028 const value_type* __s = __ia.__vp_;
3029 for (_Ip __i = __ia.__1d_.__begin_, __e = __ia.__1d_.__end_;
3030 __i != __e; ++__i, ++__end_)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05003031 ::new ((void*)__end_) value_type(__s[*__i]);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003032#ifndef _LIBCPP_NO_EXCEPTIONS
3033 }
3034 catch (...)
3035 {
Eric Fiselier2856ef82018-10-25 17:21:30 +00003036 __clear(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003037 throw;
3038 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04003039#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00003040 }
3041}
3042
3043template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003044inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003045valarray<_Tp>::~valarray()
3046{
Eric Fiselier2856ef82018-10-25 17:21:30 +00003047 __clear(size());
Mikhail Maltsev59de6f82018-02-08 11:33:48 +00003048}
3049
3050template <class _Tp>
3051valarray<_Tp>&
3052valarray<_Tp>::__assign_range(const value_type* __f, const value_type* __l)
3053{
3054 size_t __n = __l - __f;
3055 if (size() != __n)
3056 {
Eric Fiselier2856ef82018-10-25 17:21:30 +00003057 __clear(size());
Louis Dionne5ffe5152020-09-28 15:47:49 -04003058 __begin_ = allocator<value_type>().allocate(__n);
Mikhail Maltsev59de6f82018-02-08 11:33:48 +00003059 __end_ = __begin_ + __n;
3060 _VSTD::uninitialized_copy(__f, __l, __begin_);
3061 } else {
3062 _VSTD::copy(__f, __l, __begin_);
3063 }
3064 return *this;
Howard Hinnantc51e1022010-05-11 19:42:16 +00003065}
3066
3067template <class _Tp>
3068valarray<_Tp>&
3069valarray<_Tp>::operator=(const valarray& __v)
3070{
Mark de Wever357a1fc2021-09-28 19:15:18 +02003071 if (this != _VSTD::addressof(__v))
Mikhail Maltsev59de6f82018-02-08 11:33:48 +00003072 return __assign_range(__v.__begin_, __v.__end_);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003073 return *this;
3074}
3075
Eric Fiselier3b0b81f2017-04-19 00:23:45 +00003076#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00003077
3078template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003079inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003080valarray<_Tp>&
Howard Hinnant298aed92012-07-21 00:51:28 +00003081valarray<_Tp>::operator=(valarray&& __v) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00003082{
Eric Fiselier2856ef82018-10-25 17:21:30 +00003083 __clear(size());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003084 __begin_ = __v.__begin_;
3085 __end_ = __v.__end_;
3086 __v.__begin_ = nullptr;
3087 __v.__end_ = nullptr;
3088 return *this;
3089}
3090
3091template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003092inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003093valarray<_Tp>&
3094valarray<_Tp>::operator=(initializer_list<value_type> __il)
3095{
Mikhail Maltsev59de6f82018-02-08 11:33:48 +00003096 return __assign_range(__il.begin(), __il.end());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003097}
3098
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04003099#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00003100
3101template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003102inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003103valarray<_Tp>&
3104valarray<_Tp>::operator=(const value_type& __x)
3105{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003106 _VSTD::fill(__begin_, __end_, __x);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003107 return *this;
3108}
3109
3110template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003111inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003112valarray<_Tp>&
3113valarray<_Tp>::operator=(const slice_array<value_type>& __sa)
3114{
3115 value_type* __t = __begin_;
3116 const value_type* __s = __sa.__vp_;
3117 for (size_t __n = __sa.__size_; __n; --__n, __s += __sa.__stride_, ++__t)
3118 *__t = *__s;
3119 return *this;
3120}
3121
3122template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003123inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003124valarray<_Tp>&
3125valarray<_Tp>::operator=(const gslice_array<value_type>& __ga)
3126{
3127 typedef const size_t* _Ip;
3128 value_type* __t = __begin_;
3129 const value_type* __s = __ga.__vp_;
3130 for (_Ip __i = __ga.__1d_.__begin_, __e = __ga.__1d_.__end_;
3131 __i != __e; ++__i, ++__t)
3132 *__t = __s[*__i];
3133 return *this;
3134}
3135
3136template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003137inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003138valarray<_Tp>&
3139valarray<_Tp>::operator=(const mask_array<value_type>& __ma)
3140{
3141 typedef const size_t* _Ip;
3142 value_type* __t = __begin_;
3143 const value_type* __s = __ma.__vp_;
3144 for (_Ip __i = __ma.__1d_.__begin_, __e = __ma.__1d_.__end_;
3145 __i != __e; ++__i, ++__t)
3146 *__t = __s[*__i];
3147 return *this;
3148}
3149
3150template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003151inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003152valarray<_Tp>&
3153valarray<_Tp>::operator=(const indirect_array<value_type>& __ia)
3154{
3155 typedef const size_t* _Ip;
3156 value_type* __t = __begin_;
3157 const value_type* __s = __ia.__vp_;
3158 for (_Ip __i = __ia.__1d_.__begin_, __e = __ia.__1d_.__end_;
3159 __i != __e; ++__i, ++__t)
3160 *__t = __s[*__i];
3161 return *this;
3162}
3163
3164template <class _Tp>
Howard Hinnant329cd412011-07-27 23:19:59 +00003165template <class _ValExpr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003166inline
Howard Hinnant329cd412011-07-27 23:19:59 +00003167valarray<_Tp>&
3168valarray<_Tp>::operator=(const __val_expr<_ValExpr>& __v)
3169{
3170 size_t __n = __v.size();
3171 if (size() != __n)
3172 resize(__n);
3173 value_type* __t = __begin_;
3174 for (size_t __i = 0; __i != __n; ++__t, ++__i)
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04003175 *__t = __result_type(__v[__i]);
Howard Hinnant329cd412011-07-27 23:19:59 +00003176 return *this;
3177}
3178
3179template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003180inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003181__val_expr<__slice_expr<const valarray<_Tp>&> >
3182valarray<_Tp>::operator[](slice __s) const
3183{
3184 return __val_expr<__slice_expr<const valarray&> >(__slice_expr<const valarray&>(__s, *this));
3185}
3186
3187template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003188inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003189slice_array<_Tp>
3190valarray<_Tp>::operator[](slice __s)
3191{
3192 return slice_array<value_type>(__s, *this);
3193}
3194
3195template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003196inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003197__val_expr<__indirect_expr<const valarray<_Tp>&> >
3198valarray<_Tp>::operator[](const gslice& __gs) const
3199{
3200 return __val_expr<__indirect_expr<const valarray&> >(__indirect_expr<const valarray&>(__gs.__1d_, *this));
3201}
3202
3203template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003204inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003205gslice_array<_Tp>
3206valarray<_Tp>::operator[](const gslice& __gs)
3207{
3208 return gslice_array<value_type>(__gs, *this);
3209}
3210
Eric Fiselier3b0b81f2017-04-19 00:23:45 +00003211#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00003212
3213template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003214inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003215__val_expr<__indirect_expr<const valarray<_Tp>&> >
3216valarray<_Tp>::operator[](gslice&& __gs) const
3217{
Corentin Jabotcfb8a912022-02-24 19:54:00 -05003218 return __val_expr<__indirect_expr<const valarray&> >(__indirect_expr<const valarray&>(std::move(__gs.__1d_), *this));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003219}
3220
3221template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003222inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003223gslice_array<_Tp>
3224valarray<_Tp>::operator[](gslice&& __gs)
3225{
Corentin Jabotcfb8a912022-02-24 19:54:00 -05003226 return gslice_array<value_type>(std::move(__gs), *this);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003227}
3228
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04003229#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00003230
3231template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003232inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003233__val_expr<__mask_expr<const valarray<_Tp>&> >
3234valarray<_Tp>::operator[](const valarray<bool>& __vb) const
3235{
3236 return __val_expr<__mask_expr<const valarray&> >(__mask_expr<const valarray&>(__vb, *this));
3237}
3238
3239template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003240inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003241mask_array<_Tp>
3242valarray<_Tp>::operator[](const valarray<bool>& __vb)
3243{
3244 return mask_array<value_type>(__vb, *this);
3245}
3246
Eric Fiselier3b0b81f2017-04-19 00:23:45 +00003247#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00003248
3249template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003250inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003251__val_expr<__mask_expr<const valarray<_Tp>&> >
3252valarray<_Tp>::operator[](valarray<bool>&& __vb) const
3253{
Corentin Jabotcfb8a912022-02-24 19:54:00 -05003254 return __val_expr<__mask_expr<const valarray&> >(__mask_expr<const valarray&>(std::move(__vb), *this));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003255}
3256
3257template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003258inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003259mask_array<_Tp>
3260valarray<_Tp>::operator[](valarray<bool>&& __vb)
3261{
Corentin Jabotcfb8a912022-02-24 19:54:00 -05003262 return mask_array<value_type>(std::move(__vb), *this);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003263}
3264
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04003265#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00003266
3267template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003268inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003269__val_expr<__indirect_expr<const valarray<_Tp>&> >
3270valarray<_Tp>::operator[](const valarray<size_t>& __vs) const
3271{
3272 return __val_expr<__indirect_expr<const valarray&> >(__indirect_expr<const valarray&>(__vs, *this));
3273}
3274
3275template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003276inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003277indirect_array<_Tp>
3278valarray<_Tp>::operator[](const valarray<size_t>& __vs)
3279{
3280 return indirect_array<value_type>(__vs, *this);
3281}
3282
Eric Fiselier3b0b81f2017-04-19 00:23:45 +00003283#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00003284
3285template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003286inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003287__val_expr<__indirect_expr<const valarray<_Tp>&> >
3288valarray<_Tp>::operator[](valarray<size_t>&& __vs) const
3289{
Corentin Jabotcfb8a912022-02-24 19:54:00 -05003290 return __val_expr<__indirect_expr<const valarray&> >(__indirect_expr<const valarray&>(std::move(__vs), *this));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003291}
3292
3293template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003294inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003295indirect_array<_Tp>
3296valarray<_Tp>::operator[](valarray<size_t>&& __vs)
3297{
Corentin Jabotcfb8a912022-02-24 19:54:00 -05003298 return indirect_array<value_type>(std::move(__vs), *this);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003299}
3300
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04003301#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00003302
3303template <class _Tp>
3304valarray<_Tp>
3305valarray<_Tp>::operator+() const
3306{
3307 valarray<value_type> __r;
3308 size_t __n = size();
3309 if (__n)
3310 {
Louis Dionne5ffe5152020-09-28 15:47:49 -04003311 __r.__begin_ = __r.__end_ = allocator<value_type>().allocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003312 for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05003313 ::new ((void*)__r.__end_) value_type(+*__p);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003314 }
3315 return __r;
3316}
3317
3318template <class _Tp>
3319valarray<_Tp>
3320valarray<_Tp>::operator-() const
3321{
3322 valarray<value_type> __r;
3323 size_t __n = size();
3324 if (__n)
3325 {
Louis Dionne5ffe5152020-09-28 15:47:49 -04003326 __r.__begin_ = __r.__end_ = allocator<value_type>().allocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003327 for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05003328 ::new ((void*)__r.__end_) value_type(-*__p);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003329 }
3330 return __r;
3331}
3332
3333template <class _Tp>
3334valarray<_Tp>
3335valarray<_Tp>::operator~() const
3336{
3337 valarray<value_type> __r;
3338 size_t __n = size();
3339 if (__n)
3340 {
Louis Dionne5ffe5152020-09-28 15:47:49 -04003341 __r.__begin_ = __r.__end_ = allocator<value_type>().allocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003342 for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05003343 ::new ((void*)__r.__end_) value_type(~*__p);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003344 }
3345 return __r;
3346}
3347
3348template <class _Tp>
3349valarray<bool>
3350valarray<_Tp>::operator!() const
3351{
3352 valarray<bool> __r;
3353 size_t __n = size();
3354 if (__n)
3355 {
Louis Dionne5ffe5152020-09-28 15:47:49 -04003356 __r.__begin_ = __r.__end_ = allocator<bool>().allocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003357 for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05003358 ::new ((void*)__r.__end_) bool(!*__p);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003359 }
3360 return __r;
3361}
3362
3363template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003364inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003365valarray<_Tp>&
3366valarray<_Tp>::operator*=(const value_type& __x)
3367{
3368 for (value_type* __p = __begin_; __p != __end_; ++__p)
3369 *__p *= __x;
3370 return *this;
3371}
3372
3373template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003374inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003375valarray<_Tp>&
3376valarray<_Tp>::operator/=(const value_type& __x)
3377{
3378 for (value_type* __p = __begin_; __p != __end_; ++__p)
3379 *__p /= __x;
3380 return *this;
3381}
3382
3383template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003384inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003385valarray<_Tp>&
3386valarray<_Tp>::operator%=(const value_type& __x)
3387{
3388 for (value_type* __p = __begin_; __p != __end_; ++__p)
3389 *__p %= __x;
3390 return *this;
3391}
3392
3393template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003394inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003395valarray<_Tp>&
3396valarray<_Tp>::operator+=(const value_type& __x)
3397{
3398 for (value_type* __p = __begin_; __p != __end_; ++__p)
3399 *__p += __x;
3400 return *this;
3401}
3402
3403template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003404inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003405valarray<_Tp>&
3406valarray<_Tp>::operator-=(const value_type& __x)
3407{
3408 for (value_type* __p = __begin_; __p != __end_; ++__p)
3409 *__p -= __x;
3410 return *this;
3411}
3412
3413template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003414inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003415valarray<_Tp>&
3416valarray<_Tp>::operator^=(const value_type& __x)
3417{
3418 for (value_type* __p = __begin_; __p != __end_; ++__p)
3419 *__p ^= __x;
3420 return *this;
3421}
3422
3423template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003424inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003425valarray<_Tp>&
3426valarray<_Tp>::operator&=(const value_type& __x)
3427{
3428 for (value_type* __p = __begin_; __p != __end_; ++__p)
3429 *__p &= __x;
3430 return *this;
3431}
3432
3433template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003434inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003435valarray<_Tp>&
3436valarray<_Tp>::operator|=(const value_type& __x)
3437{
3438 for (value_type* __p = __begin_; __p != __end_; ++__p)
3439 *__p |= __x;
3440 return *this;
3441}
3442
3443template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003444inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003445valarray<_Tp>&
3446valarray<_Tp>::operator<<=(const value_type& __x)
3447{
3448 for (value_type* __p = __begin_; __p != __end_; ++__p)
3449 *__p <<= __x;
3450 return *this;
3451}
3452
3453template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003454inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003455valarray<_Tp>&
3456valarray<_Tp>::operator>>=(const value_type& __x)
3457{
3458 for (value_type* __p = __begin_; __p != __end_; ++__p)
3459 *__p >>= __x;
3460 return *this;
3461}
3462
3463template <class _Tp>
3464template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003465inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003466typename enable_if
3467<
3468 __is_val_expr<_Expr>::value,
3469 valarray<_Tp>&
3470>::type
3471valarray<_Tp>::operator*=(const _Expr& __v)
3472{
3473 size_t __i = 0;
3474 for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3475 *__t *= __v[__i];
3476 return *this;
3477}
3478
3479template <class _Tp>
3480template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003481inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003482typename enable_if
3483<
3484 __is_val_expr<_Expr>::value,
3485 valarray<_Tp>&
3486>::type
3487valarray<_Tp>::operator/=(const _Expr& __v)
3488{
3489 size_t __i = 0;
3490 for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3491 *__t /= __v[__i];
3492 return *this;
3493}
3494
3495template <class _Tp>
3496template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003497inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003498typename enable_if
3499<
3500 __is_val_expr<_Expr>::value,
3501 valarray<_Tp>&
3502>::type
3503valarray<_Tp>::operator%=(const _Expr& __v)
3504{
3505 size_t __i = 0;
3506 for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3507 *__t %= __v[__i];
3508 return *this;
3509}
3510
3511template <class _Tp>
3512template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003513inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003514typename enable_if
3515<
3516 __is_val_expr<_Expr>::value,
3517 valarray<_Tp>&
3518>::type
3519valarray<_Tp>::operator+=(const _Expr& __v)
3520{
3521 size_t __i = 0;
3522 for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3523 *__t += __v[__i];
3524 return *this;
3525}
3526
3527template <class _Tp>
3528template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003529inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003530typename enable_if
3531<
3532 __is_val_expr<_Expr>::value,
3533 valarray<_Tp>&
3534>::type
3535valarray<_Tp>::operator-=(const _Expr& __v)
3536{
3537 size_t __i = 0;
3538 for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3539 *__t -= __v[__i];
3540 return *this;
3541}
3542
3543template <class _Tp>
3544template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003545inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003546typename enable_if
3547<
3548 __is_val_expr<_Expr>::value,
3549 valarray<_Tp>&
3550>::type
3551valarray<_Tp>::operator^=(const _Expr& __v)
3552{
3553 size_t __i = 0;
3554 for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3555 *__t ^= __v[__i];
3556 return *this;
3557}
3558
3559template <class _Tp>
3560template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003561inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003562typename enable_if
3563<
3564 __is_val_expr<_Expr>::value,
3565 valarray<_Tp>&
3566>::type
3567valarray<_Tp>::operator|=(const _Expr& __v)
3568{
3569 size_t __i = 0;
3570 for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3571 *__t |= __v[__i];
3572 return *this;
3573}
3574
3575template <class _Tp>
3576template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003577inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003578typename enable_if
3579<
3580 __is_val_expr<_Expr>::value,
3581 valarray<_Tp>&
3582>::type
3583valarray<_Tp>::operator&=(const _Expr& __v)
3584{
3585 size_t __i = 0;
3586 for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3587 *__t &= __v[__i];
3588 return *this;
3589}
3590
3591template <class _Tp>
3592template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003593inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003594typename enable_if
3595<
3596 __is_val_expr<_Expr>::value,
3597 valarray<_Tp>&
3598>::type
3599valarray<_Tp>::operator<<=(const _Expr& __v)
3600{
3601 size_t __i = 0;
3602 for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3603 *__t <<= __v[__i];
3604 return *this;
3605}
3606
3607template <class _Tp>
3608template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003609inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003610typename enable_if
3611<
3612 __is_val_expr<_Expr>::value,
3613 valarray<_Tp>&
3614>::type
3615valarray<_Tp>::operator>>=(const _Expr& __v)
3616{
3617 size_t __i = 0;
3618 for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3619 *__t >>= __v[__i];
3620 return *this;
3621}
3622
3623template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003624inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003625void
Howard Hinnant298aed92012-07-21 00:51:28 +00003626valarray<_Tp>::swap(valarray& __v) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00003627{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003628 _VSTD::swap(__begin_, __v.__begin_);
3629 _VSTD::swap(__end_, __v.__end_);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003630}
3631
3632template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003633inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003634_Tp
3635valarray<_Tp>::sum() const
3636{
3637 if (__begin_ == __end_)
3638 return value_type();
3639 const value_type* __p = __begin_;
3640 _Tp __r = *__p;
3641 for (++__p; __p != __end_; ++__p)
3642 __r += *__p;
3643 return __r;
3644}
3645
3646template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003647inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003648_Tp
3649valarray<_Tp>::min() const
3650{
3651 if (__begin_ == __end_)
3652 return value_type();
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003653 return *_VSTD::min_element(__begin_, __end_);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003654}
3655
3656template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003657inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003658_Tp
3659valarray<_Tp>::max() const
3660{
3661 if (__begin_ == __end_)
3662 return value_type();
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003663 return *_VSTD::max_element(__begin_, __end_);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003664}
3665
3666template <class _Tp>
3667valarray<_Tp>
3668valarray<_Tp>::shift(int __i) const
3669{
3670 valarray<value_type> __r;
3671 size_t __n = size();
3672 if (__n)
3673 {
Louis Dionne5ffe5152020-09-28 15:47:49 -04003674 __r.__begin_ = __r.__end_ = allocator<value_type>().allocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003675 const value_type* __sb;
3676 value_type* __tb;
3677 value_type* __te;
3678 if (__i >= 0)
3679 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003680 __i = _VSTD::min(__i, static_cast<int>(__n));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003681 __sb = __begin_ + __i;
3682 __tb = __r.__begin_;
3683 __te = __r.__begin_ + (__n - __i);
3684 }
3685 else
3686 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003687 __i = _VSTD::min(-__i, static_cast<int>(__n));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003688 __sb = __begin_;
3689 __tb = __r.__begin_ + __i;
3690 __te = __r.__begin_ + __n;
3691 }
3692 for (; __r.__end_ != __tb; ++__r.__end_)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05003693 ::new ((void*)__r.__end_) value_type();
Howard Hinnantc51e1022010-05-11 19:42:16 +00003694 for (; __r.__end_ != __te; ++__r.__end_, ++__sb)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05003695 ::new ((void*)__r.__end_) value_type(*__sb);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003696 for (__te = __r.__begin_ + __n; __r.__end_ != __te; ++__r.__end_)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05003697 ::new ((void*)__r.__end_) value_type();
Howard Hinnantc51e1022010-05-11 19:42:16 +00003698 }
3699 return __r;
3700}
3701
3702template <class _Tp>
3703valarray<_Tp>
3704valarray<_Tp>::cshift(int __i) 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 __i %= static_cast<int>(__n);
3712 const value_type* __m = __i >= 0 ? __begin_ + __i : __end_ + __i;
3713 for (const value_type* __s = __m; __s != __end_; ++__r.__end_, ++__s)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05003714 ::new ((void*)__r.__end_) value_type(*__s);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003715 for (const value_type* __s = __begin_; __s != __m; ++__r.__end_, ++__s)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05003716 ::new ((void*)__r.__end_) value_type(*__s);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003717 }
3718 return __r;
3719}
3720
3721template <class _Tp>
3722valarray<_Tp>
3723valarray<_Tp>::apply(value_type __f(value_type)) const
3724{
3725 valarray<value_type> __r;
3726 size_t __n = size();
3727 if (__n)
3728 {
Louis Dionne5ffe5152020-09-28 15:47:49 -04003729 __r.__begin_ = __r.__end_ = allocator<value_type>().allocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003730 for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05003731 ::new ((void*)__r.__end_) value_type(__f(*__p));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003732 }
3733 return __r;
3734}
3735
3736template <class _Tp>
3737valarray<_Tp>
3738valarray<_Tp>::apply(value_type __f(const value_type&)) const
3739{
3740 valarray<value_type> __r;
3741 size_t __n = size();
3742 if (__n)
3743 {
Louis Dionne5ffe5152020-09-28 15:47:49 -04003744 __r.__begin_ = __r.__end_ = allocator<value_type>().allocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003745 for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05003746 ::new ((void*)__r.__end_) value_type(__f(*__p));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003747 }
3748 return __r;
3749}
3750
3751template <class _Tp>
Eric Fiseliera119c322018-10-25 17:43:26 +00003752inline
Eric Fiselier2856ef82018-10-25 17:21:30 +00003753void valarray<_Tp>::__clear(size_t __capacity)
Howard Hinnantc51e1022010-05-11 19:42:16 +00003754{
Eric Fiselier2856ef82018-10-25 17:21:30 +00003755 if (__begin_ != nullptr)
3756 {
3757 while (__end_ != __begin_)
3758 (--__end_)->~value_type();
Louis Dionne5ffe5152020-09-28 15:47:49 -04003759 allocator<value_type>().deallocate(__begin_, __capacity);
Eric Fiselier2856ef82018-10-25 17:21:30 +00003760 __begin_ = __end_ = nullptr;
3761 }
Mikhail Maltsev59de6f82018-02-08 11:33:48 +00003762}
3763
3764template <class _Tp>
3765void
3766valarray<_Tp>::resize(size_t __n, value_type __x)
3767{
Eric Fiselier2856ef82018-10-25 17:21:30 +00003768 __clear(size());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003769 if (__n)
3770 {
Louis Dionne5ffe5152020-09-28 15:47:49 -04003771 __begin_ = __end_ = allocator<value_type>().allocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003772#ifndef _LIBCPP_NO_EXCEPTIONS
3773 try
3774 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04003775#endif // _LIBCPP_NO_EXCEPTIONS
Eric Fiselier2856ef82018-10-25 17:21:30 +00003776 for (size_t __n_left = __n; __n_left; --__n_left, ++__end_)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05003777 ::new ((void*)__end_) value_type(__x);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003778#ifndef _LIBCPP_NO_EXCEPTIONS
3779 }
3780 catch (...)
3781 {
Eric Fiselier2856ef82018-10-25 17:21:30 +00003782 __clear(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003783 throw;
3784 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04003785#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00003786 }
3787}
3788
3789template<class _Tp>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003790inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003791void
Howard Hinnant298aed92012-07-21 00:51:28 +00003792swap(valarray<_Tp>& __x, valarray<_Tp>& __y) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00003793{
3794 __x.swap(__y);
3795}
3796
3797template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003798inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003799typename enable_if
3800<
3801 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
3802 __val_expr<_BinaryOp<multiplies<typename _Expr1::value_type>, _Expr1, _Expr2> >
3803>::type
3804operator*(const _Expr1& __x, const _Expr2& __y)
3805{
3806 typedef typename _Expr1::value_type value_type;
3807 typedef _BinaryOp<multiplies<value_type>, _Expr1, _Expr2> _Op;
3808 return __val_expr<_Op>(_Op(multiplies<value_type>(), __x, __y));
3809}
3810
3811template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003812inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003813typename enable_if
3814<
3815 __is_val_expr<_Expr>::value,
3816 __val_expr<_BinaryOp<multiplies<typename _Expr::value_type>,
3817 _Expr, __scalar_expr<typename _Expr::value_type> > >
3818>::type
3819operator*(const _Expr& __x, const typename _Expr::value_type& __y)
3820{
3821 typedef typename _Expr::value_type value_type;
3822 typedef _BinaryOp<multiplies<value_type>, _Expr, __scalar_expr<value_type> > _Op;
3823 return __val_expr<_Op>(_Op(multiplies<value_type>(),
3824 __x, __scalar_expr<value_type>(__y, __x.size())));
3825}
3826
3827template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003828inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003829typename enable_if
3830<
3831 __is_val_expr<_Expr>::value,
3832 __val_expr<_BinaryOp<multiplies<typename _Expr::value_type>,
3833 __scalar_expr<typename _Expr::value_type>, _Expr> >
3834>::type
3835operator*(const typename _Expr::value_type& __x, const _Expr& __y)
3836{
3837 typedef typename _Expr::value_type value_type;
3838 typedef _BinaryOp<multiplies<value_type>, __scalar_expr<value_type>, _Expr> _Op;
3839 return __val_expr<_Op>(_Op(multiplies<value_type>(),
3840 __scalar_expr<value_type>(__x, __y.size()), __y));
3841}
3842
3843template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003844inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003845typename enable_if
3846<
3847 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
3848 __val_expr<_BinaryOp<divides<typename _Expr1::value_type>, _Expr1, _Expr2> >
3849>::type
3850operator/(const _Expr1& __x, const _Expr2& __y)
3851{
3852 typedef typename _Expr1::value_type value_type;
3853 typedef _BinaryOp<divides<value_type>, _Expr1, _Expr2> _Op;
3854 return __val_expr<_Op>(_Op(divides<value_type>(), __x, __y));
3855}
3856
3857template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003858inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003859typename enable_if
3860<
3861 __is_val_expr<_Expr>::value,
3862 __val_expr<_BinaryOp<divides<typename _Expr::value_type>,
3863 _Expr, __scalar_expr<typename _Expr::value_type> > >
3864>::type
3865operator/(const _Expr& __x, const typename _Expr::value_type& __y)
3866{
3867 typedef typename _Expr::value_type value_type;
3868 typedef _BinaryOp<divides<value_type>, _Expr, __scalar_expr<value_type> > _Op;
3869 return __val_expr<_Op>(_Op(divides<value_type>(),
3870 __x, __scalar_expr<value_type>(__y, __x.size())));
3871}
3872
3873template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003874inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003875typename enable_if
3876<
3877 __is_val_expr<_Expr>::value,
3878 __val_expr<_BinaryOp<divides<typename _Expr::value_type>,
3879 __scalar_expr<typename _Expr::value_type>, _Expr> >
3880>::type
3881operator/(const typename _Expr::value_type& __x, const _Expr& __y)
3882{
3883 typedef typename _Expr::value_type value_type;
3884 typedef _BinaryOp<divides<value_type>, __scalar_expr<value_type>, _Expr> _Op;
3885 return __val_expr<_Op>(_Op(divides<value_type>(),
3886 __scalar_expr<value_type>(__x, __y.size()), __y));
3887}
3888
3889template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003890inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003891typename enable_if
3892<
3893 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
3894 __val_expr<_BinaryOp<modulus<typename _Expr1::value_type>, _Expr1, _Expr2> >
3895>::type
3896operator%(const _Expr1& __x, const _Expr2& __y)
3897{
3898 typedef typename _Expr1::value_type value_type;
3899 typedef _BinaryOp<modulus<value_type>, _Expr1, _Expr2> _Op;
3900 return __val_expr<_Op>(_Op(modulus<value_type>(), __x, __y));
3901}
3902
3903template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003904inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003905typename enable_if
3906<
3907 __is_val_expr<_Expr>::value,
3908 __val_expr<_BinaryOp<modulus<typename _Expr::value_type>,
3909 _Expr, __scalar_expr<typename _Expr::value_type> > >
3910>::type
3911operator%(const _Expr& __x, const typename _Expr::value_type& __y)
3912{
3913 typedef typename _Expr::value_type value_type;
3914 typedef _BinaryOp<modulus<value_type>, _Expr, __scalar_expr<value_type> > _Op;
3915 return __val_expr<_Op>(_Op(modulus<value_type>(),
3916 __x, __scalar_expr<value_type>(__y, __x.size())));
3917}
3918
3919template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003920inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003921typename enable_if
3922<
3923 __is_val_expr<_Expr>::value,
3924 __val_expr<_BinaryOp<modulus<typename _Expr::value_type>,
3925 __scalar_expr<typename _Expr::value_type>, _Expr> >
3926>::type
3927operator%(const typename _Expr::value_type& __x, const _Expr& __y)
3928{
3929 typedef typename _Expr::value_type value_type;
3930 typedef _BinaryOp<modulus<value_type>, __scalar_expr<value_type>, _Expr> _Op;
3931 return __val_expr<_Op>(_Op(modulus<value_type>(),
3932 __scalar_expr<value_type>(__x, __y.size()), __y));
3933}
3934
3935template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003936inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003937typename enable_if
3938<
3939 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
3940 __val_expr<_BinaryOp<plus<typename _Expr1::value_type>, _Expr1, _Expr2> >
3941>::type
3942operator+(const _Expr1& __x, const _Expr2& __y)
3943{
3944 typedef typename _Expr1::value_type value_type;
3945 typedef _BinaryOp<plus<value_type>, _Expr1, _Expr2> _Op;
3946 return __val_expr<_Op>(_Op(plus<value_type>(), __x, __y));
3947}
3948
3949template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003950inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003951typename enable_if
3952<
3953 __is_val_expr<_Expr>::value,
3954 __val_expr<_BinaryOp<plus<typename _Expr::value_type>,
3955 _Expr, __scalar_expr<typename _Expr::value_type> > >
3956>::type
3957operator+(const _Expr& __x, const typename _Expr::value_type& __y)
3958{
3959 typedef typename _Expr::value_type value_type;
3960 typedef _BinaryOp<plus<value_type>, _Expr, __scalar_expr<value_type> > _Op;
3961 return __val_expr<_Op>(_Op(plus<value_type>(),
3962 __x, __scalar_expr<value_type>(__y, __x.size())));
3963}
3964
3965template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003966inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003967typename enable_if
3968<
3969 __is_val_expr<_Expr>::value,
3970 __val_expr<_BinaryOp<plus<typename _Expr::value_type>,
3971 __scalar_expr<typename _Expr::value_type>, _Expr> >
3972>::type
3973operator+(const typename _Expr::value_type& __x, const _Expr& __y)
3974{
3975 typedef typename _Expr::value_type value_type;
3976 typedef _BinaryOp<plus<value_type>, __scalar_expr<value_type>, _Expr> _Op;
3977 return __val_expr<_Op>(_Op(plus<value_type>(),
3978 __scalar_expr<value_type>(__x, __y.size()), __y));
3979}
3980
3981template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003982inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003983typename enable_if
3984<
3985 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
3986 __val_expr<_BinaryOp<minus<typename _Expr1::value_type>, _Expr1, _Expr2> >
3987>::type
3988operator-(const _Expr1& __x, const _Expr2& __y)
3989{
3990 typedef typename _Expr1::value_type value_type;
3991 typedef _BinaryOp<minus<value_type>, _Expr1, _Expr2> _Op;
3992 return __val_expr<_Op>(_Op(minus<value_type>(), __x, __y));
3993}
3994
3995template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003996inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003997typename enable_if
3998<
3999 __is_val_expr<_Expr>::value,
4000 __val_expr<_BinaryOp<minus<typename _Expr::value_type>,
4001 _Expr, __scalar_expr<typename _Expr::value_type> > >
4002>::type
4003operator-(const _Expr& __x, const typename _Expr::value_type& __y)
4004{
4005 typedef typename _Expr::value_type value_type;
4006 typedef _BinaryOp<minus<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4007 return __val_expr<_Op>(_Op(minus<value_type>(),
4008 __x, __scalar_expr<value_type>(__y, __x.size())));
4009}
4010
4011template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004012inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004013typename enable_if
4014<
4015 __is_val_expr<_Expr>::value,
4016 __val_expr<_BinaryOp<minus<typename _Expr::value_type>,
4017 __scalar_expr<typename _Expr::value_type>, _Expr> >
4018>::type
4019operator-(const typename _Expr::value_type& __x, const _Expr& __y)
4020{
4021 typedef typename _Expr::value_type value_type;
4022 typedef _BinaryOp<minus<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4023 return __val_expr<_Op>(_Op(minus<value_type>(),
4024 __scalar_expr<value_type>(__x, __y.size()), __y));
4025}
4026
4027template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004028inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004029typename enable_if
4030<
4031 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4032 __val_expr<_BinaryOp<bit_xor<typename _Expr1::value_type>, _Expr1, _Expr2> >
4033>::type
4034operator^(const _Expr1& __x, const _Expr2& __y)
4035{
4036 typedef typename _Expr1::value_type value_type;
4037 typedef _BinaryOp<bit_xor<value_type>, _Expr1, _Expr2> _Op;
4038 return __val_expr<_Op>(_Op(bit_xor<value_type>(), __x, __y));
4039}
4040
4041template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004042inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004043typename enable_if
4044<
4045 __is_val_expr<_Expr>::value,
4046 __val_expr<_BinaryOp<bit_xor<typename _Expr::value_type>,
4047 _Expr, __scalar_expr<typename _Expr::value_type> > >
4048>::type
4049operator^(const _Expr& __x, const typename _Expr::value_type& __y)
4050{
4051 typedef typename _Expr::value_type value_type;
4052 typedef _BinaryOp<bit_xor<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4053 return __val_expr<_Op>(_Op(bit_xor<value_type>(),
4054 __x, __scalar_expr<value_type>(__y, __x.size())));
4055}
4056
4057template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004058inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004059typename enable_if
4060<
4061 __is_val_expr<_Expr>::value,
4062 __val_expr<_BinaryOp<bit_xor<typename _Expr::value_type>,
4063 __scalar_expr<typename _Expr::value_type>, _Expr> >
4064>::type
4065operator^(const typename _Expr::value_type& __x, const _Expr& __y)
4066{
4067 typedef typename _Expr::value_type value_type;
4068 typedef _BinaryOp<bit_xor<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4069 return __val_expr<_Op>(_Op(bit_xor<value_type>(),
4070 __scalar_expr<value_type>(__x, __y.size()), __y));
4071}
4072
4073template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004074inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004075typename enable_if
4076<
4077 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4078 __val_expr<_BinaryOp<bit_and<typename _Expr1::value_type>, _Expr1, _Expr2> >
4079>::type
4080operator&(const _Expr1& __x, const _Expr2& __y)
4081{
4082 typedef typename _Expr1::value_type value_type;
4083 typedef _BinaryOp<bit_and<value_type>, _Expr1, _Expr2> _Op;
4084 return __val_expr<_Op>(_Op(bit_and<value_type>(), __x, __y));
4085}
4086
4087template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004088inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004089typename enable_if
4090<
4091 __is_val_expr<_Expr>::value,
4092 __val_expr<_BinaryOp<bit_and<typename _Expr::value_type>,
4093 _Expr, __scalar_expr<typename _Expr::value_type> > >
4094>::type
4095operator&(const _Expr& __x, const typename _Expr::value_type& __y)
4096{
4097 typedef typename _Expr::value_type value_type;
4098 typedef _BinaryOp<bit_and<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4099 return __val_expr<_Op>(_Op(bit_and<value_type>(),
4100 __x, __scalar_expr<value_type>(__y, __x.size())));
4101}
4102
4103template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004104inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004105typename enable_if
4106<
4107 __is_val_expr<_Expr>::value,
4108 __val_expr<_BinaryOp<bit_and<typename _Expr::value_type>,
4109 __scalar_expr<typename _Expr::value_type>, _Expr> >
4110>::type
4111operator&(const typename _Expr::value_type& __x, const _Expr& __y)
4112{
4113 typedef typename _Expr::value_type value_type;
4114 typedef _BinaryOp<bit_and<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4115 return __val_expr<_Op>(_Op(bit_and<value_type>(),
4116 __scalar_expr<value_type>(__x, __y.size()), __y));
4117}
4118
4119template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004120inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004121typename enable_if
4122<
4123 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4124 __val_expr<_BinaryOp<bit_or<typename _Expr1::value_type>, _Expr1, _Expr2> >
4125>::type
4126operator|(const _Expr1& __x, const _Expr2& __y)
4127{
4128 typedef typename _Expr1::value_type value_type;
4129 typedef _BinaryOp<bit_or<value_type>, _Expr1, _Expr2> _Op;
4130 return __val_expr<_Op>(_Op(bit_or<value_type>(), __x, __y));
4131}
4132
4133template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004134inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004135typename enable_if
4136<
4137 __is_val_expr<_Expr>::value,
4138 __val_expr<_BinaryOp<bit_or<typename _Expr::value_type>,
4139 _Expr, __scalar_expr<typename _Expr::value_type> > >
4140>::type
4141operator|(const _Expr& __x, const typename _Expr::value_type& __y)
4142{
4143 typedef typename _Expr::value_type value_type;
4144 typedef _BinaryOp<bit_or<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4145 return __val_expr<_Op>(_Op(bit_or<value_type>(),
4146 __x, __scalar_expr<value_type>(__y, __x.size())));
4147}
4148
4149template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004150inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004151typename enable_if
4152<
4153 __is_val_expr<_Expr>::value,
4154 __val_expr<_BinaryOp<bit_or<typename _Expr::value_type>,
4155 __scalar_expr<typename _Expr::value_type>, _Expr> >
4156>::type
4157operator|(const typename _Expr::value_type& __x, const _Expr& __y)
4158{
4159 typedef typename _Expr::value_type value_type;
4160 typedef _BinaryOp<bit_or<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4161 return __val_expr<_Op>(_Op(bit_or<value_type>(),
4162 __scalar_expr<value_type>(__x, __y.size()), __y));
4163}
4164
4165template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004166inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004167typename enable_if
4168<
4169 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4170 __val_expr<_BinaryOp<__bit_shift_left<typename _Expr1::value_type>, _Expr1, _Expr2> >
4171>::type
4172operator<<(const _Expr1& __x, const _Expr2& __y)
4173{
4174 typedef typename _Expr1::value_type value_type;
4175 typedef _BinaryOp<__bit_shift_left<value_type>, _Expr1, _Expr2> _Op;
4176 return __val_expr<_Op>(_Op(__bit_shift_left<value_type>(), __x, __y));
4177}
4178
4179template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004180inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004181typename enable_if
4182<
4183 __is_val_expr<_Expr>::value,
4184 __val_expr<_BinaryOp<__bit_shift_left<typename _Expr::value_type>,
4185 _Expr, __scalar_expr<typename _Expr::value_type> > >
4186>::type
4187operator<<(const _Expr& __x, const typename _Expr::value_type& __y)
4188{
4189 typedef typename _Expr::value_type value_type;
4190 typedef _BinaryOp<__bit_shift_left<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4191 return __val_expr<_Op>(_Op(__bit_shift_left<value_type>(),
4192 __x, __scalar_expr<value_type>(__y, __x.size())));
4193}
4194
4195template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004196inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004197typename enable_if
4198<
4199 __is_val_expr<_Expr>::value,
4200 __val_expr<_BinaryOp<__bit_shift_left<typename _Expr::value_type>,
4201 __scalar_expr<typename _Expr::value_type>, _Expr> >
4202>::type
4203operator<<(const typename _Expr::value_type& __x, const _Expr& __y)
4204{
4205 typedef typename _Expr::value_type value_type;
4206 typedef _BinaryOp<__bit_shift_left<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4207 return __val_expr<_Op>(_Op(__bit_shift_left<value_type>(),
4208 __scalar_expr<value_type>(__x, __y.size()), __y));
4209}
4210
4211template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004212inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004213typename enable_if
4214<
4215 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4216 __val_expr<_BinaryOp<__bit_shift_right<typename _Expr1::value_type>, _Expr1, _Expr2> >
4217>::type
4218operator>>(const _Expr1& __x, const _Expr2& __y)
4219{
4220 typedef typename _Expr1::value_type value_type;
4221 typedef _BinaryOp<__bit_shift_right<value_type>, _Expr1, _Expr2> _Op;
4222 return __val_expr<_Op>(_Op(__bit_shift_right<value_type>(), __x, __y));
4223}
4224
4225template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004226inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004227typename enable_if
4228<
4229 __is_val_expr<_Expr>::value,
4230 __val_expr<_BinaryOp<__bit_shift_right<typename _Expr::value_type>,
4231 _Expr, __scalar_expr<typename _Expr::value_type> > >
4232>::type
4233operator>>(const _Expr& __x, const typename _Expr::value_type& __y)
4234{
4235 typedef typename _Expr::value_type value_type;
4236 typedef _BinaryOp<__bit_shift_right<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4237 return __val_expr<_Op>(_Op(__bit_shift_right<value_type>(),
4238 __x, __scalar_expr<value_type>(__y, __x.size())));
4239}
4240
4241template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004242inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004243typename enable_if
4244<
4245 __is_val_expr<_Expr>::value,
4246 __val_expr<_BinaryOp<__bit_shift_right<typename _Expr::value_type>,
4247 __scalar_expr<typename _Expr::value_type>, _Expr> >
4248>::type
4249operator>>(const typename _Expr::value_type& __x, const _Expr& __y)
4250{
4251 typedef typename _Expr::value_type value_type;
4252 typedef _BinaryOp<__bit_shift_right<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4253 return __val_expr<_Op>(_Op(__bit_shift_right<value_type>(),
4254 __scalar_expr<value_type>(__x, __y.size()), __y));
4255}
4256
4257template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004258inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004259typename enable_if
4260<
4261 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4262 __val_expr<_BinaryOp<logical_and<typename _Expr1::value_type>, _Expr1, _Expr2> >
4263>::type
4264operator&&(const _Expr1& __x, const _Expr2& __y)
4265{
4266 typedef typename _Expr1::value_type value_type;
4267 typedef _BinaryOp<logical_and<value_type>, _Expr1, _Expr2> _Op;
4268 return __val_expr<_Op>(_Op(logical_and<value_type>(), __x, __y));
4269}
4270
4271template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004272inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004273typename enable_if
4274<
4275 __is_val_expr<_Expr>::value,
4276 __val_expr<_BinaryOp<logical_and<typename _Expr::value_type>,
4277 _Expr, __scalar_expr<typename _Expr::value_type> > >
4278>::type
4279operator&&(const _Expr& __x, const typename _Expr::value_type& __y)
4280{
4281 typedef typename _Expr::value_type value_type;
4282 typedef _BinaryOp<logical_and<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4283 return __val_expr<_Op>(_Op(logical_and<value_type>(),
4284 __x, __scalar_expr<value_type>(__y, __x.size())));
4285}
4286
4287template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004288inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004289typename enable_if
4290<
4291 __is_val_expr<_Expr>::value,
4292 __val_expr<_BinaryOp<logical_and<typename _Expr::value_type>,
4293 __scalar_expr<typename _Expr::value_type>, _Expr> >
4294>::type
4295operator&&(const typename _Expr::value_type& __x, const _Expr& __y)
4296{
4297 typedef typename _Expr::value_type value_type;
4298 typedef _BinaryOp<logical_and<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4299 return __val_expr<_Op>(_Op(logical_and<value_type>(),
4300 __scalar_expr<value_type>(__x, __y.size()), __y));
4301}
4302
4303template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004304inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004305typename enable_if
4306<
4307 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4308 __val_expr<_BinaryOp<logical_or<typename _Expr1::value_type>, _Expr1, _Expr2> >
4309>::type
4310operator||(const _Expr1& __x, const _Expr2& __y)
4311{
4312 typedef typename _Expr1::value_type value_type;
4313 typedef _BinaryOp<logical_or<value_type>, _Expr1, _Expr2> _Op;
4314 return __val_expr<_Op>(_Op(logical_or<value_type>(), __x, __y));
4315}
4316
4317template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004318inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004319typename enable_if
4320<
4321 __is_val_expr<_Expr>::value,
4322 __val_expr<_BinaryOp<logical_or<typename _Expr::value_type>,
4323 _Expr, __scalar_expr<typename _Expr::value_type> > >
4324>::type
4325operator||(const _Expr& __x, const typename _Expr::value_type& __y)
4326{
4327 typedef typename _Expr::value_type value_type;
4328 typedef _BinaryOp<logical_or<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4329 return __val_expr<_Op>(_Op(logical_or<value_type>(),
4330 __x, __scalar_expr<value_type>(__y, __x.size())));
4331}
4332
4333template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004334inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004335typename enable_if
4336<
4337 __is_val_expr<_Expr>::value,
4338 __val_expr<_BinaryOp<logical_or<typename _Expr::value_type>,
4339 __scalar_expr<typename _Expr::value_type>, _Expr> >
4340>::type
4341operator||(const typename _Expr::value_type& __x, const _Expr& __y)
4342{
4343 typedef typename _Expr::value_type value_type;
4344 typedef _BinaryOp<logical_or<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4345 return __val_expr<_Op>(_Op(logical_or<value_type>(),
4346 __scalar_expr<value_type>(__x, __y.size()), __y));
4347}
4348
4349template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004350inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004351typename enable_if
4352<
4353 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4354 __val_expr<_BinaryOp<equal_to<typename _Expr1::value_type>, _Expr1, _Expr2> >
4355>::type
4356operator==(const _Expr1& __x, const _Expr2& __y)
4357{
4358 typedef typename _Expr1::value_type value_type;
4359 typedef _BinaryOp<equal_to<value_type>, _Expr1, _Expr2> _Op;
4360 return __val_expr<_Op>(_Op(equal_to<value_type>(), __x, __y));
4361}
4362
4363template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004364inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004365typename enable_if
4366<
4367 __is_val_expr<_Expr>::value,
4368 __val_expr<_BinaryOp<equal_to<typename _Expr::value_type>,
4369 _Expr, __scalar_expr<typename _Expr::value_type> > >
4370>::type
4371operator==(const _Expr& __x, const typename _Expr::value_type& __y)
4372{
4373 typedef typename _Expr::value_type value_type;
4374 typedef _BinaryOp<equal_to<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4375 return __val_expr<_Op>(_Op(equal_to<value_type>(),
4376 __x, __scalar_expr<value_type>(__y, __x.size())));
4377}
4378
4379template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004380inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004381typename enable_if
4382<
4383 __is_val_expr<_Expr>::value,
4384 __val_expr<_BinaryOp<equal_to<typename _Expr::value_type>,
4385 __scalar_expr<typename _Expr::value_type>, _Expr> >
4386>::type
4387operator==(const typename _Expr::value_type& __x, const _Expr& __y)
4388{
4389 typedef typename _Expr::value_type value_type;
4390 typedef _BinaryOp<equal_to<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4391 return __val_expr<_Op>(_Op(equal_to<value_type>(),
4392 __scalar_expr<value_type>(__x, __y.size()), __y));
4393}
4394
4395template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004396inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004397typename enable_if
4398<
4399 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4400 __val_expr<_BinaryOp<not_equal_to<typename _Expr1::value_type>, _Expr1, _Expr2> >
4401>::type
4402operator!=(const _Expr1& __x, const _Expr2& __y)
4403{
4404 typedef typename _Expr1::value_type value_type;
4405 typedef _BinaryOp<not_equal_to<value_type>, _Expr1, _Expr2> _Op;
4406 return __val_expr<_Op>(_Op(not_equal_to<value_type>(), __x, __y));
4407}
4408
4409template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004410inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004411typename enable_if
4412<
4413 __is_val_expr<_Expr>::value,
4414 __val_expr<_BinaryOp<not_equal_to<typename _Expr::value_type>,
4415 _Expr, __scalar_expr<typename _Expr::value_type> > >
4416>::type
4417operator!=(const _Expr& __x, const typename _Expr::value_type& __y)
4418{
4419 typedef typename _Expr::value_type value_type;
4420 typedef _BinaryOp<not_equal_to<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4421 return __val_expr<_Op>(_Op(not_equal_to<value_type>(),
4422 __x, __scalar_expr<value_type>(__y, __x.size())));
4423}
4424
4425template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004426inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004427typename enable_if
4428<
4429 __is_val_expr<_Expr>::value,
4430 __val_expr<_BinaryOp<not_equal_to<typename _Expr::value_type>,
4431 __scalar_expr<typename _Expr::value_type>, _Expr> >
4432>::type
4433operator!=(const typename _Expr::value_type& __x, const _Expr& __y)
4434{
4435 typedef typename _Expr::value_type value_type;
4436 typedef _BinaryOp<not_equal_to<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4437 return __val_expr<_Op>(_Op(not_equal_to<value_type>(),
4438 __scalar_expr<value_type>(__x, __y.size()), __y));
4439}
4440
4441template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004442inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004443typename enable_if
4444<
4445 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4446 __val_expr<_BinaryOp<less<typename _Expr1::value_type>, _Expr1, _Expr2> >
4447>::type
4448operator<(const _Expr1& __x, const _Expr2& __y)
4449{
4450 typedef typename _Expr1::value_type value_type;
4451 typedef _BinaryOp<less<value_type>, _Expr1, _Expr2> _Op;
4452 return __val_expr<_Op>(_Op(less<value_type>(), __x, __y));
4453}
4454
4455template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004456inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004457typename enable_if
4458<
4459 __is_val_expr<_Expr>::value,
4460 __val_expr<_BinaryOp<less<typename _Expr::value_type>,
4461 _Expr, __scalar_expr<typename _Expr::value_type> > >
4462>::type
4463operator<(const _Expr& __x, const typename _Expr::value_type& __y)
4464{
4465 typedef typename _Expr::value_type value_type;
4466 typedef _BinaryOp<less<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4467 return __val_expr<_Op>(_Op(less<value_type>(),
4468 __x, __scalar_expr<value_type>(__y, __x.size())));
4469}
4470
4471template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004472inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004473typename enable_if
4474<
4475 __is_val_expr<_Expr>::value,
4476 __val_expr<_BinaryOp<less<typename _Expr::value_type>,
4477 __scalar_expr<typename _Expr::value_type>, _Expr> >
4478>::type
4479operator<(const typename _Expr::value_type& __x, const _Expr& __y)
4480{
4481 typedef typename _Expr::value_type value_type;
4482 typedef _BinaryOp<less<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4483 return __val_expr<_Op>(_Op(less<value_type>(),
4484 __scalar_expr<value_type>(__x, __y.size()), __y));
4485}
4486
4487template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004488inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004489typename enable_if
4490<
4491 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4492 __val_expr<_BinaryOp<greater<typename _Expr1::value_type>, _Expr1, _Expr2> >
4493>::type
4494operator>(const _Expr1& __x, const _Expr2& __y)
4495{
4496 typedef typename _Expr1::value_type value_type;
4497 typedef _BinaryOp<greater<value_type>, _Expr1, _Expr2> _Op;
4498 return __val_expr<_Op>(_Op(greater<value_type>(), __x, __y));
4499}
4500
4501template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004502inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004503typename enable_if
4504<
4505 __is_val_expr<_Expr>::value,
4506 __val_expr<_BinaryOp<greater<typename _Expr::value_type>,
4507 _Expr, __scalar_expr<typename _Expr::value_type> > >
4508>::type
4509operator>(const _Expr& __x, const typename _Expr::value_type& __y)
4510{
4511 typedef typename _Expr::value_type value_type;
4512 typedef _BinaryOp<greater<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4513 return __val_expr<_Op>(_Op(greater<value_type>(),
4514 __x, __scalar_expr<value_type>(__y, __x.size())));
4515}
4516
4517template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004518inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004519typename enable_if
4520<
4521 __is_val_expr<_Expr>::value,
4522 __val_expr<_BinaryOp<greater<typename _Expr::value_type>,
4523 __scalar_expr<typename _Expr::value_type>, _Expr> >
4524>::type
4525operator>(const typename _Expr::value_type& __x, const _Expr& __y)
4526{
4527 typedef typename _Expr::value_type value_type;
4528 typedef _BinaryOp<greater<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4529 return __val_expr<_Op>(_Op(greater<value_type>(),
4530 __scalar_expr<value_type>(__x, __y.size()), __y));
4531}
4532
4533template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004534inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004535typename enable_if
4536<
4537 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4538 __val_expr<_BinaryOp<less_equal<typename _Expr1::value_type>, _Expr1, _Expr2> >
4539>::type
4540operator<=(const _Expr1& __x, const _Expr2& __y)
4541{
4542 typedef typename _Expr1::value_type value_type;
4543 typedef _BinaryOp<less_equal<value_type>, _Expr1, _Expr2> _Op;
4544 return __val_expr<_Op>(_Op(less_equal<value_type>(), __x, __y));
4545}
4546
4547template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004548inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004549typename enable_if
4550<
4551 __is_val_expr<_Expr>::value,
4552 __val_expr<_BinaryOp<less_equal<typename _Expr::value_type>,
4553 _Expr, __scalar_expr<typename _Expr::value_type> > >
4554>::type
4555operator<=(const _Expr& __x, const typename _Expr::value_type& __y)
4556{
4557 typedef typename _Expr::value_type value_type;
4558 typedef _BinaryOp<less_equal<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4559 return __val_expr<_Op>(_Op(less_equal<value_type>(),
4560 __x, __scalar_expr<value_type>(__y, __x.size())));
4561}
4562
4563template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004564inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004565typename enable_if
4566<
4567 __is_val_expr<_Expr>::value,
4568 __val_expr<_BinaryOp<less_equal<typename _Expr::value_type>,
4569 __scalar_expr<typename _Expr::value_type>, _Expr> >
4570>::type
4571operator<=(const typename _Expr::value_type& __x, const _Expr& __y)
4572{
4573 typedef typename _Expr::value_type value_type;
4574 typedef _BinaryOp<less_equal<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4575 return __val_expr<_Op>(_Op(less_equal<value_type>(),
4576 __scalar_expr<value_type>(__x, __y.size()), __y));
4577}
4578
4579template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004580inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004581typename enable_if
4582<
4583 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4584 __val_expr<_BinaryOp<greater_equal<typename _Expr1::value_type>, _Expr1, _Expr2> >
4585>::type
4586operator>=(const _Expr1& __x, const _Expr2& __y)
4587{
4588 typedef typename _Expr1::value_type value_type;
4589 typedef _BinaryOp<greater_equal<value_type>, _Expr1, _Expr2> _Op;
4590 return __val_expr<_Op>(_Op(greater_equal<value_type>(), __x, __y));
4591}
4592
4593template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004594inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004595typename enable_if
4596<
4597 __is_val_expr<_Expr>::value,
4598 __val_expr<_BinaryOp<greater_equal<typename _Expr::value_type>,
4599 _Expr, __scalar_expr<typename _Expr::value_type> > >
4600>::type
4601operator>=(const _Expr& __x, const typename _Expr::value_type& __y)
4602{
4603 typedef typename _Expr::value_type value_type;
4604 typedef _BinaryOp<greater_equal<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4605 return __val_expr<_Op>(_Op(greater_equal<value_type>(),
4606 __x, __scalar_expr<value_type>(__y, __x.size())));
4607}
4608
4609template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004610inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004611typename enable_if
4612<
4613 __is_val_expr<_Expr>::value,
4614 __val_expr<_BinaryOp<greater_equal<typename _Expr::value_type>,
4615 __scalar_expr<typename _Expr::value_type>, _Expr> >
4616>::type
4617operator>=(const typename _Expr::value_type& __x, const _Expr& __y)
4618{
4619 typedef typename _Expr::value_type value_type;
4620 typedef _BinaryOp<greater_equal<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4621 return __val_expr<_Op>(_Op(greater_equal<value_type>(),
4622 __scalar_expr<value_type>(__x, __y.size()), __y));
4623}
4624
4625template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004626inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004627typename enable_if
4628<
4629 __is_val_expr<_Expr>::value,
4630 __val_expr<_UnaryOp<__abs_expr<typename _Expr::value_type>, _Expr> >
4631>::type
4632abs(const _Expr& __x)
4633{
4634 typedef typename _Expr::value_type value_type;
4635 typedef _UnaryOp<__abs_expr<value_type>, _Expr> _Op;
4636 return __val_expr<_Op>(_Op(__abs_expr<value_type>(), __x));
4637}
4638
4639template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004640inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004641typename enable_if
4642<
4643 __is_val_expr<_Expr>::value,
4644 __val_expr<_UnaryOp<__acos_expr<typename _Expr::value_type>, _Expr> >
4645>::type
4646acos(const _Expr& __x)
4647{
4648 typedef typename _Expr::value_type value_type;
4649 typedef _UnaryOp<__acos_expr<value_type>, _Expr> _Op;
4650 return __val_expr<_Op>(_Op(__acos_expr<value_type>(), __x));
4651}
4652
4653template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004654inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004655typename enable_if
4656<
4657 __is_val_expr<_Expr>::value,
4658 __val_expr<_UnaryOp<__asin_expr<typename _Expr::value_type>, _Expr> >
4659>::type
4660asin(const _Expr& __x)
4661{
4662 typedef typename _Expr::value_type value_type;
4663 typedef _UnaryOp<__asin_expr<value_type>, _Expr> _Op;
4664 return __val_expr<_Op>(_Op(__asin_expr<value_type>(), __x));
4665}
4666
4667template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004668inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004669typename enable_if
4670<
4671 __is_val_expr<_Expr>::value,
4672 __val_expr<_UnaryOp<__atan_expr<typename _Expr::value_type>, _Expr> >
4673>::type
4674atan(const _Expr& __x)
4675{
4676 typedef typename _Expr::value_type value_type;
4677 typedef _UnaryOp<__atan_expr<value_type>, _Expr> _Op;
4678 return __val_expr<_Op>(_Op(__atan_expr<value_type>(), __x));
4679}
4680
4681template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004682inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004683typename enable_if
4684<
4685 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4686 __val_expr<_BinaryOp<__atan2_expr<typename _Expr1::value_type>, _Expr1, _Expr2> >
4687>::type
4688atan2(const _Expr1& __x, const _Expr2& __y)
4689{
4690 typedef typename _Expr1::value_type value_type;
4691 typedef _BinaryOp<__atan2_expr<value_type>, _Expr1, _Expr2> _Op;
4692 return __val_expr<_Op>(_Op(__atan2_expr<value_type>(), __x, __y));
4693}
4694
4695template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004696inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004697typename enable_if
4698<
4699 __is_val_expr<_Expr>::value,
4700 __val_expr<_BinaryOp<__atan2_expr<typename _Expr::value_type>,
4701 _Expr, __scalar_expr<typename _Expr::value_type> > >
4702>::type
4703atan2(const _Expr& __x, const typename _Expr::value_type& __y)
4704{
4705 typedef typename _Expr::value_type value_type;
4706 typedef _BinaryOp<__atan2_expr<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4707 return __val_expr<_Op>(_Op(__atan2_expr<value_type>(),
4708 __x, __scalar_expr<value_type>(__y, __x.size())));
4709}
4710
4711template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004712inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004713typename enable_if
4714<
4715 __is_val_expr<_Expr>::value,
4716 __val_expr<_BinaryOp<__atan2_expr<typename _Expr::value_type>,
4717 __scalar_expr<typename _Expr::value_type>, _Expr> >
4718>::type
4719atan2(const typename _Expr::value_type& __x, const _Expr& __y)
4720{
4721 typedef typename _Expr::value_type value_type;
4722 typedef _BinaryOp<__atan2_expr<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4723 return __val_expr<_Op>(_Op(__atan2_expr<value_type>(),
4724 __scalar_expr<value_type>(__x, __y.size()), __y));
4725}
4726
4727template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004728inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004729typename enable_if
4730<
4731 __is_val_expr<_Expr>::value,
4732 __val_expr<_UnaryOp<__cos_expr<typename _Expr::value_type>, _Expr> >
4733>::type
4734cos(const _Expr& __x)
4735{
4736 typedef typename _Expr::value_type value_type;
4737 typedef _UnaryOp<__cos_expr<value_type>, _Expr> _Op;
4738 return __val_expr<_Op>(_Op(__cos_expr<value_type>(), __x));
4739}
4740
4741template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004742inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004743typename enable_if
4744<
4745 __is_val_expr<_Expr>::value,
4746 __val_expr<_UnaryOp<__cosh_expr<typename _Expr::value_type>, _Expr> >
4747>::type
4748cosh(const _Expr& __x)
4749{
4750 typedef typename _Expr::value_type value_type;
4751 typedef _UnaryOp<__cosh_expr<value_type>, _Expr> _Op;
4752 return __val_expr<_Op>(_Op(__cosh_expr<value_type>(), __x));
4753}
4754
4755template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004756inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004757typename enable_if
4758<
4759 __is_val_expr<_Expr>::value,
4760 __val_expr<_UnaryOp<__exp_expr<typename _Expr::value_type>, _Expr> >
4761>::type
4762exp(const _Expr& __x)
4763{
4764 typedef typename _Expr::value_type value_type;
4765 typedef _UnaryOp<__exp_expr<value_type>, _Expr> _Op;
4766 return __val_expr<_Op>(_Op(__exp_expr<value_type>(), __x));
4767}
4768
4769template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004770inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004771typename enable_if
4772<
4773 __is_val_expr<_Expr>::value,
4774 __val_expr<_UnaryOp<__log_expr<typename _Expr::value_type>, _Expr> >
4775>::type
4776log(const _Expr& __x)
4777{
4778 typedef typename _Expr::value_type value_type;
4779 typedef _UnaryOp<__log_expr<value_type>, _Expr> _Op;
4780 return __val_expr<_Op>(_Op(__log_expr<value_type>(), __x));
4781}
4782
4783template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004784inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004785typename enable_if
4786<
4787 __is_val_expr<_Expr>::value,
4788 __val_expr<_UnaryOp<__log10_expr<typename _Expr::value_type>, _Expr> >
4789>::type
4790log10(const _Expr& __x)
4791{
4792 typedef typename _Expr::value_type value_type;
4793 typedef _UnaryOp<__log10_expr<value_type>, _Expr> _Op;
4794 return __val_expr<_Op>(_Op(__log10_expr<value_type>(), __x));
4795}
4796
4797template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004798inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004799typename enable_if
4800<
4801 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4802 __val_expr<_BinaryOp<__pow_expr<typename _Expr1::value_type>, _Expr1, _Expr2> >
4803>::type
4804pow(const _Expr1& __x, const _Expr2& __y)
4805{
4806 typedef typename _Expr1::value_type value_type;
4807 typedef _BinaryOp<__pow_expr<value_type>, _Expr1, _Expr2> _Op;
4808 return __val_expr<_Op>(_Op(__pow_expr<value_type>(), __x, __y));
4809}
4810
4811template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004812inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004813typename enable_if
4814<
4815 __is_val_expr<_Expr>::value,
4816 __val_expr<_BinaryOp<__pow_expr<typename _Expr::value_type>,
4817 _Expr, __scalar_expr<typename _Expr::value_type> > >
4818>::type
4819pow(const _Expr& __x, const typename _Expr::value_type& __y)
4820{
4821 typedef typename _Expr::value_type value_type;
4822 typedef _BinaryOp<__pow_expr<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4823 return __val_expr<_Op>(_Op(__pow_expr<value_type>(),
4824 __x, __scalar_expr<value_type>(__y, __x.size())));
4825}
4826
4827template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004828inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004829typename enable_if
4830<
4831 __is_val_expr<_Expr>::value,
4832 __val_expr<_BinaryOp<__pow_expr<typename _Expr::value_type>,
4833 __scalar_expr<typename _Expr::value_type>, _Expr> >
4834>::type
4835pow(const typename _Expr::value_type& __x, const _Expr& __y)
4836{
4837 typedef typename _Expr::value_type value_type;
4838 typedef _BinaryOp<__pow_expr<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4839 return __val_expr<_Op>(_Op(__pow_expr<value_type>(),
4840 __scalar_expr<value_type>(__x, __y.size()), __y));
4841}
4842
4843template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004844inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004845typename enable_if
4846<
4847 __is_val_expr<_Expr>::value,
4848 __val_expr<_UnaryOp<__sin_expr<typename _Expr::value_type>, _Expr> >
4849>::type
4850sin(const _Expr& __x)
4851{
4852 typedef typename _Expr::value_type value_type;
4853 typedef _UnaryOp<__sin_expr<value_type>, _Expr> _Op;
4854 return __val_expr<_Op>(_Op(__sin_expr<value_type>(), __x));
4855}
4856
4857template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004858inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004859typename enable_if
4860<
4861 __is_val_expr<_Expr>::value,
4862 __val_expr<_UnaryOp<__sinh_expr<typename _Expr::value_type>, _Expr> >
4863>::type
4864sinh(const _Expr& __x)
4865{
4866 typedef typename _Expr::value_type value_type;
4867 typedef _UnaryOp<__sinh_expr<value_type>, _Expr> _Op;
4868 return __val_expr<_Op>(_Op(__sinh_expr<value_type>(), __x));
4869}
4870
4871template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004872inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004873typename enable_if
4874<
4875 __is_val_expr<_Expr>::value,
4876 __val_expr<_UnaryOp<__sqrt_expr<typename _Expr::value_type>, _Expr> >
4877>::type
4878sqrt(const _Expr& __x)
4879{
4880 typedef typename _Expr::value_type value_type;
4881 typedef _UnaryOp<__sqrt_expr<value_type>, _Expr> _Op;
4882 return __val_expr<_Op>(_Op(__sqrt_expr<value_type>(), __x));
4883}
4884
4885template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004886inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004887typename enable_if
4888<
4889 __is_val_expr<_Expr>::value,
4890 __val_expr<_UnaryOp<__tan_expr<typename _Expr::value_type>, _Expr> >
4891>::type
4892tan(const _Expr& __x)
4893{
4894 typedef typename _Expr::value_type value_type;
4895 typedef _UnaryOp<__tan_expr<value_type>, _Expr> _Op;
4896 return __val_expr<_Op>(_Op(__tan_expr<value_type>(), __x));
4897}
4898
4899template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004900inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004901typename enable_if
4902<
4903 __is_val_expr<_Expr>::value,
4904 __val_expr<_UnaryOp<__tanh_expr<typename _Expr::value_type>, _Expr> >
4905>::type
4906tanh(const _Expr& __x)
4907{
4908 typedef typename _Expr::value_type value_type;
4909 typedef _UnaryOp<__tanh_expr<value_type>, _Expr> _Op;
4910 return __val_expr<_Op>(_Op(__tanh_expr<value_type>(), __x));
4911}
4912
4913template <class _Tp>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004914inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004915_Tp*
4916begin(valarray<_Tp>& __v)
4917{
4918 return __v.__begin_;
4919}
4920
4921template <class _Tp>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004922inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004923const _Tp*
4924begin(const valarray<_Tp>& __v)
4925{
4926 return __v.__begin_;
4927}
4928
4929template <class _Tp>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004930inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004931_Tp*
4932end(valarray<_Tp>& __v)
4933{
4934 return __v.__end_;
4935}
4936
4937template <class _Tp>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004938inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004939const _Tp*
4940end(const valarray<_Tp>& __v)
4941{
4942 return __v.__end_;
4943}
4944
Howard Hinnantc51e1022010-05-11 19:42:16 +00004945_LIBCPP_END_NAMESPACE_STD
4946
Eric Fiselierf4433a32017-05-31 22:07:49 +00004947_LIBCPP_POP_MACROS
4948
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04004949#endif // _LIBCPP_VALARRAY