blob: 6f6af6571417cb29c5eef1ff717188bedb130a9e [file] [log] [blame]
Howard Hinnantc51e1022010-05-11 19:42:16 +00001// -*- C++ -*-
Louis Dionne9bd93882021-11-17 16:25:01 -05002//===----------------------------------------------------------------------===//
Howard Hinnantc51e1022010-05-11 19:42:16 +00003//
Chandler Carruthd2012102019-01-19 10:56:40 +00004// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5// See https://llvm.org/LICENSE.txt for license information.
6// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
Howard Hinnantc51e1022010-05-11 19:42:16 +00007//
8//===----------------------------------------------------------------------===//
9
10#ifndef _LIBCPP_VALARRAY
11#define _LIBCPP_VALARRAY
12
13/*
14 valarray synopsis
15
16namespace std
17{
18
19template<class T>
20class valarray
21{
22public:
23 typedef T value_type;
24
25 // construct/destroy:
26 valarray();
27 explicit valarray(size_t n);
28 valarray(const value_type& x, size_t n);
29 valarray(const value_type* px, size_t n);
30 valarray(const valarray& v);
Howard Hinnant298aed92012-07-21 00:51:28 +000031 valarray(valarray&& v) noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +000032 valarray(const slice_array<value_type>& sa);
33 valarray(const gslice_array<value_type>& ga);
34 valarray(const mask_array<value_type>& ma);
35 valarray(const indirect_array<value_type>& ia);
36 valarray(initializer_list<value_type> il);
37 ~valarray();
38
39 // assignment:
40 valarray& operator=(const valarray& v);
Howard Hinnant298aed92012-07-21 00:51:28 +000041 valarray& operator=(valarray&& v) noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +000042 valarray& operator=(initializer_list<value_type> il);
43 valarray& operator=(const value_type& x);
44 valarray& operator=(const slice_array<value_type>& sa);
45 valarray& operator=(const gslice_array<value_type>& ga);
46 valarray& operator=(const mask_array<value_type>& ma);
47 valarray& operator=(const indirect_array<value_type>& ia);
48
49 // element access:
50 const value_type& operator[](size_t i) const;
51 value_type& operator[](size_t i);
52
53 // subset operations:
54 valarray operator[](slice s) const;
55 slice_array<value_type> operator[](slice s);
56 valarray operator[](const gslice& gs) const;
57 gslice_array<value_type> operator[](const gslice& gs);
58 valarray operator[](const valarray<bool>& vb) const;
59 mask_array<value_type> operator[](const valarray<bool>& vb);
60 valarray operator[](const valarray<size_t>& vs) const;
61 indirect_array<value_type> operator[](const valarray<size_t>& vs);
62
63 // unary operators:
64 valarray operator+() const;
65 valarray operator-() const;
66 valarray operator~() const;
67 valarray<bool> operator!() const;
68
69 // computed assignment:
70 valarray& operator*= (const value_type& x);
71 valarray& operator/= (const value_type& x);
72 valarray& operator%= (const value_type& x);
73 valarray& operator+= (const value_type& x);
74 valarray& operator-= (const value_type& x);
75 valarray& operator^= (const value_type& x);
76 valarray& operator&= (const value_type& x);
77 valarray& operator|= (const value_type& x);
78 valarray& operator<<=(const value_type& x);
79 valarray& operator>>=(const value_type& x);
80
81 valarray& operator*= (const valarray& v);
82 valarray& operator/= (const valarray& v);
83 valarray& operator%= (const valarray& v);
84 valarray& operator+= (const valarray& v);
85 valarray& operator-= (const valarray& v);
86 valarray& operator^= (const valarray& v);
87 valarray& operator|= (const valarray& v);
88 valarray& operator&= (const valarray& v);
89 valarray& operator<<=(const valarray& v);
90 valarray& operator>>=(const valarray& v);
91
92 // member functions:
Howard Hinnant298aed92012-07-21 00:51:28 +000093 void swap(valarray& v) noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +000094
95 size_t size() const;
96
97 value_type sum() const;
98 value_type min() const;
99 value_type max() const;
100
101 valarray shift (int i) const;
102 valarray cshift(int i) const;
103 valarray apply(value_type f(value_type)) const;
104 valarray apply(value_type f(const value_type&)) const;
105 void resize(size_t n, value_type x = value_type());
106};
107
Konstantin Varlamovebb31192021-10-28 00:36:19 -0700108template<class T, size_t cnt> valarray(const T(&)[cnt], size_t) -> valarray<T>;
109
Howard Hinnantc51e1022010-05-11 19:42:16 +0000110class slice
111{
112public:
113 slice();
114 slice(size_t start, size_t size, size_t stride);
115
116 size_t start() const;
117 size_t size() const;
118 size_t stride() const;
119};
120
121template <class T>
122class slice_array
123{
124public:
125 typedef T value_type;
126
127 const slice_array& operator=(const slice_array& sa) const;
128 void operator= (const valarray<value_type>& v) const;
129 void operator*= (const valarray<value_type>& v) const;
130 void operator/= (const valarray<value_type>& v) const;
131 void operator%= (const valarray<value_type>& v) const;
132 void operator+= (const valarray<value_type>& v) const;
133 void operator-= (const valarray<value_type>& v) const;
134 void operator^= (const valarray<value_type>& v) const;
135 void operator&= (const valarray<value_type>& v) const;
136 void operator|= (const valarray<value_type>& v) const;
137 void operator<<=(const valarray<value_type>& v) const;
138 void operator>>=(const valarray<value_type>& v) const;
139
140 void operator=(const value_type& x) const;
zoecarver79fa7502020-12-02 10:49:20 -0800141 void operator=(const valarray<T>& val_arr) const;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000142
143 slice_array() = delete;
144};
145
146class gslice
147{
148public:
149 gslice();
150 gslice(size_t start, const valarray<size_t>& size,
151 const valarray<size_t>& stride);
152
153 size_t start() const;
154 valarray<size_t> size() const;
155 valarray<size_t> stride() const;
156};
157
158template <class T>
159class gslice_array
160{
161public:
162 typedef T value_type;
163
164 void operator= (const valarray<value_type>& v) const;
165 void operator*= (const valarray<value_type>& v) const;
166 void operator/= (const valarray<value_type>& v) const;
167 void operator%= (const valarray<value_type>& v) const;
168 void operator+= (const valarray<value_type>& v) const;
169 void operator-= (const valarray<value_type>& v) const;
170 void operator^= (const valarray<value_type>& v) const;
171 void operator&= (const valarray<value_type>& v) const;
172 void operator|= (const valarray<value_type>& v) const;
173 void operator<<=(const valarray<value_type>& v) const;
174 void operator>>=(const valarray<value_type>& v) const;
175
176 gslice_array(const gslice_array& ga);
177 ~gslice_array();
178 const gslice_array& operator=(const gslice_array& ga) const;
179 void operator=(const value_type& x) const;
180
181 gslice_array() = delete;
182};
183
184template <class T>
185class mask_array
186{
187public:
188 typedef T value_type;
189
190 void operator= (const valarray<value_type>& v) const;
191 void operator*= (const valarray<value_type>& v) const;
192 void operator/= (const valarray<value_type>& v) const;
193 void operator%= (const valarray<value_type>& v) const;
194 void operator+= (const valarray<value_type>& v) const;
195 void operator-= (const valarray<value_type>& v) const;
196 void operator^= (const valarray<value_type>& v) const;
197 void operator&= (const valarray<value_type>& v) const;
198 void operator|= (const valarray<value_type>& v) const;
199 void operator<<=(const valarray<value_type>& v) const;
200 void operator>>=(const valarray<value_type>& v) const;
201
202 mask_array(const mask_array& ma);
203 ~mask_array();
204 const mask_array& operator=(const mask_array& ma) const;
205 void operator=(const value_type& x) const;
206
207 mask_array() = delete;
208};
209
210template <class T>
211class indirect_array
212{
213public:
214 typedef T value_type;
215
216 void operator= (const valarray<value_type>& v) const;
217 void operator*= (const valarray<value_type>& v) const;
218 void operator/= (const valarray<value_type>& v) const;
219 void operator%= (const valarray<value_type>& v) const;
220 void operator+= (const valarray<value_type>& v) const;
221 void operator-= (const valarray<value_type>& v) const;
222 void operator^= (const valarray<value_type>& v) const;
223 void operator&= (const valarray<value_type>& v) const;
224 void operator|= (const valarray<value_type>& v) const;
225 void operator<<=(const valarray<value_type>& v) const;
226 void operator>>=(const valarray<value_type>& v) const;
227
228 indirect_array(const indirect_array& ia);
229 ~indirect_array();
230 const indirect_array& operator=(const indirect_array& ia) const;
231 void operator=(const value_type& x) const;
232
233 indirect_array() = delete;
234};
235
Howard Hinnant298aed92012-07-21 00:51:28 +0000236template<class T> void swap(valarray<T>& x, valarray<T>& y) noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000237
238template<class T> valarray<T> operator* (const valarray<T>& x, const valarray<T>& y);
239template<class T> valarray<T> operator* (const valarray<T>& x, const T& y);
240template<class T> valarray<T> operator* (const T& x, const valarray<T>& y);
241
242template<class T> valarray<T> operator/ (const valarray<T>& x, const valarray<T>& y);
243template<class T> valarray<T> operator/ (const valarray<T>& x, const T& y);
244template<class T> valarray<T> operator/ (const T& x, const valarray<T>& y);
245
246template<class T> valarray<T> operator% (const valarray<T>& x, const valarray<T>& y);
247template<class T> valarray<T> operator% (const valarray<T>& x, const T& y);
248template<class T> valarray<T> operator% (const T& x, const valarray<T>& y);
249
250template<class T> valarray<T> operator+ (const valarray<T>& x, const valarray<T>& y);
251template<class T> valarray<T> operator+ (const valarray<T>& x, const T& y);
252template<class T> valarray<T> operator+ (const T& x, const valarray<T>& y);
253
254template<class T> valarray<T> operator- (const valarray<T>& x, const valarray<T>& y);
255template<class T> valarray<T> operator- (const valarray<T>& x, const T& y);
256template<class T> valarray<T> operator- (const T& x, const valarray<T>& y);
257
258template<class T> valarray<T> operator^ (const valarray<T>& x, const valarray<T>& y);
259template<class T> valarray<T> operator^ (const valarray<T>& x, const T& y);
260template<class T> valarray<T> operator^ (const T& x, const valarray<T>& y);
261
262template<class T> valarray<T> operator& (const valarray<T>& x, const valarray<T>& y);
263template<class T> valarray<T> operator& (const valarray<T>& x, const T& y);
264template<class T> valarray<T> operator& (const T& x, const valarray<T>& y);
265
266template<class T> valarray<T> operator| (const valarray<T>& x, const valarray<T>& y);
267template<class T> valarray<T> operator| (const valarray<T>& x, const T& y);
268template<class T> valarray<T> operator| (const T& x, const valarray<T>& y);
269
270template<class T> valarray<T> operator<<(const valarray<T>& x, const valarray<T>& y);
271template<class T> valarray<T> operator<<(const valarray<T>& x, const T& y);
272template<class T> valarray<T> operator<<(const T& x, const valarray<T>& y);
273
274template<class T> valarray<T> operator>>(const valarray<T>& x, const valarray<T>& y);
275template<class T> valarray<T> operator>>(const valarray<T>& x, const T& y);
276template<class T> valarray<T> operator>>(const T& x, const valarray<T>& y);
277
278template<class T> valarray<bool> operator&&(const valarray<T>& x, const valarray<T>& y);
279template<class T> valarray<bool> operator&&(const valarray<T>& x, const T& y);
280template<class T> valarray<bool> operator&&(const T& x, const valarray<T>& y);
281
282template<class T> valarray<bool> operator||(const valarray<T>& x, const valarray<T>& y);
283template<class T> valarray<bool> operator||(const valarray<T>& x, const T& y);
284template<class T> valarray<bool> operator||(const T& x, const valarray<T>& y);
285
286template<class T> valarray<bool> operator==(const valarray<T>& x, const valarray<T>& y);
287template<class T> valarray<bool> operator==(const valarray<T>& x, const T& y);
288template<class T> valarray<bool> operator==(const T& x, const valarray<T>& y);
289
290template<class T> valarray<bool> operator!=(const valarray<T>& x, const valarray<T>& y);
291template<class T> valarray<bool> operator!=(const valarray<T>& x, const T& y);
292template<class T> valarray<bool> operator!=(const T& x, const valarray<T>& y);
293
294template<class T> valarray<bool> operator< (const valarray<T>& x, const valarray<T>& y);
295template<class T> valarray<bool> operator< (const valarray<T>& x, const T& y);
296template<class T> valarray<bool> operator< (const T& x, const valarray<T>& y);
297
298template<class T> valarray<bool> operator> (const valarray<T>& x, const valarray<T>& y);
299template<class T> valarray<bool> operator> (const valarray<T>& x, const T& y);
300template<class T> valarray<bool> operator> (const T& x, const valarray<T>& y);
301
302template<class T> valarray<bool> operator<=(const valarray<T>& x, const valarray<T>& y);
303template<class T> valarray<bool> operator<=(const valarray<T>& x, const T& y);
304template<class T> valarray<bool> operator<=(const T& x, const valarray<T>& y);
305
306template<class T> valarray<bool> operator>=(const valarray<T>& x, const valarray<T>& y);
307template<class T> valarray<bool> operator>=(const valarray<T>& x, const T& y);
308template<class T> valarray<bool> operator>=(const T& x, const valarray<T>& y);
309
310template<class T> valarray<T> abs (const valarray<T>& x);
311template<class T> valarray<T> acos (const valarray<T>& x);
312template<class T> valarray<T> asin (const valarray<T>& x);
313template<class T> valarray<T> atan (const valarray<T>& x);
314
315template<class T> valarray<T> atan2(const valarray<T>& x, const valarray<T>& y);
316template<class T> valarray<T> atan2(const valarray<T>& x, const T& y);
317template<class T> valarray<T> atan2(const T& x, const valarray<T>& y);
318
319template<class T> valarray<T> cos (const valarray<T>& x);
320template<class T> valarray<T> cosh (const valarray<T>& x);
321template<class T> valarray<T> exp (const valarray<T>& x);
322template<class T> valarray<T> log (const valarray<T>& x);
323template<class T> valarray<T> log10(const valarray<T>& x);
324
325template<class T> valarray<T> pow(const valarray<T>& x, const valarray<T>& y);
326template<class T> valarray<T> pow(const valarray<T>& x, const T& y);
327template<class T> valarray<T> pow(const T& x, const valarray<T>& y);
328
329template<class T> valarray<T> sin (const valarray<T>& x);
330template<class T> valarray<T> sinh (const valarray<T>& x);
331template<class T> valarray<T> sqrt (const valarray<T>& x);
332template<class T> valarray<T> tan (const valarray<T>& x);
333template<class T> valarray<T> tanh (const valarray<T>& x);
334
335template <class T> unspecified1 begin(valarray<T>& v);
336template <class T> unspecified2 begin(const valarray<T>& v);
337template <class T> unspecified1 end(valarray<T>& v);
338template <class T> unspecified2 end(const valarray<T>& v);
339
340} // std
341
342*/
343
Nikolas Klauserf210d8a2022-02-15 18:18:08 +0100344#include <__algorithm/copy.h>
345#include <__algorithm/count.h>
346#include <__algorithm/fill.h>
347#include <__algorithm/max_element.h>
348#include <__algorithm/min.h>
349#include <__algorithm/min_element.h>
350#include <__algorithm/unwrap_iter.h>
Louis Dionneb4fce352022-03-25 12:55:36 -0400351#include <__assert> // all public C++ headers provide the assertion handler
Howard Hinnantc51e1022010-05-11 19:42:16 +0000352#include <__config>
Nikolas Klauseree2dbc32022-04-17 16:01:38 +0200353#include <__functional/operations.h>
354#include <__memory/allocator.h>
355#include <__memory/uninitialized_algorithms.h>
356#include <__utility/move.h>
357#include <__utility/swap.h>
Arthur O'Dwyeref181602021-05-19 11:57:04 -0400358#include <cmath>
359#include <cstddef>
Arthur O'Dwyeref181602021-05-19 11:57:04 -0400360#include <initializer_list>
Richard Smith1f1c1472014-06-04 19:54:15 +0000361#include <new>
Mark de Weverce8f12c2021-12-22 18:14:14 +0100362#include <version>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000363
Howard Hinnantaaaa52b2011-10-17 20:05:10 +0000364#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
Arthur O'Dwyer6eeaa002022-02-01 20:16:40 -0500365# pragma GCC system_header
Howard Hinnantaaaa52b2011-10-17 20:05:10 +0000366#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +0000367
Eric Fiselierf4433a32017-05-31 22:07:49 +0000368_LIBCPP_PUSH_MACROS
369#include <__undef_macros>
370
Howard Hinnantc51e1022010-05-11 19:42:16 +0000371_LIBCPP_BEGIN_NAMESPACE_STD
372
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000373template<class _Tp> class _LIBCPP_TEMPLATE_VIS valarray;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000374
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000375class _LIBCPP_TEMPLATE_VIS slice
Howard Hinnantc51e1022010-05-11 19:42:16 +0000376{
377 size_t __start_;
378 size_t __size_;
379 size_t __stride_;
380public:
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000381 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000382 slice()
383 : __start_(0),
384 __size_(0),
385 __stride_(0)
386 {}
387
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000388 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000389 slice(size_t __start, size_t __size, size_t __stride)
390 : __start_(__start),
391 __size_(__size),
392 __stride_(__stride)
393 {}
394
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000395 _LIBCPP_INLINE_VISIBILITY size_t start() const {return __start_;}
396 _LIBCPP_INLINE_VISIBILITY size_t size() const {return __size_;}
397 _LIBCPP_INLINE_VISIBILITY size_t stride() const {return __stride_;}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000398};
399
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000400template <class _Tp> class _LIBCPP_TEMPLATE_VIS slice_array;
Howard Hinnant8331b762013-03-06 23:30:19 +0000401class _LIBCPP_TYPE_VIS gslice;
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000402template <class _Tp> class _LIBCPP_TEMPLATE_VIS gslice_array;
403template <class _Tp> class _LIBCPP_TEMPLATE_VIS mask_array;
404template <class _Tp> class _LIBCPP_TEMPLATE_VIS indirect_array;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000405
406template <class _Tp>
Howard Hinnanta54386e2012-09-14 00:39:16 +0000407_LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000408_Tp*
409begin(valarray<_Tp>& __v);
410
411template <class _Tp>
Howard Hinnanta54386e2012-09-14 00:39:16 +0000412_LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000413const _Tp*
414begin(const valarray<_Tp>& __v);
415
416template <class _Tp>
Howard Hinnanta54386e2012-09-14 00:39:16 +0000417_LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000418_Tp*
419end(valarray<_Tp>& __v);
420
421template <class _Tp>
Howard Hinnanta54386e2012-09-14 00:39:16 +0000422_LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000423const _Tp*
424end(const valarray<_Tp>& __v);
425
426template <class _Op, class _A0>
427struct _UnaryOp
428{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400429 typedef typename _Op::__result_type __result_type;
Arthur O'Dwyer0b6c2482021-05-31 11:33:51 -0400430 typedef typename decay<__result_type>::type value_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000431
432 _Op __op_;
433 _A0 __a0_;
434
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000435 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000436 _UnaryOp(const _Op& __op, const _A0& __a0) : __op_(__op), __a0_(__a0) {}
437
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000438 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400439 __result_type operator[](size_t __i) const {return __op_(__a0_[__i]);}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000440
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000441 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000442 size_t size() const {return __a0_.size();}
443};
444
445template <class _Op, class _A0, class _A1>
446struct _BinaryOp
447{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400448 typedef typename _Op::__result_type __result_type;
Arthur O'Dwyer0b6c2482021-05-31 11:33:51 -0400449 typedef typename decay<__result_type>::type value_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000450
451 _Op __op_;
452 _A0 __a0_;
453 _A1 __a1_;
454
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000455 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000456 _BinaryOp(const _Op& __op, const _A0& __a0, const _A1& __a1)
457 : __op_(__op), __a0_(__a0), __a1_(__a1) {}
458
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000459 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer0b6c2482021-05-31 11:33:51 -0400460 __result_type operator[](size_t __i) const {return __op_(__a0_[__i], __a1_[__i]);}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000461
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000462 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000463 size_t size() const {return __a0_.size();}
464};
465
466template <class _Tp>
467class __scalar_expr
468{
469public:
470 typedef _Tp value_type;
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400471 typedef const _Tp& __result_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000472private:
473 const value_type& __t_;
474 size_t __s_;
475public:
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000476 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000477 explicit __scalar_expr(const value_type& __t, size_t __s) : __t_(__t), __s_(__s) {}
478
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000479 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400480 __result_type operator[](size_t) const {return __t_;}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000481
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000482 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000483 size_t size() const {return __s_;}
484};
485
486template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400487struct __unary_plus
Howard Hinnantc51e1022010-05-11 19:42:16 +0000488{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400489 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000490 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000491 _Tp operator()(const _Tp& __x) const
492 {return +__x;}
493};
494
495template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400496struct __bit_not
Howard Hinnantc51e1022010-05-11 19:42:16 +0000497{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400498 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000499 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000500 _Tp operator()(const _Tp& __x) const
501 {return ~__x;}
502};
503
504template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400505struct __bit_shift_left
Howard Hinnantc51e1022010-05-11 19:42:16 +0000506{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400507 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000508 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000509 _Tp operator()(const _Tp& __x, const _Tp& __y) const
510 {return __x << __y;}
511};
512
513template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400514struct __bit_shift_right
Howard Hinnantc51e1022010-05-11 19:42:16 +0000515{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400516 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000517 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000518 _Tp operator()(const _Tp& __x, const _Tp& __y) const
519 {return __x >> __y;}
520};
521
Howard Hinnantc834c512011-11-29 18:15:50 +0000522template <class _Tp, class _Fp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400523struct __apply_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000524{
525private:
Howard Hinnantc834c512011-11-29 18:15:50 +0000526 _Fp __f_;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000527public:
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400528 typedef _Tp __result_type;
529
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000530 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc834c512011-11-29 18:15:50 +0000531 explicit __apply_expr(_Fp __f) : __f_(__f) {}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000532
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000533 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000534 _Tp operator()(const _Tp& __x) const
535 {return __f_(__x);}
536};
537
538template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400539struct __abs_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000540{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400541 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000542 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000543 _Tp operator()(const _Tp& __x) const
544 {return abs(__x);}
545};
546
547template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400548struct __acos_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000549{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400550 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000551 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000552 _Tp operator()(const _Tp& __x) const
553 {return acos(__x);}
554};
555
556template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400557struct __asin_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000558{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400559 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000560 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000561 _Tp operator()(const _Tp& __x) const
562 {return asin(__x);}
563};
564
565template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400566struct __atan_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000567{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400568 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000569 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000570 _Tp operator()(const _Tp& __x) const
571 {return atan(__x);}
572};
573
574template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400575struct __atan2_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000576{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400577 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000578 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000579 _Tp operator()(const _Tp& __x, const _Tp& __y) const
580 {return atan2(__x, __y);}
581};
582
583template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400584struct __cos_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000585{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400586 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000587 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000588 _Tp operator()(const _Tp& __x) const
589 {return cos(__x);}
590};
591
592template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400593struct __cosh_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000594{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400595 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000596 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000597 _Tp operator()(const _Tp& __x) const
598 {return cosh(__x);}
599};
600
601template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400602struct __exp_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000603{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400604 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000605 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000606 _Tp operator()(const _Tp& __x) const
607 {return exp(__x);}
608};
609
610template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400611struct __log_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000612{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400613 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000614 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000615 _Tp operator()(const _Tp& __x) const
616 {return log(__x);}
617};
618
619template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400620struct __log10_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000621{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400622 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000623 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000624 _Tp operator()(const _Tp& __x) const
625 {return log10(__x);}
626};
627
628template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400629struct __pow_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000630{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400631 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000632 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000633 _Tp operator()(const _Tp& __x, const _Tp& __y) const
634 {return pow(__x, __y);}
635};
636
637template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400638struct __sin_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000639{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400640 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000641 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000642 _Tp operator()(const _Tp& __x) const
643 {return sin(__x);}
644};
645
646template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400647struct __sinh_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000648{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400649 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000650 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000651 _Tp operator()(const _Tp& __x) const
652 {return sinh(__x);}
653};
654
655template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400656struct __sqrt_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000657{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400658 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000659 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000660 _Tp operator()(const _Tp& __x) const
661 {return sqrt(__x);}
662};
663
664template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400665struct __tan_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000666{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400667 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000668 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000669 _Tp operator()(const _Tp& __x) const
670 {return tan(__x);}
671};
672
673template <class _Tp>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400674struct __tanh_expr
Howard Hinnantc51e1022010-05-11 19:42:16 +0000675{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400676 typedef _Tp __result_type;
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000677 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000678 _Tp operator()(const _Tp& __x) const
679 {return tanh(__x);}
680};
681
682template <class _ValExpr>
683class __slice_expr
684{
685 typedef typename remove_reference<_ValExpr>::type _RmExpr;
686public:
687 typedef typename _RmExpr::value_type value_type;
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400688 typedef value_type __result_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000689
690private:
691 _ValExpr __expr_;
692 size_t __start_;
693 size_t __size_;
694 size_t __stride_;
695
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000696 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000697 __slice_expr(const slice& __sl, const _RmExpr& __e)
698 : __expr_(__e),
699 __start_(__sl.start()),
700 __size_(__sl.size()),
701 __stride_(__sl.stride())
702 {}
703public:
704
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000705 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400706 __result_type operator[](size_t __i) const
Howard Hinnantc51e1022010-05-11 19:42:16 +0000707 {return __expr_[__start_ + __i * __stride_];}
708
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000709 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000710 size_t size() const {return __size_;}
711
Eric Fiselier7b31ed02019-04-02 08:05:23 +0000712 template <class> friend class __val_expr;
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000713 template <class> friend class _LIBCPP_TEMPLATE_VIS valarray;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000714};
715
716template <class _ValExpr>
717class __mask_expr;
718
719template <class _ValExpr>
720class __indirect_expr;
721
722template <class _ValExpr>
723class __shift_expr
724{
725 typedef typename remove_reference<_ValExpr>::type _RmExpr;
726public:
727 typedef typename _RmExpr::value_type value_type;
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400728 typedef value_type __result_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000729
730private:
731 _ValExpr __expr_;
732 size_t __size_;
733 ptrdiff_t __ul_;
734 ptrdiff_t __sn_;
735 ptrdiff_t __n_;
Howard Hinnantc834c512011-11-29 18:15:50 +0000736 static const ptrdiff_t _Np = static_cast<ptrdiff_t>(
Howard Hinnantc51e1022010-05-11 19:42:16 +0000737 sizeof(ptrdiff_t) * __CHAR_BIT__ - 1);
738
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000739 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000740 __shift_expr(int __n, const _RmExpr& __e)
741 : __expr_(__e),
742 __size_(__e.size()),
743 __n_(__n)
744 {
Howard Hinnantc834c512011-11-29 18:15:50 +0000745 ptrdiff_t __neg_n = static_cast<ptrdiff_t>(__n_ >> _Np);
746 __sn_ = __neg_n | static_cast<ptrdiff_t>(static_cast<size_t>(-__n_) >> _Np);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000747 __ul_ = ((__size_ - __n_) & ~__neg_n) | ((__n_ + 1) & __neg_n);
748 }
749public:
750
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000751 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400752 __result_type operator[](size_t __j) const
Howard Hinnantc51e1022010-05-11 19:42:16 +0000753 {
Howard Hinnant28b24882011-12-01 20:21:04 +0000754 ptrdiff_t __i = static_cast<ptrdiff_t>(__j);
Howard Hinnantc834c512011-11-29 18:15:50 +0000755 ptrdiff_t __m = (__sn_ * __i - __ul_) >> _Np;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000756 return (__expr_[(__i + __n_) & __m] & __m) | (value_type() & ~__m);
757 }
758
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000759 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000760 size_t size() const {return __size_;}
761
762 template <class> friend class __val_expr;
763};
764
765template <class _ValExpr>
766class __cshift_expr
767{
768 typedef typename remove_reference<_ValExpr>::type _RmExpr;
769public:
770 typedef typename _RmExpr::value_type value_type;
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400771 typedef value_type __result_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000772
773private:
774 _ValExpr __expr_;
775 size_t __size_;
776 size_t __m_;
777 size_t __o1_;
778 size_t __o2_;
779
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000780 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000781 __cshift_expr(int __n, const _RmExpr& __e)
782 : __expr_(__e),
783 __size_(__e.size())
784 {
785 __n %= static_cast<int>(__size_);
786 if (__n >= 0)
787 {
788 __m_ = __size_ - __n;
789 __o1_ = __n;
790 __o2_ = __n - __size_;
791 }
792 else
793 {
794 __m_ = -__n;
795 __o1_ = __n + __size_;
796 __o2_ = __n;
797 }
798 }
799public:
800
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000801 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400802 __result_type operator[](size_t __i) const
Howard Hinnantc51e1022010-05-11 19:42:16 +0000803 {
804 if (__i < __m_)
805 return __expr_[__i + __o1_];
806 return __expr_[__i + __o2_];
807 }
808
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000809 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000810 size_t size() const {return __size_;}
811
812 template <class> friend class __val_expr;
813};
814
815template<class _ValExpr>
816class __val_expr;
817
818template<class _ValExpr>
819struct __is_val_expr : false_type {};
820
821template<class _ValExpr>
822struct __is_val_expr<__val_expr<_ValExpr> > : true_type {};
823
824template<class _Tp>
825struct __is_val_expr<valarray<_Tp> > : true_type {};
826
827template<class _Tp>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000828class _LIBCPP_TEMPLATE_VIS valarray
Howard Hinnantc51e1022010-05-11 19:42:16 +0000829{
830public:
831 typedef _Tp value_type;
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -0400832 typedef _Tp __result_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000833
834private:
835 value_type* __begin_;
836 value_type* __end_;
837
838public:
839 // construct/destroy:
Douglas Gregor68902322012-05-19 07:14:17 +0000840 _LIBCPP_INLINE_VISIBILITY
Bruce Mitchener170d8972020-11-24 12:53:53 -0500841 valarray() : __begin_(nullptr), __end_(nullptr) {}
Louis Dionneb4d05d72018-10-16 19:26:23 +0000842 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Eric Fiseliere529a802016-09-16 00:13:55 +0000843 explicit valarray(size_t __n);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000844 _LIBCPP_INLINE_VISIBILITY
Douglas Gregor68902322012-05-19 07:14:17 +0000845 valarray(const value_type& __x, size_t __n);
846 valarray(const value_type* __p, size_t __n);
847 valarray(const valarray& __v);
Eric Fiselier3b0b81f2017-04-19 00:23:45 +0000848#ifndef _LIBCPP_CXX03_LANG
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000849 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant298aed92012-07-21 00:51:28 +0000850 valarray(valarray&& __v) _NOEXCEPT;
Douglas Gregor68902322012-05-19 07:14:17 +0000851 valarray(initializer_list<value_type> __il);
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400852#endif // _LIBCPP_CXX03_LANG
Douglas Gregor68902322012-05-19 07:14:17 +0000853 valarray(const slice_array<value_type>& __sa);
854 valarray(const gslice_array<value_type>& __ga);
855 valarray(const mask_array<value_type>& __ma);
856 valarray(const indirect_array<value_type>& __ia);
Louis Dionneb4d05d72018-10-16 19:26:23 +0000857 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Douglas Gregor68902322012-05-19 07:14:17 +0000858 ~valarray();
Howard Hinnantc51e1022010-05-11 19:42:16 +0000859
860 // assignment:
Douglas Gregor68902322012-05-19 07:14:17 +0000861 valarray& operator=(const valarray& __v);
Eric Fiselier3b0b81f2017-04-19 00:23:45 +0000862#ifndef _LIBCPP_CXX03_LANG
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000863 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant298aed92012-07-21 00:51:28 +0000864 valarray& operator=(valarray&& __v) _NOEXCEPT;
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000865 _LIBCPP_INLINE_VISIBILITY
Douglas Gregor68902322012-05-19 07:14:17 +0000866 valarray& operator=(initializer_list<value_type>);
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400867#endif // _LIBCPP_CXX03_LANG
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000868 _LIBCPP_INLINE_VISIBILITY
Douglas Gregor68902322012-05-19 07:14:17 +0000869 valarray& operator=(const value_type& __x);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000870 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000871 valarray& operator=(const slice_array<value_type>& __sa);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000872 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000873 valarray& operator=(const gslice_array<value_type>& __ga);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000874 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000875 valarray& operator=(const mask_array<value_type>& __ma);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000876 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000877 valarray& operator=(const indirect_array<value_type>& __ia);
Howard Hinnant329cd412011-07-27 23:19:59 +0000878 template <class _ValExpr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000879 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant329cd412011-07-27 23:19:59 +0000880 valarray& operator=(const __val_expr<_ValExpr>& __v);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000881
882 // element access:
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000883 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000884 const value_type& operator[](size_t __i) const {return __begin_[__i];}
885
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000886 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000887 value_type& operator[](size_t __i) {return __begin_[__i];}
888
889 // subset operations:
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000890 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000891 __val_expr<__slice_expr<const valarray&> > operator[](slice __s) const;
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000892 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000893 slice_array<value_type> operator[](slice __s);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000894 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000895 __val_expr<__indirect_expr<const valarray&> > operator[](const gslice& __gs) const;
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000896 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000897 gslice_array<value_type> operator[](const gslice& __gs);
Eric Fiselier3b0b81f2017-04-19 00:23:45 +0000898#ifndef _LIBCPP_CXX03_LANG
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000899 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000900 __val_expr<__indirect_expr<const valarray&> > operator[](gslice&& __gs) const;
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000901 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000902 gslice_array<value_type> operator[](gslice&& __gs);
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400903#endif // _LIBCPP_CXX03_LANG
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000904 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000905 __val_expr<__mask_expr<const valarray&> > operator[](const valarray<bool>& __vb) const;
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000906 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000907 mask_array<value_type> operator[](const valarray<bool>& __vb);
Eric Fiselier3b0b81f2017-04-19 00:23:45 +0000908#ifndef _LIBCPP_CXX03_LANG
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000909 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000910 __val_expr<__mask_expr<const valarray&> > operator[](valarray<bool>&& __vb) const;
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000911 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000912 mask_array<value_type> operator[](valarray<bool>&& __vb);
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400913#endif // _LIBCPP_CXX03_LANG
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000914 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000915 __val_expr<__indirect_expr<const valarray&> > operator[](const valarray<size_t>& __vs) const;
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000916 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000917 indirect_array<value_type> operator[](const valarray<size_t>& __vs);
Eric Fiselier3b0b81f2017-04-19 00:23:45 +0000918#ifndef _LIBCPP_CXX03_LANG
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000919 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000920 __val_expr<__indirect_expr<const valarray&> > operator[](valarray<size_t>&& __vs) const;
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000921 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000922 indirect_array<value_type> operator[](valarray<size_t>&& __vs);
Louis Dionne2b1ceaa2021-04-20 12:03:32 -0400923#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000924
925 // unary operators:
Louis Dionne12a2e572022-05-05 12:24:43 -0400926 _LIBCPP_INLINE_VISIBILITY
927 __val_expr<_UnaryOp<__unary_plus<_Tp>, const valarray&> > operator+() const;
928 _LIBCPP_INLINE_VISIBILITY
929 __val_expr<_UnaryOp<negate<_Tp>, const valarray&> > operator-() const;
930 _LIBCPP_INLINE_VISIBILITY
931 __val_expr<_UnaryOp<__bit_not<_Tp>, const valarray&> > operator~() const;
932 _LIBCPP_INLINE_VISIBILITY
933 __val_expr<_UnaryOp<logical_not<_Tp>, const valarray&> > operator!() const;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000934
935 // computed assignment:
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);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000940 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000941 valarray& operator%= (const value_type& __x);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000942 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000943 valarray& operator+= (const value_type& __x);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000944 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000945 valarray& operator-= (const value_type& __x);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000946 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000947 valarray& operator^= (const value_type& __x);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000948 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000949 valarray& operator&= (const value_type& __x);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000950 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000951 valarray& operator|= (const value_type& __x);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000952 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000953 valarray& operator<<=(const value_type& __x);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000954 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000955 valarray& operator>>=(const value_type& __x);
956
957 template <class _Expr>
958 typename enable_if
959 <
960 __is_val_expr<_Expr>::value,
961 valarray&
962 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000963 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000964 operator*= (const _Expr& __v);
965
966 template <class _Expr>
967 typename enable_if
968 <
969 __is_val_expr<_Expr>::value,
970 valarray&
971 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000972 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000973 operator/= (const _Expr& __v);
974
975 template <class _Expr>
976 typename enable_if
977 <
978 __is_val_expr<_Expr>::value,
979 valarray&
980 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000981 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000982 operator%= (const _Expr& __v);
983
984 template <class _Expr>
985 typename enable_if
986 <
987 __is_val_expr<_Expr>::value,
988 valarray&
989 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000990 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000991 operator+= (const _Expr& __v);
992
993 template <class _Expr>
994 typename enable_if
995 <
996 __is_val_expr<_Expr>::value,
997 valarray&
998 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000999 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001000 operator-= (const _Expr& __v);
1001
1002 template <class _Expr>
1003 typename enable_if
1004 <
1005 __is_val_expr<_Expr>::value,
1006 valarray&
1007 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001008 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001009 operator^= (const _Expr& __v);
1010
1011 template <class _Expr>
1012 typename enable_if
1013 <
1014 __is_val_expr<_Expr>::value,
1015 valarray&
1016 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001017 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001018 operator|= (const _Expr& __v);
1019
1020 template <class _Expr>
1021 typename enable_if
1022 <
1023 __is_val_expr<_Expr>::value,
1024 valarray&
1025 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001026 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001027 operator&= (const _Expr& __v);
1028
1029 template <class _Expr>
1030 typename enable_if
1031 <
1032 __is_val_expr<_Expr>::value,
1033 valarray&
1034 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001035 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001036 operator<<= (const _Expr& __v);
1037
1038 template <class _Expr>
1039 typename enable_if
1040 <
1041 __is_val_expr<_Expr>::value,
1042 valarray&
1043 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001044 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001045 operator>>= (const _Expr& __v);
1046
1047 // member functions:
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001048 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant298aed92012-07-21 00:51:28 +00001049 void swap(valarray& __v) _NOEXCEPT;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001050
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001051 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant28b24882011-12-01 20:21:04 +00001052 size_t size() const {return static_cast<size_t>(__end_ - __begin_);}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001053
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001054 _LIBCPP_INLINE_VISIBILITY
Douglas Gregor68902322012-05-19 07:14:17 +00001055 value_type sum() const;
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001056 _LIBCPP_INLINE_VISIBILITY
Douglas Gregor68902322012-05-19 07:14:17 +00001057 value_type min() const;
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001058 _LIBCPP_INLINE_VISIBILITY
Douglas Gregor68902322012-05-19 07:14:17 +00001059 value_type max() const;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001060
Douglas Gregor68902322012-05-19 07:14:17 +00001061 valarray shift (int __i) const;
1062 valarray cshift(int __i) const;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001063 valarray apply(value_type __f(value_type)) const;
1064 valarray apply(value_type __f(const value_type&)) const;
1065 void resize(size_t __n, value_type __x = value_type());
1066
1067private:
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00001068 template <class> friend class _LIBCPP_TEMPLATE_VIS valarray;
1069 template <class> friend class _LIBCPP_TEMPLATE_VIS slice_array;
1070 template <class> friend class _LIBCPP_TEMPLATE_VIS gslice_array;
1071 template <class> friend class _LIBCPP_TEMPLATE_VIS mask_array;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001072 template <class> friend class __mask_expr;
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00001073 template <class> friend class _LIBCPP_TEMPLATE_VIS indirect_array;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001074 template <class> friend class __indirect_expr;
1075 template <class> friend class __val_expr;
1076
1077 template <class _Up>
1078 friend
1079 _Up*
1080 begin(valarray<_Up>& __v);
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001081
Howard Hinnantc51e1022010-05-11 19:42:16 +00001082 template <class _Up>
1083 friend
1084 const _Up*
1085 begin(const valarray<_Up>& __v);
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001086
Howard Hinnantc51e1022010-05-11 19:42:16 +00001087 template <class _Up>
1088 friend
1089 _Up*
1090 end(valarray<_Up>& __v);
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001091
Howard Hinnantc51e1022010-05-11 19:42:16 +00001092 template <class _Up>
1093 friend
1094 const _Up*
1095 end(const valarray<_Up>& __v);
Mikhail Maltsev59de6f82018-02-08 11:33:48 +00001096
Eric Fiseliera119c322018-10-25 17:43:26 +00001097 _LIBCPP_INLINE_VISIBILITY
Eric Fiselier2856ef82018-10-25 17:21:30 +00001098 void __clear(size_t __capacity);
Mikhail Maltsev59de6f82018-02-08 11:33:48 +00001099 valarray& __assign_range(const value_type* __f, const value_type* __l);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001100};
1101
Konstantin Varlamovebb31192021-10-28 00:36:19 -07001102#if _LIBCPP_STD_VER > 14
1103template<class _Tp, size_t _Size>
1104valarray(const _Tp(&)[_Size], size_t) -> valarray<_Tp>;
1105#endif
1106
Howard Hinnanta37d3cf2013-08-12 18:38:34 +00001107_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void valarray<size_t>::resize(size_t, size_t))
1108
Howard Hinnantc51e1022010-05-11 19:42:16 +00001109template <class _Op, class _Tp>
1110struct _UnaryOp<_Op, valarray<_Tp> >
1111{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04001112 typedef typename _Op::__result_type __result_type;
Arthur O'Dwyer0b6c2482021-05-31 11:33:51 -04001113 typedef typename decay<__result_type>::type value_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001114
1115 _Op __op_;
1116 const valarray<_Tp>& __a0_;
1117
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001118 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001119 _UnaryOp(const _Op& __op, const valarray<_Tp>& __a0) : __op_(__op), __a0_(__a0) {}
1120
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001121 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04001122 __result_type operator[](size_t __i) const {return __op_(__a0_[__i]);}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001123
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001124 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001125 size_t size() const {return __a0_.size();}
1126};
1127
1128template <class _Op, class _Tp, class _A1>
1129struct _BinaryOp<_Op, valarray<_Tp>, _A1>
1130{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04001131 typedef typename _Op::__result_type __result_type;
Arthur O'Dwyer0b6c2482021-05-31 11:33:51 -04001132 typedef typename decay<__result_type>::type value_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001133
1134 _Op __op_;
1135 const valarray<_Tp>& __a0_;
1136 _A1 __a1_;
1137
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001138 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001139 _BinaryOp(const _Op& __op, const valarray<_Tp>& __a0, const _A1& __a1)
1140 : __op_(__op), __a0_(__a0), __a1_(__a1) {}
1141
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001142 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer0b6c2482021-05-31 11:33:51 -04001143 __result_type operator[](size_t __i) const {return __op_(__a0_[__i], __a1_[__i]);}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001144
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001145 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001146 size_t size() const {return __a0_.size();}
1147};
1148
1149template <class _Op, class _A0, class _Tp>
1150struct _BinaryOp<_Op, _A0, valarray<_Tp> >
1151{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04001152 typedef typename _Op::__result_type __result_type;
Arthur O'Dwyer0b6c2482021-05-31 11:33:51 -04001153 typedef typename decay<__result_type>::type value_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001154
1155 _Op __op_;
1156 _A0 __a0_;
1157 const valarray<_Tp>& __a1_;
1158
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001159 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001160 _BinaryOp(const _Op& __op, const _A0& __a0, const valarray<_Tp>& __a1)
1161 : __op_(__op), __a0_(__a0), __a1_(__a1) {}
1162
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001163 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer0b6c2482021-05-31 11:33:51 -04001164 __result_type operator[](size_t __i) const {return __op_(__a0_[__i], __a1_[__i]);}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001165
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001166 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001167 size_t size() const {return __a0_.size();}
1168};
1169
1170template <class _Op, class _Tp>
1171struct _BinaryOp<_Op, valarray<_Tp>, valarray<_Tp> >
1172{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04001173 typedef typename _Op::__result_type __result_type;
Arthur O'Dwyer0b6c2482021-05-31 11:33:51 -04001174 typedef typename decay<__result_type>::type value_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001175
1176 _Op __op_;
1177 const valarray<_Tp>& __a0_;
1178 const valarray<_Tp>& __a1_;
1179
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001180 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001181 _BinaryOp(const _Op& __op, const valarray<_Tp>& __a0, const valarray<_Tp>& __a1)
1182 : __op_(__op), __a0_(__a0), __a1_(__a1) {}
1183
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001184 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer0b6c2482021-05-31 11:33:51 -04001185 __result_type operator[](size_t __i) const {return __op_(__a0_[__i], __a1_[__i]);}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001186
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001187 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001188 size_t size() const {return __a0_.size();}
1189};
1190
1191// slice_array
1192
1193template <class _Tp>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00001194class _LIBCPP_TEMPLATE_VIS slice_array
Howard Hinnantc51e1022010-05-11 19:42:16 +00001195{
1196public:
1197 typedef _Tp value_type;
1198
1199private:
1200 value_type* __vp_;
1201 size_t __size_;
1202 size_t __stride_;
1203
1204public:
1205 template <class _Expr>
1206 typename enable_if
1207 <
1208 __is_val_expr<_Expr>::value,
1209 void
1210 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001211 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001212 operator=(const _Expr& __v) const;
1213
1214 template <class _Expr>
1215 typename enable_if
1216 <
1217 __is_val_expr<_Expr>::value,
1218 void
1219 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001220 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001221 operator*=(const _Expr& __v) const;
1222
1223 template <class _Expr>
1224 typename enable_if
1225 <
1226 __is_val_expr<_Expr>::value,
1227 void
1228 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001229 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001230 operator/=(const _Expr& __v) const;
1231
1232 template <class _Expr>
1233 typename enable_if
1234 <
1235 __is_val_expr<_Expr>::value,
1236 void
1237 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001238 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001239 operator%=(const _Expr& __v) const;
1240
1241 template <class _Expr>
1242 typename enable_if
1243 <
1244 __is_val_expr<_Expr>::value,
1245 void
1246 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001247 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001248 operator+=(const _Expr& __v) const;
1249
1250 template <class _Expr>
1251 typename enable_if
1252 <
1253 __is_val_expr<_Expr>::value,
1254 void
1255 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001256 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001257 operator-=(const _Expr& __v) const;
1258
1259 template <class _Expr>
1260 typename enable_if
1261 <
1262 __is_val_expr<_Expr>::value,
1263 void
1264 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001265 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001266 operator^=(const _Expr& __v) const;
1267
1268 template <class _Expr>
1269 typename enable_if
1270 <
1271 __is_val_expr<_Expr>::value,
1272 void
1273 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001274 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001275 operator&=(const _Expr& __v) const;
1276
1277 template <class _Expr>
1278 typename enable_if
1279 <
1280 __is_val_expr<_Expr>::value,
1281 void
1282 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001283 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001284 operator|=(const _Expr& __v) const;
1285
1286 template <class _Expr>
1287 typename enable_if
1288 <
1289 __is_val_expr<_Expr>::value,
1290 void
1291 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001292 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001293 operator<<=(const _Expr& __v) const;
1294
1295 template <class _Expr>
1296 typename enable_if
1297 <
1298 __is_val_expr<_Expr>::value,
1299 void
1300 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001301 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001302 operator>>=(const _Expr& __v) const;
1303
Eric Fiselierb9f37ca2019-12-12 20:48:11 -05001304 slice_array(slice_array const&) = default;
1305
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001306 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001307 const slice_array& operator=(const slice_array& __sa) const;
1308
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001309 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001310 void operator=(const value_type& __x) const;
1311
zoecarver79fa7502020-12-02 10:49:20 -08001312 _LIBCPP_INLINE_VISIBILITY
1313 void operator=(const valarray<value_type>& __va) const;
1314
Howard Hinnantc51e1022010-05-11 19:42:16 +00001315private:
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001316 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001317 slice_array(const slice& __sl, const valarray<value_type>& __v)
1318 : __vp_(const_cast<value_type*>(__v.__begin_ + __sl.start())),
1319 __size_(__sl.size()),
1320 __stride_(__sl.stride())
1321 {}
1322
1323 template <class> friend class valarray;
1324 template <class> friend class sliceExpr;
1325};
1326
1327template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001328inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001329const slice_array<_Tp>&
1330slice_array<_Tp>::operator=(const slice_array& __sa) const
1331{
1332 value_type* __t = __vp_;
1333 const value_type* __s = __sa.__vp_;
1334 for (size_t __n = __size_; __n; --__n, __t += __stride_, __s += __sa.__stride_)
1335 *__t = *__s;
Eric Fiselier3b80ce92014-08-12 00:06:58 +00001336 return *this;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001337}
1338
1339template <class _Tp>
1340template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001341inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001342typename enable_if
1343<
1344 __is_val_expr<_Expr>::value,
1345 void
1346>::type
1347slice_array<_Tp>::operator=(const _Expr& __v) const
1348{
1349 value_type* __t = __vp_;
1350 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1351 *__t = __v[__i];
1352}
1353
1354template <class _Tp>
zoecarver79fa7502020-12-02 10:49:20 -08001355inline void
1356slice_array<_Tp>::operator=(const valarray<value_type>& __va) const
1357{
1358 value_type* __t = __vp_;
1359 for (size_t __i = 0; __i < __va.size(); ++__i, __t += __stride_)
1360 *__t = __va[__i];
1361}
1362
1363template <class _Tp>
Howard Hinnantc51e1022010-05-11 19:42:16 +00001364template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001365inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001366typename enable_if
1367<
1368 __is_val_expr<_Expr>::value,
1369 void
1370>::type
1371slice_array<_Tp>::operator*=(const _Expr& __v) const
1372{
1373 value_type* __t = __vp_;
1374 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1375 *__t *= __v[__i];
1376}
1377
1378template <class _Tp>
1379template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001380inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001381typename enable_if
1382<
1383 __is_val_expr<_Expr>::value,
1384 void
1385>::type
1386slice_array<_Tp>::operator/=(const _Expr& __v) const
1387{
1388 value_type* __t = __vp_;
1389 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1390 *__t /= __v[__i];
1391}
1392
1393template <class _Tp>
1394template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001395inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001396typename enable_if
1397<
1398 __is_val_expr<_Expr>::value,
1399 void
1400>::type
1401slice_array<_Tp>::operator%=(const _Expr& __v) const
1402{
1403 value_type* __t = __vp_;
1404 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1405 *__t %= __v[__i];
1406}
1407
1408template <class _Tp>
1409template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001410inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001411typename enable_if
1412<
1413 __is_val_expr<_Expr>::value,
1414 void
1415>::type
1416slice_array<_Tp>::operator+=(const _Expr& __v) const
1417{
1418 value_type* __t = __vp_;
1419 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1420 *__t += __v[__i];
1421}
1422
1423template <class _Tp>
1424template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001425inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001426typename enable_if
1427<
1428 __is_val_expr<_Expr>::value,
1429 void
1430>::type
1431slice_array<_Tp>::operator-=(const _Expr& __v) const
1432{
1433 value_type* __t = __vp_;
1434 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1435 *__t -= __v[__i];
1436}
1437
1438template <class _Tp>
1439template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001440inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001441typename enable_if
1442<
1443 __is_val_expr<_Expr>::value,
1444 void
1445>::type
1446slice_array<_Tp>::operator^=(const _Expr& __v) const
1447{
1448 value_type* __t = __vp_;
1449 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1450 *__t ^= __v[__i];
1451}
1452
1453template <class _Tp>
1454template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001455inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001456typename enable_if
1457<
1458 __is_val_expr<_Expr>::value,
1459 void
1460>::type
1461slice_array<_Tp>::operator&=(const _Expr& __v) const
1462{
1463 value_type* __t = __vp_;
1464 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1465 *__t &= __v[__i];
1466}
1467
1468template <class _Tp>
1469template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001470inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001471typename enable_if
1472<
1473 __is_val_expr<_Expr>::value,
1474 void
1475>::type
1476slice_array<_Tp>::operator|=(const _Expr& __v) const
1477{
1478 value_type* __t = __vp_;
1479 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1480 *__t |= __v[__i];
1481}
1482
1483template <class _Tp>
1484template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001485inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001486typename enable_if
1487<
1488 __is_val_expr<_Expr>::value,
1489 void
1490>::type
1491slice_array<_Tp>::operator<<=(const _Expr& __v) const
1492{
1493 value_type* __t = __vp_;
1494 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1495 *__t <<= __v[__i];
1496}
1497
1498template <class _Tp>
1499template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001500inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001501typename enable_if
1502<
1503 __is_val_expr<_Expr>::value,
1504 void
1505>::type
1506slice_array<_Tp>::operator>>=(const _Expr& __v) const
1507{
1508 value_type* __t = __vp_;
1509 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1510 *__t >>= __v[__i];
1511}
1512
1513template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001514inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001515void
1516slice_array<_Tp>::operator=(const value_type& __x) const
1517{
1518 value_type* __t = __vp_;
1519 for (size_t __n = __size_; __n; --__n, __t += __stride_)
1520 *__t = __x;
1521}
1522
1523// gslice
1524
Howard Hinnant8331b762013-03-06 23:30:19 +00001525class _LIBCPP_TYPE_VIS gslice
Howard Hinnantc51e1022010-05-11 19:42:16 +00001526{
1527 valarray<size_t> __size_;
1528 valarray<size_t> __stride_;
1529 valarray<size_t> __1d_;
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001530
Howard Hinnantc51e1022010-05-11 19:42:16 +00001531public:
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001532 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001533 gslice() {}
Douglas Gregor68902322012-05-19 07:14:17 +00001534
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001535 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001536 gslice(size_t __start, const valarray<size_t>& __size,
1537 const valarray<size_t>& __stride)
1538 : __size_(__size),
1539 __stride_(__stride)
1540 {__init(__start);}
1541
Eric Fiselier3b0b81f2017-04-19 00:23:45 +00001542#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001543
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001544 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001545 gslice(size_t __start, const valarray<size_t>& __size,
1546 valarray<size_t>&& __stride)
1547 : __size_(__size),
Corentin Jabotcfb8a912022-02-24 19:54:00 -05001548 __stride_(std::move(__stride))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001549 {__init(__start);}
1550
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001551 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001552 gslice(size_t __start, valarray<size_t>&& __size,
1553 const valarray<size_t>& __stride)
Corentin Jabotcfb8a912022-02-24 19:54:00 -05001554 : __size_(std::move(__size)),
Howard Hinnantc51e1022010-05-11 19:42:16 +00001555 __stride_(__stride)
1556 {__init(__start);}
1557
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001558 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001559 gslice(size_t __start, valarray<size_t>&& __size,
1560 valarray<size_t>&& __stride)
Corentin Jabotcfb8a912022-02-24 19:54:00 -05001561 : __size_(std::move(__size)),
1562 __stride_(std::move(__stride))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001563 {__init(__start);}
1564
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001565#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001566
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001567 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001568 size_t start() const {return __1d_.size() ? __1d_[0] : 0;}
1569
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001570 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001571 valarray<size_t> size() const {return __size_;}
1572
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001573 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001574 valarray<size_t> stride() const {return __stride_;}
1575
1576private:
1577 void __init(size_t __start);
1578
1579 template <class> friend class gslice_array;
1580 template <class> friend class valarray;
1581 template <class> friend class __val_expr;
1582};
1583
1584// gslice_array
1585
1586template <class _Tp>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00001587class _LIBCPP_TEMPLATE_VIS gslice_array
Howard Hinnantc51e1022010-05-11 19:42:16 +00001588{
1589public:
1590 typedef _Tp value_type;
1591
1592private:
1593 value_type* __vp_;
1594 valarray<size_t> __1d_;
1595
1596public:
1597 template <class _Expr>
1598 typename enable_if
1599 <
1600 __is_val_expr<_Expr>::value,
1601 void
1602 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001603 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001604 operator=(const _Expr& __v) const;
1605
1606 template <class _Expr>
1607 typename enable_if
1608 <
1609 __is_val_expr<_Expr>::value,
1610 void
1611 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001612 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001613 operator*=(const _Expr& __v) const;
1614
1615 template <class _Expr>
1616 typename enable_if
1617 <
1618 __is_val_expr<_Expr>::value,
1619 void
1620 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001621 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001622 operator/=(const _Expr& __v) const;
1623
1624 template <class _Expr>
1625 typename enable_if
1626 <
1627 __is_val_expr<_Expr>::value,
1628 void
1629 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001630 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001631 operator%=(const _Expr& __v) const;
1632
1633 template <class _Expr>
1634 typename enable_if
1635 <
1636 __is_val_expr<_Expr>::value,
1637 void
1638 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001639 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001640 operator+=(const _Expr& __v) const;
1641
1642 template <class _Expr>
1643 typename enable_if
1644 <
1645 __is_val_expr<_Expr>::value,
1646 void
1647 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001648 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001649 operator-=(const _Expr& __v) const;
1650
1651 template <class _Expr>
1652 typename enable_if
1653 <
1654 __is_val_expr<_Expr>::value,
1655 void
1656 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001657 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001658 operator^=(const _Expr& __v) const;
1659
1660 template <class _Expr>
1661 typename enable_if
1662 <
1663 __is_val_expr<_Expr>::value,
1664 void
1665 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001666 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001667 operator&=(const _Expr& __v) const;
1668
1669 template <class _Expr>
1670 typename enable_if
1671 <
1672 __is_val_expr<_Expr>::value,
1673 void
1674 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001675 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001676 operator|=(const _Expr& __v) const;
1677
1678 template <class _Expr>
1679 typename enable_if
1680 <
1681 __is_val_expr<_Expr>::value,
1682 void
1683 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001684 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001685 operator<<=(const _Expr& __v) const;
1686
1687 template <class _Expr>
1688 typename enable_if
1689 <
1690 __is_val_expr<_Expr>::value,
1691 void
1692 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001693 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001694 operator>>=(const _Expr& __v) const;
1695
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001696 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001697 const gslice_array& operator=(const gslice_array& __ga) const;
1698
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001699 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001700 void operator=(const value_type& __x) const;
1701
Eric Fiselierb9f37ca2019-12-12 20:48:11 -05001702 gslice_array(const gslice_array&) = default;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001703
1704private:
Howard Hinnantc51e1022010-05-11 19:42:16 +00001705 gslice_array(const gslice& __gs, const valarray<value_type>& __v)
1706 : __vp_(const_cast<value_type*>(__v.__begin_)),
1707 __1d_(__gs.__1d_)
1708 {}
1709
Eric Fiselier3b0b81f2017-04-19 00:23:45 +00001710#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001711 gslice_array(gslice&& __gs, const valarray<value_type>& __v)
1712 : __vp_(const_cast<value_type*>(__v.__begin_)),
Corentin Jabotcfb8a912022-02-24 19:54:00 -05001713 __1d_(std::move(__gs.__1d_))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001714 {}
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04001715#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001716
1717 template <class> friend class valarray;
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>
1881template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001882inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001883typename enable_if
1884<
1885 __is_val_expr<_Expr>::value,
1886 void
1887>::type
1888gslice_array<_Tp>::operator>>=(const _Expr& __v) const
1889{
1890 typedef const size_t* _Ip;
1891 size_t __j = 0;
1892 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1893 __vp_[*__i] >>= __v[__j];
1894}
1895
1896template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001897inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001898const gslice_array<_Tp>&
1899gslice_array<_Tp>::operator=(const gslice_array& __ga) const
1900{
1901 typedef const size_t* _Ip;
1902 const value_type* __s = __ga.__vp_;
1903 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_, __j = __ga.__1d_.__begin_;
1904 __i != __e; ++__i, ++__j)
1905 __vp_[*__i] = __s[*__j];
1906 return *this;
1907}
1908
1909template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001910inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001911void
1912gslice_array<_Tp>::operator=(const value_type& __x) const
1913{
1914 typedef const size_t* _Ip;
1915 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i)
1916 __vp_[*__i] = __x;
1917}
1918
1919// mask_array
1920
1921template <class _Tp>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00001922class _LIBCPP_TEMPLATE_VIS mask_array
Howard Hinnantc51e1022010-05-11 19:42:16 +00001923{
1924public:
1925 typedef _Tp value_type;
1926
1927private:
1928 value_type* __vp_;
1929 valarray<size_t> __1d_;
1930
1931public:
1932 template <class _Expr>
1933 typename enable_if
1934 <
1935 __is_val_expr<_Expr>::value,
1936 void
1937 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001938 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001939 operator=(const _Expr& __v) const;
1940
1941 template <class _Expr>
1942 typename enable_if
1943 <
1944 __is_val_expr<_Expr>::value,
1945 void
1946 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001947 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001948 operator*=(const _Expr& __v) const;
1949
1950 template <class _Expr>
1951 typename enable_if
1952 <
1953 __is_val_expr<_Expr>::value,
1954 void
1955 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001956 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001957 operator/=(const _Expr& __v) const;
1958
1959 template <class _Expr>
1960 typename enable_if
1961 <
1962 __is_val_expr<_Expr>::value,
1963 void
1964 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001965 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001966 operator%=(const _Expr& __v) const;
1967
1968 template <class _Expr>
1969 typename enable_if
1970 <
1971 __is_val_expr<_Expr>::value,
1972 void
1973 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001974 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001975 operator+=(const _Expr& __v) const;
1976
1977 template <class _Expr>
1978 typename enable_if
1979 <
1980 __is_val_expr<_Expr>::value,
1981 void
1982 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001983 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001984 operator-=(const _Expr& __v) const;
1985
1986 template <class _Expr>
1987 typename enable_if
1988 <
1989 __is_val_expr<_Expr>::value,
1990 void
1991 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001992 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001993 operator^=(const _Expr& __v) const;
1994
1995 template <class _Expr>
1996 typename enable_if
1997 <
1998 __is_val_expr<_Expr>::value,
1999 void
2000 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002001 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002002 operator&=(const _Expr& __v) const;
2003
2004 template <class _Expr>
2005 typename enable_if
2006 <
2007 __is_val_expr<_Expr>::value,
2008 void
2009 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002010 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002011 operator|=(const _Expr& __v) const;
2012
2013 template <class _Expr>
2014 typename enable_if
2015 <
2016 __is_val_expr<_Expr>::value,
2017 void
2018 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002019 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002020 operator<<=(const _Expr& __v) const;
2021
2022 template <class _Expr>
2023 typename enable_if
2024 <
2025 __is_val_expr<_Expr>::value,
2026 void
2027 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002028 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002029 operator>>=(const _Expr& __v) const;
2030
Eric Fiselierb9f37ca2019-12-12 20:48:11 -05002031 mask_array(const mask_array&) = default;
2032
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002033 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002034 const mask_array& operator=(const mask_array& __ma) const;
2035
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002036 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002037 void operator=(const value_type& __x) const;
2038
Howard Hinnantc51e1022010-05-11 19:42:16 +00002039private:
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002040 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002041 mask_array(const valarray<bool>& __vb, const valarray<value_type>& __v)
2042 : __vp_(const_cast<value_type*>(__v.__begin_)),
Howard Hinnant28b24882011-12-01 20:21:04 +00002043 __1d_(static_cast<size_t>(count(__vb.__begin_, __vb.__end_, true)))
Howard Hinnantc51e1022010-05-11 19:42:16 +00002044 {
2045 size_t __j = 0;
2046 for (size_t __i = 0; __i < __vb.size(); ++__i)
2047 if (__vb[__i])
2048 __1d_[__j++] = __i;
2049 }
2050
2051 template <class> friend class valarray;
2052};
2053
2054template <class _Tp>
2055template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002056inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002057typename enable_if
2058<
2059 __is_val_expr<_Expr>::value,
2060 void
2061>::type
2062mask_array<_Tp>::operator=(const _Expr& __v) const
2063{
2064 size_t __n = __1d_.size();
2065 for (size_t __i = 0; __i < __n; ++__i)
2066 __vp_[__1d_[__i]] = __v[__i];
2067}
2068
2069template <class _Tp>
2070template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002071inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002072typename enable_if
2073<
2074 __is_val_expr<_Expr>::value,
2075 void
2076>::type
2077mask_array<_Tp>::operator*=(const _Expr& __v) const
2078{
2079 size_t __n = __1d_.size();
2080 for (size_t __i = 0; __i < __n; ++__i)
2081 __vp_[__1d_[__i]] *= __v[__i];
2082}
2083
2084template <class _Tp>
2085template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002086inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002087typename enable_if
2088<
2089 __is_val_expr<_Expr>::value,
2090 void
2091>::type
2092mask_array<_Tp>::operator/=(const _Expr& __v) const
2093{
2094 size_t __n = __1d_.size();
2095 for (size_t __i = 0; __i < __n; ++__i)
2096 __vp_[__1d_[__i]] /= __v[__i];
2097}
2098
2099template <class _Tp>
2100template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002101inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002102typename enable_if
2103<
2104 __is_val_expr<_Expr>::value,
2105 void
2106>::type
2107mask_array<_Tp>::operator%=(const _Expr& __v) const
2108{
2109 size_t __n = __1d_.size();
2110 for (size_t __i = 0; __i < __n; ++__i)
2111 __vp_[__1d_[__i]] %= __v[__i];
2112}
2113
2114template <class _Tp>
2115template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002116inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002117typename enable_if
2118<
2119 __is_val_expr<_Expr>::value,
2120 void
2121>::type
2122mask_array<_Tp>::operator+=(const _Expr& __v) const
2123{
2124 size_t __n = __1d_.size();
2125 for (size_t __i = 0; __i < __n; ++__i)
2126 __vp_[__1d_[__i]] += __v[__i];
2127}
2128
2129template <class _Tp>
2130template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002131inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002132typename enable_if
2133<
2134 __is_val_expr<_Expr>::value,
2135 void
2136>::type
2137mask_array<_Tp>::operator-=(const _Expr& __v) const
2138{
2139 size_t __n = __1d_.size();
2140 for (size_t __i = 0; __i < __n; ++__i)
2141 __vp_[__1d_[__i]] -= __v[__i];
2142}
2143
2144template <class _Tp>
2145template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002146inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002147typename enable_if
2148<
2149 __is_val_expr<_Expr>::value,
2150 void
2151>::type
2152mask_array<_Tp>::operator^=(const _Expr& __v) const
2153{
2154 size_t __n = __1d_.size();
2155 for (size_t __i = 0; __i < __n; ++__i)
2156 __vp_[__1d_[__i]] ^= __v[__i];
2157}
2158
2159template <class _Tp>
2160template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002161inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002162typename enable_if
2163<
2164 __is_val_expr<_Expr>::value,
2165 void
2166>::type
2167mask_array<_Tp>::operator&=(const _Expr& __v) const
2168{
2169 size_t __n = __1d_.size();
2170 for (size_t __i = 0; __i < __n; ++__i)
2171 __vp_[__1d_[__i]] &= __v[__i];
2172}
2173
2174template <class _Tp>
2175template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002176inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002177typename enable_if
2178<
2179 __is_val_expr<_Expr>::value,
2180 void
2181>::type
2182mask_array<_Tp>::operator|=(const _Expr& __v) const
2183{
2184 size_t __n = __1d_.size();
2185 for (size_t __i = 0; __i < __n; ++__i)
2186 __vp_[__1d_[__i]] |= __v[__i];
2187}
2188
2189template <class _Tp>
2190template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002191inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002192typename enable_if
2193<
2194 __is_val_expr<_Expr>::value,
2195 void
2196>::type
2197mask_array<_Tp>::operator<<=(const _Expr& __v) const
2198{
2199 size_t __n = __1d_.size();
2200 for (size_t __i = 0; __i < __n; ++__i)
2201 __vp_[__1d_[__i]] <<= __v[__i];
2202}
2203
2204template <class _Tp>
2205template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002206inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002207typename enable_if
2208<
2209 __is_val_expr<_Expr>::value,
2210 void
2211>::type
2212mask_array<_Tp>::operator>>=(const _Expr& __v) const
2213{
2214 size_t __n = __1d_.size();
2215 for (size_t __i = 0; __i < __n; ++__i)
2216 __vp_[__1d_[__i]] >>= __v[__i];
2217}
2218
2219template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002220inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002221const mask_array<_Tp>&
2222mask_array<_Tp>::operator=(const mask_array& __ma) const
2223{
2224 size_t __n = __1d_.size();
2225 for (size_t __i = 0; __i < __n; ++__i)
2226 __vp_[__1d_[__i]] = __ma.__vp_[__1d_[__i]];
Eric Fiselier3b80ce92014-08-12 00:06:58 +00002227 return *this;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002228}
2229
2230template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002231inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002232void
2233mask_array<_Tp>::operator=(const value_type& __x) const
2234{
2235 size_t __n = __1d_.size();
2236 for (size_t __i = 0; __i < __n; ++__i)
2237 __vp_[__1d_[__i]] = __x;
2238}
2239
2240template <class _ValExpr>
2241class __mask_expr
2242{
2243 typedef typename remove_reference<_ValExpr>::type _RmExpr;
2244public:
2245 typedef typename _RmExpr::value_type value_type;
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002246 typedef value_type __result_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002247
2248private:
2249 _ValExpr __expr_;
2250 valarray<size_t> __1d_;
2251
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002252 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002253 __mask_expr(const valarray<bool>& __vb, const _RmExpr& __e)
2254 : __expr_(__e),
Howard Hinnant28b24882011-12-01 20:21:04 +00002255 __1d_(static_cast<size_t>(count(__vb.__begin_, __vb.__end_, true)))
Howard Hinnantc51e1022010-05-11 19:42:16 +00002256 {
2257 size_t __j = 0;
2258 for (size_t __i = 0; __i < __vb.size(); ++__i)
2259 if (__vb[__i])
2260 __1d_[__j++] = __i;
2261 }
2262
2263public:
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002264 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002265 __result_type operator[](size_t __i) const
Howard Hinnantc51e1022010-05-11 19:42:16 +00002266 {return __expr_[__1d_[__i]];}
2267
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002268 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002269 size_t size() const {return __1d_.size();}
2270
Eric Fiselier7b31ed02019-04-02 08:05:23 +00002271 template <class> friend class __val_expr;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002272 template <class> friend class valarray;
2273};
2274
2275// indirect_array
2276
2277template <class _Tp>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00002278class _LIBCPP_TEMPLATE_VIS indirect_array
Howard Hinnantc51e1022010-05-11 19:42:16 +00002279{
2280public:
2281 typedef _Tp value_type;
2282
2283private:
2284 value_type* __vp_;
2285 valarray<size_t> __1d_;
2286
2287public:
2288 template <class _Expr>
2289 typename enable_if
2290 <
2291 __is_val_expr<_Expr>::value,
2292 void
2293 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002294 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002295 operator=(const _Expr& __v) const;
2296
2297 template <class _Expr>
2298 typename enable_if
2299 <
2300 __is_val_expr<_Expr>::value,
2301 void
2302 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002303 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002304 operator*=(const _Expr& __v) const;
2305
2306 template <class _Expr>
2307 typename enable_if
2308 <
2309 __is_val_expr<_Expr>::value,
2310 void
2311 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002312 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002313 operator/=(const _Expr& __v) const;
2314
2315 template <class _Expr>
2316 typename enable_if
2317 <
2318 __is_val_expr<_Expr>::value,
2319 void
2320 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002321 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002322 operator%=(const _Expr& __v) const;
2323
2324 template <class _Expr>
2325 typename enable_if
2326 <
2327 __is_val_expr<_Expr>::value,
2328 void
2329 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002330 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002331 operator+=(const _Expr& __v) const;
2332
2333 template <class _Expr>
2334 typename enable_if
2335 <
2336 __is_val_expr<_Expr>::value,
2337 void
2338 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002339 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002340 operator-=(const _Expr& __v) const;
2341
2342 template <class _Expr>
2343 typename enable_if
2344 <
2345 __is_val_expr<_Expr>::value,
2346 void
2347 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002348 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002349 operator^=(const _Expr& __v) const;
2350
2351 template <class _Expr>
2352 typename enable_if
2353 <
2354 __is_val_expr<_Expr>::value,
2355 void
2356 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002357 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002358 operator&=(const _Expr& __v) const;
2359
2360 template <class _Expr>
2361 typename enable_if
2362 <
2363 __is_val_expr<_Expr>::value,
2364 void
2365 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002366 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002367 operator|=(const _Expr& __v) const;
2368
2369 template <class _Expr>
2370 typename enable_if
2371 <
2372 __is_val_expr<_Expr>::value,
2373 void
2374 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002375 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002376 operator<<=(const _Expr& __v) const;
2377
2378 template <class _Expr>
2379 typename enable_if
2380 <
2381 __is_val_expr<_Expr>::value,
2382 void
2383 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002384 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002385 operator>>=(const _Expr& __v) const;
2386
Eric Fiselierb9f37ca2019-12-12 20:48:11 -05002387 indirect_array(const indirect_array&) = default;
2388
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002389 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002390 const indirect_array& operator=(const indirect_array& __ia) const;
2391
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002392 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002393 void operator=(const value_type& __x) const;
2394
Howard Hinnantc51e1022010-05-11 19:42:16 +00002395private:
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002396 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002397 indirect_array(const valarray<size_t>& __ia, const valarray<value_type>& __v)
2398 : __vp_(const_cast<value_type*>(__v.__begin_)),
2399 __1d_(__ia)
2400 {}
2401
Eric Fiselier3b0b81f2017-04-19 00:23:45 +00002402#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00002403
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002404 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002405 indirect_array(valarray<size_t>&& __ia, const valarray<value_type>& __v)
2406 : __vp_(const_cast<value_type*>(__v.__begin_)),
Corentin Jabotcfb8a912022-02-24 19:54:00 -05002407 __1d_(std::move(__ia))
Howard Hinnantc51e1022010-05-11 19:42:16 +00002408 {}
2409
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002410#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00002411
2412 template <class> friend class valarray;
2413};
2414
2415template <class _Tp>
2416template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002417inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002418typename enable_if
2419<
2420 __is_val_expr<_Expr>::value,
2421 void
2422>::type
2423indirect_array<_Tp>::operator=(const _Expr& __v) const
2424{
2425 size_t __n = __1d_.size();
2426 for (size_t __i = 0; __i < __n; ++__i)
2427 __vp_[__1d_[__i]] = __v[__i];
2428}
2429
2430template <class _Tp>
2431template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002432inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002433typename enable_if
2434<
2435 __is_val_expr<_Expr>::value,
2436 void
2437>::type
2438indirect_array<_Tp>::operator*=(const _Expr& __v) const
2439{
2440 size_t __n = __1d_.size();
2441 for (size_t __i = 0; __i < __n; ++__i)
2442 __vp_[__1d_[__i]] *= __v[__i];
2443}
2444
2445template <class _Tp>
2446template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002447inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002448typename enable_if
2449<
2450 __is_val_expr<_Expr>::value,
2451 void
2452>::type
2453indirect_array<_Tp>::operator/=(const _Expr& __v) const
2454{
2455 size_t __n = __1d_.size();
2456 for (size_t __i = 0; __i < __n; ++__i)
2457 __vp_[__1d_[__i]] /= __v[__i];
2458}
2459
2460template <class _Tp>
2461template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002462inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002463typename enable_if
2464<
2465 __is_val_expr<_Expr>::value,
2466 void
2467>::type
2468indirect_array<_Tp>::operator%=(const _Expr& __v) const
2469{
2470 size_t __n = __1d_.size();
2471 for (size_t __i = 0; __i < __n; ++__i)
2472 __vp_[__1d_[__i]] %= __v[__i];
2473}
2474
2475template <class _Tp>
2476template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002477inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002478typename enable_if
2479<
2480 __is_val_expr<_Expr>::value,
2481 void
2482>::type
2483indirect_array<_Tp>::operator+=(const _Expr& __v) const
2484{
2485 size_t __n = __1d_.size();
2486 for (size_t __i = 0; __i < __n; ++__i)
2487 __vp_[__1d_[__i]] += __v[__i];
2488}
2489
2490template <class _Tp>
2491template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002492inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002493typename enable_if
2494<
2495 __is_val_expr<_Expr>::value,
2496 void
2497>::type
2498indirect_array<_Tp>::operator-=(const _Expr& __v) const
2499{
2500 size_t __n = __1d_.size();
2501 for (size_t __i = 0; __i < __n; ++__i)
2502 __vp_[__1d_[__i]] -= __v[__i];
2503}
2504
2505template <class _Tp>
2506template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002507inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002508typename enable_if
2509<
2510 __is_val_expr<_Expr>::value,
2511 void
2512>::type
2513indirect_array<_Tp>::operator^=(const _Expr& __v) const
2514{
2515 size_t __n = __1d_.size();
2516 for (size_t __i = 0; __i < __n; ++__i)
2517 __vp_[__1d_[__i]] ^= __v[__i];
2518}
2519
2520template <class _Tp>
2521template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002522inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002523typename enable_if
2524<
2525 __is_val_expr<_Expr>::value,
2526 void
2527>::type
2528indirect_array<_Tp>::operator&=(const _Expr& __v) const
2529{
2530 size_t __n = __1d_.size();
2531 for (size_t __i = 0; __i < __n; ++__i)
2532 __vp_[__1d_[__i]] &= __v[__i];
2533}
2534
2535template <class _Tp>
2536template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002537inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002538typename enable_if
2539<
2540 __is_val_expr<_Expr>::value,
2541 void
2542>::type
2543indirect_array<_Tp>::operator|=(const _Expr& __v) const
2544{
2545 size_t __n = __1d_.size();
2546 for (size_t __i = 0; __i < __n; ++__i)
2547 __vp_[__1d_[__i]] |= __v[__i];
2548}
2549
2550template <class _Tp>
2551template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002552inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002553typename enable_if
2554<
2555 __is_val_expr<_Expr>::value,
2556 void
2557>::type
2558indirect_array<_Tp>::operator<<=(const _Expr& __v) const
2559{
2560 size_t __n = __1d_.size();
2561 for (size_t __i = 0; __i < __n; ++__i)
2562 __vp_[__1d_[__i]] <<= __v[__i];
2563}
2564
2565template <class _Tp>
2566template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002567inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002568typename enable_if
2569<
2570 __is_val_expr<_Expr>::value,
2571 void
2572>::type
2573indirect_array<_Tp>::operator>>=(const _Expr& __v) const
2574{
2575 size_t __n = __1d_.size();
2576 for (size_t __i = 0; __i < __n; ++__i)
2577 __vp_[__1d_[__i]] >>= __v[__i];
2578}
2579
2580template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002581inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002582const indirect_array<_Tp>&
2583indirect_array<_Tp>::operator=(const indirect_array& __ia) const
2584{
2585 typedef const size_t* _Ip;
2586 const value_type* __s = __ia.__vp_;
2587 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_, __j = __ia.__1d_.__begin_;
2588 __i != __e; ++__i, ++__j)
2589 __vp_[*__i] = __s[*__j];
2590 return *this;
2591}
2592
2593template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002594inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002595void
2596indirect_array<_Tp>::operator=(const value_type& __x) const
2597{
2598 typedef const size_t* _Ip;
2599 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i)
2600 __vp_[*__i] = __x;
2601}
2602
2603template <class _ValExpr>
2604class __indirect_expr
2605{
2606 typedef typename remove_reference<_ValExpr>::type _RmExpr;
2607public:
2608 typedef typename _RmExpr::value_type value_type;
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002609 typedef value_type __result_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002610
2611private:
2612 _ValExpr __expr_;
2613 valarray<size_t> __1d_;
2614
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002615 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002616 __indirect_expr(const valarray<size_t>& __ia, const _RmExpr& __e)
2617 : __expr_(__e),
2618 __1d_(__ia)
2619 {}
2620
Eric Fiselier3b0b81f2017-04-19 00:23:45 +00002621#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00002622
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002623 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002624 __indirect_expr(valarray<size_t>&& __ia, const _RmExpr& __e)
2625 : __expr_(__e),
Corentin Jabotcfb8a912022-02-24 19:54:00 -05002626 __1d_(std::move(__ia))
Howard Hinnantc51e1022010-05-11 19:42:16 +00002627 {}
2628
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002629#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00002630
2631public:
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002632 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002633 __result_type operator[](size_t __i) const
Howard Hinnantc51e1022010-05-11 19:42:16 +00002634 {return __expr_[__1d_[__i]];}
2635
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002636 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002637 size_t size() const {return __1d_.size();}
2638
Eric Fiselier7b31ed02019-04-02 08:05:23 +00002639 template <class> friend class __val_expr;
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00002640 template <class> friend class _LIBCPP_TEMPLATE_VIS valarray;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002641};
2642
2643template<class _ValExpr>
2644class __val_expr
2645{
2646 typedef typename remove_reference<_ValExpr>::type _RmExpr;
2647
2648 _ValExpr __expr_;
2649public:
2650 typedef typename _RmExpr::value_type value_type;
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002651 typedef typename _RmExpr::__result_type __result_type;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002652
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002653 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002654 explicit __val_expr(const _RmExpr& __e) : __expr_(__e) {}
2655
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002656 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002657 __result_type operator[](size_t __i) const
Howard Hinnantc51e1022010-05-11 19:42:16 +00002658 {return __expr_[__i];}
2659
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002660 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002661 __val_expr<__slice_expr<_ValExpr> > operator[](slice __s) const
Eric Fiselier7b31ed02019-04-02 08:05:23 +00002662 {
2663 typedef __slice_expr<_ValExpr> _NewExpr;
2664 return __val_expr< _NewExpr >(_NewExpr(__s, __expr_));
2665 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00002666
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002667 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002668 __val_expr<__indirect_expr<_ValExpr> > operator[](const gslice& __gs) const
Eric Fiselier7b31ed02019-04-02 08:05:23 +00002669 {
2670 typedef __indirect_expr<_ValExpr> _NewExpr;
2671 return __val_expr<_NewExpr >(_NewExpr(__gs.__1d_, __expr_));
2672 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00002673
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002674 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002675 __val_expr<__mask_expr<_ValExpr> > operator[](const valarray<bool>& __vb) const
Eric Fiselier7b31ed02019-04-02 08:05:23 +00002676 {
2677 typedef __mask_expr<_ValExpr> _NewExpr;
2678 return __val_expr< _NewExpr >( _NewExpr(__vb, __expr_));
2679 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00002680
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002681 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002682 __val_expr<__indirect_expr<_ValExpr> > operator[](const valarray<size_t>& __vs) const
Eric Fiselier7b31ed02019-04-02 08:05:23 +00002683 {
2684 typedef __indirect_expr<_ValExpr> _NewExpr;
2685 return __val_expr< _NewExpr >(_NewExpr(__vs, __expr_));
2686 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00002687
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002688 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002689 __val_expr<_UnaryOp<__unary_plus<value_type>, _ValExpr> >
2690 operator+() const
2691 {
2692 typedef _UnaryOp<__unary_plus<value_type>, _ValExpr> _NewExpr;
2693 return __val_expr<_NewExpr>(_NewExpr(__unary_plus<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<negate<value_type>, _ValExpr> >
2698 operator-() const
2699 {
2700 typedef _UnaryOp<negate<value_type>, _ValExpr> _NewExpr;
2701 return __val_expr<_NewExpr>(_NewExpr(negate<value_type>(), __expr_));
2702 }
2703
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002704 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002705 __val_expr<_UnaryOp<__bit_not<value_type>, _ValExpr> >
2706 operator~() const
2707 {
2708 typedef _UnaryOp<__bit_not<value_type>, _ValExpr> _NewExpr;
2709 return __val_expr<_NewExpr>(_NewExpr(__bit_not<value_type>(), __expr_));
2710 }
2711
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002712 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002713 __val_expr<_UnaryOp<logical_not<value_type>, _ValExpr> >
2714 operator!() const
2715 {
2716 typedef _UnaryOp<logical_not<value_type>, _ValExpr> _NewExpr;
2717 return __val_expr<_NewExpr>(_NewExpr(logical_not<value_type>(), __expr_));
2718 }
2719
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002720 operator valarray<__result_type>() const;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002721
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002722 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002723 size_t size() const {return __expr_.size();}
2724
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002725 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002726 __result_type sum() const
Howard Hinnantc51e1022010-05-11 19:42:16 +00002727 {
2728 size_t __n = __expr_.size();
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002729 __result_type __r = __n ? __expr_[0] : __result_type();
Howard Hinnantc51e1022010-05-11 19:42:16 +00002730 for (size_t __i = 1; __i < __n; ++__i)
2731 __r += __expr_[__i];
2732 return __r;
2733 }
2734
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002735 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002736 __result_type min() const
Howard Hinnantc51e1022010-05-11 19:42:16 +00002737 {
2738 size_t __n = size();
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002739 __result_type __r = __n ? (*this)[0] : __result_type();
Howard Hinnantc51e1022010-05-11 19:42:16 +00002740 for (size_t __i = 1; __i < __n; ++__i)
2741 {
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002742 __result_type __x = __expr_[__i];
Howard Hinnantc51e1022010-05-11 19:42:16 +00002743 if (__x < __r)
2744 __r = __x;
2745 }
2746 return __r;
2747 }
2748
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002749 _LIBCPP_INLINE_VISIBILITY
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002750 __result_type max() const
Howard Hinnantc51e1022010-05-11 19:42:16 +00002751 {
2752 size_t __n = size();
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002753 __result_type __r = __n ? (*this)[0] : __result_type();
Howard Hinnantc51e1022010-05-11 19:42:16 +00002754 for (size_t __i = 1; __i < __n; ++__i)
2755 {
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002756 __result_type __x = __expr_[__i];
Howard Hinnantc51e1022010-05-11 19:42:16 +00002757 if (__r < __x)
2758 __r = __x;
2759 }
2760 return __r;
2761 }
2762
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002763 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002764 __val_expr<__shift_expr<_ValExpr> > shift (int __i) const
2765 {return __val_expr<__shift_expr<_ValExpr> >(__shift_expr<_ValExpr>(__i, __expr_));}
2766
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002767 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002768 __val_expr<__cshift_expr<_ValExpr> > cshift(int __i) const
2769 {return __val_expr<__cshift_expr<_ValExpr> >(__cshift_expr<_ValExpr>(__i, __expr_));}
2770
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002771 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002772 __val_expr<_UnaryOp<__apply_expr<value_type, value_type(*)(value_type)>, _ValExpr> >
2773 apply(value_type __f(value_type)) const
2774 {
2775 typedef __apply_expr<value_type, value_type(*)(value_type)> _Op;
2776 typedef _UnaryOp<_Op, _ValExpr> _NewExpr;
2777 return __val_expr<_NewExpr>(_NewExpr(_Op(__f), __expr_));
2778 }
2779
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002780 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002781 __val_expr<_UnaryOp<__apply_expr<value_type, value_type(*)(const value_type&)>, _ValExpr> >
2782 apply(value_type __f(const value_type&)) const
2783 {
2784 typedef __apply_expr<value_type, value_type(*)(const value_type&)> _Op;
2785 typedef _UnaryOp<_Op, _ValExpr> _NewExpr;
2786 return __val_expr<_NewExpr>(_NewExpr(_Op(__f), __expr_));
2787 }
2788};
2789
2790template<class _ValExpr>
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002791__val_expr<_ValExpr>::operator valarray<__val_expr::__result_type>() const
Howard Hinnantc51e1022010-05-11 19:42:16 +00002792{
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002793 valarray<__result_type> __r;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002794 size_t __n = __expr_.size();
2795 if (__n)
2796 {
2797 __r.__begin_ =
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002798 __r.__end_ = allocator<__result_type>().allocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002799 for (size_t __i = 0; __i != __n; ++__r.__end_, ++__i)
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04002800 ::new ((void*)__r.__end_) __result_type(__expr_[__i]);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002801 }
2802 return __r;
2803}
2804
2805// valarray
2806
2807template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002808inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002809valarray<_Tp>::valarray(size_t __n)
Bruce Mitchener170d8972020-11-24 12:53:53 -05002810 : __begin_(nullptr),
2811 __end_(nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002812{
Mikhail Maltsev59de6f82018-02-08 11:33:48 +00002813 if (__n)
2814 {
Louis Dionne5ffe5152020-09-28 15:47:49 -04002815 __begin_ = __end_ = allocator<value_type>().allocate(__n);
Mikhail Maltsev59de6f82018-02-08 11:33:48 +00002816#ifndef _LIBCPP_NO_EXCEPTIONS
2817 try
2818 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002819#endif // _LIBCPP_NO_EXCEPTIONS
Eric Fiselier2856ef82018-10-25 17:21:30 +00002820 for (size_t __n_left = __n; __n_left; --__n_left, ++__end_)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05002821 ::new ((void*)__end_) value_type();
Mikhail Maltsev59de6f82018-02-08 11:33:48 +00002822#ifndef _LIBCPP_NO_EXCEPTIONS
2823 }
2824 catch (...)
2825 {
Eric Fiselier2856ef82018-10-25 17:21:30 +00002826 __clear(__n);
Mikhail Maltsev59de6f82018-02-08 11:33:48 +00002827 throw;
2828 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002829#endif // _LIBCPP_NO_EXCEPTIONS
Mikhail Maltsev59de6f82018-02-08 11:33:48 +00002830 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00002831}
2832
2833template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002834inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002835valarray<_Tp>::valarray(const value_type& __x, size_t __n)
Bruce Mitchener170d8972020-11-24 12:53:53 -05002836 : __begin_(nullptr),
2837 __end_(nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002838{
2839 resize(__n, __x);
2840}
2841
2842template <class _Tp>
2843valarray<_Tp>::valarray(const value_type* __p, size_t __n)
Bruce Mitchener170d8972020-11-24 12:53:53 -05002844 : __begin_(nullptr),
2845 __end_(nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002846{
2847 if (__n)
2848 {
Louis Dionne5ffe5152020-09-28 15:47:49 -04002849 __begin_ = __end_ = allocator<value_type>().allocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002850#ifndef _LIBCPP_NO_EXCEPTIONS
2851 try
2852 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002853#endif // _LIBCPP_NO_EXCEPTIONS
Eric Fiselier2856ef82018-10-25 17:21:30 +00002854 for (size_t __n_left = __n; __n_left; ++__end_, ++__p, --__n_left)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05002855 ::new ((void*)__end_) value_type(*__p);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002856#ifndef _LIBCPP_NO_EXCEPTIONS
2857 }
2858 catch (...)
2859 {
Eric Fiselier2856ef82018-10-25 17:21:30 +00002860 __clear(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002861 throw;
2862 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002863#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00002864 }
2865}
2866
2867template <class _Tp>
2868valarray<_Tp>::valarray(const valarray& __v)
Bruce Mitchener170d8972020-11-24 12:53:53 -05002869 : __begin_(nullptr),
2870 __end_(nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002871{
2872 if (__v.size())
2873 {
Louis Dionne5ffe5152020-09-28 15:47:49 -04002874 __begin_ = __end_ = allocator<value_type>().allocate(__v.size());
Howard Hinnantc51e1022010-05-11 19:42:16 +00002875#ifndef _LIBCPP_NO_EXCEPTIONS
2876 try
2877 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002878#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00002879 for (value_type* __p = __v.__begin_; __p != __v.__end_; ++__end_, ++__p)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05002880 ::new ((void*)__end_) value_type(*__p);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002881#ifndef _LIBCPP_NO_EXCEPTIONS
2882 }
2883 catch (...)
2884 {
Eric Fiselier2856ef82018-10-25 17:21:30 +00002885 __clear(__v.size());
Howard Hinnantc51e1022010-05-11 19:42:16 +00002886 throw;
2887 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002888#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00002889 }
2890}
2891
Eric Fiselier3b0b81f2017-04-19 00:23:45 +00002892#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00002893
2894template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002895inline
Howard Hinnant298aed92012-07-21 00:51:28 +00002896valarray<_Tp>::valarray(valarray&& __v) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00002897 : __begin_(__v.__begin_),
2898 __end_(__v.__end_)
2899{
2900 __v.__begin_ = __v.__end_ = nullptr;
2901}
2902
2903template <class _Tp>
2904valarray<_Tp>::valarray(initializer_list<value_type> __il)
Bruce Mitchener170d8972020-11-24 12:53:53 -05002905 : __begin_(nullptr),
2906 __end_(nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002907{
Eric Fiselier2856ef82018-10-25 17:21:30 +00002908 const size_t __n = __il.size();
Howard Hinnantc51e1022010-05-11 19:42:16 +00002909 if (__n)
2910 {
Louis Dionne5ffe5152020-09-28 15:47:49 -04002911 __begin_ = __end_ = allocator<value_type>().allocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002912#ifndef _LIBCPP_NO_EXCEPTIONS
2913 try
2914 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002915#endif // _LIBCPP_NO_EXCEPTIONS
Eric Fiselier2856ef82018-10-25 17:21:30 +00002916 size_t __n_left = __n;
2917 for (const value_type* __p = __il.begin(); __n_left; ++__end_, ++__p, --__n_left)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05002918 ::new ((void*)__end_) value_type(*__p);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002919#ifndef _LIBCPP_NO_EXCEPTIONS
2920 }
2921 catch (...)
2922 {
Eric Fiselier2856ef82018-10-25 17:21:30 +00002923 __clear(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002924 throw;
2925 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002926#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00002927 }
2928}
2929
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002930#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00002931
2932template <class _Tp>
2933valarray<_Tp>::valarray(const slice_array<value_type>& __sa)
Bruce Mitchener170d8972020-11-24 12:53:53 -05002934 : __begin_(nullptr),
2935 __end_(nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002936{
Eric Fiselier2856ef82018-10-25 17:21:30 +00002937 const size_t __n = __sa.__size_;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002938 if (__n)
2939 {
Louis Dionne5ffe5152020-09-28 15:47:49 -04002940 __begin_ = __end_ = allocator<value_type>().allocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002941#ifndef _LIBCPP_NO_EXCEPTIONS
2942 try
2943 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002944#endif // _LIBCPP_NO_EXCEPTIONS
Eric Fiselier2856ef82018-10-25 17:21:30 +00002945 size_t __n_left = __n;
2946 for (const value_type* __p = __sa.__vp_; __n_left; ++__end_, __p += __sa.__stride_, --__n_left)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05002947 ::new ((void*)__end_) value_type(*__p);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002948#ifndef _LIBCPP_NO_EXCEPTIONS
2949 }
2950 catch (...)
2951 {
Eric Fiselier2856ef82018-10-25 17:21:30 +00002952 __clear(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002953 throw;
2954 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002955#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00002956 }
2957}
2958
2959template <class _Tp>
2960valarray<_Tp>::valarray(const gslice_array<value_type>& __ga)
Bruce Mitchener170d8972020-11-24 12:53:53 -05002961 : __begin_(nullptr),
2962 __end_(nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002963{
Eric Fiselier2856ef82018-10-25 17:21:30 +00002964 const size_t __n = __ga.__1d_.size();
Howard Hinnantc51e1022010-05-11 19:42:16 +00002965 if (__n)
2966 {
Louis Dionne5ffe5152020-09-28 15:47:49 -04002967 __begin_ = __end_ = allocator<value_type>().allocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002968#ifndef _LIBCPP_NO_EXCEPTIONS
2969 try
2970 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002971#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00002972 typedef const size_t* _Ip;
2973 const value_type* __s = __ga.__vp_;
2974 for (_Ip __i = __ga.__1d_.__begin_, __e = __ga.__1d_.__end_;
2975 __i != __e; ++__i, ++__end_)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05002976 ::new ((void*)__end_) value_type(__s[*__i]);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002977#ifndef _LIBCPP_NO_EXCEPTIONS
2978 }
2979 catch (...)
2980 {
Eric Fiselier2856ef82018-10-25 17:21:30 +00002981 __clear(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002982 throw;
2983 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002984#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00002985 }
2986}
2987
2988template <class _Tp>
2989valarray<_Tp>::valarray(const mask_array<value_type>& __ma)
Bruce Mitchener170d8972020-11-24 12:53:53 -05002990 : __begin_(nullptr),
2991 __end_(nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002992{
Eric Fiselier2856ef82018-10-25 17:21:30 +00002993 const size_t __n = __ma.__1d_.size();
Howard Hinnantc51e1022010-05-11 19:42:16 +00002994 if (__n)
2995 {
Louis Dionne5ffe5152020-09-28 15:47:49 -04002996 __begin_ = __end_ = allocator<value_type>().allocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002997#ifndef _LIBCPP_NO_EXCEPTIONS
2998 try
2999 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04003000#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00003001 typedef const size_t* _Ip;
3002 const value_type* __s = __ma.__vp_;
3003 for (_Ip __i = __ma.__1d_.__begin_, __e = __ma.__1d_.__end_;
3004 __i != __e; ++__i, ++__end_)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05003005 ::new ((void*)__end_) value_type(__s[*__i]);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003006#ifndef _LIBCPP_NO_EXCEPTIONS
3007 }
3008 catch (...)
3009 {
Eric Fiselier2856ef82018-10-25 17:21:30 +00003010 __clear(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003011 throw;
3012 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04003013#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00003014 }
3015}
3016
3017template <class _Tp>
3018valarray<_Tp>::valarray(const indirect_array<value_type>& __ia)
Bruce Mitchener170d8972020-11-24 12:53:53 -05003019 : __begin_(nullptr),
3020 __end_(nullptr)
Howard Hinnantc51e1022010-05-11 19:42:16 +00003021{
Eric Fiselier2856ef82018-10-25 17:21:30 +00003022 const size_t __n = __ia.__1d_.size();
Howard Hinnantc51e1022010-05-11 19:42:16 +00003023 if (__n)
3024 {
Louis Dionne5ffe5152020-09-28 15:47:49 -04003025 __begin_ = __end_ = allocator<value_type>().allocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003026#ifndef _LIBCPP_NO_EXCEPTIONS
3027 try
3028 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04003029#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00003030 typedef const size_t* _Ip;
3031 const value_type* __s = __ia.__vp_;
3032 for (_Ip __i = __ia.__1d_.__begin_, __e = __ia.__1d_.__end_;
3033 __i != __e; ++__i, ++__end_)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05003034 ::new ((void*)__end_) value_type(__s[*__i]);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003035#ifndef _LIBCPP_NO_EXCEPTIONS
3036 }
3037 catch (...)
3038 {
Eric Fiselier2856ef82018-10-25 17:21:30 +00003039 __clear(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003040 throw;
3041 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04003042#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00003043 }
3044}
3045
3046template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003047inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003048valarray<_Tp>::~valarray()
3049{
Eric Fiselier2856ef82018-10-25 17:21:30 +00003050 __clear(size());
Mikhail Maltsev59de6f82018-02-08 11:33:48 +00003051}
3052
3053template <class _Tp>
3054valarray<_Tp>&
3055valarray<_Tp>::__assign_range(const value_type* __f, const value_type* __l)
3056{
3057 size_t __n = __l - __f;
3058 if (size() != __n)
3059 {
Eric Fiselier2856ef82018-10-25 17:21:30 +00003060 __clear(size());
Louis Dionne5ffe5152020-09-28 15:47:49 -04003061 __begin_ = allocator<value_type>().allocate(__n);
Mikhail Maltsev59de6f82018-02-08 11:33:48 +00003062 __end_ = __begin_ + __n;
3063 _VSTD::uninitialized_copy(__f, __l, __begin_);
3064 } else {
3065 _VSTD::copy(__f, __l, __begin_);
3066 }
3067 return *this;
Howard Hinnantc51e1022010-05-11 19:42:16 +00003068}
3069
3070template <class _Tp>
3071valarray<_Tp>&
3072valarray<_Tp>::operator=(const valarray& __v)
3073{
Mark de Wever357a1fc2021-09-28 19:15:18 +02003074 if (this != _VSTD::addressof(__v))
Mikhail Maltsev59de6f82018-02-08 11:33:48 +00003075 return __assign_range(__v.__begin_, __v.__end_);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003076 return *this;
3077}
3078
Eric Fiselier3b0b81f2017-04-19 00:23:45 +00003079#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00003080
3081template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003082inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003083valarray<_Tp>&
Howard Hinnant298aed92012-07-21 00:51:28 +00003084valarray<_Tp>::operator=(valarray&& __v) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00003085{
Eric Fiselier2856ef82018-10-25 17:21:30 +00003086 __clear(size());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003087 __begin_ = __v.__begin_;
3088 __end_ = __v.__end_;
3089 __v.__begin_ = nullptr;
3090 __v.__end_ = nullptr;
3091 return *this;
3092}
3093
3094template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003095inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003096valarray<_Tp>&
3097valarray<_Tp>::operator=(initializer_list<value_type> __il)
3098{
Mikhail Maltsev59de6f82018-02-08 11:33:48 +00003099 return __assign_range(__il.begin(), __il.end());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003100}
3101
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04003102#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00003103
3104template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003105inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003106valarray<_Tp>&
3107valarray<_Tp>::operator=(const value_type& __x)
3108{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003109 _VSTD::fill(__begin_, __end_, __x);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003110 return *this;
3111}
3112
3113template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003114inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003115valarray<_Tp>&
3116valarray<_Tp>::operator=(const slice_array<value_type>& __sa)
3117{
3118 value_type* __t = __begin_;
3119 const value_type* __s = __sa.__vp_;
3120 for (size_t __n = __sa.__size_; __n; --__n, __s += __sa.__stride_, ++__t)
3121 *__t = *__s;
3122 return *this;
3123}
3124
3125template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003126inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003127valarray<_Tp>&
3128valarray<_Tp>::operator=(const gslice_array<value_type>& __ga)
3129{
3130 typedef const size_t* _Ip;
3131 value_type* __t = __begin_;
3132 const value_type* __s = __ga.__vp_;
3133 for (_Ip __i = __ga.__1d_.__begin_, __e = __ga.__1d_.__end_;
3134 __i != __e; ++__i, ++__t)
3135 *__t = __s[*__i];
3136 return *this;
3137}
3138
3139template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003140inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003141valarray<_Tp>&
3142valarray<_Tp>::operator=(const mask_array<value_type>& __ma)
3143{
3144 typedef const size_t* _Ip;
3145 value_type* __t = __begin_;
3146 const value_type* __s = __ma.__vp_;
3147 for (_Ip __i = __ma.__1d_.__begin_, __e = __ma.__1d_.__end_;
3148 __i != __e; ++__i, ++__t)
3149 *__t = __s[*__i];
3150 return *this;
3151}
3152
3153template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003154inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003155valarray<_Tp>&
3156valarray<_Tp>::operator=(const indirect_array<value_type>& __ia)
3157{
3158 typedef const size_t* _Ip;
3159 value_type* __t = __begin_;
3160 const value_type* __s = __ia.__vp_;
3161 for (_Ip __i = __ia.__1d_.__begin_, __e = __ia.__1d_.__end_;
3162 __i != __e; ++__i, ++__t)
3163 *__t = __s[*__i];
3164 return *this;
3165}
3166
3167template <class _Tp>
Howard Hinnant329cd412011-07-27 23:19:59 +00003168template <class _ValExpr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003169inline
Howard Hinnant329cd412011-07-27 23:19:59 +00003170valarray<_Tp>&
3171valarray<_Tp>::operator=(const __val_expr<_ValExpr>& __v)
3172{
3173 size_t __n = __v.size();
3174 if (size() != __n)
3175 resize(__n);
3176 value_type* __t = __begin_;
3177 for (size_t __i = 0; __i != __n; ++__t, ++__i)
Arthur O'Dwyer66bf60a2021-05-29 13:09:07 -04003178 *__t = __result_type(__v[__i]);
Howard Hinnant329cd412011-07-27 23:19:59 +00003179 return *this;
3180}
3181
3182template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003183inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003184__val_expr<__slice_expr<const valarray<_Tp>&> >
3185valarray<_Tp>::operator[](slice __s) const
3186{
3187 return __val_expr<__slice_expr<const valarray&> >(__slice_expr<const valarray&>(__s, *this));
3188}
3189
3190template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003191inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003192slice_array<_Tp>
3193valarray<_Tp>::operator[](slice __s)
3194{
3195 return slice_array<value_type>(__s, *this);
3196}
3197
3198template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003199inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003200__val_expr<__indirect_expr<const valarray<_Tp>&> >
3201valarray<_Tp>::operator[](const gslice& __gs) const
3202{
3203 return __val_expr<__indirect_expr<const valarray&> >(__indirect_expr<const valarray&>(__gs.__1d_, *this));
3204}
3205
3206template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003207inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003208gslice_array<_Tp>
3209valarray<_Tp>::operator[](const gslice& __gs)
3210{
3211 return gslice_array<value_type>(__gs, *this);
3212}
3213
Eric Fiselier3b0b81f2017-04-19 00:23:45 +00003214#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00003215
3216template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003217inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003218__val_expr<__indirect_expr<const valarray<_Tp>&> >
3219valarray<_Tp>::operator[](gslice&& __gs) const
3220{
Corentin Jabotcfb8a912022-02-24 19:54:00 -05003221 return __val_expr<__indirect_expr<const valarray&> >(__indirect_expr<const valarray&>(std::move(__gs.__1d_), *this));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003222}
3223
3224template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003225inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003226gslice_array<_Tp>
3227valarray<_Tp>::operator[](gslice&& __gs)
3228{
Corentin Jabotcfb8a912022-02-24 19:54:00 -05003229 return gslice_array<value_type>(std::move(__gs), *this);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003230}
3231
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04003232#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00003233
3234template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003235inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003236__val_expr<__mask_expr<const valarray<_Tp>&> >
3237valarray<_Tp>::operator[](const valarray<bool>& __vb) const
3238{
3239 return __val_expr<__mask_expr<const valarray&> >(__mask_expr<const valarray&>(__vb, *this));
3240}
3241
3242template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003243inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003244mask_array<_Tp>
3245valarray<_Tp>::operator[](const valarray<bool>& __vb)
3246{
3247 return mask_array<value_type>(__vb, *this);
3248}
3249
Eric Fiselier3b0b81f2017-04-19 00:23:45 +00003250#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00003251
3252template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003253inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003254__val_expr<__mask_expr<const valarray<_Tp>&> >
3255valarray<_Tp>::operator[](valarray<bool>&& __vb) const
3256{
Corentin Jabotcfb8a912022-02-24 19:54:00 -05003257 return __val_expr<__mask_expr<const valarray&> >(__mask_expr<const valarray&>(std::move(__vb), *this));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003258}
3259
3260template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003261inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003262mask_array<_Tp>
3263valarray<_Tp>::operator[](valarray<bool>&& __vb)
3264{
Corentin Jabotcfb8a912022-02-24 19:54:00 -05003265 return mask_array<value_type>(std::move(__vb), *this);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003266}
3267
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04003268#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00003269
3270template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003271inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003272__val_expr<__indirect_expr<const valarray<_Tp>&> >
3273valarray<_Tp>::operator[](const valarray<size_t>& __vs) const
3274{
3275 return __val_expr<__indirect_expr<const valarray&> >(__indirect_expr<const valarray&>(__vs, *this));
3276}
3277
3278template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003279inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003280indirect_array<_Tp>
3281valarray<_Tp>::operator[](const valarray<size_t>& __vs)
3282{
3283 return indirect_array<value_type>(__vs, *this);
3284}
3285
Eric Fiselier3b0b81f2017-04-19 00:23:45 +00003286#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00003287
3288template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003289inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003290__val_expr<__indirect_expr<const valarray<_Tp>&> >
3291valarray<_Tp>::operator[](valarray<size_t>&& __vs) const
3292{
Corentin Jabotcfb8a912022-02-24 19:54:00 -05003293 return __val_expr<__indirect_expr<const valarray&> >(__indirect_expr<const valarray&>(std::move(__vs), *this));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003294}
3295
3296template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003297inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003298indirect_array<_Tp>
3299valarray<_Tp>::operator[](valarray<size_t>&& __vs)
3300{
Corentin Jabotcfb8a912022-02-24 19:54:00 -05003301 return indirect_array<value_type>(std::move(__vs), *this);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003302}
3303
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04003304#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00003305
3306template <class _Tp>
Louis Dionne12a2e572022-05-05 12:24:43 -04003307inline
3308__val_expr<_UnaryOp<__unary_plus<_Tp>, const valarray<_Tp>&> >
Howard Hinnantc51e1022010-05-11 19:42:16 +00003309valarray<_Tp>::operator+() const
3310{
Louis Dionne12a2e572022-05-05 12:24:43 -04003311 using _Op = _UnaryOp<__unary_plus<_Tp>, const valarray<_Tp>&>;
3312 return __val_expr<_Op>(_Op(__unary_plus<_Tp>(), *this));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003313}
3314
3315template <class _Tp>
Louis Dionne12a2e572022-05-05 12:24:43 -04003316inline
3317__val_expr<_UnaryOp<negate<_Tp>, const valarray<_Tp>&> >
Howard Hinnantc51e1022010-05-11 19:42:16 +00003318valarray<_Tp>::operator-() const
3319{
Louis Dionne12a2e572022-05-05 12:24:43 -04003320 using _Op = _UnaryOp<negate<_Tp>, const valarray<_Tp>&>;
3321 return __val_expr<_Op>(_Op(negate<_Tp>(), *this));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003322}
3323
3324template <class _Tp>
Louis Dionne12a2e572022-05-05 12:24:43 -04003325inline
3326__val_expr<_UnaryOp<__bit_not<_Tp>, const valarray<_Tp>&> >
Howard Hinnantc51e1022010-05-11 19:42:16 +00003327valarray<_Tp>::operator~() const
3328{
Louis Dionne12a2e572022-05-05 12:24:43 -04003329 using _Op = _UnaryOp<__bit_not<_Tp>, const valarray<_Tp>&>;
3330 return __val_expr<_Op>(_Op(__bit_not<_Tp>(), *this));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003331}
3332
3333template <class _Tp>
Louis Dionne12a2e572022-05-05 12:24:43 -04003334inline
3335__val_expr<_UnaryOp<logical_not<_Tp>, const valarray<_Tp>&> >
Howard Hinnantc51e1022010-05-11 19:42:16 +00003336valarray<_Tp>::operator!() const
3337{
Louis Dionne12a2e572022-05-05 12:24:43 -04003338 using _Op = _UnaryOp<logical_not<_Tp>, const valarray<_Tp>&>;
3339 return __val_expr<_Op>(_Op(logical_not<_Tp>(), *this));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003340}
3341
3342template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003343inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003344valarray<_Tp>&
3345valarray<_Tp>::operator*=(const value_type& __x)
3346{
3347 for (value_type* __p = __begin_; __p != __end_; ++__p)
3348 *__p *= __x;
3349 return *this;
3350}
3351
3352template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003353inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003354valarray<_Tp>&
3355valarray<_Tp>::operator/=(const value_type& __x)
3356{
3357 for (value_type* __p = __begin_; __p != __end_; ++__p)
3358 *__p /= __x;
3359 return *this;
3360}
3361
3362template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003363inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003364valarray<_Tp>&
3365valarray<_Tp>::operator%=(const value_type& __x)
3366{
3367 for (value_type* __p = __begin_; __p != __end_; ++__p)
3368 *__p %= __x;
3369 return *this;
3370}
3371
3372template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003373inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003374valarray<_Tp>&
3375valarray<_Tp>::operator+=(const value_type& __x)
3376{
3377 for (value_type* __p = __begin_; __p != __end_; ++__p)
3378 *__p += __x;
3379 return *this;
3380}
3381
3382template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003383inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003384valarray<_Tp>&
3385valarray<_Tp>::operator-=(const value_type& __x)
3386{
3387 for (value_type* __p = __begin_; __p != __end_; ++__p)
3388 *__p -= __x;
3389 return *this;
3390}
3391
3392template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003393inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003394valarray<_Tp>&
3395valarray<_Tp>::operator^=(const value_type& __x)
3396{
3397 for (value_type* __p = __begin_; __p != __end_; ++__p)
3398 *__p ^= __x;
3399 return *this;
3400}
3401
3402template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003403inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003404valarray<_Tp>&
3405valarray<_Tp>::operator&=(const value_type& __x)
3406{
3407 for (value_type* __p = __begin_; __p != __end_; ++__p)
3408 *__p &= __x;
3409 return *this;
3410}
3411
3412template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003413inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003414valarray<_Tp>&
3415valarray<_Tp>::operator|=(const value_type& __x)
3416{
3417 for (value_type* __p = __begin_; __p != __end_; ++__p)
3418 *__p |= __x;
3419 return *this;
3420}
3421
3422template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003423inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003424valarray<_Tp>&
3425valarray<_Tp>::operator<<=(const value_type& __x)
3426{
3427 for (value_type* __p = __begin_; __p != __end_; ++__p)
3428 *__p <<= __x;
3429 return *this;
3430}
3431
3432template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003433inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003434valarray<_Tp>&
3435valarray<_Tp>::operator>>=(const value_type& __x)
3436{
3437 for (value_type* __p = __begin_; __p != __end_; ++__p)
3438 *__p >>= __x;
3439 return *this;
3440}
3441
3442template <class _Tp>
3443template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003444inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003445typename enable_if
3446<
3447 __is_val_expr<_Expr>::value,
3448 valarray<_Tp>&
3449>::type
3450valarray<_Tp>::operator*=(const _Expr& __v)
3451{
3452 size_t __i = 0;
3453 for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3454 *__t *= __v[__i];
3455 return *this;
3456}
3457
3458template <class _Tp>
3459template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003460inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003461typename enable_if
3462<
3463 __is_val_expr<_Expr>::value,
3464 valarray<_Tp>&
3465>::type
3466valarray<_Tp>::operator/=(const _Expr& __v)
3467{
3468 size_t __i = 0;
3469 for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3470 *__t /= __v[__i];
3471 return *this;
3472}
3473
3474template <class _Tp>
3475template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003476inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003477typename enable_if
3478<
3479 __is_val_expr<_Expr>::value,
3480 valarray<_Tp>&
3481>::type
3482valarray<_Tp>::operator%=(const _Expr& __v)
3483{
3484 size_t __i = 0;
3485 for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3486 *__t %= __v[__i];
3487 return *this;
3488}
3489
3490template <class _Tp>
3491template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003492inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003493typename enable_if
3494<
3495 __is_val_expr<_Expr>::value,
3496 valarray<_Tp>&
3497>::type
3498valarray<_Tp>::operator+=(const _Expr& __v)
3499{
3500 size_t __i = 0;
3501 for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3502 *__t += __v[__i];
3503 return *this;
3504}
3505
3506template <class _Tp>
3507template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003508inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003509typename enable_if
3510<
3511 __is_val_expr<_Expr>::value,
3512 valarray<_Tp>&
3513>::type
3514valarray<_Tp>::operator-=(const _Expr& __v)
3515{
3516 size_t __i = 0;
3517 for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3518 *__t -= __v[__i];
3519 return *this;
3520}
3521
3522template <class _Tp>
3523template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003524inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003525typename enable_if
3526<
3527 __is_val_expr<_Expr>::value,
3528 valarray<_Tp>&
3529>::type
3530valarray<_Tp>::operator^=(const _Expr& __v)
3531{
3532 size_t __i = 0;
3533 for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3534 *__t ^= __v[__i];
3535 return *this;
3536}
3537
3538template <class _Tp>
3539template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003540inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003541typename enable_if
3542<
3543 __is_val_expr<_Expr>::value,
3544 valarray<_Tp>&
3545>::type
3546valarray<_Tp>::operator|=(const _Expr& __v)
3547{
3548 size_t __i = 0;
3549 for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3550 *__t |= __v[__i];
3551 return *this;
3552}
3553
3554template <class _Tp>
3555template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003556inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003557typename enable_if
3558<
3559 __is_val_expr<_Expr>::value,
3560 valarray<_Tp>&
3561>::type
3562valarray<_Tp>::operator&=(const _Expr& __v)
3563{
3564 size_t __i = 0;
3565 for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3566 *__t &= __v[__i];
3567 return *this;
3568}
3569
3570template <class _Tp>
3571template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003572inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003573typename enable_if
3574<
3575 __is_val_expr<_Expr>::value,
3576 valarray<_Tp>&
3577>::type
3578valarray<_Tp>::operator<<=(const _Expr& __v)
3579{
3580 size_t __i = 0;
3581 for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3582 *__t <<= __v[__i];
3583 return *this;
3584}
3585
3586template <class _Tp>
3587template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003588inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003589typename enable_if
3590<
3591 __is_val_expr<_Expr>::value,
3592 valarray<_Tp>&
3593>::type
3594valarray<_Tp>::operator>>=(const _Expr& __v)
3595{
3596 size_t __i = 0;
3597 for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3598 *__t >>= __v[__i];
3599 return *this;
3600}
3601
3602template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003603inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003604void
Howard Hinnant298aed92012-07-21 00:51:28 +00003605valarray<_Tp>::swap(valarray& __v) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00003606{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003607 _VSTD::swap(__begin_, __v.__begin_);
3608 _VSTD::swap(__end_, __v.__end_);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003609}
3610
3611template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003612inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003613_Tp
3614valarray<_Tp>::sum() const
3615{
3616 if (__begin_ == __end_)
3617 return value_type();
3618 const value_type* __p = __begin_;
3619 _Tp __r = *__p;
3620 for (++__p; __p != __end_; ++__p)
3621 __r += *__p;
3622 return __r;
3623}
3624
3625template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003626inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003627_Tp
3628valarray<_Tp>::min() const
3629{
3630 if (__begin_ == __end_)
3631 return value_type();
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003632 return *_VSTD::min_element(__begin_, __end_);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003633}
3634
3635template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003636inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003637_Tp
3638valarray<_Tp>::max() const
3639{
3640 if (__begin_ == __end_)
3641 return value_type();
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003642 return *_VSTD::max_element(__begin_, __end_);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003643}
3644
3645template <class _Tp>
3646valarray<_Tp>
3647valarray<_Tp>::shift(int __i) const
3648{
3649 valarray<value_type> __r;
3650 size_t __n = size();
3651 if (__n)
3652 {
Louis Dionne5ffe5152020-09-28 15:47:49 -04003653 __r.__begin_ = __r.__end_ = allocator<value_type>().allocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003654 const value_type* __sb;
3655 value_type* __tb;
3656 value_type* __te;
3657 if (__i >= 0)
3658 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003659 __i = _VSTD::min(__i, static_cast<int>(__n));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003660 __sb = __begin_ + __i;
3661 __tb = __r.__begin_;
3662 __te = __r.__begin_ + (__n - __i);
3663 }
3664 else
3665 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003666 __i = _VSTD::min(-__i, static_cast<int>(__n));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003667 __sb = __begin_;
3668 __tb = __r.__begin_ + __i;
3669 __te = __r.__begin_ + __n;
3670 }
3671 for (; __r.__end_ != __tb; ++__r.__end_)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05003672 ::new ((void*)__r.__end_) value_type();
Howard Hinnantc51e1022010-05-11 19:42:16 +00003673 for (; __r.__end_ != __te; ++__r.__end_, ++__sb)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05003674 ::new ((void*)__r.__end_) value_type(*__sb);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003675 for (__te = __r.__begin_ + __n; __r.__end_ != __te; ++__r.__end_)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05003676 ::new ((void*)__r.__end_) value_type();
Howard Hinnantc51e1022010-05-11 19:42:16 +00003677 }
3678 return __r;
3679}
3680
3681template <class _Tp>
3682valarray<_Tp>
3683valarray<_Tp>::cshift(int __i) const
3684{
3685 valarray<value_type> __r;
3686 size_t __n = size();
3687 if (__n)
3688 {
Louis Dionne5ffe5152020-09-28 15:47:49 -04003689 __r.__begin_ = __r.__end_ = allocator<value_type>().allocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003690 __i %= static_cast<int>(__n);
3691 const value_type* __m = __i >= 0 ? __begin_ + __i : __end_ + __i;
3692 for (const value_type* __s = __m; __s != __end_; ++__r.__end_, ++__s)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05003693 ::new ((void*)__r.__end_) value_type(*__s);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003694 for (const value_type* __s = __begin_; __s != __m; ++__r.__end_, ++__s)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05003695 ::new ((void*)__r.__end_) value_type(*__s);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003696 }
3697 return __r;
3698}
3699
3700template <class _Tp>
3701valarray<_Tp>
3702valarray<_Tp>::apply(value_type __f(value_type)) const
3703{
3704 valarray<value_type> __r;
3705 size_t __n = size();
3706 if (__n)
3707 {
Louis Dionne5ffe5152020-09-28 15:47:49 -04003708 __r.__begin_ = __r.__end_ = allocator<value_type>().allocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003709 for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05003710 ::new ((void*)__r.__end_) value_type(__f(*__p));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003711 }
3712 return __r;
3713}
3714
3715template <class _Tp>
3716valarray<_Tp>
3717valarray<_Tp>::apply(value_type __f(const value_type&)) const
3718{
3719 valarray<value_type> __r;
3720 size_t __n = size();
3721 if (__n)
3722 {
Louis Dionne5ffe5152020-09-28 15:47:49 -04003723 __r.__begin_ = __r.__end_ = allocator<value_type>().allocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003724 for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05003725 ::new ((void*)__r.__end_) value_type(__f(*__p));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003726 }
3727 return __r;
3728}
3729
3730template <class _Tp>
Eric Fiseliera119c322018-10-25 17:43:26 +00003731inline
Eric Fiselier2856ef82018-10-25 17:21:30 +00003732void valarray<_Tp>::__clear(size_t __capacity)
Howard Hinnantc51e1022010-05-11 19:42:16 +00003733{
Eric Fiselier2856ef82018-10-25 17:21:30 +00003734 if (__begin_ != nullptr)
3735 {
3736 while (__end_ != __begin_)
3737 (--__end_)->~value_type();
Louis Dionne5ffe5152020-09-28 15:47:49 -04003738 allocator<value_type>().deallocate(__begin_, __capacity);
Eric Fiselier2856ef82018-10-25 17:21:30 +00003739 __begin_ = __end_ = nullptr;
3740 }
Mikhail Maltsev59de6f82018-02-08 11:33:48 +00003741}
3742
3743template <class _Tp>
3744void
3745valarray<_Tp>::resize(size_t __n, value_type __x)
3746{
Eric Fiselier2856ef82018-10-25 17:21:30 +00003747 __clear(size());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003748 if (__n)
3749 {
Louis Dionne5ffe5152020-09-28 15:47:49 -04003750 __begin_ = __end_ = allocator<value_type>().allocate(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003751#ifndef _LIBCPP_NO_EXCEPTIONS
3752 try
3753 {
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04003754#endif // _LIBCPP_NO_EXCEPTIONS
Eric Fiselier2856ef82018-10-25 17:21:30 +00003755 for (size_t __n_left = __n; __n_left; --__n_left, ++__end_)
Arthur O'Dwyer0c4472a2020-12-11 20:30:28 -05003756 ::new ((void*)__end_) value_type(__x);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003757#ifndef _LIBCPP_NO_EXCEPTIONS
3758 }
3759 catch (...)
3760 {
Eric Fiselier2856ef82018-10-25 17:21:30 +00003761 __clear(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003762 throw;
3763 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04003764#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00003765 }
3766}
3767
3768template<class _Tp>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003769inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003770void
Howard Hinnant298aed92012-07-21 00:51:28 +00003771swap(valarray<_Tp>& __x, valarray<_Tp>& __y) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00003772{
3773 __x.swap(__y);
3774}
3775
3776template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003777inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003778typename enable_if
3779<
3780 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
3781 __val_expr<_BinaryOp<multiplies<typename _Expr1::value_type>, _Expr1, _Expr2> >
3782>::type
3783operator*(const _Expr1& __x, const _Expr2& __y)
3784{
3785 typedef typename _Expr1::value_type value_type;
3786 typedef _BinaryOp<multiplies<value_type>, _Expr1, _Expr2> _Op;
3787 return __val_expr<_Op>(_Op(multiplies<value_type>(), __x, __y));
3788}
3789
3790template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003791inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003792typename enable_if
3793<
3794 __is_val_expr<_Expr>::value,
3795 __val_expr<_BinaryOp<multiplies<typename _Expr::value_type>,
3796 _Expr, __scalar_expr<typename _Expr::value_type> > >
3797>::type
3798operator*(const _Expr& __x, const typename _Expr::value_type& __y)
3799{
3800 typedef typename _Expr::value_type value_type;
3801 typedef _BinaryOp<multiplies<value_type>, _Expr, __scalar_expr<value_type> > _Op;
3802 return __val_expr<_Op>(_Op(multiplies<value_type>(),
3803 __x, __scalar_expr<value_type>(__y, __x.size())));
3804}
3805
3806template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003807inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003808typename enable_if
3809<
3810 __is_val_expr<_Expr>::value,
3811 __val_expr<_BinaryOp<multiplies<typename _Expr::value_type>,
3812 __scalar_expr<typename _Expr::value_type>, _Expr> >
3813>::type
3814operator*(const typename _Expr::value_type& __x, const _Expr& __y)
3815{
3816 typedef typename _Expr::value_type value_type;
3817 typedef _BinaryOp<multiplies<value_type>, __scalar_expr<value_type>, _Expr> _Op;
3818 return __val_expr<_Op>(_Op(multiplies<value_type>(),
3819 __scalar_expr<value_type>(__x, __y.size()), __y));
3820}
3821
3822template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003823inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003824typename enable_if
3825<
3826 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
3827 __val_expr<_BinaryOp<divides<typename _Expr1::value_type>, _Expr1, _Expr2> >
3828>::type
3829operator/(const _Expr1& __x, const _Expr2& __y)
3830{
3831 typedef typename _Expr1::value_type value_type;
3832 typedef _BinaryOp<divides<value_type>, _Expr1, _Expr2> _Op;
3833 return __val_expr<_Op>(_Op(divides<value_type>(), __x, __y));
3834}
3835
3836template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003837inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003838typename enable_if
3839<
3840 __is_val_expr<_Expr>::value,
3841 __val_expr<_BinaryOp<divides<typename _Expr::value_type>,
3842 _Expr, __scalar_expr<typename _Expr::value_type> > >
3843>::type
3844operator/(const _Expr& __x, const typename _Expr::value_type& __y)
3845{
3846 typedef typename _Expr::value_type value_type;
3847 typedef _BinaryOp<divides<value_type>, _Expr, __scalar_expr<value_type> > _Op;
3848 return __val_expr<_Op>(_Op(divides<value_type>(),
3849 __x, __scalar_expr<value_type>(__y, __x.size())));
3850}
3851
3852template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003853inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003854typename enable_if
3855<
3856 __is_val_expr<_Expr>::value,
3857 __val_expr<_BinaryOp<divides<typename _Expr::value_type>,
3858 __scalar_expr<typename _Expr::value_type>, _Expr> >
3859>::type
3860operator/(const typename _Expr::value_type& __x, const _Expr& __y)
3861{
3862 typedef typename _Expr::value_type value_type;
3863 typedef _BinaryOp<divides<value_type>, __scalar_expr<value_type>, _Expr> _Op;
3864 return __val_expr<_Op>(_Op(divides<value_type>(),
3865 __scalar_expr<value_type>(__x, __y.size()), __y));
3866}
3867
3868template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003869inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003870typename enable_if
3871<
3872 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
3873 __val_expr<_BinaryOp<modulus<typename _Expr1::value_type>, _Expr1, _Expr2> >
3874>::type
3875operator%(const _Expr1& __x, const _Expr2& __y)
3876{
3877 typedef typename _Expr1::value_type value_type;
3878 typedef _BinaryOp<modulus<value_type>, _Expr1, _Expr2> _Op;
3879 return __val_expr<_Op>(_Op(modulus<value_type>(), __x, __y));
3880}
3881
3882template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003883inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003884typename enable_if
3885<
3886 __is_val_expr<_Expr>::value,
3887 __val_expr<_BinaryOp<modulus<typename _Expr::value_type>,
3888 _Expr, __scalar_expr<typename _Expr::value_type> > >
3889>::type
3890operator%(const _Expr& __x, const typename _Expr::value_type& __y)
3891{
3892 typedef typename _Expr::value_type value_type;
3893 typedef _BinaryOp<modulus<value_type>, _Expr, __scalar_expr<value_type> > _Op;
3894 return __val_expr<_Op>(_Op(modulus<value_type>(),
3895 __x, __scalar_expr<value_type>(__y, __x.size())));
3896}
3897
3898template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003899inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003900typename enable_if
3901<
3902 __is_val_expr<_Expr>::value,
3903 __val_expr<_BinaryOp<modulus<typename _Expr::value_type>,
3904 __scalar_expr<typename _Expr::value_type>, _Expr> >
3905>::type
3906operator%(const typename _Expr::value_type& __x, const _Expr& __y)
3907{
3908 typedef typename _Expr::value_type value_type;
3909 typedef _BinaryOp<modulus<value_type>, __scalar_expr<value_type>, _Expr> _Op;
3910 return __val_expr<_Op>(_Op(modulus<value_type>(),
3911 __scalar_expr<value_type>(__x, __y.size()), __y));
3912}
3913
3914template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003915inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003916typename enable_if
3917<
3918 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
3919 __val_expr<_BinaryOp<plus<typename _Expr1::value_type>, _Expr1, _Expr2> >
3920>::type
3921operator+(const _Expr1& __x, const _Expr2& __y)
3922{
3923 typedef typename _Expr1::value_type value_type;
3924 typedef _BinaryOp<plus<value_type>, _Expr1, _Expr2> _Op;
3925 return __val_expr<_Op>(_Op(plus<value_type>(), __x, __y));
3926}
3927
3928template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003929inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003930typename enable_if
3931<
3932 __is_val_expr<_Expr>::value,
3933 __val_expr<_BinaryOp<plus<typename _Expr::value_type>,
3934 _Expr, __scalar_expr<typename _Expr::value_type> > >
3935>::type
3936operator+(const _Expr& __x, const typename _Expr::value_type& __y)
3937{
3938 typedef typename _Expr::value_type value_type;
3939 typedef _BinaryOp<plus<value_type>, _Expr, __scalar_expr<value_type> > _Op;
3940 return __val_expr<_Op>(_Op(plus<value_type>(),
3941 __x, __scalar_expr<value_type>(__y, __x.size())));
3942}
3943
3944template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003945inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003946typename enable_if
3947<
3948 __is_val_expr<_Expr>::value,
3949 __val_expr<_BinaryOp<plus<typename _Expr::value_type>,
3950 __scalar_expr<typename _Expr::value_type>, _Expr> >
3951>::type
3952operator+(const typename _Expr::value_type& __x, const _Expr& __y)
3953{
3954 typedef typename _Expr::value_type value_type;
3955 typedef _BinaryOp<plus<value_type>, __scalar_expr<value_type>, _Expr> _Op;
3956 return __val_expr<_Op>(_Op(plus<value_type>(),
3957 __scalar_expr<value_type>(__x, __y.size()), __y));
3958}
3959
3960template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003961inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003962typename enable_if
3963<
3964 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
3965 __val_expr<_BinaryOp<minus<typename _Expr1::value_type>, _Expr1, _Expr2> >
3966>::type
3967operator-(const _Expr1& __x, const _Expr2& __y)
3968{
3969 typedef typename _Expr1::value_type value_type;
3970 typedef _BinaryOp<minus<value_type>, _Expr1, _Expr2> _Op;
3971 return __val_expr<_Op>(_Op(minus<value_type>(), __x, __y));
3972}
3973
3974template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003975inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003976typename enable_if
3977<
3978 __is_val_expr<_Expr>::value,
3979 __val_expr<_BinaryOp<minus<typename _Expr::value_type>,
3980 _Expr, __scalar_expr<typename _Expr::value_type> > >
3981>::type
3982operator-(const _Expr& __x, const typename _Expr::value_type& __y)
3983{
3984 typedef typename _Expr::value_type value_type;
3985 typedef _BinaryOp<minus<value_type>, _Expr, __scalar_expr<value_type> > _Op;
3986 return __val_expr<_Op>(_Op(minus<value_type>(),
3987 __x, __scalar_expr<value_type>(__y, __x.size())));
3988}
3989
3990template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003991inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003992typename enable_if
3993<
3994 __is_val_expr<_Expr>::value,
3995 __val_expr<_BinaryOp<minus<typename _Expr::value_type>,
3996 __scalar_expr<typename _Expr::value_type>, _Expr> >
3997>::type
3998operator-(const typename _Expr::value_type& __x, const _Expr& __y)
3999{
4000 typedef typename _Expr::value_type value_type;
4001 typedef _BinaryOp<minus<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4002 return __val_expr<_Op>(_Op(minus<value_type>(),
4003 __scalar_expr<value_type>(__x, __y.size()), __y));
4004}
4005
4006template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004007inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004008typename enable_if
4009<
4010 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4011 __val_expr<_BinaryOp<bit_xor<typename _Expr1::value_type>, _Expr1, _Expr2> >
4012>::type
4013operator^(const _Expr1& __x, const _Expr2& __y)
4014{
4015 typedef typename _Expr1::value_type value_type;
4016 typedef _BinaryOp<bit_xor<value_type>, _Expr1, _Expr2> _Op;
4017 return __val_expr<_Op>(_Op(bit_xor<value_type>(), __x, __y));
4018}
4019
4020template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004021inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004022typename enable_if
4023<
4024 __is_val_expr<_Expr>::value,
4025 __val_expr<_BinaryOp<bit_xor<typename _Expr::value_type>,
4026 _Expr, __scalar_expr<typename _Expr::value_type> > >
4027>::type
4028operator^(const _Expr& __x, const typename _Expr::value_type& __y)
4029{
4030 typedef typename _Expr::value_type value_type;
4031 typedef _BinaryOp<bit_xor<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4032 return __val_expr<_Op>(_Op(bit_xor<value_type>(),
4033 __x, __scalar_expr<value_type>(__y, __x.size())));
4034}
4035
4036template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004037inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004038typename enable_if
4039<
4040 __is_val_expr<_Expr>::value,
4041 __val_expr<_BinaryOp<bit_xor<typename _Expr::value_type>,
4042 __scalar_expr<typename _Expr::value_type>, _Expr> >
4043>::type
4044operator^(const typename _Expr::value_type& __x, const _Expr& __y)
4045{
4046 typedef typename _Expr::value_type value_type;
4047 typedef _BinaryOp<bit_xor<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4048 return __val_expr<_Op>(_Op(bit_xor<value_type>(),
4049 __scalar_expr<value_type>(__x, __y.size()), __y));
4050}
4051
4052template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004053inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004054typename enable_if
4055<
4056 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4057 __val_expr<_BinaryOp<bit_and<typename _Expr1::value_type>, _Expr1, _Expr2> >
4058>::type
4059operator&(const _Expr1& __x, const _Expr2& __y)
4060{
4061 typedef typename _Expr1::value_type value_type;
4062 typedef _BinaryOp<bit_and<value_type>, _Expr1, _Expr2> _Op;
4063 return __val_expr<_Op>(_Op(bit_and<value_type>(), __x, __y));
4064}
4065
4066template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004067inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004068typename enable_if
4069<
4070 __is_val_expr<_Expr>::value,
4071 __val_expr<_BinaryOp<bit_and<typename _Expr::value_type>,
4072 _Expr, __scalar_expr<typename _Expr::value_type> > >
4073>::type
4074operator&(const _Expr& __x, const typename _Expr::value_type& __y)
4075{
4076 typedef typename _Expr::value_type value_type;
4077 typedef _BinaryOp<bit_and<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4078 return __val_expr<_Op>(_Op(bit_and<value_type>(),
4079 __x, __scalar_expr<value_type>(__y, __x.size())));
4080}
4081
4082template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004083inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004084typename enable_if
4085<
4086 __is_val_expr<_Expr>::value,
4087 __val_expr<_BinaryOp<bit_and<typename _Expr::value_type>,
4088 __scalar_expr<typename _Expr::value_type>, _Expr> >
4089>::type
4090operator&(const typename _Expr::value_type& __x, const _Expr& __y)
4091{
4092 typedef typename _Expr::value_type value_type;
4093 typedef _BinaryOp<bit_and<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4094 return __val_expr<_Op>(_Op(bit_and<value_type>(),
4095 __scalar_expr<value_type>(__x, __y.size()), __y));
4096}
4097
4098template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004099inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004100typename enable_if
4101<
4102 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4103 __val_expr<_BinaryOp<bit_or<typename _Expr1::value_type>, _Expr1, _Expr2> >
4104>::type
4105operator|(const _Expr1& __x, const _Expr2& __y)
4106{
4107 typedef typename _Expr1::value_type value_type;
4108 typedef _BinaryOp<bit_or<value_type>, _Expr1, _Expr2> _Op;
4109 return __val_expr<_Op>(_Op(bit_or<value_type>(), __x, __y));
4110}
4111
4112template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004113inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004114typename enable_if
4115<
4116 __is_val_expr<_Expr>::value,
4117 __val_expr<_BinaryOp<bit_or<typename _Expr::value_type>,
4118 _Expr, __scalar_expr<typename _Expr::value_type> > >
4119>::type
4120operator|(const _Expr& __x, const typename _Expr::value_type& __y)
4121{
4122 typedef typename _Expr::value_type value_type;
4123 typedef _BinaryOp<bit_or<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4124 return __val_expr<_Op>(_Op(bit_or<value_type>(),
4125 __x, __scalar_expr<value_type>(__y, __x.size())));
4126}
4127
4128template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004129inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004130typename enable_if
4131<
4132 __is_val_expr<_Expr>::value,
4133 __val_expr<_BinaryOp<bit_or<typename _Expr::value_type>,
4134 __scalar_expr<typename _Expr::value_type>, _Expr> >
4135>::type
4136operator|(const typename _Expr::value_type& __x, const _Expr& __y)
4137{
4138 typedef typename _Expr::value_type value_type;
4139 typedef _BinaryOp<bit_or<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4140 return __val_expr<_Op>(_Op(bit_or<value_type>(),
4141 __scalar_expr<value_type>(__x, __y.size()), __y));
4142}
4143
4144template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004145inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004146typename enable_if
4147<
4148 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4149 __val_expr<_BinaryOp<__bit_shift_left<typename _Expr1::value_type>, _Expr1, _Expr2> >
4150>::type
4151operator<<(const _Expr1& __x, const _Expr2& __y)
4152{
4153 typedef typename _Expr1::value_type value_type;
4154 typedef _BinaryOp<__bit_shift_left<value_type>, _Expr1, _Expr2> _Op;
4155 return __val_expr<_Op>(_Op(__bit_shift_left<value_type>(), __x, __y));
4156}
4157
4158template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004159inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004160typename enable_if
4161<
4162 __is_val_expr<_Expr>::value,
4163 __val_expr<_BinaryOp<__bit_shift_left<typename _Expr::value_type>,
4164 _Expr, __scalar_expr<typename _Expr::value_type> > >
4165>::type
4166operator<<(const _Expr& __x, const typename _Expr::value_type& __y)
4167{
4168 typedef typename _Expr::value_type value_type;
4169 typedef _BinaryOp<__bit_shift_left<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4170 return __val_expr<_Op>(_Op(__bit_shift_left<value_type>(),
4171 __x, __scalar_expr<value_type>(__y, __x.size())));
4172}
4173
4174template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004175inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004176typename enable_if
4177<
4178 __is_val_expr<_Expr>::value,
4179 __val_expr<_BinaryOp<__bit_shift_left<typename _Expr::value_type>,
4180 __scalar_expr<typename _Expr::value_type>, _Expr> >
4181>::type
4182operator<<(const typename _Expr::value_type& __x, const _Expr& __y)
4183{
4184 typedef typename _Expr::value_type value_type;
4185 typedef _BinaryOp<__bit_shift_left<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4186 return __val_expr<_Op>(_Op(__bit_shift_left<value_type>(),
4187 __scalar_expr<value_type>(__x, __y.size()), __y));
4188}
4189
4190template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004191inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004192typename enable_if
4193<
4194 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4195 __val_expr<_BinaryOp<__bit_shift_right<typename _Expr1::value_type>, _Expr1, _Expr2> >
4196>::type
4197operator>>(const _Expr1& __x, const _Expr2& __y)
4198{
4199 typedef typename _Expr1::value_type value_type;
4200 typedef _BinaryOp<__bit_shift_right<value_type>, _Expr1, _Expr2> _Op;
4201 return __val_expr<_Op>(_Op(__bit_shift_right<value_type>(), __x, __y));
4202}
4203
4204template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004205inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004206typename enable_if
4207<
4208 __is_val_expr<_Expr>::value,
4209 __val_expr<_BinaryOp<__bit_shift_right<typename _Expr::value_type>,
4210 _Expr, __scalar_expr<typename _Expr::value_type> > >
4211>::type
4212operator>>(const _Expr& __x, const typename _Expr::value_type& __y)
4213{
4214 typedef typename _Expr::value_type value_type;
4215 typedef _BinaryOp<__bit_shift_right<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4216 return __val_expr<_Op>(_Op(__bit_shift_right<value_type>(),
4217 __x, __scalar_expr<value_type>(__y, __x.size())));
4218}
4219
4220template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004221inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004222typename enable_if
4223<
4224 __is_val_expr<_Expr>::value,
4225 __val_expr<_BinaryOp<__bit_shift_right<typename _Expr::value_type>,
4226 __scalar_expr<typename _Expr::value_type>, _Expr> >
4227>::type
4228operator>>(const typename _Expr::value_type& __x, const _Expr& __y)
4229{
4230 typedef typename _Expr::value_type value_type;
4231 typedef _BinaryOp<__bit_shift_right<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4232 return __val_expr<_Op>(_Op(__bit_shift_right<value_type>(),
4233 __scalar_expr<value_type>(__x, __y.size()), __y));
4234}
4235
4236template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004237inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004238typename enable_if
4239<
4240 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4241 __val_expr<_BinaryOp<logical_and<typename _Expr1::value_type>, _Expr1, _Expr2> >
4242>::type
4243operator&&(const _Expr1& __x, const _Expr2& __y)
4244{
4245 typedef typename _Expr1::value_type value_type;
4246 typedef _BinaryOp<logical_and<value_type>, _Expr1, _Expr2> _Op;
4247 return __val_expr<_Op>(_Op(logical_and<value_type>(), __x, __y));
4248}
4249
4250template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004251inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004252typename enable_if
4253<
4254 __is_val_expr<_Expr>::value,
4255 __val_expr<_BinaryOp<logical_and<typename _Expr::value_type>,
4256 _Expr, __scalar_expr<typename _Expr::value_type> > >
4257>::type
4258operator&&(const _Expr& __x, const typename _Expr::value_type& __y)
4259{
4260 typedef typename _Expr::value_type value_type;
4261 typedef _BinaryOp<logical_and<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4262 return __val_expr<_Op>(_Op(logical_and<value_type>(),
4263 __x, __scalar_expr<value_type>(__y, __x.size())));
4264}
4265
4266template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004267inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004268typename enable_if
4269<
4270 __is_val_expr<_Expr>::value,
4271 __val_expr<_BinaryOp<logical_and<typename _Expr::value_type>,
4272 __scalar_expr<typename _Expr::value_type>, _Expr> >
4273>::type
4274operator&&(const typename _Expr::value_type& __x, const _Expr& __y)
4275{
4276 typedef typename _Expr::value_type value_type;
4277 typedef _BinaryOp<logical_and<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4278 return __val_expr<_Op>(_Op(logical_and<value_type>(),
4279 __scalar_expr<value_type>(__x, __y.size()), __y));
4280}
4281
4282template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004283inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004284typename enable_if
4285<
4286 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4287 __val_expr<_BinaryOp<logical_or<typename _Expr1::value_type>, _Expr1, _Expr2> >
4288>::type
4289operator||(const _Expr1& __x, const _Expr2& __y)
4290{
4291 typedef typename _Expr1::value_type value_type;
4292 typedef _BinaryOp<logical_or<value_type>, _Expr1, _Expr2> _Op;
4293 return __val_expr<_Op>(_Op(logical_or<value_type>(), __x, __y));
4294}
4295
4296template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004297inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004298typename enable_if
4299<
4300 __is_val_expr<_Expr>::value,
4301 __val_expr<_BinaryOp<logical_or<typename _Expr::value_type>,
4302 _Expr, __scalar_expr<typename _Expr::value_type> > >
4303>::type
4304operator||(const _Expr& __x, const typename _Expr::value_type& __y)
4305{
4306 typedef typename _Expr::value_type value_type;
4307 typedef _BinaryOp<logical_or<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4308 return __val_expr<_Op>(_Op(logical_or<value_type>(),
4309 __x, __scalar_expr<value_type>(__y, __x.size())));
4310}
4311
4312template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004313inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004314typename enable_if
4315<
4316 __is_val_expr<_Expr>::value,
4317 __val_expr<_BinaryOp<logical_or<typename _Expr::value_type>,
4318 __scalar_expr<typename _Expr::value_type>, _Expr> >
4319>::type
4320operator||(const typename _Expr::value_type& __x, const _Expr& __y)
4321{
4322 typedef typename _Expr::value_type value_type;
4323 typedef _BinaryOp<logical_or<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4324 return __val_expr<_Op>(_Op(logical_or<value_type>(),
4325 __scalar_expr<value_type>(__x, __y.size()), __y));
4326}
4327
4328template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004329inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004330typename enable_if
4331<
4332 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4333 __val_expr<_BinaryOp<equal_to<typename _Expr1::value_type>, _Expr1, _Expr2> >
4334>::type
4335operator==(const _Expr1& __x, const _Expr2& __y)
4336{
4337 typedef typename _Expr1::value_type value_type;
4338 typedef _BinaryOp<equal_to<value_type>, _Expr1, _Expr2> _Op;
4339 return __val_expr<_Op>(_Op(equal_to<value_type>(), __x, __y));
4340}
4341
4342template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004343inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004344typename enable_if
4345<
4346 __is_val_expr<_Expr>::value,
4347 __val_expr<_BinaryOp<equal_to<typename _Expr::value_type>,
4348 _Expr, __scalar_expr<typename _Expr::value_type> > >
4349>::type
4350operator==(const _Expr& __x, const typename _Expr::value_type& __y)
4351{
4352 typedef typename _Expr::value_type value_type;
4353 typedef _BinaryOp<equal_to<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4354 return __val_expr<_Op>(_Op(equal_to<value_type>(),
4355 __x, __scalar_expr<value_type>(__y, __x.size())));
4356}
4357
4358template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004359inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004360typename enable_if
4361<
4362 __is_val_expr<_Expr>::value,
4363 __val_expr<_BinaryOp<equal_to<typename _Expr::value_type>,
4364 __scalar_expr<typename _Expr::value_type>, _Expr> >
4365>::type
4366operator==(const typename _Expr::value_type& __x, const _Expr& __y)
4367{
4368 typedef typename _Expr::value_type value_type;
4369 typedef _BinaryOp<equal_to<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4370 return __val_expr<_Op>(_Op(equal_to<value_type>(),
4371 __scalar_expr<value_type>(__x, __y.size()), __y));
4372}
4373
4374template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004375inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004376typename enable_if
4377<
4378 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4379 __val_expr<_BinaryOp<not_equal_to<typename _Expr1::value_type>, _Expr1, _Expr2> >
4380>::type
4381operator!=(const _Expr1& __x, const _Expr2& __y)
4382{
4383 typedef typename _Expr1::value_type value_type;
4384 typedef _BinaryOp<not_equal_to<value_type>, _Expr1, _Expr2> _Op;
4385 return __val_expr<_Op>(_Op(not_equal_to<value_type>(), __x, __y));
4386}
4387
4388template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004389inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004390typename enable_if
4391<
4392 __is_val_expr<_Expr>::value,
4393 __val_expr<_BinaryOp<not_equal_to<typename _Expr::value_type>,
4394 _Expr, __scalar_expr<typename _Expr::value_type> > >
4395>::type
4396operator!=(const _Expr& __x, const typename _Expr::value_type& __y)
4397{
4398 typedef typename _Expr::value_type value_type;
4399 typedef _BinaryOp<not_equal_to<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4400 return __val_expr<_Op>(_Op(not_equal_to<value_type>(),
4401 __x, __scalar_expr<value_type>(__y, __x.size())));
4402}
4403
4404template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004405inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004406typename enable_if
4407<
4408 __is_val_expr<_Expr>::value,
4409 __val_expr<_BinaryOp<not_equal_to<typename _Expr::value_type>,
4410 __scalar_expr<typename _Expr::value_type>, _Expr> >
4411>::type
4412operator!=(const typename _Expr::value_type& __x, const _Expr& __y)
4413{
4414 typedef typename _Expr::value_type value_type;
4415 typedef _BinaryOp<not_equal_to<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4416 return __val_expr<_Op>(_Op(not_equal_to<value_type>(),
4417 __scalar_expr<value_type>(__x, __y.size()), __y));
4418}
4419
4420template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004421inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004422typename enable_if
4423<
4424 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4425 __val_expr<_BinaryOp<less<typename _Expr1::value_type>, _Expr1, _Expr2> >
4426>::type
4427operator<(const _Expr1& __x, const _Expr2& __y)
4428{
4429 typedef typename _Expr1::value_type value_type;
4430 typedef _BinaryOp<less<value_type>, _Expr1, _Expr2> _Op;
4431 return __val_expr<_Op>(_Op(less<value_type>(), __x, __y));
4432}
4433
4434template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004435inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004436typename enable_if
4437<
4438 __is_val_expr<_Expr>::value,
4439 __val_expr<_BinaryOp<less<typename _Expr::value_type>,
4440 _Expr, __scalar_expr<typename _Expr::value_type> > >
4441>::type
4442operator<(const _Expr& __x, const typename _Expr::value_type& __y)
4443{
4444 typedef typename _Expr::value_type value_type;
4445 typedef _BinaryOp<less<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4446 return __val_expr<_Op>(_Op(less<value_type>(),
4447 __x, __scalar_expr<value_type>(__y, __x.size())));
4448}
4449
4450template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004451inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004452typename enable_if
4453<
4454 __is_val_expr<_Expr>::value,
4455 __val_expr<_BinaryOp<less<typename _Expr::value_type>,
4456 __scalar_expr<typename _Expr::value_type>, _Expr> >
4457>::type
4458operator<(const typename _Expr::value_type& __x, const _Expr& __y)
4459{
4460 typedef typename _Expr::value_type value_type;
4461 typedef _BinaryOp<less<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4462 return __val_expr<_Op>(_Op(less<value_type>(),
4463 __scalar_expr<value_type>(__x, __y.size()), __y));
4464}
4465
4466template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004467inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004468typename enable_if
4469<
4470 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4471 __val_expr<_BinaryOp<greater<typename _Expr1::value_type>, _Expr1, _Expr2> >
4472>::type
4473operator>(const _Expr1& __x, const _Expr2& __y)
4474{
4475 typedef typename _Expr1::value_type value_type;
4476 typedef _BinaryOp<greater<value_type>, _Expr1, _Expr2> _Op;
4477 return __val_expr<_Op>(_Op(greater<value_type>(), __x, __y));
4478}
4479
4480template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004481inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004482typename enable_if
4483<
4484 __is_val_expr<_Expr>::value,
4485 __val_expr<_BinaryOp<greater<typename _Expr::value_type>,
4486 _Expr, __scalar_expr<typename _Expr::value_type> > >
4487>::type
4488operator>(const _Expr& __x, const typename _Expr::value_type& __y)
4489{
4490 typedef typename _Expr::value_type value_type;
4491 typedef _BinaryOp<greater<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4492 return __val_expr<_Op>(_Op(greater<value_type>(),
4493 __x, __scalar_expr<value_type>(__y, __x.size())));
4494}
4495
4496template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004497inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004498typename enable_if
4499<
4500 __is_val_expr<_Expr>::value,
4501 __val_expr<_BinaryOp<greater<typename _Expr::value_type>,
4502 __scalar_expr<typename _Expr::value_type>, _Expr> >
4503>::type
4504operator>(const typename _Expr::value_type& __x, const _Expr& __y)
4505{
4506 typedef typename _Expr::value_type value_type;
4507 typedef _BinaryOp<greater<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4508 return __val_expr<_Op>(_Op(greater<value_type>(),
4509 __scalar_expr<value_type>(__x, __y.size()), __y));
4510}
4511
4512template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004513inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004514typename enable_if
4515<
4516 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4517 __val_expr<_BinaryOp<less_equal<typename _Expr1::value_type>, _Expr1, _Expr2> >
4518>::type
4519operator<=(const _Expr1& __x, const _Expr2& __y)
4520{
4521 typedef typename _Expr1::value_type value_type;
4522 typedef _BinaryOp<less_equal<value_type>, _Expr1, _Expr2> _Op;
4523 return __val_expr<_Op>(_Op(less_equal<value_type>(), __x, __y));
4524}
4525
4526template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004527inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004528typename enable_if
4529<
4530 __is_val_expr<_Expr>::value,
4531 __val_expr<_BinaryOp<less_equal<typename _Expr::value_type>,
4532 _Expr, __scalar_expr<typename _Expr::value_type> > >
4533>::type
4534operator<=(const _Expr& __x, const typename _Expr::value_type& __y)
4535{
4536 typedef typename _Expr::value_type value_type;
4537 typedef _BinaryOp<less_equal<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4538 return __val_expr<_Op>(_Op(less_equal<value_type>(),
4539 __x, __scalar_expr<value_type>(__y, __x.size())));
4540}
4541
4542template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004543inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004544typename enable_if
4545<
4546 __is_val_expr<_Expr>::value,
4547 __val_expr<_BinaryOp<less_equal<typename _Expr::value_type>,
4548 __scalar_expr<typename _Expr::value_type>, _Expr> >
4549>::type
4550operator<=(const typename _Expr::value_type& __x, const _Expr& __y)
4551{
4552 typedef typename _Expr::value_type value_type;
4553 typedef _BinaryOp<less_equal<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4554 return __val_expr<_Op>(_Op(less_equal<value_type>(),
4555 __scalar_expr<value_type>(__x, __y.size()), __y));
4556}
4557
4558template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004559inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004560typename enable_if
4561<
4562 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4563 __val_expr<_BinaryOp<greater_equal<typename _Expr1::value_type>, _Expr1, _Expr2> >
4564>::type
4565operator>=(const _Expr1& __x, const _Expr2& __y)
4566{
4567 typedef typename _Expr1::value_type value_type;
4568 typedef _BinaryOp<greater_equal<value_type>, _Expr1, _Expr2> _Op;
4569 return __val_expr<_Op>(_Op(greater_equal<value_type>(), __x, __y));
4570}
4571
4572template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004573inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004574typename enable_if
4575<
4576 __is_val_expr<_Expr>::value,
4577 __val_expr<_BinaryOp<greater_equal<typename _Expr::value_type>,
4578 _Expr, __scalar_expr<typename _Expr::value_type> > >
4579>::type
4580operator>=(const _Expr& __x, const typename _Expr::value_type& __y)
4581{
4582 typedef typename _Expr::value_type value_type;
4583 typedef _BinaryOp<greater_equal<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4584 return __val_expr<_Op>(_Op(greater_equal<value_type>(),
4585 __x, __scalar_expr<value_type>(__y, __x.size())));
4586}
4587
4588template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004589inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004590typename enable_if
4591<
4592 __is_val_expr<_Expr>::value,
4593 __val_expr<_BinaryOp<greater_equal<typename _Expr::value_type>,
4594 __scalar_expr<typename _Expr::value_type>, _Expr> >
4595>::type
4596operator>=(const typename _Expr::value_type& __x, const _Expr& __y)
4597{
4598 typedef typename _Expr::value_type value_type;
4599 typedef _BinaryOp<greater_equal<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4600 return __val_expr<_Op>(_Op(greater_equal<value_type>(),
4601 __scalar_expr<value_type>(__x, __y.size()), __y));
4602}
4603
4604template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004605inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004606typename enable_if
4607<
4608 __is_val_expr<_Expr>::value,
4609 __val_expr<_UnaryOp<__abs_expr<typename _Expr::value_type>, _Expr> >
4610>::type
4611abs(const _Expr& __x)
4612{
4613 typedef typename _Expr::value_type value_type;
4614 typedef _UnaryOp<__abs_expr<value_type>, _Expr> _Op;
4615 return __val_expr<_Op>(_Op(__abs_expr<value_type>(), __x));
4616}
4617
4618template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004619inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004620typename enable_if
4621<
4622 __is_val_expr<_Expr>::value,
4623 __val_expr<_UnaryOp<__acos_expr<typename _Expr::value_type>, _Expr> >
4624>::type
4625acos(const _Expr& __x)
4626{
4627 typedef typename _Expr::value_type value_type;
4628 typedef _UnaryOp<__acos_expr<value_type>, _Expr> _Op;
4629 return __val_expr<_Op>(_Op(__acos_expr<value_type>(), __x));
4630}
4631
4632template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004633inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004634typename enable_if
4635<
4636 __is_val_expr<_Expr>::value,
4637 __val_expr<_UnaryOp<__asin_expr<typename _Expr::value_type>, _Expr> >
4638>::type
4639asin(const _Expr& __x)
4640{
4641 typedef typename _Expr::value_type value_type;
4642 typedef _UnaryOp<__asin_expr<value_type>, _Expr> _Op;
4643 return __val_expr<_Op>(_Op(__asin_expr<value_type>(), __x));
4644}
4645
4646template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004647inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004648typename enable_if
4649<
4650 __is_val_expr<_Expr>::value,
4651 __val_expr<_UnaryOp<__atan_expr<typename _Expr::value_type>, _Expr> >
4652>::type
4653atan(const _Expr& __x)
4654{
4655 typedef typename _Expr::value_type value_type;
4656 typedef _UnaryOp<__atan_expr<value_type>, _Expr> _Op;
4657 return __val_expr<_Op>(_Op(__atan_expr<value_type>(), __x));
4658}
4659
4660template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004661inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004662typename enable_if
4663<
4664 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4665 __val_expr<_BinaryOp<__atan2_expr<typename _Expr1::value_type>, _Expr1, _Expr2> >
4666>::type
4667atan2(const _Expr1& __x, const _Expr2& __y)
4668{
4669 typedef typename _Expr1::value_type value_type;
4670 typedef _BinaryOp<__atan2_expr<value_type>, _Expr1, _Expr2> _Op;
4671 return __val_expr<_Op>(_Op(__atan2_expr<value_type>(), __x, __y));
4672}
4673
4674template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004675inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004676typename enable_if
4677<
4678 __is_val_expr<_Expr>::value,
4679 __val_expr<_BinaryOp<__atan2_expr<typename _Expr::value_type>,
4680 _Expr, __scalar_expr<typename _Expr::value_type> > >
4681>::type
4682atan2(const _Expr& __x, const typename _Expr::value_type& __y)
4683{
4684 typedef typename _Expr::value_type value_type;
4685 typedef _BinaryOp<__atan2_expr<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4686 return __val_expr<_Op>(_Op(__atan2_expr<value_type>(),
4687 __x, __scalar_expr<value_type>(__y, __x.size())));
4688}
4689
4690template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004691inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004692typename enable_if
4693<
4694 __is_val_expr<_Expr>::value,
4695 __val_expr<_BinaryOp<__atan2_expr<typename _Expr::value_type>,
4696 __scalar_expr<typename _Expr::value_type>, _Expr> >
4697>::type
4698atan2(const typename _Expr::value_type& __x, const _Expr& __y)
4699{
4700 typedef typename _Expr::value_type value_type;
4701 typedef _BinaryOp<__atan2_expr<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4702 return __val_expr<_Op>(_Op(__atan2_expr<value_type>(),
4703 __scalar_expr<value_type>(__x, __y.size()), __y));
4704}
4705
4706template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004707inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004708typename enable_if
4709<
4710 __is_val_expr<_Expr>::value,
4711 __val_expr<_UnaryOp<__cos_expr<typename _Expr::value_type>, _Expr> >
4712>::type
4713cos(const _Expr& __x)
4714{
4715 typedef typename _Expr::value_type value_type;
4716 typedef _UnaryOp<__cos_expr<value_type>, _Expr> _Op;
4717 return __val_expr<_Op>(_Op(__cos_expr<value_type>(), __x));
4718}
4719
4720template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004721inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004722typename enable_if
4723<
4724 __is_val_expr<_Expr>::value,
4725 __val_expr<_UnaryOp<__cosh_expr<typename _Expr::value_type>, _Expr> >
4726>::type
4727cosh(const _Expr& __x)
4728{
4729 typedef typename _Expr::value_type value_type;
4730 typedef _UnaryOp<__cosh_expr<value_type>, _Expr> _Op;
4731 return __val_expr<_Op>(_Op(__cosh_expr<value_type>(), __x));
4732}
4733
4734template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004735inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004736typename enable_if
4737<
4738 __is_val_expr<_Expr>::value,
4739 __val_expr<_UnaryOp<__exp_expr<typename _Expr::value_type>, _Expr> >
4740>::type
4741exp(const _Expr& __x)
4742{
4743 typedef typename _Expr::value_type value_type;
4744 typedef _UnaryOp<__exp_expr<value_type>, _Expr> _Op;
4745 return __val_expr<_Op>(_Op(__exp_expr<value_type>(), __x));
4746}
4747
4748template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004749inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004750typename enable_if
4751<
4752 __is_val_expr<_Expr>::value,
4753 __val_expr<_UnaryOp<__log_expr<typename _Expr::value_type>, _Expr> >
4754>::type
4755log(const _Expr& __x)
4756{
4757 typedef typename _Expr::value_type value_type;
4758 typedef _UnaryOp<__log_expr<value_type>, _Expr> _Op;
4759 return __val_expr<_Op>(_Op(__log_expr<value_type>(), __x));
4760}
4761
4762template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004763inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004764typename enable_if
4765<
4766 __is_val_expr<_Expr>::value,
4767 __val_expr<_UnaryOp<__log10_expr<typename _Expr::value_type>, _Expr> >
4768>::type
4769log10(const _Expr& __x)
4770{
4771 typedef typename _Expr::value_type value_type;
4772 typedef _UnaryOp<__log10_expr<value_type>, _Expr> _Op;
4773 return __val_expr<_Op>(_Op(__log10_expr<value_type>(), __x));
4774}
4775
4776template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004777inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004778typename enable_if
4779<
4780 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4781 __val_expr<_BinaryOp<__pow_expr<typename _Expr1::value_type>, _Expr1, _Expr2> >
4782>::type
4783pow(const _Expr1& __x, const _Expr2& __y)
4784{
4785 typedef typename _Expr1::value_type value_type;
4786 typedef _BinaryOp<__pow_expr<value_type>, _Expr1, _Expr2> _Op;
4787 return __val_expr<_Op>(_Op(__pow_expr<value_type>(), __x, __y));
4788}
4789
4790template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004791inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004792typename enable_if
4793<
4794 __is_val_expr<_Expr>::value,
4795 __val_expr<_BinaryOp<__pow_expr<typename _Expr::value_type>,
4796 _Expr, __scalar_expr<typename _Expr::value_type> > >
4797>::type
4798pow(const _Expr& __x, const typename _Expr::value_type& __y)
4799{
4800 typedef typename _Expr::value_type value_type;
4801 typedef _BinaryOp<__pow_expr<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4802 return __val_expr<_Op>(_Op(__pow_expr<value_type>(),
4803 __x, __scalar_expr<value_type>(__y, __x.size())));
4804}
4805
4806template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004807inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004808typename enable_if
4809<
4810 __is_val_expr<_Expr>::value,
4811 __val_expr<_BinaryOp<__pow_expr<typename _Expr::value_type>,
4812 __scalar_expr<typename _Expr::value_type>, _Expr> >
4813>::type
4814pow(const typename _Expr::value_type& __x, const _Expr& __y)
4815{
4816 typedef typename _Expr::value_type value_type;
4817 typedef _BinaryOp<__pow_expr<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4818 return __val_expr<_Op>(_Op(__pow_expr<value_type>(),
4819 __scalar_expr<value_type>(__x, __y.size()), __y));
4820}
4821
4822template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004823inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004824typename enable_if
4825<
4826 __is_val_expr<_Expr>::value,
4827 __val_expr<_UnaryOp<__sin_expr<typename _Expr::value_type>, _Expr> >
4828>::type
4829sin(const _Expr& __x)
4830{
4831 typedef typename _Expr::value_type value_type;
4832 typedef _UnaryOp<__sin_expr<value_type>, _Expr> _Op;
4833 return __val_expr<_Op>(_Op(__sin_expr<value_type>(), __x));
4834}
4835
4836template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004837inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004838typename enable_if
4839<
4840 __is_val_expr<_Expr>::value,
4841 __val_expr<_UnaryOp<__sinh_expr<typename _Expr::value_type>, _Expr> >
4842>::type
4843sinh(const _Expr& __x)
4844{
4845 typedef typename _Expr::value_type value_type;
4846 typedef _UnaryOp<__sinh_expr<value_type>, _Expr> _Op;
4847 return __val_expr<_Op>(_Op(__sinh_expr<value_type>(), __x));
4848}
4849
4850template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004851inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004852typename enable_if
4853<
4854 __is_val_expr<_Expr>::value,
4855 __val_expr<_UnaryOp<__sqrt_expr<typename _Expr::value_type>, _Expr> >
4856>::type
4857sqrt(const _Expr& __x)
4858{
4859 typedef typename _Expr::value_type value_type;
4860 typedef _UnaryOp<__sqrt_expr<value_type>, _Expr> _Op;
4861 return __val_expr<_Op>(_Op(__sqrt_expr<value_type>(), __x));
4862}
4863
4864template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004865inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004866typename enable_if
4867<
4868 __is_val_expr<_Expr>::value,
4869 __val_expr<_UnaryOp<__tan_expr<typename _Expr::value_type>, _Expr> >
4870>::type
4871tan(const _Expr& __x)
4872{
4873 typedef typename _Expr::value_type value_type;
4874 typedef _UnaryOp<__tan_expr<value_type>, _Expr> _Op;
4875 return __val_expr<_Op>(_Op(__tan_expr<value_type>(), __x));
4876}
4877
4878template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004879inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004880typename enable_if
4881<
4882 __is_val_expr<_Expr>::value,
4883 __val_expr<_UnaryOp<__tanh_expr<typename _Expr::value_type>, _Expr> >
4884>::type
4885tanh(const _Expr& __x)
4886{
4887 typedef typename _Expr::value_type value_type;
4888 typedef _UnaryOp<__tanh_expr<value_type>, _Expr> _Op;
4889 return __val_expr<_Op>(_Op(__tanh_expr<value_type>(), __x));
4890}
4891
4892template <class _Tp>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004893inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004894_Tp*
4895begin(valarray<_Tp>& __v)
4896{
4897 return __v.__begin_;
4898}
4899
4900template <class _Tp>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004901inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004902const _Tp*
4903begin(const 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 +00004910_Tp*
4911end(valarray<_Tp>& __v)
4912{
4913 return __v.__end_;
4914}
4915
4916template <class _Tp>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004917inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004918const _Tp*
4919end(const valarray<_Tp>& __v)
4920{
4921 return __v.__end_;
4922}
4923
Howard Hinnantc51e1022010-05-11 19:42:16 +00004924_LIBCPP_END_NAMESPACE_STD
4925
Eric Fiselierf4433a32017-05-31 22:07:49 +00004926_LIBCPP_POP_MACROS
4927
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04004928#endif // _LIBCPP_VALARRAY