blob: 909e0422c476d23752893dc0f278cefdd4794e74 [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
344#include <__config>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000345#include <algorithm>
Arthur O'Dwyeref181602021-05-19 11:57:04 -0400346#include <cmath>
347#include <cstddef>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000348#include <functional>
Arthur O'Dwyeref181602021-05-19 11:57:04 -0400349#include <initializer_list>
Richard Smith1f1c1472014-06-04 19:54:15 +0000350#include <new>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000351
Howard Hinnantaaaa52b2011-10-17 20:05:10 +0000352#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000353#pragma GCC system_header
Howard Hinnantaaaa52b2011-10-17 20:05:10 +0000354#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +0000355
Eric Fiselierf4433a32017-05-31 22:07:49 +0000356_LIBCPP_PUSH_MACROS
357#include <__undef_macros>
358
Howard Hinnantc51e1022010-05-11 19:42:16 +0000359_LIBCPP_BEGIN_NAMESPACE_STD
360
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000361template<class _Tp> class _LIBCPP_TEMPLATE_VIS valarray;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000362
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000363class _LIBCPP_TEMPLATE_VIS slice
Howard Hinnantc51e1022010-05-11 19:42:16 +0000364{
365 size_t __start_;
366 size_t __size_;
367 size_t __stride_;
368public:
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000369 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000370 slice()
371 : __start_(0),
372 __size_(0),
373 __stride_(0)
374 {}
375
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000376 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000377 slice(size_t __start, size_t __size, size_t __stride)
378 : __start_(__start),
379 __size_(__size),
380 __stride_(__stride)
381 {}
382
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000383 _LIBCPP_INLINE_VISIBILITY size_t start() const {return __start_;}
384 _LIBCPP_INLINE_VISIBILITY size_t size() const {return __size_;}
385 _LIBCPP_INLINE_VISIBILITY size_t stride() const {return __stride_;}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000386};
387
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000388template <class _Tp> class _LIBCPP_TEMPLATE_VIS slice_array;
Howard Hinnant8331b762013-03-06 23:30:19 +0000389class _LIBCPP_TYPE_VIS gslice;
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000390template <class _Tp> class _LIBCPP_TEMPLATE_VIS gslice_array;
391template <class _Tp> class _LIBCPP_TEMPLATE_VIS mask_array;
392template <class _Tp> class _LIBCPP_TEMPLATE_VIS indirect_array;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000393
394template <class _Tp>
Howard Hinnanta54386e2012-09-14 00:39:16 +0000395_LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000396_Tp*
397begin(valarray<_Tp>& __v);
398
399template <class _Tp>
Howard Hinnanta54386e2012-09-14 00:39:16 +0000400_LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000401const _Tp*
402begin(const valarray<_Tp>& __v);
403
404template <class _Tp>
Howard Hinnanta54386e2012-09-14 00:39:16 +0000405_LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000406_Tp*
407end(valarray<_Tp>& __v);
408
409template <class _Tp>
Howard Hinnanta54386e2012-09-14 00:39:16 +0000410_LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000411const _Tp*
412end(const valarray<_Tp>& __v);
413
414template <class _Op, class _A0>
415struct _UnaryOp
416{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400417 typedef typename _Op::__result_type __result_type;
Arthur O'Dwyer0b6c2482021-05-31 11:33:51 -0400418 typedef typename decay<__result_type>::type value_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000419
420 _Op __op_;
421 _A0 __a0_;
422
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000423 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000424 _UnaryOp(const _Op& __op, const _A0& __a0) : __op_(__op), __a0_(__a0) {}
425
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000426 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400427 __result_type operator[](size_t __i) const {return __op_(__a0_[__i]);}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000428
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000429 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000430 size_t size() const {return __a0_.size();}
431};
432
433template <class _Op, class _A0, class _A1>
434struct _BinaryOp
435{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400436 typedef typename _Op::__result_type __result_type;
Arthur O'Dwyer0b6c2482021-05-31 11:33:51 -0400437 typedef typename decay<__result_type>::type value_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000438
439 _Op __op_;
440 _A0 __a0_;
441 _A1 __a1_;
442
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000443 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000444 _BinaryOp(const _Op& __op, const _A0& __a0, const _A1& __a1)
445 : __op_(__op), __a0_(__a0), __a1_(__a1) {}
446
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000447 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer0b6c2482021-05-31 11:33:51 -0400448 __result_type operator[](size_t __i) const {return __op_(__a0_[__i], __a1_[__i]);}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000449
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000450 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000451 size_t size() const {return __a0_.size();}
452};
453
454template <class _Tp>
455class __scalar_expr
456{
457public:
458 typedef _Tp value_type;
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400459 typedef const _Tp& __result_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000460private:
461 const value_type& __t_;
462 size_t __s_;
463public:
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000464 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000465 explicit __scalar_expr(const value_type& __t, size_t __s) : __t_(__t), __s_(__s) {}
466
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000467 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400468 __result_type operator[](size_t) const {return __t_;}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000469
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000470 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000471 size_t size() const {return __s_;}
472};
473
474template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400475struct __unary_plus
Howard Hinnantc51e1022010-05-11 19:42:16 +0000476{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400477 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000478 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000479 _Tp operator()(const _Tp& __x) const
480 {return +__x;}
481};
482
483template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400484struct __bit_not
Howard Hinnantc51e1022010-05-11 19:42:16 +0000485{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400486 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000487 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000488 _Tp operator()(const _Tp& __x) const
489 {return ~__x;}
490};
491
492template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400493struct __bit_shift_left
Howard Hinnantc51e1022010-05-11 19:42:16 +0000494{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400495 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000496 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000497 _Tp operator()(const _Tp& __x, const _Tp& __y) const
498 {return __x << __y;}
499};
500
501template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400502struct __bit_shift_right
Howard Hinnantc51e1022010-05-11 19:42:16 +0000503{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400504 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000505 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000506 _Tp operator()(const _Tp& __x, const _Tp& __y) const
507 {return __x >> __y;}
508};
509
Howard Hinnantc834c512011-11-29 18:15:50 +0000510template <class _Tp, class _Fp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400511struct __apply_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000512{
513private:
Howard Hinnantc834c512011-11-29 18:15:50 +0000514 _Fp __f_;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000515public:
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400516 typedef _Tp __result_type;
517
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000518 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc834c512011-11-29 18:15:50 +0000519 explicit __apply_expr(_Fp __f) : __f_(__f) {}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000520
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000521 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000522 _Tp operator()(const _Tp& __x) const
523 {return __f_(__x);}
524};
525
526template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400527struct __abs_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000528{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400529 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000530 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000531 _Tp operator()(const _Tp& __x) const
532 {return abs(__x);}
533};
534
535template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400536struct __acos_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000537{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400538 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000539 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000540 _Tp operator()(const _Tp& __x) const
541 {return acos(__x);}
542};
543
544template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400545struct __asin_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000546{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400547 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000548 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000549 _Tp operator()(const _Tp& __x) const
550 {return asin(__x);}
551};
552
553template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400554struct __atan_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000555{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400556 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000557 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000558 _Tp operator()(const _Tp& __x) const
559 {return atan(__x);}
560};
561
562template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400563struct __atan2_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000564{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400565 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000566 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000567 _Tp operator()(const _Tp& __x, const _Tp& __y) const
568 {return atan2(__x, __y);}
569};
570
571template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400572struct __cos_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000573{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400574 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000575 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000576 _Tp operator()(const _Tp& __x) const
577 {return cos(__x);}
578};
579
580template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400581struct __cosh_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000582{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400583 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000584 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000585 _Tp operator()(const _Tp& __x) const
586 {return cosh(__x);}
587};
588
589template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400590struct __exp_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000591{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400592 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000593 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000594 _Tp operator()(const _Tp& __x) const
595 {return exp(__x);}
596};
597
598template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400599struct __log_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000600{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400601 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000602 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000603 _Tp operator()(const _Tp& __x) const
604 {return log(__x);}
605};
606
607template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400608struct __log10_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000609{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400610 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000611 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000612 _Tp operator()(const _Tp& __x) const
613 {return log10(__x);}
614};
615
616template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400617struct __pow_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000618{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400619 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000620 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000621 _Tp operator()(const _Tp& __x, const _Tp& __y) const
622 {return pow(__x, __y);}
623};
624
625template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400626struct __sin_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000627{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400628 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000629 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000630 _Tp operator()(const _Tp& __x) const
631 {return sin(__x);}
632};
633
634template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400635struct __sinh_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000636{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400637 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000638 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000639 _Tp operator()(const _Tp& __x) const
640 {return sinh(__x);}
641};
642
643template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400644struct __sqrt_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000645{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400646 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000647 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000648 _Tp operator()(const _Tp& __x) const
649 {return sqrt(__x);}
650};
651
652template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400653struct __tan_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000654{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400655 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000656 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000657 _Tp operator()(const _Tp& __x) const
658 {return tan(__x);}
659};
660
661template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400662struct __tanh_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000663{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400664 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000665 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000666 _Tp operator()(const _Tp& __x) const
667 {return tanh(__x);}
668};
669
670template <class _ValExpr>
671class __slice_expr
672{
673 typedef typename remove_reference<_ValExpr>::type _RmExpr;
674public:
675 typedef typename _RmExpr::value_type value_type;
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400676 typedef value_type __result_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000677
678private:
679 _ValExpr __expr_;
680 size_t __start_;
681 size_t __size_;
682 size_t __stride_;
683
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000684 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000685 __slice_expr(const slice& __sl, const _RmExpr& __e)
686 : __expr_(__e),
687 __start_(__sl.start()),
688 __size_(__sl.size()),
689 __stride_(__sl.stride())
690 {}
691public:
692
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000693 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400694 __result_type operator[](size_t __i) const
Howard Hinnantc51e1022010-05-11 19:42:16 +0000695 {return __expr_[__start_ + __i * __stride_];}
696
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000697 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000698 size_t size() const {return __size_;}
699
Eric Fiselier7b31ed02019-04-02 08:05:23 +0000700 template <class> friend class __val_expr;
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000701 template <class> friend class _LIBCPP_TEMPLATE_VIS valarray;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000702};
703
704template <class _ValExpr>
705class __mask_expr;
706
707template <class _ValExpr>
708class __indirect_expr;
709
710template <class _ValExpr>
711class __shift_expr
712{
713 typedef typename remove_reference<_ValExpr>::type _RmExpr;
714public:
715 typedef typename _RmExpr::value_type value_type;
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400716 typedef value_type __result_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000717
718private:
719 _ValExpr __expr_;
720 size_t __size_;
721 ptrdiff_t __ul_;
722 ptrdiff_t __sn_;
723 ptrdiff_t __n_;
Howard Hinnantc834c512011-11-29 18:15:50 +0000724 static const ptrdiff_t _Np = static_cast<ptrdiff_t>(
Howard Hinnantc51e1022010-05-11 19:42:16 +0000725 sizeof(ptrdiff_t) * __CHAR_BIT__ - 1);
726
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000727 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000728 __shift_expr(int __n, const _RmExpr& __e)
729 : __expr_(__e),
730 __size_(__e.size()),
731 __n_(__n)
732 {
Howard Hinnantc834c512011-11-29 18:15:50 +0000733 ptrdiff_t __neg_n = static_cast<ptrdiff_t>(__n_ >> _Np);
734 __sn_ = __neg_n | static_cast<ptrdiff_t>(static_cast<size_t>(-__n_) >> _Np);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000735 __ul_ = ((__size_ - __n_) & ~__neg_n) | ((__n_ + 1) & __neg_n);
736 }
737public:
738
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000739 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400740 __result_type operator[](size_t __j) const
Howard Hinnantc51e1022010-05-11 19:42:16 +0000741 {
Howard Hinnant28b24882011-12-01 20:21:04 +0000742 ptrdiff_t __i = static_cast<ptrdiff_t>(__j);
Howard Hinnantc834c512011-11-29 18:15:50 +0000743 ptrdiff_t __m = (__sn_ * __i - __ul_) >> _Np;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000744 return (__expr_[(__i + __n_) & __m] & __m) | (value_type() & ~__m);
745 }
746
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000747 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000748 size_t size() const {return __size_;}
749
750 template <class> friend class __val_expr;
751};
752
753template <class _ValExpr>
754class __cshift_expr
755{
756 typedef typename remove_reference<_ValExpr>::type _RmExpr;
757public:
758 typedef typename _RmExpr::value_type value_type;
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400759 typedef value_type __result_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000760
761private:
762 _ValExpr __expr_;
763 size_t __size_;
764 size_t __m_;
765 size_t __o1_;
766 size_t __o2_;
767
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000768 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000769 __cshift_expr(int __n, const _RmExpr& __e)
770 : __expr_(__e),
771 __size_(__e.size())
772 {
773 __n %= static_cast<int>(__size_);
774 if (__n >= 0)
775 {
776 __m_ = __size_ - __n;
777 __o1_ = __n;
778 __o2_ = __n - __size_;
779 }
780 else
781 {
782 __m_ = -__n;
783 __o1_ = __n + __size_;
784 __o2_ = __n;
785 }
786 }
787public:
788
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000789 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400790 __result_type operator[](size_t __i) const
Howard Hinnantc51e1022010-05-11 19:42:16 +0000791 {
792 if (__i < __m_)
793 return __expr_[__i + __o1_];
794 return __expr_[__i + __o2_];
795 }
796
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000797 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000798 size_t size() const {return __size_;}
799
800 template <class> friend class __val_expr;
801};
802
803template<class _ValExpr>
804class __val_expr;
805
806template<class _ValExpr>
807struct __is_val_expr : false_type {};
808
809template<class _ValExpr>
810struct __is_val_expr<__val_expr<_ValExpr> > : true_type {};
811
812template<class _Tp>
813struct __is_val_expr<valarray<_Tp> > : true_type {};
814
815template<class _Tp>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000816class _LIBCPP_TEMPLATE_VIS valarray
Howard Hinnantc51e1022010-05-11 19:42:16 +0000817{
818public:
819 typedef _Tp value_type;
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400820 typedef _Tp __result_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000821
822private:
823 value_type* __begin_;
824 value_type* __end_;
825
826public:
827 // construct/destroy:
Douglas Gregor68902322012-05-19 07:14:17 +0000828 _LIBCPP_INLINE_VISIBILITY
Bruce Mitchener170d8972020-11-24 12:53:53 -0500829 valarray() : __begin_(nullptr), __end_(nullptr) {}
Louis Dionneb4d05d72018-10-16 19:26:23 +0000830 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Eric Fiseliere529a802016-09-16 00:13:55 +0000831 explicit valarray(size_t __n);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000832 _LIBCPP_INLINE_VISIBILITY
Douglas Gregor68902322012-05-19 07:14:17 +0000833 valarray(const value_type& __x, size_t __n);
834 valarray(const value_type* __p, size_t __n);
835 valarray(const valarray& __v);
Eric Fiselier3b0b81f2017-04-19 00:23:45 +0000836#ifndef _LIBCPP_CXX03_LANG
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000837 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant298aed92012-07-21 00:51:28 +0000838 valarray(valarray&& __v) _NOEXCEPT;
Douglas Gregor68902322012-05-19 07:14:17 +0000839 valarray(initializer_list<value_type> __il);
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400840#endif // _LIBCPP_CXX03_LANG
Douglas Gregor68902322012-05-19 07:14:17 +0000841 valarray(const slice_array<value_type>& __sa);
842 valarray(const gslice_array<value_type>& __ga);
843 valarray(const mask_array<value_type>& __ma);
844 valarray(const indirect_array<value_type>& __ia);
Louis Dionneb4d05d72018-10-16 19:26:23 +0000845 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Douglas Gregor68902322012-05-19 07:14:17 +0000846 ~valarray();
Howard Hinnantc51e1022010-05-11 19:42:16 +0000847
848 // assignment:
Douglas Gregor68902322012-05-19 07:14:17 +0000849 valarray& operator=(const valarray& __v);
Eric Fiselier3b0b81f2017-04-19 00:23:45 +0000850#ifndef _LIBCPP_CXX03_LANG
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000851 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant298aed92012-07-21 00:51:28 +0000852 valarray& operator=(valarray&& __v) _NOEXCEPT;
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000853 _LIBCPP_INLINE_VISIBILITY
Douglas Gregor68902322012-05-19 07:14:17 +0000854 valarray& operator=(initializer_list<value_type>);
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400855#endif // _LIBCPP_CXX03_LANG
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000856 _LIBCPP_INLINE_VISIBILITY
Douglas Gregor68902322012-05-19 07:14:17 +0000857 valarray& operator=(const value_type& __x);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000858 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000859 valarray& operator=(const slice_array<value_type>& __sa);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000860 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000861 valarray& operator=(const gslice_array<value_type>& __ga);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000862 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000863 valarray& operator=(const mask_array<value_type>& __ma);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000864 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000865 valarray& operator=(const indirect_array<value_type>& __ia);
Howard Hinnant329cd412011-07-27 23:19:59 +0000866 template <class _ValExpr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000867 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant329cd412011-07-27 23:19:59 +0000868 valarray& operator=(const __val_expr<_ValExpr>& __v);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000869
870 // element access:
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000871 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000872 const value_type& operator[](size_t __i) const {return __begin_[__i];}
873
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000874 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000875 value_type& operator[](size_t __i) {return __begin_[__i];}
876
877 // subset operations:
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000878 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000879 __val_expr<__slice_expr<const valarray&> > operator[](slice __s) const;
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000880 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000881 slice_array<value_type> operator[](slice __s);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000882 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000883 __val_expr<__indirect_expr<const valarray&> > operator[](const gslice& __gs) const;
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000884 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000885 gslice_array<value_type> operator[](const gslice& __gs);
Eric Fiselier3b0b81f2017-04-19 00:23:45 +0000886#ifndef _LIBCPP_CXX03_LANG
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000887 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000888 __val_expr<__indirect_expr<const valarray&> > operator[](gslice&& __gs) const;
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000889 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000890 gslice_array<value_type> operator[](gslice&& __gs);
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400891#endif // _LIBCPP_CXX03_LANG
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000892 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000893 __val_expr<__mask_expr<const valarray&> > operator[](const valarray<bool>& __vb) const;
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000894 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000895 mask_array<value_type> operator[](const valarray<bool>& __vb);
Eric Fiselier3b0b81f2017-04-19 00:23:45 +0000896#ifndef _LIBCPP_CXX03_LANG
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000897 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000898 __val_expr<__mask_expr<const valarray&> > operator[](valarray<bool>&& __vb) const;
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000899 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000900 mask_array<value_type> operator[](valarray<bool>&& __vb);
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400901#endif // _LIBCPP_CXX03_LANG
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000902 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000903 __val_expr<__indirect_expr<const valarray&> > operator[](const valarray<size_t>& __vs) const;
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000904 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000905 indirect_array<value_type> operator[](const valarray<size_t>& __vs);
Eric Fiselier3b0b81f2017-04-19 00:23:45 +0000906#ifndef _LIBCPP_CXX03_LANG
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000907 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000908 __val_expr<__indirect_expr<const valarray&> > operator[](valarray<size_t>&& __vs) const;
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000909 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000910 indirect_array<value_type> operator[](valarray<size_t>&& __vs);
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400911#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000912
913 // unary operators:
Douglas Gregor68902322012-05-19 07:14:17 +0000914 valarray operator+() const;
915 valarray operator-() const;
916 valarray operator~() const;
917 valarray<bool> operator!() const;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000918
919 // computed assignment:
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000920 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000921 valarray& operator*= (const value_type& __x);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000922 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000923 valarray& operator/= (const value_type& __x);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000924 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000925 valarray& operator%= (const value_type& __x);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000926 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000927 valarray& operator+= (const value_type& __x);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000928 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000929 valarray& operator-= (const value_type& __x);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000930 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000931 valarray& operator^= (const value_type& __x);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000932 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000933 valarray& operator&= (const value_type& __x);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000934 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000935 valarray& operator|= (const value_type& __x);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000936 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000937 valarray& operator<<=(const value_type& __x);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000938 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000939 valarray& operator>>=(const value_type& __x);
940
941 template <class _Expr>
942 typename enable_if
943 <
944 __is_val_expr<_Expr>::value,
945 valarray&
946 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000947 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000948 operator*= (const _Expr& __v);
949
950 template <class _Expr>
951 typename enable_if
952 <
953 __is_val_expr<_Expr>::value,
954 valarray&
955 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000956 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000957 operator/= (const _Expr& __v);
958
959 template <class _Expr>
960 typename enable_if
961 <
962 __is_val_expr<_Expr>::value,
963 valarray&
964 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000965 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000966 operator%= (const _Expr& __v);
967
968 template <class _Expr>
969 typename enable_if
970 <
971 __is_val_expr<_Expr>::value,
972 valarray&
973 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000974 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000975 operator+= (const _Expr& __v);
976
977 template <class _Expr>
978 typename enable_if
979 <
980 __is_val_expr<_Expr>::value,
981 valarray&
982 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000983 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000984 operator-= (const _Expr& __v);
985
986 template <class _Expr>
987 typename enable_if
988 <
989 __is_val_expr<_Expr>::value,
990 valarray&
991 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000992 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000993 operator^= (const _Expr& __v);
994
995 template <class _Expr>
996 typename enable_if
997 <
998 __is_val_expr<_Expr>::value,
999 valarray&
1000 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001001 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001002 operator|= (const _Expr& __v);
1003
1004 template <class _Expr>
1005 typename enable_if
1006 <
1007 __is_val_expr<_Expr>::value,
1008 valarray&
1009 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001010 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001011 operator&= (const _Expr& __v);
1012
1013 template <class _Expr>
1014 typename enable_if
1015 <
1016 __is_val_expr<_Expr>::value,
1017 valarray&
1018 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001019 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001020 operator<<= (const _Expr& __v);
1021
1022 template <class _Expr>
1023 typename enable_if
1024 <
1025 __is_val_expr<_Expr>::value,
1026 valarray&
1027 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001028 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001029 operator>>= (const _Expr& __v);
1030
1031 // member functions:
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001032 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant298aed92012-07-21 00:51:28 +00001033 void swap(valarray& __v) _NOEXCEPT;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001034
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001035 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant28b24882011-12-01 20:21:04 +00001036 size_t size() const {return static_cast<size_t>(__end_ - __begin_);}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001037
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001038 _LIBCPP_INLINE_VISIBILITY
Douglas Gregor68902322012-05-19 07:14:17 +00001039 value_type sum() const;
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001040 _LIBCPP_INLINE_VISIBILITY
Douglas Gregor68902322012-05-19 07:14:17 +00001041 value_type min() const;
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001042 _LIBCPP_INLINE_VISIBILITY
Douglas Gregor68902322012-05-19 07:14:17 +00001043 value_type max() const;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001044
Douglas Gregor68902322012-05-19 07:14:17 +00001045 valarray shift (int __i) const;
1046 valarray cshift(int __i) const;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001047 valarray apply(value_type __f(value_type)) const;
1048 valarray apply(value_type __f(const value_type&)) const;
1049 void resize(size_t __n, value_type __x = value_type());
1050
1051private:
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00001052 template <class> friend class _LIBCPP_TEMPLATE_VIS valarray;
1053 template <class> friend class _LIBCPP_TEMPLATE_VIS slice_array;
1054 template <class> friend class _LIBCPP_TEMPLATE_VIS gslice_array;
1055 template <class> friend class _LIBCPP_TEMPLATE_VIS mask_array;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001056 template <class> friend class __mask_expr;
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00001057 template <class> friend class _LIBCPP_TEMPLATE_VIS indirect_array;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001058 template <class> friend class __indirect_expr;
1059 template <class> friend class __val_expr;
1060
1061 template <class _Up>
1062 friend
1063 _Up*
1064 begin(valarray<_Up>& __v);
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001065
Howard Hinnantc51e1022010-05-11 19:42:16 +00001066 template <class _Up>
1067 friend
1068 const _Up*
1069 begin(const valarray<_Up>& __v);
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001070
Howard Hinnantc51e1022010-05-11 19:42:16 +00001071 template <class _Up>
1072 friend
1073 _Up*
1074 end(valarray<_Up>& __v);
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001075
Howard Hinnantc51e1022010-05-11 19:42:16 +00001076 template <class _Up>
1077 friend
1078 const _Up*
1079 end(const valarray<_Up>& __v);
Mikhail Maltsev59de6f82018-02-08 11:33:48 +00001080
Eric Fiseliera119c322018-10-25 17:43:26 +00001081 _LIBCPP_INLINE_VISIBILITY
Eric Fiselier2856ef82018-10-25 17:21:30 +00001082 void __clear(size_t __capacity);
Mikhail Maltsev59de6f82018-02-08 11:33:48 +00001083 valarray& __assign_range(const value_type* __f, const value_type* __l);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001084};
1085
Konstantin Varlamovebb31192021-10-28 00:36:19 -07001086#if _LIBCPP_STD_VER > 14
1087template<class _Tp, size_t _Size>
1088valarray(const _Tp(&)[_Size], size_t) -> valarray<_Tp>;
1089#endif
1090
Howard Hinnanta37d3cf2013-08-12 18:38:34 +00001091_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void valarray<size_t>::resize(size_t, size_t))
1092
Howard Hinnantc51e1022010-05-11 19:42:16 +00001093template <class _Op, class _Tp>
1094struct _UnaryOp<_Op, valarray<_Tp> >
1095{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04001096 typedef typename _Op::__result_type __result_type;
Arthur O'Dwyer0b6c2482021-05-31 11:33:51 -04001097 typedef typename decay<__result_type>::type value_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001098
1099 _Op __op_;
1100 const valarray<_Tp>& __a0_;
1101
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001102 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001103 _UnaryOp(const _Op& __op, const valarray<_Tp>& __a0) : __op_(__op), __a0_(__a0) {}
1104
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001105 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04001106 __result_type operator[](size_t __i) const {return __op_(__a0_[__i]);}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001107
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001108 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001109 size_t size() const {return __a0_.size();}
1110};
1111
1112template <class _Op, class _Tp, class _A1>
1113struct _BinaryOp<_Op, valarray<_Tp>, _A1>
1114{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04001115 typedef typename _Op::__result_type __result_type;
Arthur O'Dwyer0b6c2482021-05-31 11:33:51 -04001116 typedef typename decay<__result_type>::type value_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001117
1118 _Op __op_;
1119 const valarray<_Tp>& __a0_;
1120 _A1 __a1_;
1121
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001122 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001123 _BinaryOp(const _Op& __op, const valarray<_Tp>& __a0, const _A1& __a1)
1124 : __op_(__op), __a0_(__a0), __a1_(__a1) {}
1125
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001126 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer0b6c2482021-05-31 11:33:51 -04001127 __result_type operator[](size_t __i) const {return __op_(__a0_[__i], __a1_[__i]);}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001128
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001129 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001130 size_t size() const {return __a0_.size();}
1131};
1132
1133template <class _Op, class _A0, class _Tp>
1134struct _BinaryOp<_Op, _A0, valarray<_Tp> >
1135{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04001136 typedef typename _Op::__result_type __result_type;
Arthur O'Dwyer0b6c2482021-05-31 11:33:51 -04001137 typedef typename decay<__result_type>::type value_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001138
1139 _Op __op_;
1140 _A0 __a0_;
1141 const valarray<_Tp>& __a1_;
1142
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001143 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001144 _BinaryOp(const _Op& __op, const _A0& __a0, const valarray<_Tp>& __a1)
1145 : __op_(__op), __a0_(__a0), __a1_(__a1) {}
1146
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001147 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer0b6c2482021-05-31 11:33:51 -04001148 __result_type operator[](size_t __i) const {return __op_(__a0_[__i], __a1_[__i]);}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001149
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001150 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001151 size_t size() const {return __a0_.size();}
1152};
1153
1154template <class _Op, class _Tp>
1155struct _BinaryOp<_Op, valarray<_Tp>, valarray<_Tp> >
1156{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04001157 typedef typename _Op::__result_type __result_type;
Arthur O'Dwyer0b6c2482021-05-31 11:33:51 -04001158 typedef typename decay<__result_type>::type value_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001159
1160 _Op __op_;
1161 const valarray<_Tp>& __a0_;
1162 const valarray<_Tp>& __a1_;
1163
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001164 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001165 _BinaryOp(const _Op& __op, const valarray<_Tp>& __a0, const valarray<_Tp>& __a1)
1166 : __op_(__op), __a0_(__a0), __a1_(__a1) {}
1167
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001168 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer0b6c2482021-05-31 11:33:51 -04001169 __result_type operator[](size_t __i) const {return __op_(__a0_[__i], __a1_[__i]);}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001170
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001171 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001172 size_t size() const {return __a0_.size();}
1173};
1174
1175// slice_array
1176
1177template <class _Tp>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00001178class _LIBCPP_TEMPLATE_VIS slice_array
Howard Hinnantc51e1022010-05-11 19:42:16 +00001179{
1180public:
1181 typedef _Tp value_type;
1182
1183private:
1184 value_type* __vp_;
1185 size_t __size_;
1186 size_t __stride_;
1187
1188public:
1189 template <class _Expr>
1190 typename enable_if
1191 <
1192 __is_val_expr<_Expr>::value,
1193 void
1194 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001195 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001196 operator=(const _Expr& __v) const;
1197
1198 template <class _Expr>
1199 typename enable_if
1200 <
1201 __is_val_expr<_Expr>::value,
1202 void
1203 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001204 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001205 operator*=(const _Expr& __v) const;
1206
1207 template <class _Expr>
1208 typename enable_if
1209 <
1210 __is_val_expr<_Expr>::value,
1211 void
1212 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001213 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001214 operator/=(const _Expr& __v) const;
1215
1216 template <class _Expr>
1217 typename enable_if
1218 <
1219 __is_val_expr<_Expr>::value,
1220 void
1221 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001222 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001223 operator%=(const _Expr& __v) const;
1224
1225 template <class _Expr>
1226 typename enable_if
1227 <
1228 __is_val_expr<_Expr>::value,
1229 void
1230 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001231 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001232 operator+=(const _Expr& __v) const;
1233
1234 template <class _Expr>
1235 typename enable_if
1236 <
1237 __is_val_expr<_Expr>::value,
1238 void
1239 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001240 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001241 operator-=(const _Expr& __v) const;
1242
1243 template <class _Expr>
1244 typename enable_if
1245 <
1246 __is_val_expr<_Expr>::value,
1247 void
1248 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001249 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001250 operator^=(const _Expr& __v) const;
1251
1252 template <class _Expr>
1253 typename enable_if
1254 <
1255 __is_val_expr<_Expr>::value,
1256 void
1257 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001258 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001259 operator&=(const _Expr& __v) const;
1260
1261 template <class _Expr>
1262 typename enable_if
1263 <
1264 __is_val_expr<_Expr>::value,
1265 void
1266 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001267 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001268 operator|=(const _Expr& __v) const;
1269
1270 template <class _Expr>
1271 typename enable_if
1272 <
1273 __is_val_expr<_Expr>::value,
1274 void
1275 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001276 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001277 operator<<=(const _Expr& __v) const;
1278
1279 template <class _Expr>
1280 typename enable_if
1281 <
1282 __is_val_expr<_Expr>::value,
1283 void
1284 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001285 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001286 operator>>=(const _Expr& __v) const;
1287
Eric Fiselierb9f37ca2019-12-12 20:48:11 -05001288 slice_array(slice_array const&) = default;
1289
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001290 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001291 const slice_array& operator=(const slice_array& __sa) const;
1292
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001293 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001294 void operator=(const value_type& __x) const;
1295
zoecarver79fa7502020-12-02 10:49:20 -08001296 _LIBCPP_INLINE_VISIBILITY
1297 void operator=(const valarray<value_type>& __va) const;
1298
Howard Hinnantc51e1022010-05-11 19:42:16 +00001299private:
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001300 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001301 slice_array(const slice& __sl, const valarray<value_type>& __v)
1302 : __vp_(const_cast<value_type*>(__v.__begin_ + __sl.start())),
1303 __size_(__sl.size()),
1304 __stride_(__sl.stride())
1305 {}
1306
1307 template <class> friend class valarray;
1308 template <class> friend class sliceExpr;
1309};
1310
1311template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001312inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001313const slice_array<_Tp>&
1314slice_array<_Tp>::operator=(const slice_array& __sa) const
1315{
1316 value_type* __t = __vp_;
1317 const value_type* __s = __sa.__vp_;
1318 for (size_t __n = __size_; __n; --__n, __t += __stride_, __s += __sa.__stride_)
1319 *__t = *__s;
Eric Fiselier3b80ce92014-08-12 00:06:58 +00001320 return *this;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001321}
1322
1323template <class _Tp>
1324template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001325inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001326typename enable_if
1327<
1328 __is_val_expr<_Expr>::value,
1329 void
1330>::type
1331slice_array<_Tp>::operator=(const _Expr& __v) const
1332{
1333 value_type* __t = __vp_;
1334 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1335 *__t = __v[__i];
1336}
1337
1338template <class _Tp>
zoecarver79fa7502020-12-02 10:49:20 -08001339inline void
1340slice_array<_Tp>::operator=(const valarray<value_type>& __va) const
1341{
1342 value_type* __t = __vp_;
1343 for (size_t __i = 0; __i < __va.size(); ++__i, __t += __stride_)
1344 *__t = __va[__i];
1345}
1346
1347template <class _Tp>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001348template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001349inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001350typename enable_if
1351<
1352 __is_val_expr<_Expr>::value,
1353 void
1354>::type
1355slice_array<_Tp>::operator*=(const _Expr& __v) const
1356{
1357 value_type* __t = __vp_;
1358 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1359 *__t *= __v[__i];
1360}
1361
1362template <class _Tp>
1363template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001364inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001365typename enable_if
1366<
1367 __is_val_expr<_Expr>::value,
1368 void
1369>::type
1370slice_array<_Tp>::operator/=(const _Expr& __v) const
1371{
1372 value_type* __t = __vp_;
1373 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1374 *__t /= __v[__i];
1375}
1376
1377template <class _Tp>
1378template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001379inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001380typename enable_if
1381<
1382 __is_val_expr<_Expr>::value,
1383 void
1384>::type
1385slice_array<_Tp>::operator%=(const _Expr& __v) const
1386{
1387 value_type* __t = __vp_;
1388 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1389 *__t %= __v[__i];
1390}
1391
1392template <class _Tp>
1393template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001394inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001395typename enable_if
1396<
1397 __is_val_expr<_Expr>::value,
1398 void
1399>::type
1400slice_array<_Tp>::operator+=(const _Expr& __v) const
1401{
1402 value_type* __t = __vp_;
1403 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1404 *__t += __v[__i];
1405}
1406
1407template <class _Tp>
1408template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001409inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001410typename enable_if
1411<
1412 __is_val_expr<_Expr>::value,
1413 void
1414>::type
1415slice_array<_Tp>::operator-=(const _Expr& __v) const
1416{
1417 value_type* __t = __vp_;
1418 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1419 *__t -= __v[__i];
1420}
1421
1422template <class _Tp>
1423template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001424inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001425typename enable_if
1426<
1427 __is_val_expr<_Expr>::value,
1428 void
1429>::type
1430slice_array<_Tp>::operator^=(const _Expr& __v) const
1431{
1432 value_type* __t = __vp_;
1433 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1434 *__t ^= __v[__i];
1435}
1436
1437template <class _Tp>
1438template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001439inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001440typename enable_if
1441<
1442 __is_val_expr<_Expr>::value,
1443 void
1444>::type
1445slice_array<_Tp>::operator&=(const _Expr& __v) const
1446{
1447 value_type* __t = __vp_;
1448 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1449 *__t &= __v[__i];
1450}
1451
1452template <class _Tp>
1453template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001454inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001455typename enable_if
1456<
1457 __is_val_expr<_Expr>::value,
1458 void
1459>::type
1460slice_array<_Tp>::operator|=(const _Expr& __v) const
1461{
1462 value_type* __t = __vp_;
1463 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1464 *__t |= __v[__i];
1465}
1466
1467template <class _Tp>
1468template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001469inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001470typename enable_if
1471<
1472 __is_val_expr<_Expr>::value,
1473 void
1474>::type
1475slice_array<_Tp>::operator<<=(const _Expr& __v) const
1476{
1477 value_type* __t = __vp_;
1478 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1479 *__t <<= __v[__i];
1480}
1481
1482template <class _Tp>
1483template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001484inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001485typename enable_if
1486<
1487 __is_val_expr<_Expr>::value,
1488 void
1489>::type
1490slice_array<_Tp>::operator>>=(const _Expr& __v) const
1491{
1492 value_type* __t = __vp_;
1493 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1494 *__t >>= __v[__i];
1495}
1496
1497template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001498inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001499void
1500slice_array<_Tp>::operator=(const value_type& __x) const
1501{
1502 value_type* __t = __vp_;
1503 for (size_t __n = __size_; __n; --__n, __t += __stride_)
1504 *__t = __x;
1505}
1506
1507// gslice
1508
Howard Hinnant8331b762013-03-06 23:30:19 +00001509class _LIBCPP_TYPE_VIS gslice
Howard Hinnantc51e1022010-05-11 19:42:16 +00001510{
1511 valarray<size_t> __size_;
1512 valarray<size_t> __stride_;
1513 valarray<size_t> __1d_;
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001514
Howard Hinnantc51e1022010-05-11 19:42:16 +00001515public:
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001516 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001517 gslice() {}
Douglas Gregor68902322012-05-19 07:14:17 +00001518
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001519 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001520 gslice(size_t __start, const valarray<size_t>& __size,
1521 const valarray<size_t>& __stride)
1522 : __size_(__size),
1523 __stride_(__stride)
1524 {__init(__start);}
1525
Eric Fiselier3b0b81f2017-04-19 00:23:45 +00001526#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001527
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001528 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001529 gslice(size_t __start, const valarray<size_t>& __size,
1530 valarray<size_t>&& __stride)
1531 : __size_(__size),
1532 __stride_(move(__stride))
1533 {__init(__start);}
1534
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001535 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001536 gslice(size_t __start, valarray<size_t>&& __size,
1537 const valarray<size_t>& __stride)
1538 : __size_(move(__size)),
1539 __stride_(__stride)
1540 {__init(__start);}
1541
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001542 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001543 gslice(size_t __start, valarray<size_t>&& __size,
1544 valarray<size_t>&& __stride)
1545 : __size_(move(__size)),
1546 __stride_(move(__stride))
1547 {__init(__start);}
1548
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001549#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001550
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001551 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001552 size_t start() const {return __1d_.size() ? __1d_[0] : 0;}
1553
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001554 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001555 valarray<size_t> size() const {return __size_;}
1556
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001557 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001558 valarray<size_t> stride() const {return __stride_;}
1559
1560private:
1561 void __init(size_t __start);
1562
1563 template <class> friend class gslice_array;
1564 template <class> friend class valarray;
1565 template <class> friend class __val_expr;
1566};
1567
1568// gslice_array
1569
1570template <class _Tp>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00001571class _LIBCPP_TEMPLATE_VIS gslice_array
Howard Hinnantc51e1022010-05-11 19:42:16 +00001572{
1573public:
1574 typedef _Tp value_type;
1575
1576private:
1577 value_type* __vp_;
1578 valarray<size_t> __1d_;
1579
1580public:
1581 template <class _Expr>
1582 typename enable_if
1583 <
1584 __is_val_expr<_Expr>::value,
1585 void
1586 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001587 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001588 operator=(const _Expr& __v) const;
1589
1590 template <class _Expr>
1591 typename enable_if
1592 <
1593 __is_val_expr<_Expr>::value,
1594 void
1595 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001596 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001597 operator*=(const _Expr& __v) const;
1598
1599 template <class _Expr>
1600 typename enable_if
1601 <
1602 __is_val_expr<_Expr>::value,
1603 void
1604 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001605 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001606 operator/=(const _Expr& __v) const;
1607
1608 template <class _Expr>
1609 typename enable_if
1610 <
1611 __is_val_expr<_Expr>::value,
1612 void
1613 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001614 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001615 operator%=(const _Expr& __v) const;
1616
1617 template <class _Expr>
1618 typename enable_if
1619 <
1620 __is_val_expr<_Expr>::value,
1621 void
1622 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001623 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001624 operator+=(const _Expr& __v) const;
1625
1626 template <class _Expr>
1627 typename enable_if
1628 <
1629 __is_val_expr<_Expr>::value,
1630 void
1631 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001632 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001633 operator-=(const _Expr& __v) const;
1634
1635 template <class _Expr>
1636 typename enable_if
1637 <
1638 __is_val_expr<_Expr>::value,
1639 void
1640 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001641 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001642 operator^=(const _Expr& __v) const;
1643
1644 template <class _Expr>
1645 typename enable_if
1646 <
1647 __is_val_expr<_Expr>::value,
1648 void
1649 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001650 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001651 operator&=(const _Expr& __v) const;
1652
1653 template <class _Expr>
1654 typename enable_if
1655 <
1656 __is_val_expr<_Expr>::value,
1657 void
1658 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001659 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001660 operator|=(const _Expr& __v) const;
1661
1662 template <class _Expr>
1663 typename enable_if
1664 <
1665 __is_val_expr<_Expr>::value,
1666 void
1667 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001668 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001669 operator<<=(const _Expr& __v) const;
1670
1671 template <class _Expr>
1672 typename enable_if
1673 <
1674 __is_val_expr<_Expr>::value,
1675 void
1676 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001677 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001678 operator>>=(const _Expr& __v) const;
1679
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001680 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001681 const gslice_array& operator=(const gslice_array& __ga) const;
1682
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001683 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001684 void operator=(const value_type& __x) const;
1685
Eric Fiselierb9f37ca2019-12-12 20:48:11 -05001686 gslice_array(const gslice_array&) = default;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001687
1688private:
Howard Hinnantc51e1022010-05-11 19:42:16 +00001689 gslice_array(const gslice& __gs, const valarray<value_type>& __v)
1690 : __vp_(const_cast<value_type*>(__v.__begin_)),
1691 __1d_(__gs.__1d_)
1692 {}
1693
Eric Fiselier3b0b81f2017-04-19 00:23:45 +00001694#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001695 gslice_array(gslice&& __gs, const valarray<value_type>& __v)
1696 : __vp_(const_cast<value_type*>(__v.__begin_)),
1697 __1d_(move(__gs.__1d_))
1698 {}
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001699#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001700
1701 template <class> friend class valarray;
1702};
1703
1704template <class _Tp>
1705template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001706inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001707typename enable_if
1708<
1709 __is_val_expr<_Expr>::value,
1710 void
1711>::type
1712gslice_array<_Tp>::operator=(const _Expr& __v) const
1713{
1714 typedef const size_t* _Ip;
1715 size_t __j = 0;
1716 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1717 __vp_[*__i] = __v[__j];
1718}
1719
1720template <class _Tp>
1721template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001722inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001723typename enable_if
1724<
1725 __is_val_expr<_Expr>::value,
1726 void
1727>::type
1728gslice_array<_Tp>::operator*=(const _Expr& __v) const
1729{
1730 typedef const size_t* _Ip;
1731 size_t __j = 0;
1732 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1733 __vp_[*__i] *= __v[__j];
1734}
1735
1736template <class _Tp>
1737template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001738inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001739typename enable_if
1740<
1741 __is_val_expr<_Expr>::value,
1742 void
1743>::type
1744gslice_array<_Tp>::operator/=(const _Expr& __v) const
1745{
1746 typedef const size_t* _Ip;
1747 size_t __j = 0;
1748 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1749 __vp_[*__i] /= __v[__j];
1750}
1751
1752template <class _Tp>
1753template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001754inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001755typename enable_if
1756<
1757 __is_val_expr<_Expr>::value,
1758 void
1759>::type
1760gslice_array<_Tp>::operator%=(const _Expr& __v) const
1761{
1762 typedef const size_t* _Ip;
1763 size_t __j = 0;
1764 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1765 __vp_[*__i] %= __v[__j];
1766}
1767
1768template <class _Tp>
1769template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001770inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001771typename enable_if
1772<
1773 __is_val_expr<_Expr>::value,
1774 void
1775>::type
1776gslice_array<_Tp>::operator+=(const _Expr& __v) const
1777{
1778 typedef const size_t* _Ip;
1779 size_t __j = 0;
1780 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1781 __vp_[*__i] += __v[__j];
1782}
1783
1784template <class _Tp>
1785template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001786inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001787typename enable_if
1788<
1789 __is_val_expr<_Expr>::value,
1790 void
1791>::type
1792gslice_array<_Tp>::operator-=(const _Expr& __v) const
1793{
1794 typedef const size_t* _Ip;
1795 size_t __j = 0;
1796 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1797 __vp_[*__i] -= __v[__j];
1798}
1799
1800template <class _Tp>
1801template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001802inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001803typename enable_if
1804<
1805 __is_val_expr<_Expr>::value,
1806 void
1807>::type
1808gslice_array<_Tp>::operator^=(const _Expr& __v) const
1809{
1810 typedef const size_t* _Ip;
1811 size_t __j = 0;
1812 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1813 __vp_[*__i] ^= __v[__j];
1814}
1815
1816template <class _Tp>
1817template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001818inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001819typename enable_if
1820<
1821 __is_val_expr<_Expr>::value,
1822 void
1823>::type
1824gslice_array<_Tp>::operator&=(const _Expr& __v) const
1825{
1826 typedef const size_t* _Ip;
1827 size_t __j = 0;
1828 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1829 __vp_[*__i] &= __v[__j];
1830}
1831
1832template <class _Tp>
1833template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001834inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001835typename enable_if
1836<
1837 __is_val_expr<_Expr>::value,
1838 void
1839>::type
1840gslice_array<_Tp>::operator|=(const _Expr& __v) const
1841{
1842 typedef const size_t* _Ip;
1843 size_t __j = 0;
1844 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1845 __vp_[*__i] |= __v[__j];
1846}
1847
1848template <class _Tp>
1849template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001850inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001851typename enable_if
1852<
1853 __is_val_expr<_Expr>::value,
1854 void
1855>::type
1856gslice_array<_Tp>::operator<<=(const _Expr& __v) const
1857{
1858 typedef const size_t* _Ip;
1859 size_t __j = 0;
1860 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1861 __vp_[*__i] <<= __v[__j];
1862}
1863
1864template <class _Tp>
1865template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001866inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001867typename enable_if
1868<
1869 __is_val_expr<_Expr>::value,
1870 void
1871>::type
1872gslice_array<_Tp>::operator>>=(const _Expr& __v) const
1873{
1874 typedef const size_t* _Ip;
1875 size_t __j = 0;
1876 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1877 __vp_[*__i] >>= __v[__j];
1878}
1879
1880template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001881inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001882const gslice_array<_Tp>&
1883gslice_array<_Tp>::operator=(const gslice_array& __ga) const
1884{
1885 typedef const size_t* _Ip;
1886 const value_type* __s = __ga.__vp_;
1887 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_, __j = __ga.__1d_.__begin_;
1888 __i != __e; ++__i, ++__j)
1889 __vp_[*__i] = __s[*__j];
1890 return *this;
1891}
1892
1893template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001894inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001895void
1896gslice_array<_Tp>::operator=(const value_type& __x) const
1897{
1898 typedef const size_t* _Ip;
1899 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i)
1900 __vp_[*__i] = __x;
1901}
1902
1903// mask_array
1904
1905template <class _Tp>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00001906class _LIBCPP_TEMPLATE_VIS mask_array
Howard Hinnantc51e1022010-05-11 19:42:16 +00001907{
1908public:
1909 typedef _Tp value_type;
1910
1911private:
1912 value_type* __vp_;
1913 valarray<size_t> __1d_;
1914
1915public:
1916 template <class _Expr>
1917 typename enable_if
1918 <
1919 __is_val_expr<_Expr>::value,
1920 void
1921 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001922 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001923 operator=(const _Expr& __v) const;
1924
1925 template <class _Expr>
1926 typename enable_if
1927 <
1928 __is_val_expr<_Expr>::value,
1929 void
1930 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001931 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001932 operator*=(const _Expr& __v) const;
1933
1934 template <class _Expr>
1935 typename enable_if
1936 <
1937 __is_val_expr<_Expr>::value,
1938 void
1939 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001940 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001941 operator/=(const _Expr& __v) const;
1942
1943 template <class _Expr>
1944 typename enable_if
1945 <
1946 __is_val_expr<_Expr>::value,
1947 void
1948 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001949 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001950 operator%=(const _Expr& __v) const;
1951
1952 template <class _Expr>
1953 typename enable_if
1954 <
1955 __is_val_expr<_Expr>::value,
1956 void
1957 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001958 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001959 operator+=(const _Expr& __v) const;
1960
1961 template <class _Expr>
1962 typename enable_if
1963 <
1964 __is_val_expr<_Expr>::value,
1965 void
1966 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001967 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001968 operator-=(const _Expr& __v) const;
1969
1970 template <class _Expr>
1971 typename enable_if
1972 <
1973 __is_val_expr<_Expr>::value,
1974 void
1975 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001976 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001977 operator^=(const _Expr& __v) const;
1978
1979 template <class _Expr>
1980 typename enable_if
1981 <
1982 __is_val_expr<_Expr>::value,
1983 void
1984 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001985 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001986 operator&=(const _Expr& __v) const;
1987
1988 template <class _Expr>
1989 typename enable_if
1990 <
1991 __is_val_expr<_Expr>::value,
1992 void
1993 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001994 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001995 operator|=(const _Expr& __v) const;
1996
1997 template <class _Expr>
1998 typename enable_if
1999 <
2000 __is_val_expr<_Expr>::value,
2001 void
2002 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002003 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002004 operator<<=(const _Expr& __v) const;
2005
2006 template <class _Expr>
2007 typename enable_if
2008 <
2009 __is_val_expr<_Expr>::value,
2010 void
2011 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002012 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002013 operator>>=(const _Expr& __v) const;
2014
Eric Fiselierb9f37ca2019-12-12 20:48:11 -05002015 mask_array(const mask_array&) = default;
2016
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002017 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002018 const mask_array& operator=(const mask_array& __ma) const;
2019
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002020 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002021 void operator=(const value_type& __x) const;
2022
Howard Hinnantc51e1022010-05-11 19:42:16 +00002023private:
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002024 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002025 mask_array(const valarray<bool>& __vb, const valarray<value_type>& __v)
2026 : __vp_(const_cast<value_type*>(__v.__begin_)),
Howard Hinnant28b24882011-12-01 20:21:04 +00002027 __1d_(static_cast<size_t>(count(__vb.__begin_, __vb.__end_, true)))
Howard Hinnantc51e1022010-05-11 19:42:16 +00002028 {
2029 size_t __j = 0;
2030 for (size_t __i = 0; __i < __vb.size(); ++__i)
2031 if (__vb[__i])
2032 __1d_[__j++] = __i;
2033 }
2034
2035 template <class> friend class valarray;
2036};
2037
2038template <class _Tp>
2039template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002040inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002041typename enable_if
2042<
2043 __is_val_expr<_Expr>::value,
2044 void
2045>::type
2046mask_array<_Tp>::operator=(const _Expr& __v) const
2047{
2048 size_t __n = __1d_.size();
2049 for (size_t __i = 0; __i < __n; ++__i)
2050 __vp_[__1d_[__i]] = __v[__i];
2051}
2052
2053template <class _Tp>
2054template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002055inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002056typename enable_if
2057<
2058 __is_val_expr<_Expr>::value,
2059 void
2060>::type
2061mask_array<_Tp>::operator*=(const _Expr& __v) const
2062{
2063 size_t __n = __1d_.size();
2064 for (size_t __i = 0; __i < __n; ++__i)
2065 __vp_[__1d_[__i]] *= __v[__i];
2066}
2067
2068template <class _Tp>
2069template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002070inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002071typename enable_if
2072<
2073 __is_val_expr<_Expr>::value,
2074 void
2075>::type
2076mask_array<_Tp>::operator/=(const _Expr& __v) const
2077{
2078 size_t __n = __1d_.size();
2079 for (size_t __i = 0; __i < __n; ++__i)
2080 __vp_[__1d_[__i]] /= __v[__i];
2081}
2082
2083template <class _Tp>
2084template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002085inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002086typename enable_if
2087<
2088 __is_val_expr<_Expr>::value,
2089 void
2090>::type
2091mask_array<_Tp>::operator%=(const _Expr& __v) const
2092{
2093 size_t __n = __1d_.size();
2094 for (size_t __i = 0; __i < __n; ++__i)
2095 __vp_[__1d_[__i]] %= __v[__i];
2096}
2097
2098template <class _Tp>
2099template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002100inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002101typename enable_if
2102<
2103 __is_val_expr<_Expr>::value,
2104 void
2105>::type
2106mask_array<_Tp>::operator+=(const _Expr& __v) const
2107{
2108 size_t __n = __1d_.size();
2109 for (size_t __i = 0; __i < __n; ++__i)
2110 __vp_[__1d_[__i]] += __v[__i];
2111}
2112
2113template <class _Tp>
2114template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002115inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002116typename enable_if
2117<
2118 __is_val_expr<_Expr>::value,
2119 void
2120>::type
2121mask_array<_Tp>::operator-=(const _Expr& __v) const
2122{
2123 size_t __n = __1d_.size();
2124 for (size_t __i = 0; __i < __n; ++__i)
2125 __vp_[__1d_[__i]] -= __v[__i];
2126}
2127
2128template <class _Tp>
2129template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002130inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002131typename enable_if
2132<
2133 __is_val_expr<_Expr>::value,
2134 void
2135>::type
2136mask_array<_Tp>::operator^=(const _Expr& __v) const
2137{
2138 size_t __n = __1d_.size();
2139 for (size_t __i = 0; __i < __n; ++__i)
2140 __vp_[__1d_[__i]] ^= __v[__i];
2141}
2142
2143template <class _Tp>
2144template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002145inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002146typename enable_if
2147<
2148 __is_val_expr<_Expr>::value,
2149 void
2150>::type
2151mask_array<_Tp>::operator&=(const _Expr& __v) const
2152{
2153 size_t __n = __1d_.size();
2154 for (size_t __i = 0; __i < __n; ++__i)
2155 __vp_[__1d_[__i]] &= __v[__i];
2156}
2157
2158template <class _Tp>
2159template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002160inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002161typename enable_if
2162<
2163 __is_val_expr<_Expr>::value,
2164 void
2165>::type
2166mask_array<_Tp>::operator|=(const _Expr& __v) const
2167{
2168 size_t __n = __1d_.size();
2169 for (size_t __i = 0; __i < __n; ++__i)
2170 __vp_[__1d_[__i]] |= __v[__i];
2171}
2172
2173template <class _Tp>
2174template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002175inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002176typename enable_if
2177<
2178 __is_val_expr<_Expr>::value,
2179 void
2180>::type
2181mask_array<_Tp>::operator<<=(const _Expr& __v) const
2182{
2183 size_t __n = __1d_.size();
2184 for (size_t __i = 0; __i < __n; ++__i)
2185 __vp_[__1d_[__i]] <<= __v[__i];
2186}
2187
2188template <class _Tp>
2189template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002190inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002191typename enable_if
2192<
2193 __is_val_expr<_Expr>::value,
2194 void
2195>::type
2196mask_array<_Tp>::operator>>=(const _Expr& __v) const
2197{
2198 size_t __n = __1d_.size();
2199 for (size_t __i = 0; __i < __n; ++__i)
2200 __vp_[__1d_[__i]] >>= __v[__i];
2201}
2202
2203template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002204inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002205const mask_array<_Tp>&
2206mask_array<_Tp>::operator=(const mask_array& __ma) const
2207{
2208 size_t __n = __1d_.size();
2209 for (size_t __i = 0; __i < __n; ++__i)
2210 __vp_[__1d_[__i]] = __ma.__vp_[__1d_[__i]];
Eric Fiselier3b80ce92014-08-12 00:06:58 +00002211 return *this;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002212}
2213
2214template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002215inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002216void
2217mask_array<_Tp>::operator=(const value_type& __x) const
2218{
2219 size_t __n = __1d_.size();
2220 for (size_t __i = 0; __i < __n; ++__i)
2221 __vp_[__1d_[__i]] = __x;
2222}
2223
2224template <class _ValExpr>
2225class __mask_expr
2226{
2227 typedef typename remove_reference<_ValExpr>::type _RmExpr;
2228public:
2229 typedef typename _RmExpr::value_type value_type;
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002230 typedef value_type __result_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002231
2232private:
2233 _ValExpr __expr_;
2234 valarray<size_t> __1d_;
2235
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002236 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002237 __mask_expr(const valarray<bool>& __vb, const _RmExpr& __e)
2238 : __expr_(__e),
Howard Hinnant28b24882011-12-01 20:21:04 +00002239 __1d_(static_cast<size_t>(count(__vb.__begin_, __vb.__end_, true)))
Howard Hinnantc51e1022010-05-11 19:42:16 +00002240 {
2241 size_t __j = 0;
2242 for (size_t __i = 0; __i < __vb.size(); ++__i)
2243 if (__vb[__i])
2244 __1d_[__j++] = __i;
2245 }
2246
2247public:
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002248 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002249 __result_type operator[](size_t __i) const
Howard Hinnantc51e1022010-05-11 19:42:16 +00002250 {return __expr_[__1d_[__i]];}
2251
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002252 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002253 size_t size() const {return __1d_.size();}
2254
Eric Fiselier7b31ed02019-04-02 08:05:23 +00002255 template <class> friend class __val_expr;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002256 template <class> friend class valarray;
2257};
2258
2259// indirect_array
2260
2261template <class _Tp>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00002262class _LIBCPP_TEMPLATE_VIS indirect_array
Howard Hinnantc51e1022010-05-11 19:42:16 +00002263{
2264public:
2265 typedef _Tp value_type;
2266
2267private:
2268 value_type* __vp_;
2269 valarray<size_t> __1d_;
2270
2271public:
2272 template <class _Expr>
2273 typename enable_if
2274 <
2275 __is_val_expr<_Expr>::value,
2276 void
2277 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002278 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002279 operator=(const _Expr& __v) const;
2280
2281 template <class _Expr>
2282 typename enable_if
2283 <
2284 __is_val_expr<_Expr>::value,
2285 void
2286 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002287 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002288 operator*=(const _Expr& __v) const;
2289
2290 template <class _Expr>
2291 typename enable_if
2292 <
2293 __is_val_expr<_Expr>::value,
2294 void
2295 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002296 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002297 operator/=(const _Expr& __v) const;
2298
2299 template <class _Expr>
2300 typename enable_if
2301 <
2302 __is_val_expr<_Expr>::value,
2303 void
2304 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002305 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002306 operator%=(const _Expr& __v) const;
2307
2308 template <class _Expr>
2309 typename enable_if
2310 <
2311 __is_val_expr<_Expr>::value,
2312 void
2313 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002314 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002315 operator+=(const _Expr& __v) const;
2316
2317 template <class _Expr>
2318 typename enable_if
2319 <
2320 __is_val_expr<_Expr>::value,
2321 void
2322 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002323 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002324 operator-=(const _Expr& __v) const;
2325
2326 template <class _Expr>
2327 typename enable_if
2328 <
2329 __is_val_expr<_Expr>::value,
2330 void
2331 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002332 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002333 operator^=(const _Expr& __v) const;
2334
2335 template <class _Expr>
2336 typename enable_if
2337 <
2338 __is_val_expr<_Expr>::value,
2339 void
2340 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002341 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002342 operator&=(const _Expr& __v) const;
2343
2344 template <class _Expr>
2345 typename enable_if
2346 <
2347 __is_val_expr<_Expr>::value,
2348 void
2349 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002350 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002351 operator|=(const _Expr& __v) const;
2352
2353 template <class _Expr>
2354 typename enable_if
2355 <
2356 __is_val_expr<_Expr>::value,
2357 void
2358 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002359 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002360 operator<<=(const _Expr& __v) const;
2361
2362 template <class _Expr>
2363 typename enable_if
2364 <
2365 __is_val_expr<_Expr>::value,
2366 void
2367 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002368 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002369 operator>>=(const _Expr& __v) const;
2370
Eric Fiselierb9f37ca2019-12-12 20:48:11 -05002371 indirect_array(const indirect_array&) = default;
2372
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002373 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002374 const indirect_array& operator=(const indirect_array& __ia) const;
2375
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002376 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002377 void operator=(const value_type& __x) const;
2378
Howard Hinnantc51e1022010-05-11 19:42:16 +00002379private:
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002380 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002381 indirect_array(const valarray<size_t>& __ia, const valarray<value_type>& __v)
2382 : __vp_(const_cast<value_type*>(__v.__begin_)),
2383 __1d_(__ia)
2384 {}
2385
Eric Fiselier3b0b81f2017-04-19 00:23:45 +00002386#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00002387
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002388 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002389 indirect_array(valarray<size_t>&& __ia, const valarray<value_type>& __v)
2390 : __vp_(const_cast<value_type*>(__v.__begin_)),
2391 __1d_(move(__ia))
2392 {}
2393
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002394#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00002395
2396 template <class> friend class valarray;
2397};
2398
2399template <class _Tp>
2400template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002401inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002402typename enable_if
2403<
2404 __is_val_expr<_Expr>::value,
2405 void
2406>::type
2407indirect_array<_Tp>::operator=(const _Expr& __v) const
2408{
2409 size_t __n = __1d_.size();
2410 for (size_t __i = 0; __i < __n; ++__i)
2411 __vp_[__1d_[__i]] = __v[__i];
2412}
2413
2414template <class _Tp>
2415template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002416inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002417typename enable_if
2418<
2419 __is_val_expr<_Expr>::value,
2420 void
2421>::type
2422indirect_array<_Tp>::operator*=(const _Expr& __v) const
2423{
2424 size_t __n = __1d_.size();
2425 for (size_t __i = 0; __i < __n; ++__i)
2426 __vp_[__1d_[__i]] *= __v[__i];
2427}
2428
2429template <class _Tp>
2430template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002431inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002432typename enable_if
2433<
2434 __is_val_expr<_Expr>::value,
2435 void
2436>::type
2437indirect_array<_Tp>::operator/=(const _Expr& __v) const
2438{
2439 size_t __n = __1d_.size();
2440 for (size_t __i = 0; __i < __n; ++__i)
2441 __vp_[__1d_[__i]] /= __v[__i];
2442}
2443
2444template <class _Tp>
2445template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002446inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002447typename enable_if
2448<
2449 __is_val_expr<_Expr>::value,
2450 void
2451>::type
2452indirect_array<_Tp>::operator%=(const _Expr& __v) const
2453{
2454 size_t __n = __1d_.size();
2455 for (size_t __i = 0; __i < __n; ++__i)
2456 __vp_[__1d_[__i]] %= __v[__i];
2457}
2458
2459template <class _Tp>
2460template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002461inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002462typename enable_if
2463<
2464 __is_val_expr<_Expr>::value,
2465 void
2466>::type
2467indirect_array<_Tp>::operator+=(const _Expr& __v) const
2468{
2469 size_t __n = __1d_.size();
2470 for (size_t __i = 0; __i < __n; ++__i)
2471 __vp_[__1d_[__i]] += __v[__i];
2472}
2473
2474template <class _Tp>
2475template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002476inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002477typename enable_if
2478<
2479 __is_val_expr<_Expr>::value,
2480 void
2481>::type
2482indirect_array<_Tp>::operator-=(const _Expr& __v) const
2483{
2484 size_t __n = __1d_.size();
2485 for (size_t __i = 0; __i < __n; ++__i)
2486 __vp_[__1d_[__i]] -= __v[__i];
2487}
2488
2489template <class _Tp>
2490template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002491inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002492typename enable_if
2493<
2494 __is_val_expr<_Expr>::value,
2495 void
2496>::type
2497indirect_array<_Tp>::operator^=(const _Expr& __v) const
2498{
2499 size_t __n = __1d_.size();
2500 for (size_t __i = 0; __i < __n; ++__i)
2501 __vp_[__1d_[__i]] ^= __v[__i];
2502}
2503
2504template <class _Tp>
2505template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002506inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002507typename enable_if
2508<
2509 __is_val_expr<_Expr>::value,
2510 void
2511>::type
2512indirect_array<_Tp>::operator&=(const _Expr& __v) const
2513{
2514 size_t __n = __1d_.size();
2515 for (size_t __i = 0; __i < __n; ++__i)
2516 __vp_[__1d_[__i]] &= __v[__i];
2517}
2518
2519template <class _Tp>
2520template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002521inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002522typename enable_if
2523<
2524 __is_val_expr<_Expr>::value,
2525 void
2526>::type
2527indirect_array<_Tp>::operator|=(const _Expr& __v) const
2528{
2529 size_t __n = __1d_.size();
2530 for (size_t __i = 0; __i < __n; ++__i)
2531 __vp_[__1d_[__i]] |= __v[__i];
2532}
2533
2534template <class _Tp>
2535template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002536inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002537typename enable_if
2538<
2539 __is_val_expr<_Expr>::value,
2540 void
2541>::type
2542indirect_array<_Tp>::operator<<=(const _Expr& __v) const
2543{
2544 size_t __n = __1d_.size();
2545 for (size_t __i = 0; __i < __n; ++__i)
2546 __vp_[__1d_[__i]] <<= __v[__i];
2547}
2548
2549template <class _Tp>
2550template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002551inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002552typename enable_if
2553<
2554 __is_val_expr<_Expr>::value,
2555 void
2556>::type
2557indirect_array<_Tp>::operator>>=(const _Expr& __v) const
2558{
2559 size_t __n = __1d_.size();
2560 for (size_t __i = 0; __i < __n; ++__i)
2561 __vp_[__1d_[__i]] >>= __v[__i];
2562}
2563
2564template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002565inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002566const indirect_array<_Tp>&
2567indirect_array<_Tp>::operator=(const indirect_array& __ia) const
2568{
2569 typedef const size_t* _Ip;
2570 const value_type* __s = __ia.__vp_;
2571 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_, __j = __ia.__1d_.__begin_;
2572 __i != __e; ++__i, ++__j)
2573 __vp_[*__i] = __s[*__j];
2574 return *this;
2575}
2576
2577template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002578inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002579void
2580indirect_array<_Tp>::operator=(const value_type& __x) const
2581{
2582 typedef const size_t* _Ip;
2583 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i)
2584 __vp_[*__i] = __x;
2585}
2586
2587template <class _ValExpr>
2588class __indirect_expr
2589{
2590 typedef typename remove_reference<_ValExpr>::type _RmExpr;
2591public:
2592 typedef typename _RmExpr::value_type value_type;
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002593 typedef value_type __result_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002594
2595private:
2596 _ValExpr __expr_;
2597 valarray<size_t> __1d_;
2598
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002599 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002600 __indirect_expr(const valarray<size_t>& __ia, const _RmExpr& __e)
2601 : __expr_(__e),
2602 __1d_(__ia)
2603 {}
2604
Eric Fiselier3b0b81f2017-04-19 00:23:45 +00002605#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00002606
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002607 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002608 __indirect_expr(valarray<size_t>&& __ia, const _RmExpr& __e)
2609 : __expr_(__e),
2610 __1d_(move(__ia))
2611 {}
2612
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002613#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00002614
2615public:
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002616 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002617 __result_type operator[](size_t __i) const
Howard Hinnantc51e1022010-05-11 19:42:16 +00002618 {return __expr_[__1d_[__i]];}
2619
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002620 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002621 size_t size() const {return __1d_.size();}
2622
Eric Fiselier7b31ed02019-04-02 08:05:23 +00002623 template <class> friend class __val_expr;
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00002624 template <class> friend class _LIBCPP_TEMPLATE_VIS valarray;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002625};
2626
2627template<class _ValExpr>
2628class __val_expr
2629{
2630 typedef typename remove_reference<_ValExpr>::type _RmExpr;
2631
2632 _ValExpr __expr_;
2633public:
2634 typedef typename _RmExpr::value_type value_type;
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002635 typedef typename _RmExpr::__result_type __result_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002636
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002637 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002638 explicit __val_expr(const _RmExpr& __e) : __expr_(__e) {}
2639
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002640 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002641 __result_type operator[](size_t __i) const
Howard Hinnantc51e1022010-05-11 19:42:16 +00002642 {return __expr_[__i];}
2643
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002644 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002645 __val_expr<__slice_expr<_ValExpr> > operator[](slice __s) const
Eric Fiselier7b31ed02019-04-02 08:05:23 +00002646 {
2647 typedef __slice_expr<_ValExpr> _NewExpr;
2648 return __val_expr< _NewExpr >(_NewExpr(__s, __expr_));
2649 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00002650
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002651 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002652 __val_expr<__indirect_expr<_ValExpr> > operator[](const gslice& __gs) const
Eric Fiselier7b31ed02019-04-02 08:05:23 +00002653 {
2654 typedef __indirect_expr<_ValExpr> _NewExpr;
2655 return __val_expr<_NewExpr >(_NewExpr(__gs.__1d_, __expr_));
2656 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00002657
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002658 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002659 __val_expr<__mask_expr<_ValExpr> > operator[](const valarray<bool>& __vb) const
Eric Fiselier7b31ed02019-04-02 08:05:23 +00002660 {
2661 typedef __mask_expr<_ValExpr> _NewExpr;
2662 return __val_expr< _NewExpr >( _NewExpr(__vb, __expr_));
2663 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00002664
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002665 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002666 __val_expr<__indirect_expr<_ValExpr> > operator[](const valarray<size_t>& __vs) const
Eric Fiselier7b31ed02019-04-02 08:05:23 +00002667 {
2668 typedef __indirect_expr<_ValExpr> _NewExpr;
2669 return __val_expr< _NewExpr >(_NewExpr(__vs, __expr_));
2670 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00002671
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002672 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002673 __val_expr<_UnaryOp<__unary_plus<value_type>, _ValExpr> >
2674 operator+() const
2675 {
2676 typedef _UnaryOp<__unary_plus<value_type>, _ValExpr> _NewExpr;
2677 return __val_expr<_NewExpr>(_NewExpr(__unary_plus<value_type>(), __expr_));
2678 }
2679
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002680 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002681 __val_expr<_UnaryOp<negate<value_type>, _ValExpr> >
2682 operator-() const
2683 {
2684 typedef _UnaryOp<negate<value_type>, _ValExpr> _NewExpr;
2685 return __val_expr<_NewExpr>(_NewExpr(negate<value_type>(), __expr_));
2686 }
2687
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002688 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002689 __val_expr<_UnaryOp<__bit_not<value_type>, _ValExpr> >
2690 operator~() const
2691 {
2692 typedef _UnaryOp<__bit_not<value_type>, _ValExpr> _NewExpr;
2693 return __val_expr<_NewExpr>(_NewExpr(__bit_not<value_type>(), __expr_));
2694 }
2695
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002696 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002697 __val_expr<_UnaryOp<logical_not<value_type>, _ValExpr> >
2698 operator!() const
2699 {
2700 typedef _UnaryOp<logical_not<value_type>, _ValExpr> _NewExpr;
2701 return __val_expr<_NewExpr>(_NewExpr(logical_not<value_type>(), __expr_));
2702 }
2703
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002704 operator valarray<__result_type>() const;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002705
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002706 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002707 size_t size() const {return __expr_.size();}
2708
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002709 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002710 __result_type sum() const
Howard Hinnantc51e1022010-05-11 19:42:16 +00002711 {
2712 size_t __n = __expr_.size();
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002713 __result_type __r = __n ? __expr_[0] : __result_type();
Howard Hinnantc51e1022010-05-11 19:42:16 +00002714 for (size_t __i = 1; __i < __n; ++__i)
2715 __r += __expr_[__i];
2716 return __r;
2717 }
2718
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002719 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002720 __result_type min() const
Howard Hinnantc51e1022010-05-11 19:42:16 +00002721 {
2722 size_t __n = size();
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002723 __result_type __r = __n ? (*this)[0] : __result_type();
Howard Hinnantc51e1022010-05-11 19:42:16 +00002724 for (size_t __i = 1; __i < __n; ++__i)
2725 {
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002726 __result_type __x = __expr_[__i];
Howard Hinnantc51e1022010-05-11 19:42:16 +00002727 if (__x < __r)
2728 __r = __x;
2729 }
2730 return __r;
2731 }
2732
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002733 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002734 __result_type max() const
Howard Hinnantc51e1022010-05-11 19:42:16 +00002735 {
2736 size_t __n = size();
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002737 __result_type __r = __n ? (*this)[0] : __result_type();
Howard Hinnantc51e1022010-05-11 19:42:16 +00002738 for (size_t __i = 1; __i < __n; ++__i)
2739 {
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002740 __result_type __x = __expr_[__i];
Howard Hinnantc51e1022010-05-11 19:42:16 +00002741 if (__r < __x)
2742 __r = __x;
2743 }
2744 return __r;
2745 }
2746
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002747 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002748 __val_expr<__shift_expr<_ValExpr> > shift (int __i) const
2749 {return __val_expr<__shift_expr<_ValExpr> >(__shift_expr<_ValExpr>(__i, __expr_));}
2750
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002751 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002752 __val_expr<__cshift_expr<_ValExpr> > cshift(int __i) const
2753 {return __val_expr<__cshift_expr<_ValExpr> >(__cshift_expr<_ValExpr>(__i, __expr_));}
2754
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002755 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002756 __val_expr<_UnaryOp<__apply_expr<value_type, value_type(*)(value_type)>, _ValExpr> >
2757 apply(value_type __f(value_type)) const
2758 {
2759 typedef __apply_expr<value_type, value_type(*)(value_type)> _Op;
2760 typedef _UnaryOp<_Op, _ValExpr> _NewExpr;
2761 return __val_expr<_NewExpr>(_NewExpr(_Op(__f), __expr_));
2762 }
2763
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002764 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002765 __val_expr<_UnaryOp<__apply_expr<value_type, value_type(*)(const value_type&)>, _ValExpr> >
2766 apply(value_type __f(const value_type&)) const
2767 {
2768 typedef __apply_expr<value_type, value_type(*)(const value_type&)> _Op;
2769 typedef _UnaryOp<_Op, _ValExpr> _NewExpr;
2770 return __val_expr<_NewExpr>(_NewExpr(_Op(__f), __expr_));
2771 }
2772};
2773
2774template<class _ValExpr>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002775__val_expr<_ValExpr>::operator valarray<__val_expr::__result_type>() const
Howard Hinnantc51e1022010-05-11 19:42:16 +00002776{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002777 valarray<__result_type> __r;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002778 size_t __n = __expr_.size();
2779 if (__n)
2780 {
2781 __r.__begin_ =
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002782 __r.__end_ = allocator<__result_type>().allocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002783 for (size_t __i = 0; __i != __n; ++__r.__end_, ++__i)
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002784 ::new ((void*)__r.__end_) __result_type(__expr_[__i]);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002785 }
2786 return __r;
2787}
2788
2789// valarray
2790
2791template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002792inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002793valarray<_Tp>::valarray(size_t __n)
Bruce Mitchener170d8972020-11-24 12:53:53 -05002794 : __begin_(nullptr),
2795 __end_(nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002796{
Mikhail Maltsev59de6f82018-02-08 11:33:48 +00002797 if (__n)
2798 {
Louis Dionne5ffe5152020-09-28 15:47:49 -04002799 __begin_ = __end_ = allocator<value_type>().allocate(__n);
Mikhail Maltsev59de6f82018-02-08 11:33:48 +00002800#ifndef _LIBCPP_NO_EXCEPTIONS
2801 try
2802 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002803#endif // _LIBCPP_NO_EXCEPTIONS
Eric Fiselier2856ef82018-10-25 17:21:30 +00002804 for (size_t __n_left = __n; __n_left; --__n_left, ++__end_)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05002805 ::new ((void*)__end_) value_type();
Mikhail Maltsev59de6f82018-02-08 11:33:48 +00002806#ifndef _LIBCPP_NO_EXCEPTIONS
2807 }
2808 catch (...)
2809 {
Eric Fiselier2856ef82018-10-25 17:21:30 +00002810 __clear(__n);
Mikhail Maltsev59de6f82018-02-08 11:33:48 +00002811 throw;
2812 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002813#endif // _LIBCPP_NO_EXCEPTIONS
Mikhail Maltsev59de6f82018-02-08 11:33:48 +00002814 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00002815}
2816
2817template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002818inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002819valarray<_Tp>::valarray(const value_type& __x, size_t __n)
Bruce Mitchener170d8972020-11-24 12:53:53 -05002820 : __begin_(nullptr),
2821 __end_(nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002822{
2823 resize(__n, __x);
2824}
2825
2826template <class _Tp>
2827valarray<_Tp>::valarray(const value_type* __p, size_t __n)
Bruce Mitchener170d8972020-11-24 12:53:53 -05002828 : __begin_(nullptr),
2829 __end_(nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002830{
2831 if (__n)
2832 {
Louis Dionne5ffe5152020-09-28 15:47:49 -04002833 __begin_ = __end_ = allocator<value_type>().allocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002834#ifndef _LIBCPP_NO_EXCEPTIONS
2835 try
2836 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002837#endif // _LIBCPP_NO_EXCEPTIONS
Eric Fiselier2856ef82018-10-25 17:21:30 +00002838 for (size_t __n_left = __n; __n_left; ++__end_, ++__p, --__n_left)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05002839 ::new ((void*)__end_) value_type(*__p);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002840#ifndef _LIBCPP_NO_EXCEPTIONS
2841 }
2842 catch (...)
2843 {
Eric Fiselier2856ef82018-10-25 17:21:30 +00002844 __clear(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002845 throw;
2846 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002847#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00002848 }
2849}
2850
2851template <class _Tp>
2852valarray<_Tp>::valarray(const valarray& __v)
Bruce Mitchener170d8972020-11-24 12:53:53 -05002853 : __begin_(nullptr),
2854 __end_(nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002855{
2856 if (__v.size())
2857 {
Louis Dionne5ffe5152020-09-28 15:47:49 -04002858 __begin_ = __end_ = allocator<value_type>().allocate(__v.size());
Howard Hinnantc51e1022010-05-11 19:42:16 +00002859#ifndef _LIBCPP_NO_EXCEPTIONS
2860 try
2861 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002862#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00002863 for (value_type* __p = __v.__begin_; __p != __v.__end_; ++__end_, ++__p)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05002864 ::new ((void*)__end_) value_type(*__p);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002865#ifndef _LIBCPP_NO_EXCEPTIONS
2866 }
2867 catch (...)
2868 {
Eric Fiselier2856ef82018-10-25 17:21:30 +00002869 __clear(__v.size());
Howard Hinnantc51e1022010-05-11 19:42:16 +00002870 throw;
2871 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002872#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00002873 }
2874}
2875
Eric Fiselier3b0b81f2017-04-19 00:23:45 +00002876#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00002877
2878template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002879inline
Howard Hinnant298aed92012-07-21 00:51:28 +00002880valarray<_Tp>::valarray(valarray&& __v) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00002881 : __begin_(__v.__begin_),
2882 __end_(__v.__end_)
2883{
2884 __v.__begin_ = __v.__end_ = nullptr;
2885}
2886
2887template <class _Tp>
2888valarray<_Tp>::valarray(initializer_list<value_type> __il)
Bruce Mitchener170d8972020-11-24 12:53:53 -05002889 : __begin_(nullptr),
2890 __end_(nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002891{
Eric Fiselier2856ef82018-10-25 17:21:30 +00002892 const size_t __n = __il.size();
Howard Hinnantc51e1022010-05-11 19:42:16 +00002893 if (__n)
2894 {
Louis Dionne5ffe5152020-09-28 15:47:49 -04002895 __begin_ = __end_ = allocator<value_type>().allocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002896#ifndef _LIBCPP_NO_EXCEPTIONS
2897 try
2898 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002899#endif // _LIBCPP_NO_EXCEPTIONS
Eric Fiselier2856ef82018-10-25 17:21:30 +00002900 size_t __n_left = __n;
2901 for (const value_type* __p = __il.begin(); __n_left; ++__end_, ++__p, --__n_left)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05002902 ::new ((void*)__end_) value_type(*__p);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002903#ifndef _LIBCPP_NO_EXCEPTIONS
2904 }
2905 catch (...)
2906 {
Eric Fiselier2856ef82018-10-25 17:21:30 +00002907 __clear(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002908 throw;
2909 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002910#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00002911 }
2912}
2913
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002914#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00002915
2916template <class _Tp>
2917valarray<_Tp>::valarray(const slice_array<value_type>& __sa)
Bruce Mitchener170d8972020-11-24 12:53:53 -05002918 : __begin_(nullptr),
2919 __end_(nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002920{
Eric Fiselier2856ef82018-10-25 17:21:30 +00002921 const size_t __n = __sa.__size_;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002922 if (__n)
2923 {
Louis Dionne5ffe5152020-09-28 15:47:49 -04002924 __begin_ = __end_ = allocator<value_type>().allocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002925#ifndef _LIBCPP_NO_EXCEPTIONS
2926 try
2927 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002928#endif // _LIBCPP_NO_EXCEPTIONS
Eric Fiselier2856ef82018-10-25 17:21:30 +00002929 size_t __n_left = __n;
2930 for (const value_type* __p = __sa.__vp_; __n_left; ++__end_, __p += __sa.__stride_, --__n_left)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05002931 ::new ((void*)__end_) value_type(*__p);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002932#ifndef _LIBCPP_NO_EXCEPTIONS
2933 }
2934 catch (...)
2935 {
Eric Fiselier2856ef82018-10-25 17:21:30 +00002936 __clear(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002937 throw;
2938 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002939#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00002940 }
2941}
2942
2943template <class _Tp>
2944valarray<_Tp>::valarray(const gslice_array<value_type>& __ga)
Bruce Mitchener170d8972020-11-24 12:53:53 -05002945 : __begin_(nullptr),
2946 __end_(nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002947{
Eric Fiselier2856ef82018-10-25 17:21:30 +00002948 const size_t __n = __ga.__1d_.size();
Howard Hinnantc51e1022010-05-11 19:42:16 +00002949 if (__n)
2950 {
Louis Dionne5ffe5152020-09-28 15:47:49 -04002951 __begin_ = __end_ = allocator<value_type>().allocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002952#ifndef _LIBCPP_NO_EXCEPTIONS
2953 try
2954 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002955#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00002956 typedef const size_t* _Ip;
2957 const value_type* __s = __ga.__vp_;
2958 for (_Ip __i = __ga.__1d_.__begin_, __e = __ga.__1d_.__end_;
2959 __i != __e; ++__i, ++__end_)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05002960 ::new ((void*)__end_) value_type(__s[*__i]);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002961#ifndef _LIBCPP_NO_EXCEPTIONS
2962 }
2963 catch (...)
2964 {
Eric Fiselier2856ef82018-10-25 17:21:30 +00002965 __clear(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002966 throw;
2967 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002968#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00002969 }
2970}
2971
2972template <class _Tp>
2973valarray<_Tp>::valarray(const mask_array<value_type>& __ma)
Bruce Mitchener170d8972020-11-24 12:53:53 -05002974 : __begin_(nullptr),
2975 __end_(nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002976{
Eric Fiselier2856ef82018-10-25 17:21:30 +00002977 const size_t __n = __ma.__1d_.size();
Howard Hinnantc51e1022010-05-11 19:42:16 +00002978 if (__n)
2979 {
Louis Dionne5ffe5152020-09-28 15:47:49 -04002980 __begin_ = __end_ = allocator<value_type>().allocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002981#ifndef _LIBCPP_NO_EXCEPTIONS
2982 try
2983 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002984#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00002985 typedef const size_t* _Ip;
2986 const value_type* __s = __ma.__vp_;
2987 for (_Ip __i = __ma.__1d_.__begin_, __e = __ma.__1d_.__end_;
2988 __i != __e; ++__i, ++__end_)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05002989 ::new ((void*)__end_) value_type(__s[*__i]);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002990#ifndef _LIBCPP_NO_EXCEPTIONS
2991 }
2992 catch (...)
2993 {
Eric Fiselier2856ef82018-10-25 17:21:30 +00002994 __clear(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002995 throw;
2996 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002997#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00002998 }
2999}
3000
3001template <class _Tp>
3002valarray<_Tp>::valarray(const indirect_array<value_type>& __ia)
Bruce Mitchener170d8972020-11-24 12:53:53 -05003003 : __begin_(nullptr),
3004 __end_(nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00003005{
Eric Fiselier2856ef82018-10-25 17:21:30 +00003006 const size_t __n = __ia.__1d_.size();
Howard Hinnantc51e1022010-05-11 19:42:16 +00003007 if (__n)
3008 {
Louis Dionne5ffe5152020-09-28 15:47:49 -04003009 __begin_ = __end_ = allocator<value_type>().allocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003010#ifndef _LIBCPP_NO_EXCEPTIONS
3011 try
3012 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04003013#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00003014 typedef const size_t* _Ip;
3015 const value_type* __s = __ia.__vp_;
3016 for (_Ip __i = __ia.__1d_.__begin_, __e = __ia.__1d_.__end_;
3017 __i != __e; ++__i, ++__end_)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05003018 ::new ((void*)__end_) value_type(__s[*__i]);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003019#ifndef _LIBCPP_NO_EXCEPTIONS
3020 }
3021 catch (...)
3022 {
Eric Fiselier2856ef82018-10-25 17:21:30 +00003023 __clear(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003024 throw;
3025 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04003026#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00003027 }
3028}
3029
3030template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003031inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003032valarray<_Tp>::~valarray()
3033{
Eric Fiselier2856ef82018-10-25 17:21:30 +00003034 __clear(size());
Mikhail Maltsev59de6f82018-02-08 11:33:48 +00003035}
3036
3037template <class _Tp>
3038valarray<_Tp>&
3039valarray<_Tp>::__assign_range(const value_type* __f, const value_type* __l)
3040{
3041 size_t __n = __l - __f;
3042 if (size() != __n)
3043 {
Eric Fiselier2856ef82018-10-25 17:21:30 +00003044 __clear(size());
Louis Dionne5ffe5152020-09-28 15:47:49 -04003045 __begin_ = allocator<value_type>().allocate(__n);
Mikhail Maltsev59de6f82018-02-08 11:33:48 +00003046 __end_ = __begin_ + __n;
3047 _VSTD::uninitialized_copy(__f, __l, __begin_);
3048 } else {
3049 _VSTD::copy(__f, __l, __begin_);
3050 }
3051 return *this;
Howard Hinnantc51e1022010-05-11 19:42:16 +00003052}
3053
3054template <class _Tp>
3055valarray<_Tp>&
3056valarray<_Tp>::operator=(const valarray& __v)
3057{
Mark de Wever357a1fc2021-09-28 19:15:18 +02003058 if (this != _VSTD::addressof(__v))
Mikhail Maltsev59de6f82018-02-08 11:33:48 +00003059 return __assign_range(__v.__begin_, __v.__end_);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003060 return *this;
3061}
3062
Eric Fiselier3b0b81f2017-04-19 00:23:45 +00003063#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00003064
3065template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003066inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003067valarray<_Tp>&
Howard Hinnant298aed92012-07-21 00:51:28 +00003068valarray<_Tp>::operator=(valarray&& __v) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00003069{
Eric Fiselier2856ef82018-10-25 17:21:30 +00003070 __clear(size());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003071 __begin_ = __v.__begin_;
3072 __end_ = __v.__end_;
3073 __v.__begin_ = nullptr;
3074 __v.__end_ = nullptr;
3075 return *this;
3076}
3077
3078template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003079inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003080valarray<_Tp>&
3081valarray<_Tp>::operator=(initializer_list<value_type> __il)
3082{
Mikhail Maltsev59de6f82018-02-08 11:33:48 +00003083 return __assign_range(__il.begin(), __il.end());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003084}
3085
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04003086#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00003087
3088template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003089inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003090valarray<_Tp>&
3091valarray<_Tp>::operator=(const value_type& __x)
3092{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003093 _VSTD::fill(__begin_, __end_, __x);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003094 return *this;
3095}
3096
3097template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003098inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003099valarray<_Tp>&
3100valarray<_Tp>::operator=(const slice_array<value_type>& __sa)
3101{
3102 value_type* __t = __begin_;
3103 const value_type* __s = __sa.__vp_;
3104 for (size_t __n = __sa.__size_; __n; --__n, __s += __sa.__stride_, ++__t)
3105 *__t = *__s;
3106 return *this;
3107}
3108
3109template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003110inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003111valarray<_Tp>&
3112valarray<_Tp>::operator=(const gslice_array<value_type>& __ga)
3113{
3114 typedef const size_t* _Ip;
3115 value_type* __t = __begin_;
3116 const value_type* __s = __ga.__vp_;
3117 for (_Ip __i = __ga.__1d_.__begin_, __e = __ga.__1d_.__end_;
3118 __i != __e; ++__i, ++__t)
3119 *__t = __s[*__i];
3120 return *this;
3121}
3122
3123template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003124inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003125valarray<_Tp>&
3126valarray<_Tp>::operator=(const mask_array<value_type>& __ma)
3127{
3128 typedef const size_t* _Ip;
3129 value_type* __t = __begin_;
3130 const value_type* __s = __ma.__vp_;
3131 for (_Ip __i = __ma.__1d_.__begin_, __e = __ma.__1d_.__end_;
3132 __i != __e; ++__i, ++__t)
3133 *__t = __s[*__i];
3134 return *this;
3135}
3136
3137template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003138inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003139valarray<_Tp>&
3140valarray<_Tp>::operator=(const indirect_array<value_type>& __ia)
3141{
3142 typedef const size_t* _Ip;
3143 value_type* __t = __begin_;
3144 const value_type* __s = __ia.__vp_;
3145 for (_Ip __i = __ia.__1d_.__begin_, __e = __ia.__1d_.__end_;
3146 __i != __e; ++__i, ++__t)
3147 *__t = __s[*__i];
3148 return *this;
3149}
3150
3151template <class _Tp>
Howard Hinnant329cd412011-07-27 23:19:59 +00003152template <class _ValExpr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003153inline
Howard Hinnant329cd412011-07-27 23:19:59 +00003154valarray<_Tp>&
3155valarray<_Tp>::operator=(const __val_expr<_ValExpr>& __v)
3156{
3157 size_t __n = __v.size();
3158 if (size() != __n)
3159 resize(__n);
3160 value_type* __t = __begin_;
3161 for (size_t __i = 0; __i != __n; ++__t, ++__i)
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04003162 *__t = __result_type(__v[__i]);
Howard Hinnant329cd412011-07-27 23:19:59 +00003163 return *this;
3164}
3165
3166template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003167inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003168__val_expr<__slice_expr<const valarray<_Tp>&> >
3169valarray<_Tp>::operator[](slice __s) const
3170{
3171 return __val_expr<__slice_expr<const valarray&> >(__slice_expr<const valarray&>(__s, *this));
3172}
3173
3174template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003175inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003176slice_array<_Tp>
3177valarray<_Tp>::operator[](slice __s)
3178{
3179 return slice_array<value_type>(__s, *this);
3180}
3181
3182template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003183inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003184__val_expr<__indirect_expr<const valarray<_Tp>&> >
3185valarray<_Tp>::operator[](const gslice& __gs) const
3186{
3187 return __val_expr<__indirect_expr<const valarray&> >(__indirect_expr<const valarray&>(__gs.__1d_, *this));
3188}
3189
3190template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003191inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003192gslice_array<_Tp>
3193valarray<_Tp>::operator[](const gslice& __gs)
3194{
3195 return gslice_array<value_type>(__gs, *this);
3196}
3197
Eric Fiselier3b0b81f2017-04-19 00:23:45 +00003198#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00003199
3200template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003201inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003202__val_expr<__indirect_expr<const valarray<_Tp>&> >
3203valarray<_Tp>::operator[](gslice&& __gs) const
3204{
3205 return __val_expr<__indirect_expr<const valarray&> >(__indirect_expr<const valarray&>(move(__gs.__1d_), *this));
3206}
3207
3208template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003209inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003210gslice_array<_Tp>
3211valarray<_Tp>::operator[](gslice&& __gs)
3212{
3213 return gslice_array<value_type>(move(__gs), *this);
3214}
3215
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04003216#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00003217
3218template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003219inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003220__val_expr<__mask_expr<const valarray<_Tp>&> >
3221valarray<_Tp>::operator[](const valarray<bool>& __vb) const
3222{
3223 return __val_expr<__mask_expr<const valarray&> >(__mask_expr<const valarray&>(__vb, *this));
3224}
3225
3226template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003227inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003228mask_array<_Tp>
3229valarray<_Tp>::operator[](const valarray<bool>& __vb)
3230{
3231 return mask_array<value_type>(__vb, *this);
3232}
3233
Eric Fiselier3b0b81f2017-04-19 00:23:45 +00003234#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00003235
3236template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003237inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003238__val_expr<__mask_expr<const valarray<_Tp>&> >
3239valarray<_Tp>::operator[](valarray<bool>&& __vb) const
3240{
3241 return __val_expr<__mask_expr<const valarray&> >(__mask_expr<const valarray&>(move(__vb), *this));
3242}
3243
3244template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003245inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003246mask_array<_Tp>
3247valarray<_Tp>::operator[](valarray<bool>&& __vb)
3248{
3249 return mask_array<value_type>(move(__vb), *this);
3250}
3251
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04003252#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00003253
3254template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003255inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003256__val_expr<__indirect_expr<const valarray<_Tp>&> >
3257valarray<_Tp>::operator[](const valarray<size_t>& __vs) const
3258{
3259 return __val_expr<__indirect_expr<const valarray&> >(__indirect_expr<const valarray&>(__vs, *this));
3260}
3261
3262template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003263inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003264indirect_array<_Tp>
3265valarray<_Tp>::operator[](const valarray<size_t>& __vs)
3266{
3267 return indirect_array<value_type>(__vs, *this);
3268}
3269
Eric Fiselier3b0b81f2017-04-19 00:23:45 +00003270#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00003271
3272template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003273inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003274__val_expr<__indirect_expr<const valarray<_Tp>&> >
3275valarray<_Tp>::operator[](valarray<size_t>&& __vs) const
3276{
3277 return __val_expr<__indirect_expr<const valarray&> >(__indirect_expr<const valarray&>(move(__vs), *this));
3278}
3279
3280template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003281inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003282indirect_array<_Tp>
3283valarray<_Tp>::operator[](valarray<size_t>&& __vs)
3284{
3285 return indirect_array<value_type>(move(__vs), *this);
3286}
3287
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04003288#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00003289
3290template <class _Tp>
3291valarray<_Tp>
3292valarray<_Tp>::operator+() const
3293{
3294 valarray<value_type> __r;
3295 size_t __n = size();
3296 if (__n)
3297 {
Louis Dionne5ffe5152020-09-28 15:47:49 -04003298 __r.__begin_ = __r.__end_ = allocator<value_type>().allocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003299 for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05003300 ::new ((void*)__r.__end_) value_type(+*__p);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003301 }
3302 return __r;
3303}
3304
3305template <class _Tp>
3306valarray<_Tp>
3307valarray<_Tp>::operator-() const
3308{
3309 valarray<value_type> __r;
3310 size_t __n = size();
3311 if (__n)
3312 {
Louis Dionne5ffe5152020-09-28 15:47:49 -04003313 __r.__begin_ = __r.__end_ = allocator<value_type>().allocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003314 for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05003315 ::new ((void*)__r.__end_) value_type(-*__p);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003316 }
3317 return __r;
3318}
3319
3320template <class _Tp>
3321valarray<_Tp>
3322valarray<_Tp>::operator~() const
3323{
3324 valarray<value_type> __r;
3325 size_t __n = size();
3326 if (__n)
3327 {
Louis Dionne5ffe5152020-09-28 15:47:49 -04003328 __r.__begin_ = __r.__end_ = allocator<value_type>().allocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003329 for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05003330 ::new ((void*)__r.__end_) value_type(~*__p);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003331 }
3332 return __r;
3333}
3334
3335template <class _Tp>
3336valarray<bool>
3337valarray<_Tp>::operator!() const
3338{
3339 valarray<bool> __r;
3340 size_t __n = size();
3341 if (__n)
3342 {
Louis Dionne5ffe5152020-09-28 15:47:49 -04003343 __r.__begin_ = __r.__end_ = allocator<bool>().allocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003344 for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05003345 ::new ((void*)__r.__end_) bool(!*__p);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003346 }
3347 return __r;
3348}
3349
3350template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003351inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003352valarray<_Tp>&
3353valarray<_Tp>::operator*=(const value_type& __x)
3354{
3355 for (value_type* __p = __begin_; __p != __end_; ++__p)
3356 *__p *= __x;
3357 return *this;
3358}
3359
3360template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003361inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003362valarray<_Tp>&
3363valarray<_Tp>::operator/=(const value_type& __x)
3364{
3365 for (value_type* __p = __begin_; __p != __end_; ++__p)
3366 *__p /= __x;
3367 return *this;
3368}
3369
3370template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003371inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003372valarray<_Tp>&
3373valarray<_Tp>::operator%=(const value_type& __x)
3374{
3375 for (value_type* __p = __begin_; __p != __end_; ++__p)
3376 *__p %= __x;
3377 return *this;
3378}
3379
3380template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003381inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003382valarray<_Tp>&
3383valarray<_Tp>::operator+=(const value_type& __x)
3384{
3385 for (value_type* __p = __begin_; __p != __end_; ++__p)
3386 *__p += __x;
3387 return *this;
3388}
3389
3390template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003391inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003392valarray<_Tp>&
3393valarray<_Tp>::operator-=(const value_type& __x)
3394{
3395 for (value_type* __p = __begin_; __p != __end_; ++__p)
3396 *__p -= __x;
3397 return *this;
3398}
3399
3400template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003401inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003402valarray<_Tp>&
3403valarray<_Tp>::operator^=(const value_type& __x)
3404{
3405 for (value_type* __p = __begin_; __p != __end_; ++__p)
3406 *__p ^= __x;
3407 return *this;
3408}
3409
3410template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003411inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003412valarray<_Tp>&
3413valarray<_Tp>::operator&=(const value_type& __x)
3414{
3415 for (value_type* __p = __begin_; __p != __end_; ++__p)
3416 *__p &= __x;
3417 return *this;
3418}
3419
3420template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003421inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003422valarray<_Tp>&
3423valarray<_Tp>::operator|=(const value_type& __x)
3424{
3425 for (value_type* __p = __begin_; __p != __end_; ++__p)
3426 *__p |= __x;
3427 return *this;
3428}
3429
3430template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003431inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003432valarray<_Tp>&
3433valarray<_Tp>::operator<<=(const value_type& __x)
3434{
3435 for (value_type* __p = __begin_; __p != __end_; ++__p)
3436 *__p <<= __x;
3437 return *this;
3438}
3439
3440template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003441inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003442valarray<_Tp>&
3443valarray<_Tp>::operator>>=(const value_type& __x)
3444{
3445 for (value_type* __p = __begin_; __p != __end_; ++__p)
3446 *__p >>= __x;
3447 return *this;
3448}
3449
3450template <class _Tp>
3451template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003452inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003453typename enable_if
3454<
3455 __is_val_expr<_Expr>::value,
3456 valarray<_Tp>&
3457>::type
3458valarray<_Tp>::operator*=(const _Expr& __v)
3459{
3460 size_t __i = 0;
3461 for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3462 *__t *= __v[__i];
3463 return *this;
3464}
3465
3466template <class _Tp>
3467template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003468inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003469typename enable_if
3470<
3471 __is_val_expr<_Expr>::value,
3472 valarray<_Tp>&
3473>::type
3474valarray<_Tp>::operator/=(const _Expr& __v)
3475{
3476 size_t __i = 0;
3477 for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3478 *__t /= __v[__i];
3479 return *this;
3480}
3481
3482template <class _Tp>
3483template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003484inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003485typename enable_if
3486<
3487 __is_val_expr<_Expr>::value,
3488 valarray<_Tp>&
3489>::type
3490valarray<_Tp>::operator%=(const _Expr& __v)
3491{
3492 size_t __i = 0;
3493 for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3494 *__t %= __v[__i];
3495 return *this;
3496}
3497
3498template <class _Tp>
3499template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003500inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003501typename enable_if
3502<
3503 __is_val_expr<_Expr>::value,
3504 valarray<_Tp>&
3505>::type
3506valarray<_Tp>::operator+=(const _Expr& __v)
3507{
3508 size_t __i = 0;
3509 for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3510 *__t += __v[__i];
3511 return *this;
3512}
3513
3514template <class _Tp>
3515template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003516inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003517typename enable_if
3518<
3519 __is_val_expr<_Expr>::value,
3520 valarray<_Tp>&
3521>::type
3522valarray<_Tp>::operator-=(const _Expr& __v)
3523{
3524 size_t __i = 0;
3525 for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3526 *__t -= __v[__i];
3527 return *this;
3528}
3529
3530template <class _Tp>
3531template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003532inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003533typename enable_if
3534<
3535 __is_val_expr<_Expr>::value,
3536 valarray<_Tp>&
3537>::type
3538valarray<_Tp>::operator^=(const _Expr& __v)
3539{
3540 size_t __i = 0;
3541 for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3542 *__t ^= __v[__i];
3543 return *this;
3544}
3545
3546template <class _Tp>
3547template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003548inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003549typename enable_if
3550<
3551 __is_val_expr<_Expr>::value,
3552 valarray<_Tp>&
3553>::type
3554valarray<_Tp>::operator|=(const _Expr& __v)
3555{
3556 size_t __i = 0;
3557 for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3558 *__t |= __v[__i];
3559 return *this;
3560}
3561
3562template <class _Tp>
3563template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003564inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003565typename enable_if
3566<
3567 __is_val_expr<_Expr>::value,
3568 valarray<_Tp>&
3569>::type
3570valarray<_Tp>::operator&=(const _Expr& __v)
3571{
3572 size_t __i = 0;
3573 for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3574 *__t &= __v[__i];
3575 return *this;
3576}
3577
3578template <class _Tp>
3579template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003580inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003581typename enable_if
3582<
3583 __is_val_expr<_Expr>::value,
3584 valarray<_Tp>&
3585>::type
3586valarray<_Tp>::operator<<=(const _Expr& __v)
3587{
3588 size_t __i = 0;
3589 for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3590 *__t <<= __v[__i];
3591 return *this;
3592}
3593
3594template <class _Tp>
3595template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003596inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003597typename enable_if
3598<
3599 __is_val_expr<_Expr>::value,
3600 valarray<_Tp>&
3601>::type
3602valarray<_Tp>::operator>>=(const _Expr& __v)
3603{
3604 size_t __i = 0;
3605 for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3606 *__t >>= __v[__i];
3607 return *this;
3608}
3609
3610template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003611inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003612void
Howard Hinnant298aed92012-07-21 00:51:28 +00003613valarray<_Tp>::swap(valarray& __v) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00003614{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003615 _VSTD::swap(__begin_, __v.__begin_);
3616 _VSTD::swap(__end_, __v.__end_);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003617}
3618
3619template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003620inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003621_Tp
3622valarray<_Tp>::sum() const
3623{
3624 if (__begin_ == __end_)
3625 return value_type();
3626 const value_type* __p = __begin_;
3627 _Tp __r = *__p;
3628 for (++__p; __p != __end_; ++__p)
3629 __r += *__p;
3630 return __r;
3631}
3632
3633template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003634inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003635_Tp
3636valarray<_Tp>::min() const
3637{
3638 if (__begin_ == __end_)
3639 return value_type();
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003640 return *_VSTD::min_element(__begin_, __end_);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003641}
3642
3643template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003644inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003645_Tp
3646valarray<_Tp>::max() const
3647{
3648 if (__begin_ == __end_)
3649 return value_type();
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003650 return *_VSTD::max_element(__begin_, __end_);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003651}
3652
3653template <class _Tp>
3654valarray<_Tp>
3655valarray<_Tp>::shift(int __i) const
3656{
3657 valarray<value_type> __r;
3658 size_t __n = size();
3659 if (__n)
3660 {
Louis Dionne5ffe5152020-09-28 15:47:49 -04003661 __r.__begin_ = __r.__end_ = allocator<value_type>().allocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003662 const value_type* __sb;
3663 value_type* __tb;
3664 value_type* __te;
3665 if (__i >= 0)
3666 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003667 __i = _VSTD::min(__i, static_cast<int>(__n));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003668 __sb = __begin_ + __i;
3669 __tb = __r.__begin_;
3670 __te = __r.__begin_ + (__n - __i);
3671 }
3672 else
3673 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003674 __i = _VSTD::min(-__i, static_cast<int>(__n));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003675 __sb = __begin_;
3676 __tb = __r.__begin_ + __i;
3677 __te = __r.__begin_ + __n;
3678 }
3679 for (; __r.__end_ != __tb; ++__r.__end_)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05003680 ::new ((void*)__r.__end_) value_type();
Howard Hinnantc51e1022010-05-11 19:42:16 +00003681 for (; __r.__end_ != __te; ++__r.__end_, ++__sb)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05003682 ::new ((void*)__r.__end_) value_type(*__sb);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003683 for (__te = __r.__begin_ + __n; __r.__end_ != __te; ++__r.__end_)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05003684 ::new ((void*)__r.__end_) value_type();
Howard Hinnantc51e1022010-05-11 19:42:16 +00003685 }
3686 return __r;
3687}
3688
3689template <class _Tp>
3690valarray<_Tp>
3691valarray<_Tp>::cshift(int __i) const
3692{
3693 valarray<value_type> __r;
3694 size_t __n = size();
3695 if (__n)
3696 {
Louis Dionne5ffe5152020-09-28 15:47:49 -04003697 __r.__begin_ = __r.__end_ = allocator<value_type>().allocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003698 __i %= static_cast<int>(__n);
3699 const value_type* __m = __i >= 0 ? __begin_ + __i : __end_ + __i;
3700 for (const value_type* __s = __m; __s != __end_; ++__r.__end_, ++__s)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05003701 ::new ((void*)__r.__end_) value_type(*__s);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003702 for (const value_type* __s = __begin_; __s != __m; ++__r.__end_, ++__s)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05003703 ::new ((void*)__r.__end_) value_type(*__s);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003704 }
3705 return __r;
3706}
3707
3708template <class _Tp>
3709valarray<_Tp>
3710valarray<_Tp>::apply(value_type __f(value_type)) const
3711{
3712 valarray<value_type> __r;
3713 size_t __n = size();
3714 if (__n)
3715 {
Louis Dionne5ffe5152020-09-28 15:47:49 -04003716 __r.__begin_ = __r.__end_ = allocator<value_type>().allocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003717 for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05003718 ::new ((void*)__r.__end_) value_type(__f(*__p));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003719 }
3720 return __r;
3721}
3722
3723template <class _Tp>
3724valarray<_Tp>
3725valarray<_Tp>::apply(value_type __f(const value_type&)) const
3726{
3727 valarray<value_type> __r;
3728 size_t __n = size();
3729 if (__n)
3730 {
Louis Dionne5ffe5152020-09-28 15:47:49 -04003731 __r.__begin_ = __r.__end_ = allocator<value_type>().allocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003732 for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05003733 ::new ((void*)__r.__end_) value_type(__f(*__p));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003734 }
3735 return __r;
3736}
3737
3738template <class _Tp>
Eric Fiseliera119c322018-10-25 17:43:26 +00003739inline
Eric Fiselier2856ef82018-10-25 17:21:30 +00003740void valarray<_Tp>::__clear(size_t __capacity)
Howard Hinnantc51e1022010-05-11 19:42:16 +00003741{
Eric Fiselier2856ef82018-10-25 17:21:30 +00003742 if (__begin_ != nullptr)
3743 {
3744 while (__end_ != __begin_)
3745 (--__end_)->~value_type();
Louis Dionne5ffe5152020-09-28 15:47:49 -04003746 allocator<value_type>().deallocate(__begin_, __capacity);
Eric Fiselier2856ef82018-10-25 17:21:30 +00003747 __begin_ = __end_ = nullptr;
3748 }
Mikhail Maltsev59de6f82018-02-08 11:33:48 +00003749}
3750
3751template <class _Tp>
3752void
3753valarray<_Tp>::resize(size_t __n, value_type __x)
3754{
Eric Fiselier2856ef82018-10-25 17:21:30 +00003755 __clear(size());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003756 if (__n)
3757 {
Louis Dionne5ffe5152020-09-28 15:47:49 -04003758 __begin_ = __end_ = allocator<value_type>().allocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003759#ifndef _LIBCPP_NO_EXCEPTIONS
3760 try
3761 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04003762#endif // _LIBCPP_NO_EXCEPTIONS
Eric Fiselier2856ef82018-10-25 17:21:30 +00003763 for (size_t __n_left = __n; __n_left; --__n_left, ++__end_)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05003764 ::new ((void*)__end_) value_type(__x);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003765#ifndef _LIBCPP_NO_EXCEPTIONS
3766 }
3767 catch (...)
3768 {
Eric Fiselier2856ef82018-10-25 17:21:30 +00003769 __clear(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003770 throw;
3771 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04003772#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00003773 }
3774}
3775
3776template<class _Tp>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003777inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003778void
Howard Hinnant298aed92012-07-21 00:51:28 +00003779swap(valarray<_Tp>& __x, valarray<_Tp>& __y) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00003780{
3781 __x.swap(__y);
3782}
3783
3784template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003785inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003786typename enable_if
3787<
3788 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
3789 __val_expr<_BinaryOp<multiplies<typename _Expr1::value_type>, _Expr1, _Expr2> >
3790>::type
3791operator*(const _Expr1& __x, const _Expr2& __y)
3792{
3793 typedef typename _Expr1::value_type value_type;
3794 typedef _BinaryOp<multiplies<value_type>, _Expr1, _Expr2> _Op;
3795 return __val_expr<_Op>(_Op(multiplies<value_type>(), __x, __y));
3796}
3797
3798template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003799inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003800typename enable_if
3801<
3802 __is_val_expr<_Expr>::value,
3803 __val_expr<_BinaryOp<multiplies<typename _Expr::value_type>,
3804 _Expr, __scalar_expr<typename _Expr::value_type> > >
3805>::type
3806operator*(const _Expr& __x, const typename _Expr::value_type& __y)
3807{
3808 typedef typename _Expr::value_type value_type;
3809 typedef _BinaryOp<multiplies<value_type>, _Expr, __scalar_expr<value_type> > _Op;
3810 return __val_expr<_Op>(_Op(multiplies<value_type>(),
3811 __x, __scalar_expr<value_type>(__y, __x.size())));
3812}
3813
3814template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003815inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003816typename enable_if
3817<
3818 __is_val_expr<_Expr>::value,
3819 __val_expr<_BinaryOp<multiplies<typename _Expr::value_type>,
3820 __scalar_expr<typename _Expr::value_type>, _Expr> >
3821>::type
3822operator*(const typename _Expr::value_type& __x, const _Expr& __y)
3823{
3824 typedef typename _Expr::value_type value_type;
3825 typedef _BinaryOp<multiplies<value_type>, __scalar_expr<value_type>, _Expr> _Op;
3826 return __val_expr<_Op>(_Op(multiplies<value_type>(),
3827 __scalar_expr<value_type>(__x, __y.size()), __y));
3828}
3829
3830template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003831inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003832typename enable_if
3833<
3834 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
3835 __val_expr<_BinaryOp<divides<typename _Expr1::value_type>, _Expr1, _Expr2> >
3836>::type
3837operator/(const _Expr1& __x, const _Expr2& __y)
3838{
3839 typedef typename _Expr1::value_type value_type;
3840 typedef _BinaryOp<divides<value_type>, _Expr1, _Expr2> _Op;
3841 return __val_expr<_Op>(_Op(divides<value_type>(), __x, __y));
3842}
3843
3844template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003845inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003846typename enable_if
3847<
3848 __is_val_expr<_Expr>::value,
3849 __val_expr<_BinaryOp<divides<typename _Expr::value_type>,
3850 _Expr, __scalar_expr<typename _Expr::value_type> > >
3851>::type
3852operator/(const _Expr& __x, const typename _Expr::value_type& __y)
3853{
3854 typedef typename _Expr::value_type value_type;
3855 typedef _BinaryOp<divides<value_type>, _Expr, __scalar_expr<value_type> > _Op;
3856 return __val_expr<_Op>(_Op(divides<value_type>(),
3857 __x, __scalar_expr<value_type>(__y, __x.size())));
3858}
3859
3860template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003861inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003862typename enable_if
3863<
3864 __is_val_expr<_Expr>::value,
3865 __val_expr<_BinaryOp<divides<typename _Expr::value_type>,
3866 __scalar_expr<typename _Expr::value_type>, _Expr> >
3867>::type
3868operator/(const typename _Expr::value_type& __x, const _Expr& __y)
3869{
3870 typedef typename _Expr::value_type value_type;
3871 typedef _BinaryOp<divides<value_type>, __scalar_expr<value_type>, _Expr> _Op;
3872 return __val_expr<_Op>(_Op(divides<value_type>(),
3873 __scalar_expr<value_type>(__x, __y.size()), __y));
3874}
3875
3876template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003877inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003878typename enable_if
3879<
3880 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
3881 __val_expr<_BinaryOp<modulus<typename _Expr1::value_type>, _Expr1, _Expr2> >
3882>::type
3883operator%(const _Expr1& __x, const _Expr2& __y)
3884{
3885 typedef typename _Expr1::value_type value_type;
3886 typedef _BinaryOp<modulus<value_type>, _Expr1, _Expr2> _Op;
3887 return __val_expr<_Op>(_Op(modulus<value_type>(), __x, __y));
3888}
3889
3890template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003891inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003892typename enable_if
3893<
3894 __is_val_expr<_Expr>::value,
3895 __val_expr<_BinaryOp<modulus<typename _Expr::value_type>,
3896 _Expr, __scalar_expr<typename _Expr::value_type> > >
3897>::type
3898operator%(const _Expr& __x, const typename _Expr::value_type& __y)
3899{
3900 typedef typename _Expr::value_type value_type;
3901 typedef _BinaryOp<modulus<value_type>, _Expr, __scalar_expr<value_type> > _Op;
3902 return __val_expr<_Op>(_Op(modulus<value_type>(),
3903 __x, __scalar_expr<value_type>(__y, __x.size())));
3904}
3905
3906template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003907inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003908typename enable_if
3909<
3910 __is_val_expr<_Expr>::value,
3911 __val_expr<_BinaryOp<modulus<typename _Expr::value_type>,
3912 __scalar_expr<typename _Expr::value_type>, _Expr> >
3913>::type
3914operator%(const typename _Expr::value_type& __x, const _Expr& __y)
3915{
3916 typedef typename _Expr::value_type value_type;
3917 typedef _BinaryOp<modulus<value_type>, __scalar_expr<value_type>, _Expr> _Op;
3918 return __val_expr<_Op>(_Op(modulus<value_type>(),
3919 __scalar_expr<value_type>(__x, __y.size()), __y));
3920}
3921
3922template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003923inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003924typename enable_if
3925<
3926 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
3927 __val_expr<_BinaryOp<plus<typename _Expr1::value_type>, _Expr1, _Expr2> >
3928>::type
3929operator+(const _Expr1& __x, const _Expr2& __y)
3930{
3931 typedef typename _Expr1::value_type value_type;
3932 typedef _BinaryOp<plus<value_type>, _Expr1, _Expr2> _Op;
3933 return __val_expr<_Op>(_Op(plus<value_type>(), __x, __y));
3934}
3935
3936template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003937inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003938typename enable_if
3939<
3940 __is_val_expr<_Expr>::value,
3941 __val_expr<_BinaryOp<plus<typename _Expr::value_type>,
3942 _Expr, __scalar_expr<typename _Expr::value_type> > >
3943>::type
3944operator+(const _Expr& __x, const typename _Expr::value_type& __y)
3945{
3946 typedef typename _Expr::value_type value_type;
3947 typedef _BinaryOp<plus<value_type>, _Expr, __scalar_expr<value_type> > _Op;
3948 return __val_expr<_Op>(_Op(plus<value_type>(),
3949 __x, __scalar_expr<value_type>(__y, __x.size())));
3950}
3951
3952template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003953inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003954typename enable_if
3955<
3956 __is_val_expr<_Expr>::value,
3957 __val_expr<_BinaryOp<plus<typename _Expr::value_type>,
3958 __scalar_expr<typename _Expr::value_type>, _Expr> >
3959>::type
3960operator+(const typename _Expr::value_type& __x, const _Expr& __y)
3961{
3962 typedef typename _Expr::value_type value_type;
3963 typedef _BinaryOp<plus<value_type>, __scalar_expr<value_type>, _Expr> _Op;
3964 return __val_expr<_Op>(_Op(plus<value_type>(),
3965 __scalar_expr<value_type>(__x, __y.size()), __y));
3966}
3967
3968template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003969inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003970typename enable_if
3971<
3972 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
3973 __val_expr<_BinaryOp<minus<typename _Expr1::value_type>, _Expr1, _Expr2> >
3974>::type
3975operator-(const _Expr1& __x, const _Expr2& __y)
3976{
3977 typedef typename _Expr1::value_type value_type;
3978 typedef _BinaryOp<minus<value_type>, _Expr1, _Expr2> _Op;
3979 return __val_expr<_Op>(_Op(minus<value_type>(), __x, __y));
3980}
3981
3982template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003983inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003984typename enable_if
3985<
3986 __is_val_expr<_Expr>::value,
3987 __val_expr<_BinaryOp<minus<typename _Expr::value_type>,
3988 _Expr, __scalar_expr<typename _Expr::value_type> > >
3989>::type
3990operator-(const _Expr& __x, const typename _Expr::value_type& __y)
3991{
3992 typedef typename _Expr::value_type value_type;
3993 typedef _BinaryOp<minus<value_type>, _Expr, __scalar_expr<value_type> > _Op;
3994 return __val_expr<_Op>(_Op(minus<value_type>(),
3995 __x, __scalar_expr<value_type>(__y, __x.size())));
3996}
3997
3998template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003999inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004000typename enable_if
4001<
4002 __is_val_expr<_Expr>::value,
4003 __val_expr<_BinaryOp<minus<typename _Expr::value_type>,
4004 __scalar_expr<typename _Expr::value_type>, _Expr> >
4005>::type
4006operator-(const typename _Expr::value_type& __x, const _Expr& __y)
4007{
4008 typedef typename _Expr::value_type value_type;
4009 typedef _BinaryOp<minus<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4010 return __val_expr<_Op>(_Op(minus<value_type>(),
4011 __scalar_expr<value_type>(__x, __y.size()), __y));
4012}
4013
4014template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004015inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004016typename enable_if
4017<
4018 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4019 __val_expr<_BinaryOp<bit_xor<typename _Expr1::value_type>, _Expr1, _Expr2> >
4020>::type
4021operator^(const _Expr1& __x, const _Expr2& __y)
4022{
4023 typedef typename _Expr1::value_type value_type;
4024 typedef _BinaryOp<bit_xor<value_type>, _Expr1, _Expr2> _Op;
4025 return __val_expr<_Op>(_Op(bit_xor<value_type>(), __x, __y));
4026}
4027
4028template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004029inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004030typename enable_if
4031<
4032 __is_val_expr<_Expr>::value,
4033 __val_expr<_BinaryOp<bit_xor<typename _Expr::value_type>,
4034 _Expr, __scalar_expr<typename _Expr::value_type> > >
4035>::type
4036operator^(const _Expr& __x, const typename _Expr::value_type& __y)
4037{
4038 typedef typename _Expr::value_type value_type;
4039 typedef _BinaryOp<bit_xor<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4040 return __val_expr<_Op>(_Op(bit_xor<value_type>(),
4041 __x, __scalar_expr<value_type>(__y, __x.size())));
4042}
4043
4044template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004045inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004046typename enable_if
4047<
4048 __is_val_expr<_Expr>::value,
4049 __val_expr<_BinaryOp<bit_xor<typename _Expr::value_type>,
4050 __scalar_expr<typename _Expr::value_type>, _Expr> >
4051>::type
4052operator^(const typename _Expr::value_type& __x, const _Expr& __y)
4053{
4054 typedef typename _Expr::value_type value_type;
4055 typedef _BinaryOp<bit_xor<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4056 return __val_expr<_Op>(_Op(bit_xor<value_type>(),
4057 __scalar_expr<value_type>(__x, __y.size()), __y));
4058}
4059
4060template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004061inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004062typename enable_if
4063<
4064 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4065 __val_expr<_BinaryOp<bit_and<typename _Expr1::value_type>, _Expr1, _Expr2> >
4066>::type
4067operator&(const _Expr1& __x, const _Expr2& __y)
4068{
4069 typedef typename _Expr1::value_type value_type;
4070 typedef _BinaryOp<bit_and<value_type>, _Expr1, _Expr2> _Op;
4071 return __val_expr<_Op>(_Op(bit_and<value_type>(), __x, __y));
4072}
4073
4074template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004075inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004076typename enable_if
4077<
4078 __is_val_expr<_Expr>::value,
4079 __val_expr<_BinaryOp<bit_and<typename _Expr::value_type>,
4080 _Expr, __scalar_expr<typename _Expr::value_type> > >
4081>::type
4082operator&(const _Expr& __x, const typename _Expr::value_type& __y)
4083{
4084 typedef typename _Expr::value_type value_type;
4085 typedef _BinaryOp<bit_and<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4086 return __val_expr<_Op>(_Op(bit_and<value_type>(),
4087 __x, __scalar_expr<value_type>(__y, __x.size())));
4088}
4089
4090template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004091inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004092typename enable_if
4093<
4094 __is_val_expr<_Expr>::value,
4095 __val_expr<_BinaryOp<bit_and<typename _Expr::value_type>,
4096 __scalar_expr<typename _Expr::value_type>, _Expr> >
4097>::type
4098operator&(const typename _Expr::value_type& __x, const _Expr& __y)
4099{
4100 typedef typename _Expr::value_type value_type;
4101 typedef _BinaryOp<bit_and<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4102 return __val_expr<_Op>(_Op(bit_and<value_type>(),
4103 __scalar_expr<value_type>(__x, __y.size()), __y));
4104}
4105
4106template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004107inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004108typename enable_if
4109<
4110 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4111 __val_expr<_BinaryOp<bit_or<typename _Expr1::value_type>, _Expr1, _Expr2> >
4112>::type
4113operator|(const _Expr1& __x, const _Expr2& __y)
4114{
4115 typedef typename _Expr1::value_type value_type;
4116 typedef _BinaryOp<bit_or<value_type>, _Expr1, _Expr2> _Op;
4117 return __val_expr<_Op>(_Op(bit_or<value_type>(), __x, __y));
4118}
4119
4120template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004121inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004122typename enable_if
4123<
4124 __is_val_expr<_Expr>::value,
4125 __val_expr<_BinaryOp<bit_or<typename _Expr::value_type>,
4126 _Expr, __scalar_expr<typename _Expr::value_type> > >
4127>::type
4128operator|(const _Expr& __x, const typename _Expr::value_type& __y)
4129{
4130 typedef typename _Expr::value_type value_type;
4131 typedef _BinaryOp<bit_or<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4132 return __val_expr<_Op>(_Op(bit_or<value_type>(),
4133 __x, __scalar_expr<value_type>(__y, __x.size())));
4134}
4135
4136template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004137inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004138typename enable_if
4139<
4140 __is_val_expr<_Expr>::value,
4141 __val_expr<_BinaryOp<bit_or<typename _Expr::value_type>,
4142 __scalar_expr<typename _Expr::value_type>, _Expr> >
4143>::type
4144operator|(const typename _Expr::value_type& __x, const _Expr& __y)
4145{
4146 typedef typename _Expr::value_type value_type;
4147 typedef _BinaryOp<bit_or<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4148 return __val_expr<_Op>(_Op(bit_or<value_type>(),
4149 __scalar_expr<value_type>(__x, __y.size()), __y));
4150}
4151
4152template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004153inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004154typename enable_if
4155<
4156 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4157 __val_expr<_BinaryOp<__bit_shift_left<typename _Expr1::value_type>, _Expr1, _Expr2> >
4158>::type
4159operator<<(const _Expr1& __x, const _Expr2& __y)
4160{
4161 typedef typename _Expr1::value_type value_type;
4162 typedef _BinaryOp<__bit_shift_left<value_type>, _Expr1, _Expr2> _Op;
4163 return __val_expr<_Op>(_Op(__bit_shift_left<value_type>(), __x, __y));
4164}
4165
4166template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004167inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004168typename enable_if
4169<
4170 __is_val_expr<_Expr>::value,
4171 __val_expr<_BinaryOp<__bit_shift_left<typename _Expr::value_type>,
4172 _Expr, __scalar_expr<typename _Expr::value_type> > >
4173>::type
4174operator<<(const _Expr& __x, const typename _Expr::value_type& __y)
4175{
4176 typedef typename _Expr::value_type value_type;
4177 typedef _BinaryOp<__bit_shift_left<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4178 return __val_expr<_Op>(_Op(__bit_shift_left<value_type>(),
4179 __x, __scalar_expr<value_type>(__y, __x.size())));
4180}
4181
4182template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004183inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004184typename enable_if
4185<
4186 __is_val_expr<_Expr>::value,
4187 __val_expr<_BinaryOp<__bit_shift_left<typename _Expr::value_type>,
4188 __scalar_expr<typename _Expr::value_type>, _Expr> >
4189>::type
4190operator<<(const typename _Expr::value_type& __x, const _Expr& __y)
4191{
4192 typedef typename _Expr::value_type value_type;
4193 typedef _BinaryOp<__bit_shift_left<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4194 return __val_expr<_Op>(_Op(__bit_shift_left<value_type>(),
4195 __scalar_expr<value_type>(__x, __y.size()), __y));
4196}
4197
4198template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004199inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004200typename enable_if
4201<
4202 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4203 __val_expr<_BinaryOp<__bit_shift_right<typename _Expr1::value_type>, _Expr1, _Expr2> >
4204>::type
4205operator>>(const _Expr1& __x, const _Expr2& __y)
4206{
4207 typedef typename _Expr1::value_type value_type;
4208 typedef _BinaryOp<__bit_shift_right<value_type>, _Expr1, _Expr2> _Op;
4209 return __val_expr<_Op>(_Op(__bit_shift_right<value_type>(), __x, __y));
4210}
4211
4212template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004213inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004214typename enable_if
4215<
4216 __is_val_expr<_Expr>::value,
4217 __val_expr<_BinaryOp<__bit_shift_right<typename _Expr::value_type>,
4218 _Expr, __scalar_expr<typename _Expr::value_type> > >
4219>::type
4220operator>>(const _Expr& __x, const typename _Expr::value_type& __y)
4221{
4222 typedef typename _Expr::value_type value_type;
4223 typedef _BinaryOp<__bit_shift_right<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4224 return __val_expr<_Op>(_Op(__bit_shift_right<value_type>(),
4225 __x, __scalar_expr<value_type>(__y, __x.size())));
4226}
4227
4228template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004229inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004230typename enable_if
4231<
4232 __is_val_expr<_Expr>::value,
4233 __val_expr<_BinaryOp<__bit_shift_right<typename _Expr::value_type>,
4234 __scalar_expr<typename _Expr::value_type>, _Expr> >
4235>::type
4236operator>>(const typename _Expr::value_type& __x, const _Expr& __y)
4237{
4238 typedef typename _Expr::value_type value_type;
4239 typedef _BinaryOp<__bit_shift_right<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4240 return __val_expr<_Op>(_Op(__bit_shift_right<value_type>(),
4241 __scalar_expr<value_type>(__x, __y.size()), __y));
4242}
4243
4244template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004245inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004246typename enable_if
4247<
4248 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4249 __val_expr<_BinaryOp<logical_and<typename _Expr1::value_type>, _Expr1, _Expr2> >
4250>::type
4251operator&&(const _Expr1& __x, const _Expr2& __y)
4252{
4253 typedef typename _Expr1::value_type value_type;
4254 typedef _BinaryOp<logical_and<value_type>, _Expr1, _Expr2> _Op;
4255 return __val_expr<_Op>(_Op(logical_and<value_type>(), __x, __y));
4256}
4257
4258template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004259inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004260typename enable_if
4261<
4262 __is_val_expr<_Expr>::value,
4263 __val_expr<_BinaryOp<logical_and<typename _Expr::value_type>,
4264 _Expr, __scalar_expr<typename _Expr::value_type> > >
4265>::type
4266operator&&(const _Expr& __x, const typename _Expr::value_type& __y)
4267{
4268 typedef typename _Expr::value_type value_type;
4269 typedef _BinaryOp<logical_and<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4270 return __val_expr<_Op>(_Op(logical_and<value_type>(),
4271 __x, __scalar_expr<value_type>(__y, __x.size())));
4272}
4273
4274template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004275inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004276typename enable_if
4277<
4278 __is_val_expr<_Expr>::value,
4279 __val_expr<_BinaryOp<logical_and<typename _Expr::value_type>,
4280 __scalar_expr<typename _Expr::value_type>, _Expr> >
4281>::type
4282operator&&(const typename _Expr::value_type& __x, const _Expr& __y)
4283{
4284 typedef typename _Expr::value_type value_type;
4285 typedef _BinaryOp<logical_and<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4286 return __val_expr<_Op>(_Op(logical_and<value_type>(),
4287 __scalar_expr<value_type>(__x, __y.size()), __y));
4288}
4289
4290template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004291inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004292typename enable_if
4293<
4294 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4295 __val_expr<_BinaryOp<logical_or<typename _Expr1::value_type>, _Expr1, _Expr2> >
4296>::type
4297operator||(const _Expr1& __x, const _Expr2& __y)
4298{
4299 typedef typename _Expr1::value_type value_type;
4300 typedef _BinaryOp<logical_or<value_type>, _Expr1, _Expr2> _Op;
4301 return __val_expr<_Op>(_Op(logical_or<value_type>(), __x, __y));
4302}
4303
4304template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004305inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004306typename enable_if
4307<
4308 __is_val_expr<_Expr>::value,
4309 __val_expr<_BinaryOp<logical_or<typename _Expr::value_type>,
4310 _Expr, __scalar_expr<typename _Expr::value_type> > >
4311>::type
4312operator||(const _Expr& __x, const typename _Expr::value_type& __y)
4313{
4314 typedef typename _Expr::value_type value_type;
4315 typedef _BinaryOp<logical_or<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4316 return __val_expr<_Op>(_Op(logical_or<value_type>(),
4317 __x, __scalar_expr<value_type>(__y, __x.size())));
4318}
4319
4320template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004321inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004322typename enable_if
4323<
4324 __is_val_expr<_Expr>::value,
4325 __val_expr<_BinaryOp<logical_or<typename _Expr::value_type>,
4326 __scalar_expr<typename _Expr::value_type>, _Expr> >
4327>::type
4328operator||(const typename _Expr::value_type& __x, const _Expr& __y)
4329{
4330 typedef typename _Expr::value_type value_type;
4331 typedef _BinaryOp<logical_or<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4332 return __val_expr<_Op>(_Op(logical_or<value_type>(),
4333 __scalar_expr<value_type>(__x, __y.size()), __y));
4334}
4335
4336template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004337inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004338typename enable_if
4339<
4340 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4341 __val_expr<_BinaryOp<equal_to<typename _Expr1::value_type>, _Expr1, _Expr2> >
4342>::type
4343operator==(const _Expr1& __x, const _Expr2& __y)
4344{
4345 typedef typename _Expr1::value_type value_type;
4346 typedef _BinaryOp<equal_to<value_type>, _Expr1, _Expr2> _Op;
4347 return __val_expr<_Op>(_Op(equal_to<value_type>(), __x, __y));
4348}
4349
4350template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004351inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004352typename enable_if
4353<
4354 __is_val_expr<_Expr>::value,
4355 __val_expr<_BinaryOp<equal_to<typename _Expr::value_type>,
4356 _Expr, __scalar_expr<typename _Expr::value_type> > >
4357>::type
4358operator==(const _Expr& __x, const typename _Expr::value_type& __y)
4359{
4360 typedef typename _Expr::value_type value_type;
4361 typedef _BinaryOp<equal_to<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4362 return __val_expr<_Op>(_Op(equal_to<value_type>(),
4363 __x, __scalar_expr<value_type>(__y, __x.size())));
4364}
4365
4366template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004367inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004368typename enable_if
4369<
4370 __is_val_expr<_Expr>::value,
4371 __val_expr<_BinaryOp<equal_to<typename _Expr::value_type>,
4372 __scalar_expr<typename _Expr::value_type>, _Expr> >
4373>::type
4374operator==(const typename _Expr::value_type& __x, const _Expr& __y)
4375{
4376 typedef typename _Expr::value_type value_type;
4377 typedef _BinaryOp<equal_to<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4378 return __val_expr<_Op>(_Op(equal_to<value_type>(),
4379 __scalar_expr<value_type>(__x, __y.size()), __y));
4380}
4381
4382template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004383inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004384typename enable_if
4385<
4386 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4387 __val_expr<_BinaryOp<not_equal_to<typename _Expr1::value_type>, _Expr1, _Expr2> >
4388>::type
4389operator!=(const _Expr1& __x, const _Expr2& __y)
4390{
4391 typedef typename _Expr1::value_type value_type;
4392 typedef _BinaryOp<not_equal_to<value_type>, _Expr1, _Expr2> _Op;
4393 return __val_expr<_Op>(_Op(not_equal_to<value_type>(), __x, __y));
4394}
4395
4396template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004397inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004398typename enable_if
4399<
4400 __is_val_expr<_Expr>::value,
4401 __val_expr<_BinaryOp<not_equal_to<typename _Expr::value_type>,
4402 _Expr, __scalar_expr<typename _Expr::value_type> > >
4403>::type
4404operator!=(const _Expr& __x, const typename _Expr::value_type& __y)
4405{
4406 typedef typename _Expr::value_type value_type;
4407 typedef _BinaryOp<not_equal_to<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4408 return __val_expr<_Op>(_Op(not_equal_to<value_type>(),
4409 __x, __scalar_expr<value_type>(__y, __x.size())));
4410}
4411
4412template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004413inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004414typename enable_if
4415<
4416 __is_val_expr<_Expr>::value,
4417 __val_expr<_BinaryOp<not_equal_to<typename _Expr::value_type>,
4418 __scalar_expr<typename _Expr::value_type>, _Expr> >
4419>::type
4420operator!=(const typename _Expr::value_type& __x, const _Expr& __y)
4421{
4422 typedef typename _Expr::value_type value_type;
4423 typedef _BinaryOp<not_equal_to<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4424 return __val_expr<_Op>(_Op(not_equal_to<value_type>(),
4425 __scalar_expr<value_type>(__x, __y.size()), __y));
4426}
4427
4428template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004429inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004430typename enable_if
4431<
4432 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4433 __val_expr<_BinaryOp<less<typename _Expr1::value_type>, _Expr1, _Expr2> >
4434>::type
4435operator<(const _Expr1& __x, const _Expr2& __y)
4436{
4437 typedef typename _Expr1::value_type value_type;
4438 typedef _BinaryOp<less<value_type>, _Expr1, _Expr2> _Op;
4439 return __val_expr<_Op>(_Op(less<value_type>(), __x, __y));
4440}
4441
4442template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004443inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004444typename enable_if
4445<
4446 __is_val_expr<_Expr>::value,
4447 __val_expr<_BinaryOp<less<typename _Expr::value_type>,
4448 _Expr, __scalar_expr<typename _Expr::value_type> > >
4449>::type
4450operator<(const _Expr& __x, const typename _Expr::value_type& __y)
4451{
4452 typedef typename _Expr::value_type value_type;
4453 typedef _BinaryOp<less<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4454 return __val_expr<_Op>(_Op(less<value_type>(),
4455 __x, __scalar_expr<value_type>(__y, __x.size())));
4456}
4457
4458template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004459inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004460typename enable_if
4461<
4462 __is_val_expr<_Expr>::value,
4463 __val_expr<_BinaryOp<less<typename _Expr::value_type>,
4464 __scalar_expr<typename _Expr::value_type>, _Expr> >
4465>::type
4466operator<(const typename _Expr::value_type& __x, const _Expr& __y)
4467{
4468 typedef typename _Expr::value_type value_type;
4469 typedef _BinaryOp<less<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4470 return __val_expr<_Op>(_Op(less<value_type>(),
4471 __scalar_expr<value_type>(__x, __y.size()), __y));
4472}
4473
4474template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004475inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004476typename enable_if
4477<
4478 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4479 __val_expr<_BinaryOp<greater<typename _Expr1::value_type>, _Expr1, _Expr2> >
4480>::type
4481operator>(const _Expr1& __x, const _Expr2& __y)
4482{
4483 typedef typename _Expr1::value_type value_type;
4484 typedef _BinaryOp<greater<value_type>, _Expr1, _Expr2> _Op;
4485 return __val_expr<_Op>(_Op(greater<value_type>(), __x, __y));
4486}
4487
4488template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004489inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004490typename enable_if
4491<
4492 __is_val_expr<_Expr>::value,
4493 __val_expr<_BinaryOp<greater<typename _Expr::value_type>,
4494 _Expr, __scalar_expr<typename _Expr::value_type> > >
4495>::type
4496operator>(const _Expr& __x, const typename _Expr::value_type& __y)
4497{
4498 typedef typename _Expr::value_type value_type;
4499 typedef _BinaryOp<greater<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4500 return __val_expr<_Op>(_Op(greater<value_type>(),
4501 __x, __scalar_expr<value_type>(__y, __x.size())));
4502}
4503
4504template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004505inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004506typename enable_if
4507<
4508 __is_val_expr<_Expr>::value,
4509 __val_expr<_BinaryOp<greater<typename _Expr::value_type>,
4510 __scalar_expr<typename _Expr::value_type>, _Expr> >
4511>::type
4512operator>(const typename _Expr::value_type& __x, const _Expr& __y)
4513{
4514 typedef typename _Expr::value_type value_type;
4515 typedef _BinaryOp<greater<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4516 return __val_expr<_Op>(_Op(greater<value_type>(),
4517 __scalar_expr<value_type>(__x, __y.size()), __y));
4518}
4519
4520template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004521inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004522typename enable_if
4523<
4524 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4525 __val_expr<_BinaryOp<less_equal<typename _Expr1::value_type>, _Expr1, _Expr2> >
4526>::type
4527operator<=(const _Expr1& __x, const _Expr2& __y)
4528{
4529 typedef typename _Expr1::value_type value_type;
4530 typedef _BinaryOp<less_equal<value_type>, _Expr1, _Expr2> _Op;
4531 return __val_expr<_Op>(_Op(less_equal<value_type>(), __x, __y));
4532}
4533
4534template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004535inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004536typename enable_if
4537<
4538 __is_val_expr<_Expr>::value,
4539 __val_expr<_BinaryOp<less_equal<typename _Expr::value_type>,
4540 _Expr, __scalar_expr<typename _Expr::value_type> > >
4541>::type
4542operator<=(const _Expr& __x, const typename _Expr::value_type& __y)
4543{
4544 typedef typename _Expr::value_type value_type;
4545 typedef _BinaryOp<less_equal<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4546 return __val_expr<_Op>(_Op(less_equal<value_type>(),
4547 __x, __scalar_expr<value_type>(__y, __x.size())));
4548}
4549
4550template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004551inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004552typename enable_if
4553<
4554 __is_val_expr<_Expr>::value,
4555 __val_expr<_BinaryOp<less_equal<typename _Expr::value_type>,
4556 __scalar_expr<typename _Expr::value_type>, _Expr> >
4557>::type
4558operator<=(const typename _Expr::value_type& __x, const _Expr& __y)
4559{
4560 typedef typename _Expr::value_type value_type;
4561 typedef _BinaryOp<less_equal<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4562 return __val_expr<_Op>(_Op(less_equal<value_type>(),
4563 __scalar_expr<value_type>(__x, __y.size()), __y));
4564}
4565
4566template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004567inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004568typename enable_if
4569<
4570 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4571 __val_expr<_BinaryOp<greater_equal<typename _Expr1::value_type>, _Expr1, _Expr2> >
4572>::type
4573operator>=(const _Expr1& __x, const _Expr2& __y)
4574{
4575 typedef typename _Expr1::value_type value_type;
4576 typedef _BinaryOp<greater_equal<value_type>, _Expr1, _Expr2> _Op;
4577 return __val_expr<_Op>(_Op(greater_equal<value_type>(), __x, __y));
4578}
4579
4580template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004581inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004582typename enable_if
4583<
4584 __is_val_expr<_Expr>::value,
4585 __val_expr<_BinaryOp<greater_equal<typename _Expr::value_type>,
4586 _Expr, __scalar_expr<typename _Expr::value_type> > >
4587>::type
4588operator>=(const _Expr& __x, const typename _Expr::value_type& __y)
4589{
4590 typedef typename _Expr::value_type value_type;
4591 typedef _BinaryOp<greater_equal<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4592 return __val_expr<_Op>(_Op(greater_equal<value_type>(),
4593 __x, __scalar_expr<value_type>(__y, __x.size())));
4594}
4595
4596template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004597inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004598typename enable_if
4599<
4600 __is_val_expr<_Expr>::value,
4601 __val_expr<_BinaryOp<greater_equal<typename _Expr::value_type>,
4602 __scalar_expr<typename _Expr::value_type>, _Expr> >
4603>::type
4604operator>=(const typename _Expr::value_type& __x, const _Expr& __y)
4605{
4606 typedef typename _Expr::value_type value_type;
4607 typedef _BinaryOp<greater_equal<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4608 return __val_expr<_Op>(_Op(greater_equal<value_type>(),
4609 __scalar_expr<value_type>(__x, __y.size()), __y));
4610}
4611
4612template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004613inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004614typename enable_if
4615<
4616 __is_val_expr<_Expr>::value,
4617 __val_expr<_UnaryOp<__abs_expr<typename _Expr::value_type>, _Expr> >
4618>::type
4619abs(const _Expr& __x)
4620{
4621 typedef typename _Expr::value_type value_type;
4622 typedef _UnaryOp<__abs_expr<value_type>, _Expr> _Op;
4623 return __val_expr<_Op>(_Op(__abs_expr<value_type>(), __x));
4624}
4625
4626template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004627inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004628typename enable_if
4629<
4630 __is_val_expr<_Expr>::value,
4631 __val_expr<_UnaryOp<__acos_expr<typename _Expr::value_type>, _Expr> >
4632>::type
4633acos(const _Expr& __x)
4634{
4635 typedef typename _Expr::value_type value_type;
4636 typedef _UnaryOp<__acos_expr<value_type>, _Expr> _Op;
4637 return __val_expr<_Op>(_Op(__acos_expr<value_type>(), __x));
4638}
4639
4640template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004641inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004642typename enable_if
4643<
4644 __is_val_expr<_Expr>::value,
4645 __val_expr<_UnaryOp<__asin_expr<typename _Expr::value_type>, _Expr> >
4646>::type
4647asin(const _Expr& __x)
4648{
4649 typedef typename _Expr::value_type value_type;
4650 typedef _UnaryOp<__asin_expr<value_type>, _Expr> _Op;
4651 return __val_expr<_Op>(_Op(__asin_expr<value_type>(), __x));
4652}
4653
4654template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004655inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004656typename enable_if
4657<
4658 __is_val_expr<_Expr>::value,
4659 __val_expr<_UnaryOp<__atan_expr<typename _Expr::value_type>, _Expr> >
4660>::type
4661atan(const _Expr& __x)
4662{
4663 typedef typename _Expr::value_type value_type;
4664 typedef _UnaryOp<__atan_expr<value_type>, _Expr> _Op;
4665 return __val_expr<_Op>(_Op(__atan_expr<value_type>(), __x));
4666}
4667
4668template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004669inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004670typename enable_if
4671<
4672 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4673 __val_expr<_BinaryOp<__atan2_expr<typename _Expr1::value_type>, _Expr1, _Expr2> >
4674>::type
4675atan2(const _Expr1& __x, const _Expr2& __y)
4676{
4677 typedef typename _Expr1::value_type value_type;
4678 typedef _BinaryOp<__atan2_expr<value_type>, _Expr1, _Expr2> _Op;
4679 return __val_expr<_Op>(_Op(__atan2_expr<value_type>(), __x, __y));
4680}
4681
4682template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004683inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004684typename enable_if
4685<
4686 __is_val_expr<_Expr>::value,
4687 __val_expr<_BinaryOp<__atan2_expr<typename _Expr::value_type>,
4688 _Expr, __scalar_expr<typename _Expr::value_type> > >
4689>::type
4690atan2(const _Expr& __x, const typename _Expr::value_type& __y)
4691{
4692 typedef typename _Expr::value_type value_type;
4693 typedef _BinaryOp<__atan2_expr<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4694 return __val_expr<_Op>(_Op(__atan2_expr<value_type>(),
4695 __x, __scalar_expr<value_type>(__y, __x.size())));
4696}
4697
4698template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004699inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004700typename enable_if
4701<
4702 __is_val_expr<_Expr>::value,
4703 __val_expr<_BinaryOp<__atan2_expr<typename _Expr::value_type>,
4704 __scalar_expr<typename _Expr::value_type>, _Expr> >
4705>::type
4706atan2(const typename _Expr::value_type& __x, const _Expr& __y)
4707{
4708 typedef typename _Expr::value_type value_type;
4709 typedef _BinaryOp<__atan2_expr<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4710 return __val_expr<_Op>(_Op(__atan2_expr<value_type>(),
4711 __scalar_expr<value_type>(__x, __y.size()), __y));
4712}
4713
4714template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004715inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004716typename enable_if
4717<
4718 __is_val_expr<_Expr>::value,
4719 __val_expr<_UnaryOp<__cos_expr<typename _Expr::value_type>, _Expr> >
4720>::type
4721cos(const _Expr& __x)
4722{
4723 typedef typename _Expr::value_type value_type;
4724 typedef _UnaryOp<__cos_expr<value_type>, _Expr> _Op;
4725 return __val_expr<_Op>(_Op(__cos_expr<value_type>(), __x));
4726}
4727
4728template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004729inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004730typename enable_if
4731<
4732 __is_val_expr<_Expr>::value,
4733 __val_expr<_UnaryOp<__cosh_expr<typename _Expr::value_type>, _Expr> >
4734>::type
4735cosh(const _Expr& __x)
4736{
4737 typedef typename _Expr::value_type value_type;
4738 typedef _UnaryOp<__cosh_expr<value_type>, _Expr> _Op;
4739 return __val_expr<_Op>(_Op(__cosh_expr<value_type>(), __x));
4740}
4741
4742template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004743inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004744typename enable_if
4745<
4746 __is_val_expr<_Expr>::value,
4747 __val_expr<_UnaryOp<__exp_expr<typename _Expr::value_type>, _Expr> >
4748>::type
4749exp(const _Expr& __x)
4750{
4751 typedef typename _Expr::value_type value_type;
4752 typedef _UnaryOp<__exp_expr<value_type>, _Expr> _Op;
4753 return __val_expr<_Op>(_Op(__exp_expr<value_type>(), __x));
4754}
4755
4756template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004757inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004758typename enable_if
4759<
4760 __is_val_expr<_Expr>::value,
4761 __val_expr<_UnaryOp<__log_expr<typename _Expr::value_type>, _Expr> >
4762>::type
4763log(const _Expr& __x)
4764{
4765 typedef typename _Expr::value_type value_type;
4766 typedef _UnaryOp<__log_expr<value_type>, _Expr> _Op;
4767 return __val_expr<_Op>(_Op(__log_expr<value_type>(), __x));
4768}
4769
4770template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004771inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004772typename enable_if
4773<
4774 __is_val_expr<_Expr>::value,
4775 __val_expr<_UnaryOp<__log10_expr<typename _Expr::value_type>, _Expr> >
4776>::type
4777log10(const _Expr& __x)
4778{
4779 typedef typename _Expr::value_type value_type;
4780 typedef _UnaryOp<__log10_expr<value_type>, _Expr> _Op;
4781 return __val_expr<_Op>(_Op(__log10_expr<value_type>(), __x));
4782}
4783
4784template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004785inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004786typename enable_if
4787<
4788 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4789 __val_expr<_BinaryOp<__pow_expr<typename _Expr1::value_type>, _Expr1, _Expr2> >
4790>::type
4791pow(const _Expr1& __x, const _Expr2& __y)
4792{
4793 typedef typename _Expr1::value_type value_type;
4794 typedef _BinaryOp<__pow_expr<value_type>, _Expr1, _Expr2> _Op;
4795 return __val_expr<_Op>(_Op(__pow_expr<value_type>(), __x, __y));
4796}
4797
4798template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004799inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004800typename enable_if
4801<
4802 __is_val_expr<_Expr>::value,
4803 __val_expr<_BinaryOp<__pow_expr<typename _Expr::value_type>,
4804 _Expr, __scalar_expr<typename _Expr::value_type> > >
4805>::type
4806pow(const _Expr& __x, const typename _Expr::value_type& __y)
4807{
4808 typedef typename _Expr::value_type value_type;
4809 typedef _BinaryOp<__pow_expr<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4810 return __val_expr<_Op>(_Op(__pow_expr<value_type>(),
4811 __x, __scalar_expr<value_type>(__y, __x.size())));
4812}
4813
4814template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004815inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004816typename enable_if
4817<
4818 __is_val_expr<_Expr>::value,
4819 __val_expr<_BinaryOp<__pow_expr<typename _Expr::value_type>,
4820 __scalar_expr<typename _Expr::value_type>, _Expr> >
4821>::type
4822pow(const typename _Expr::value_type& __x, const _Expr& __y)
4823{
4824 typedef typename _Expr::value_type value_type;
4825 typedef _BinaryOp<__pow_expr<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4826 return __val_expr<_Op>(_Op(__pow_expr<value_type>(),
4827 __scalar_expr<value_type>(__x, __y.size()), __y));
4828}
4829
4830template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004831inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004832typename enable_if
4833<
4834 __is_val_expr<_Expr>::value,
4835 __val_expr<_UnaryOp<__sin_expr<typename _Expr::value_type>, _Expr> >
4836>::type
4837sin(const _Expr& __x)
4838{
4839 typedef typename _Expr::value_type value_type;
4840 typedef _UnaryOp<__sin_expr<value_type>, _Expr> _Op;
4841 return __val_expr<_Op>(_Op(__sin_expr<value_type>(), __x));
4842}
4843
4844template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004845inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004846typename enable_if
4847<
4848 __is_val_expr<_Expr>::value,
4849 __val_expr<_UnaryOp<__sinh_expr<typename _Expr::value_type>, _Expr> >
4850>::type
4851sinh(const _Expr& __x)
4852{
4853 typedef typename _Expr::value_type value_type;
4854 typedef _UnaryOp<__sinh_expr<value_type>, _Expr> _Op;
4855 return __val_expr<_Op>(_Op(__sinh_expr<value_type>(), __x));
4856}
4857
4858template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004859inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004860typename enable_if
4861<
4862 __is_val_expr<_Expr>::value,
4863 __val_expr<_UnaryOp<__sqrt_expr<typename _Expr::value_type>, _Expr> >
4864>::type
4865sqrt(const _Expr& __x)
4866{
4867 typedef typename _Expr::value_type value_type;
4868 typedef _UnaryOp<__sqrt_expr<value_type>, _Expr> _Op;
4869 return __val_expr<_Op>(_Op(__sqrt_expr<value_type>(), __x));
4870}
4871
4872template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004873inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004874typename enable_if
4875<
4876 __is_val_expr<_Expr>::value,
4877 __val_expr<_UnaryOp<__tan_expr<typename _Expr::value_type>, _Expr> >
4878>::type
4879tan(const _Expr& __x)
4880{
4881 typedef typename _Expr::value_type value_type;
4882 typedef _UnaryOp<__tan_expr<value_type>, _Expr> _Op;
4883 return __val_expr<_Op>(_Op(__tan_expr<value_type>(), __x));
4884}
4885
4886template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004887inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004888typename enable_if
4889<
4890 __is_val_expr<_Expr>::value,
4891 __val_expr<_UnaryOp<__tanh_expr<typename _Expr::value_type>, _Expr> >
4892>::type
4893tanh(const _Expr& __x)
4894{
4895 typedef typename _Expr::value_type value_type;
4896 typedef _UnaryOp<__tanh_expr<value_type>, _Expr> _Op;
4897 return __val_expr<_Op>(_Op(__tanh_expr<value_type>(), __x));
4898}
4899
4900template <class _Tp>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004901inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004902_Tp*
4903begin(valarray<_Tp>& __v)
4904{
4905 return __v.__begin_;
4906}
4907
4908template <class _Tp>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004909inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004910const _Tp*
4911begin(const valarray<_Tp>& __v)
4912{
4913 return __v.__begin_;
4914}
4915
4916template <class _Tp>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004917inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004918_Tp*
4919end(valarray<_Tp>& __v)
4920{
4921 return __v.__end_;
4922}
4923
4924template <class _Tp>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004925inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004926const _Tp*
4927end(const valarray<_Tp>& __v)
4928{
4929 return __v.__end_;
4930}
4931
Howard Hinnantc51e1022010-05-11 19:42:16 +00004932_LIBCPP_END_NAMESPACE_STD
4933
Eric Fiselierf4433a32017-05-31 22:07:49 +00004934_LIBCPP_POP_MACROS
4935
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04004936#endif // _LIBCPP_VALARRAY