blob: 1c4875efad3701d2fd5a3fd8030180b0f503dcd6 [file] [log] [blame]
Howard Hinnantc51e1022010-05-11 19:42:16 +00001// -*- C++ -*-
2//===-------------------------- valarray ----------------------------------===//
3//
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
108class slice
109{
110public:
111 slice();
112 slice(size_t start, size_t size, size_t stride);
113
114 size_t start() const;
115 size_t size() const;
116 size_t stride() const;
117};
118
119template <class T>
120class slice_array
121{
122public:
123 typedef T value_type;
124
125 const slice_array& operator=(const slice_array& sa) const;
126 void operator= (const valarray<value_type>& v) const;
127 void operator*= (const valarray<value_type>& v) 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
138 void operator=(const value_type& x) const;
139
140 slice_array() = delete;
141};
142
143class gslice
144{
145public:
146 gslice();
147 gslice(size_t start, const valarray<size_t>& size,
148 const valarray<size_t>& stride);
149
150 size_t start() const;
151 valarray<size_t> size() const;
152 valarray<size_t> stride() const;
153};
154
155template <class T>
156class gslice_array
157{
158public:
159 typedef T value_type;
160
161 void operator= (const valarray<value_type>& v) const;
162 void operator*= (const valarray<value_type>& v) const;
163 void operator/= (const valarray<value_type>& v) const;
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
173 gslice_array(const gslice_array& ga);
174 ~gslice_array();
175 const gslice_array& operator=(const gslice_array& ga) const;
176 void operator=(const value_type& x) const;
177
178 gslice_array() = delete;
179};
180
181template <class T>
182class mask_array
183{
184public:
185 typedef T value_type;
186
187 void operator= (const valarray<value_type>& v) const;
188 void operator*= (const valarray<value_type>& v) const;
189 void operator/= (const valarray<value_type>& v) const;
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
199 mask_array(const mask_array& ma);
200 ~mask_array();
201 const mask_array& operator=(const mask_array& ma) const;
202 void operator=(const value_type& x) const;
203
204 mask_array() = delete;
205};
206
207template <class T>
208class indirect_array
209{
210public:
211 typedef T value_type;
212
213 void operator= (const valarray<value_type>& v) const;
214 void operator*= (const valarray<value_type>& v) const;
215 void operator/= (const valarray<value_type>& v) const;
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
225 indirect_array(const indirect_array& ia);
226 ~indirect_array();
227 const indirect_array& operator=(const indirect_array& ia) const;
228 void operator=(const value_type& x) const;
229
230 indirect_array() = delete;
231};
232
Howard Hinnant298aed92012-07-21 00:51:28 +0000233template<class T> void swap(valarray<T>& x, valarray<T>& y) noexcept;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000234
235template<class T> valarray<T> operator* (const valarray<T>& x, const valarray<T>& y);
236template<class T> valarray<T> operator* (const valarray<T>& x, const T& y);
237template<class T> valarray<T> operator* (const T& x, const valarray<T>& y);
238
239template<class T> valarray<T> operator/ (const valarray<T>& x, const valarray<T>& y);
240template<class T> valarray<T> operator/ (const valarray<T>& x, const T& y);
241template<class T> valarray<T> operator/ (const T& x, const valarray<T>& y);
242
243template<class T> valarray<T> operator% (const valarray<T>& x, const valarray<T>& y);
244template<class T> valarray<T> operator% (const valarray<T>& x, const T& y);
245template<class T> valarray<T> operator% (const T& x, const valarray<T>& y);
246
247template<class T> valarray<T> operator+ (const valarray<T>& x, const valarray<T>& y);
248template<class T> valarray<T> operator+ (const valarray<T>& x, const T& y);
249template<class T> valarray<T> operator+ (const T& x, const valarray<T>& y);
250
251template<class T> valarray<T> operator- (const valarray<T>& x, const valarray<T>& y);
252template<class T> valarray<T> operator- (const valarray<T>& x, const T& y);
253template<class T> valarray<T> operator- (const T& x, const valarray<T>& y);
254
255template<class T> valarray<T> operator^ (const valarray<T>& x, const valarray<T>& y);
256template<class T> valarray<T> operator^ (const valarray<T>& x, const T& y);
257template<class T> valarray<T> operator^ (const T& x, const valarray<T>& y);
258
259template<class T> valarray<T> operator& (const valarray<T>& x, const valarray<T>& y);
260template<class T> valarray<T> operator& (const valarray<T>& x, const T& y);
261template<class T> valarray<T> operator& (const T& x, const valarray<T>& y);
262
263template<class T> valarray<T> operator| (const valarray<T>& x, const valarray<T>& y);
264template<class T> valarray<T> operator| (const valarray<T>& x, const T& y);
265template<class T> valarray<T> operator| (const T& x, const valarray<T>& y);
266
267template<class T> valarray<T> operator<<(const valarray<T>& x, const valarray<T>& y);
268template<class T> valarray<T> operator<<(const valarray<T>& x, const T& y);
269template<class T> valarray<T> operator<<(const T& x, const valarray<T>& y);
270
271template<class T> valarray<T> operator>>(const valarray<T>& x, const valarray<T>& y);
272template<class T> valarray<T> operator>>(const valarray<T>& x, const T& y);
273template<class T> valarray<T> operator>>(const T& x, const valarray<T>& y);
274
275template<class T> valarray<bool> operator&&(const valarray<T>& x, const valarray<T>& y);
276template<class T> valarray<bool> operator&&(const valarray<T>& x, const T& y);
277template<class T> valarray<bool> operator&&(const T& x, const valarray<T>& y);
278
279template<class T> valarray<bool> operator||(const valarray<T>& x, const valarray<T>& y);
280template<class T> valarray<bool> operator||(const valarray<T>& x, const T& y);
281template<class T> valarray<bool> operator||(const T& x, const valarray<T>& y);
282
283template<class T> valarray<bool> operator==(const valarray<T>& x, const valarray<T>& y);
284template<class T> valarray<bool> operator==(const valarray<T>& x, const T& y);
285template<class T> valarray<bool> operator==(const T& x, const valarray<T>& y);
286
287template<class T> valarray<bool> operator!=(const valarray<T>& x, const valarray<T>& y);
288template<class T> valarray<bool> operator!=(const valarray<T>& x, const T& y);
289template<class T> valarray<bool> operator!=(const T& x, const valarray<T>& y);
290
291template<class T> valarray<bool> operator< (const valarray<T>& x, const valarray<T>& y);
292template<class T> valarray<bool> operator< (const valarray<T>& x, const T& y);
293template<class T> valarray<bool> operator< (const T& x, const valarray<T>& y);
294
295template<class T> valarray<bool> operator> (const valarray<T>& x, const valarray<T>& y);
296template<class T> valarray<bool> operator> (const valarray<T>& x, const T& y);
297template<class T> valarray<bool> operator> (const T& x, const valarray<T>& y);
298
299template<class T> valarray<bool> operator<=(const valarray<T>& x, const valarray<T>& y);
300template<class T> valarray<bool> operator<=(const valarray<T>& x, const T& y);
301template<class T> valarray<bool> operator<=(const T& x, const valarray<T>& y);
302
303template<class T> valarray<bool> operator>=(const valarray<T>& x, const valarray<T>& y);
304template<class T> valarray<bool> operator>=(const valarray<T>& x, const T& y);
305template<class T> valarray<bool> operator>=(const T& x, const valarray<T>& y);
306
307template<class T> valarray<T> abs (const valarray<T>& x);
308template<class T> valarray<T> acos (const valarray<T>& x);
309template<class T> valarray<T> asin (const valarray<T>& x);
310template<class T> valarray<T> atan (const valarray<T>& x);
311
312template<class T> valarray<T> atan2(const valarray<T>& x, const valarray<T>& y);
313template<class T> valarray<T> atan2(const valarray<T>& x, const T& y);
314template<class T> valarray<T> atan2(const T& x, const valarray<T>& y);
315
316template<class T> valarray<T> cos (const valarray<T>& x);
317template<class T> valarray<T> cosh (const valarray<T>& x);
318template<class T> valarray<T> exp (const valarray<T>& x);
319template<class T> valarray<T> log (const valarray<T>& x);
320template<class T> valarray<T> log10(const valarray<T>& x);
321
322template<class T> valarray<T> pow(const valarray<T>& x, const valarray<T>& y);
323template<class T> valarray<T> pow(const valarray<T>& x, const T& y);
324template<class T> valarray<T> pow(const T& x, const valarray<T>& y);
325
326template<class T> valarray<T> sin (const valarray<T>& x);
327template<class T> valarray<T> sinh (const valarray<T>& x);
328template<class T> valarray<T> sqrt (const valarray<T>& x);
329template<class T> valarray<T> tan (const valarray<T>& x);
330template<class T> valarray<T> tanh (const valarray<T>& x);
331
332template <class T> unspecified1 begin(valarray<T>& v);
333template <class T> unspecified2 begin(const valarray<T>& v);
334template <class T> unspecified1 end(valarray<T>& v);
335template <class T> unspecified2 end(const valarray<T>& v);
336
337} // std
338
339*/
340
341#include <__config>
342#include <cstddef>
343#include <cmath>
344#include <initializer_list>
345#include <algorithm>
346#include <functional>
Richard Smith1f1c1472014-06-04 19:54:15 +0000347#include <new>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000348
Howard Hinnantaaaa52b2011-10-17 20:05:10 +0000349#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
Howard Hinnantc51e1022010-05-11 19:42:16 +0000350#pragma GCC system_header
Howard Hinnantaaaa52b2011-10-17 20:05:10 +0000351#endif
Howard Hinnantc51e1022010-05-11 19:42:16 +0000352
Eric Fiselierf4433a32017-05-31 22:07:49 +0000353_LIBCPP_PUSH_MACROS
354#include <__undef_macros>
355
356
Howard Hinnantc51e1022010-05-11 19:42:16 +0000357_LIBCPP_BEGIN_NAMESPACE_STD
358
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000359template<class _Tp> class _LIBCPP_TEMPLATE_VIS valarray;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000360
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000361class _LIBCPP_TEMPLATE_VIS slice
Howard Hinnantc51e1022010-05-11 19:42:16 +0000362{
363 size_t __start_;
364 size_t __size_;
365 size_t __stride_;
366public:
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000367 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000368 slice()
369 : __start_(0),
370 __size_(0),
371 __stride_(0)
372 {}
373
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000374 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000375 slice(size_t __start, size_t __size, size_t __stride)
376 : __start_(__start),
377 __size_(__size),
378 __stride_(__stride)
379 {}
380
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000381 _LIBCPP_INLINE_VISIBILITY size_t start() const {return __start_;}
382 _LIBCPP_INLINE_VISIBILITY size_t size() const {return __size_;}
383 _LIBCPP_INLINE_VISIBILITY size_t stride() const {return __stride_;}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000384};
385
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000386template <class _Tp> class _LIBCPP_TEMPLATE_VIS slice_array;
Howard Hinnant8331b762013-03-06 23:30:19 +0000387class _LIBCPP_TYPE_VIS gslice;
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000388template <class _Tp> class _LIBCPP_TEMPLATE_VIS gslice_array;
389template <class _Tp> class _LIBCPP_TEMPLATE_VIS mask_array;
390template <class _Tp> class _LIBCPP_TEMPLATE_VIS indirect_array;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000391
392template <class _Tp>
Howard Hinnanta54386e2012-09-14 00:39:16 +0000393_LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000394_Tp*
395begin(valarray<_Tp>& __v);
396
397template <class _Tp>
Howard Hinnanta54386e2012-09-14 00:39:16 +0000398_LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000399const _Tp*
400begin(const valarray<_Tp>& __v);
401
402template <class _Tp>
Howard Hinnanta54386e2012-09-14 00:39:16 +0000403_LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000404_Tp*
405end(valarray<_Tp>& __v);
406
407template <class _Tp>
Howard Hinnanta54386e2012-09-14 00:39:16 +0000408_LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000409const _Tp*
410end(const valarray<_Tp>& __v);
411
412template <class _Op, class _A0>
413struct _UnaryOp
414{
415 typedef typename _Op::result_type result_type;
416 typedef typename _A0::value_type value_type;
417
418 _Op __op_;
419 _A0 __a0_;
420
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000421 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000422 _UnaryOp(const _Op& __op, const _A0& __a0) : __op_(__op), __a0_(__a0) {}
423
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000424 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000425 result_type operator[](size_t __i) const {return __op_(__a0_[__i]);}
426
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000427 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000428 size_t size() const {return __a0_.size();}
429};
430
431template <class _Op, class _A0, class _A1>
432struct _BinaryOp
433{
434 typedef typename _Op::result_type result_type;
435 typedef typename _A0::value_type value_type;
436
437 _Op __op_;
438 _A0 __a0_;
439 _A1 __a1_;
440
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000441 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000442 _BinaryOp(const _Op& __op, const _A0& __a0, const _A1& __a1)
443 : __op_(__op), __a0_(__a0), __a1_(__a1) {}
444
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000445 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000446 value_type operator[](size_t __i) const {return __op_(__a0_[__i], __a1_[__i]);}
447
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000448 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000449 size_t size() const {return __a0_.size();}
450};
451
452template <class _Tp>
453class __scalar_expr
454{
455public:
456 typedef _Tp value_type;
457 typedef const _Tp& result_type;
458private:
459 const value_type& __t_;
460 size_t __s_;
461public:
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000462 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000463 explicit __scalar_expr(const value_type& __t, size_t __s) : __t_(__t), __s_(__s) {}
464
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000465 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000466 result_type operator[](size_t) const {return __t_;}
467
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000468 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000469 size_t size() const {return __s_;}
470};
471
472template <class _Tp>
473struct __unary_plus : unary_function<_Tp, _Tp>
474{
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000475 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000476 _Tp operator()(const _Tp& __x) const
477 {return +__x;}
478};
479
480template <class _Tp>
481struct __bit_not : unary_function<_Tp, _Tp>
482{
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000483 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000484 _Tp operator()(const _Tp& __x) const
485 {return ~__x;}
486};
487
488template <class _Tp>
489struct __bit_shift_left : binary_function<_Tp, _Tp, _Tp>
490{
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000491 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000492 _Tp operator()(const _Tp& __x, const _Tp& __y) const
493 {return __x << __y;}
494};
495
496template <class _Tp>
497struct __bit_shift_right : binary_function<_Tp, _Tp, _Tp>
498{
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 _Tp& __y) const
501 {return __x >> __y;}
502};
503
Howard Hinnantc834c512011-11-29 18:15:50 +0000504template <class _Tp, class _Fp>
Howard Hinnantc51e1022010-05-11 19:42:16 +0000505struct __apply_expr : unary_function<_Tp, _Tp>
506{
507private:
Howard Hinnantc834c512011-11-29 18:15:50 +0000508 _Fp __f_;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000509public:
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000510 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc834c512011-11-29 18:15:50 +0000511 explicit __apply_expr(_Fp __f) : __f_(__f) {}
Howard Hinnantc51e1022010-05-11 19:42:16 +0000512
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000513 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000514 _Tp operator()(const _Tp& __x) const
515 {return __f_(__x);}
516};
517
518template <class _Tp>
519struct __abs_expr : unary_function<_Tp, _Tp>
520{
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000521 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000522 _Tp operator()(const _Tp& __x) const
523 {return abs(__x);}
524};
525
526template <class _Tp>
527struct __acos_expr : unary_function<_Tp, _Tp>
528{
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000529 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000530 _Tp operator()(const _Tp& __x) const
531 {return acos(__x);}
532};
533
534template <class _Tp>
535struct __asin_expr : unary_function<_Tp, _Tp>
536{
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000537 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000538 _Tp operator()(const _Tp& __x) const
539 {return asin(__x);}
540};
541
542template <class _Tp>
543struct __atan_expr : unary_function<_Tp, _Tp>
544{
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000545 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000546 _Tp operator()(const _Tp& __x) const
547 {return atan(__x);}
548};
549
550template <class _Tp>
551struct __atan2_expr : binary_function<_Tp, _Tp, _Tp>
552{
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000553 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000554 _Tp operator()(const _Tp& __x, const _Tp& __y) const
555 {return atan2(__x, __y);}
556};
557
558template <class _Tp>
559struct __cos_expr : unary_function<_Tp, _Tp>
560{
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000561 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000562 _Tp operator()(const _Tp& __x) const
563 {return cos(__x);}
564};
565
566template <class _Tp>
567struct __cosh_expr : unary_function<_Tp, _Tp>
568{
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 cosh(__x);}
572};
573
574template <class _Tp>
575struct __exp_expr : unary_function<_Tp, _Tp>
576{
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000577 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000578 _Tp operator()(const _Tp& __x) const
579 {return exp(__x);}
580};
581
582template <class _Tp>
583struct __log_expr : unary_function<_Tp, _Tp>
584{
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000585 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000586 _Tp operator()(const _Tp& __x) const
587 {return log(__x);}
588};
589
590template <class _Tp>
591struct __log10_expr : unary_function<_Tp, _Tp>
592{
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000593 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000594 _Tp operator()(const _Tp& __x) const
595 {return log10(__x);}
596};
597
598template <class _Tp>
599struct __pow_expr : binary_function<_Tp, _Tp, _Tp>
600{
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000601 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000602 _Tp operator()(const _Tp& __x, const _Tp& __y) const
603 {return pow(__x, __y);}
604};
605
606template <class _Tp>
607struct __sin_expr : unary_function<_Tp, _Tp>
608{
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000609 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000610 _Tp operator()(const _Tp& __x) const
611 {return sin(__x);}
612};
613
614template <class _Tp>
615struct __sinh_expr : unary_function<_Tp, _Tp>
616{
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000617 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000618 _Tp operator()(const _Tp& __x) const
619 {return sinh(__x);}
620};
621
622template <class _Tp>
623struct __sqrt_expr : unary_function<_Tp, _Tp>
624{
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000625 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000626 _Tp operator()(const _Tp& __x) const
627 {return sqrt(__x);}
628};
629
630template <class _Tp>
631struct __tan_expr : unary_function<_Tp, _Tp>
632{
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000633 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000634 _Tp operator()(const _Tp& __x) const
635 {return tan(__x);}
636};
637
638template <class _Tp>
639struct __tanh_expr : unary_function<_Tp, _Tp>
640{
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 tanh(__x);}
644};
645
646template <class _ValExpr>
647class __slice_expr
648{
649 typedef typename remove_reference<_ValExpr>::type _RmExpr;
650public:
651 typedef typename _RmExpr::value_type value_type;
652 typedef value_type result_type;
653
654private:
655 _ValExpr __expr_;
656 size_t __start_;
657 size_t __size_;
658 size_t __stride_;
659
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000660 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000661 __slice_expr(const slice& __sl, const _RmExpr& __e)
662 : __expr_(__e),
663 __start_(__sl.start()),
664 __size_(__sl.size()),
665 __stride_(__sl.stride())
666 {}
667public:
668
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000669 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000670 result_type operator[](size_t __i) const
671 {return __expr_[__start_ + __i * __stride_];}
672
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000673 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000674 size_t size() const {return __size_;}
675
Eric Fiselier7b31ed02019-04-02 08:05:23 +0000676 template <class> friend class __val_expr;
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000677 template <class> friend class _LIBCPP_TEMPLATE_VIS valarray;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000678};
679
680template <class _ValExpr>
681class __mask_expr;
682
683template <class _ValExpr>
684class __indirect_expr;
685
686template <class _ValExpr>
687class __shift_expr
688{
689 typedef typename remove_reference<_ValExpr>::type _RmExpr;
690public:
691 typedef typename _RmExpr::value_type value_type;
692 typedef value_type result_type;
693
694private:
695 _ValExpr __expr_;
696 size_t __size_;
697 ptrdiff_t __ul_;
698 ptrdiff_t __sn_;
699 ptrdiff_t __n_;
Howard Hinnantc834c512011-11-29 18:15:50 +0000700 static const ptrdiff_t _Np = static_cast<ptrdiff_t>(
Howard Hinnantc51e1022010-05-11 19:42:16 +0000701 sizeof(ptrdiff_t) * __CHAR_BIT__ - 1);
702
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000703 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000704 __shift_expr(int __n, const _RmExpr& __e)
705 : __expr_(__e),
706 __size_(__e.size()),
707 __n_(__n)
708 {
Howard Hinnantc834c512011-11-29 18:15:50 +0000709 ptrdiff_t __neg_n = static_cast<ptrdiff_t>(__n_ >> _Np);
710 __sn_ = __neg_n | static_cast<ptrdiff_t>(static_cast<size_t>(-__n_) >> _Np);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000711 __ul_ = ((__size_ - __n_) & ~__neg_n) | ((__n_ + 1) & __neg_n);
712 }
713public:
714
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000715 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000716 result_type operator[](size_t __j) const
717 {
Howard Hinnant28b24882011-12-01 20:21:04 +0000718 ptrdiff_t __i = static_cast<ptrdiff_t>(__j);
Howard Hinnantc834c512011-11-29 18:15:50 +0000719 ptrdiff_t __m = (__sn_ * __i - __ul_) >> _Np;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000720 return (__expr_[(__i + __n_) & __m] & __m) | (value_type() & ~__m);
721 }
722
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000723 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000724 size_t size() const {return __size_;}
725
726 template <class> friend class __val_expr;
727};
728
729template <class _ValExpr>
730class __cshift_expr
731{
732 typedef typename remove_reference<_ValExpr>::type _RmExpr;
733public:
734 typedef typename _RmExpr::value_type value_type;
735 typedef value_type result_type;
736
737private:
738 _ValExpr __expr_;
739 size_t __size_;
740 size_t __m_;
741 size_t __o1_;
742 size_t __o2_;
743
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000744 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000745 __cshift_expr(int __n, const _RmExpr& __e)
746 : __expr_(__e),
747 __size_(__e.size())
748 {
749 __n %= static_cast<int>(__size_);
750 if (__n >= 0)
751 {
752 __m_ = __size_ - __n;
753 __o1_ = __n;
754 __o2_ = __n - __size_;
755 }
756 else
757 {
758 __m_ = -__n;
759 __o1_ = __n + __size_;
760 __o2_ = __n;
761 }
762 }
763public:
764
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000765 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000766 result_type operator[](size_t __i) const
767 {
768 if (__i < __m_)
769 return __expr_[__i + __o1_];
770 return __expr_[__i + __o2_];
771 }
772
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000773 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000774 size_t size() const {return __size_;}
775
776 template <class> friend class __val_expr;
777};
778
779template<class _ValExpr>
780class __val_expr;
781
782template<class _ValExpr>
783struct __is_val_expr : false_type {};
784
785template<class _ValExpr>
786struct __is_val_expr<__val_expr<_ValExpr> > : true_type {};
787
788template<class _Tp>
789struct __is_val_expr<valarray<_Tp> > : true_type {};
790
791template<class _Tp>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000792class _LIBCPP_TEMPLATE_VIS valarray
Howard Hinnantc51e1022010-05-11 19:42:16 +0000793{
794public:
795 typedef _Tp value_type;
796 typedef _Tp result_type;
797
798private:
799 value_type* __begin_;
800 value_type* __end_;
801
802public:
803 // construct/destroy:
Douglas Gregor68902322012-05-19 07:14:17 +0000804 _LIBCPP_INLINE_VISIBILITY
805 valarray() : __begin_(0), __end_(0) {}
Louis Dionneb4d05d72018-10-16 19:26:23 +0000806 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Eric Fiseliere529a802016-09-16 00:13:55 +0000807 explicit valarray(size_t __n);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000808 _LIBCPP_INLINE_VISIBILITY
Douglas Gregor68902322012-05-19 07:14:17 +0000809 valarray(const value_type& __x, size_t __n);
810 valarray(const value_type* __p, size_t __n);
811 valarray(const valarray& __v);
Eric Fiselier3b0b81f2017-04-19 00:23:45 +0000812#ifndef _LIBCPP_CXX03_LANG
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000813 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant298aed92012-07-21 00:51:28 +0000814 valarray(valarray&& __v) _NOEXCEPT;
Douglas Gregor68902322012-05-19 07:14:17 +0000815 valarray(initializer_list<value_type> __il);
Eric Fiselier3b0b81f2017-04-19 00:23:45 +0000816#endif // _LIBCPP_CXX03_LANG
Douglas Gregor68902322012-05-19 07:14:17 +0000817 valarray(const slice_array<value_type>& __sa);
818 valarray(const gslice_array<value_type>& __ga);
819 valarray(const mask_array<value_type>& __ma);
820 valarray(const indirect_array<value_type>& __ia);
Louis Dionneb4d05d72018-10-16 19:26:23 +0000821 inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
Douglas Gregor68902322012-05-19 07:14:17 +0000822 ~valarray();
Howard Hinnantc51e1022010-05-11 19:42:16 +0000823
824 // assignment:
Douglas Gregor68902322012-05-19 07:14:17 +0000825 valarray& operator=(const valarray& __v);
Eric Fiselier3b0b81f2017-04-19 00:23:45 +0000826#ifndef _LIBCPP_CXX03_LANG
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000827 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant298aed92012-07-21 00:51:28 +0000828 valarray& operator=(valarray&& __v) _NOEXCEPT;
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000829 _LIBCPP_INLINE_VISIBILITY
Douglas Gregor68902322012-05-19 07:14:17 +0000830 valarray& operator=(initializer_list<value_type>);
Eric Fiselier3b0b81f2017-04-19 00:23:45 +0000831#endif // _LIBCPP_CXX03_LANG
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000832 _LIBCPP_INLINE_VISIBILITY
Douglas Gregor68902322012-05-19 07:14:17 +0000833 valarray& operator=(const value_type& __x);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000834 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000835 valarray& operator=(const slice_array<value_type>& __sa);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000836 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000837 valarray& operator=(const gslice_array<value_type>& __ga);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000838 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000839 valarray& operator=(const mask_array<value_type>& __ma);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000840 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000841 valarray& operator=(const indirect_array<value_type>& __ia);
Howard Hinnant329cd412011-07-27 23:19:59 +0000842 template <class _ValExpr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000843 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant329cd412011-07-27 23:19:59 +0000844 valarray& operator=(const __val_expr<_ValExpr>& __v);
Howard Hinnantc51e1022010-05-11 19:42:16 +0000845
846 // element access:
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000847 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000848 const value_type& operator[](size_t __i) const {return __begin_[__i];}
849
Howard Hinnant1c265cd2010-09-23 18:58:28 +0000850 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000851 value_type& operator[](size_t __i) {return __begin_[__i];}
852
853 // subset operations:
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000854 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000855 __val_expr<__slice_expr<const valarray&> > operator[](slice __s) const;
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000856 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000857 slice_array<value_type> operator[](slice __s);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000858 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000859 __val_expr<__indirect_expr<const valarray&> > operator[](const gslice& __gs) const;
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000860 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000861 gslice_array<value_type> operator[](const gslice& __gs);
Eric Fiselier3b0b81f2017-04-19 00:23:45 +0000862#ifndef _LIBCPP_CXX03_LANG
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000863 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000864 __val_expr<__indirect_expr<const valarray&> > operator[](gslice&& __gs) const;
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000865 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000866 gslice_array<value_type> operator[](gslice&& __gs);
Eric Fiselier3b0b81f2017-04-19 00:23:45 +0000867#endif // _LIBCPP_CXX03_LANG
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000868 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000869 __val_expr<__mask_expr<const valarray&> > operator[](const valarray<bool>& __vb) const;
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000870 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000871 mask_array<value_type> operator[](const valarray<bool>& __vb);
Eric Fiselier3b0b81f2017-04-19 00:23:45 +0000872#ifndef _LIBCPP_CXX03_LANG
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000873 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000874 __val_expr<__mask_expr<const valarray&> > operator[](valarray<bool>&& __vb) const;
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000875 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000876 mask_array<value_type> operator[](valarray<bool>&& __vb);
Eric Fiselier3b0b81f2017-04-19 00:23:45 +0000877#endif // _LIBCPP_CXX03_LANG
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000878 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000879 __val_expr<__indirect_expr<const valarray&> > operator[](const valarray<size_t>& __vs) const;
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000880 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000881 indirect_array<value_type> operator[](const valarray<size_t>& __vs);
Eric Fiselier3b0b81f2017-04-19 00:23:45 +0000882#ifndef _LIBCPP_CXX03_LANG
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000883 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000884 __val_expr<__indirect_expr<const valarray&> > operator[](valarray<size_t>&& __vs) const;
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000885 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000886 indirect_array<value_type> operator[](valarray<size_t>&& __vs);
Eric Fiselier3b0b81f2017-04-19 00:23:45 +0000887#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +0000888
889 // unary operators:
Douglas Gregor68902322012-05-19 07:14:17 +0000890 valarray operator+() const;
891 valarray operator-() const;
892 valarray operator~() const;
893 valarray<bool> operator!() const;
Howard Hinnantc51e1022010-05-11 19:42:16 +0000894
895 // computed assignment:
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000896 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000897 valarray& operator*= (const value_type& __x);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000898 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000899 valarray& operator/= (const value_type& __x);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000900 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000901 valarray& operator%= (const value_type& __x);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000902 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000903 valarray& operator+= (const value_type& __x);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000904 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000905 valarray& operator-= (const value_type& __x);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000906 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000907 valarray& operator^= (const value_type& __x);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000908 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000909 valarray& operator&= (const value_type& __x);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000910 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000911 valarray& operator|= (const value_type& __x);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000912 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000913 valarray& operator<<=(const value_type& __x);
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000914 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000915 valarray& operator>>=(const value_type& __x);
916
917 template <class _Expr>
918 typename enable_if
919 <
920 __is_val_expr<_Expr>::value,
921 valarray&
922 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000923 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000924 operator*= (const _Expr& __v);
925
926 template <class _Expr>
927 typename enable_if
928 <
929 __is_val_expr<_Expr>::value,
930 valarray&
931 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000932 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000933 operator/= (const _Expr& __v);
934
935 template <class _Expr>
936 typename enable_if
937 <
938 __is_val_expr<_Expr>::value,
939 valarray&
940 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000941 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000942 operator%= (const _Expr& __v);
943
944 template <class _Expr>
945 typename enable_if
946 <
947 __is_val_expr<_Expr>::value,
948 valarray&
949 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000950 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000951 operator+= (const _Expr& __v);
952
953 template <class _Expr>
954 typename enable_if
955 <
956 __is_val_expr<_Expr>::value,
957 valarray&
958 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000959 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000960 operator-= (const _Expr& __v);
961
962 template <class _Expr>
963 typename enable_if
964 <
965 __is_val_expr<_Expr>::value,
966 valarray&
967 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000968 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000969 operator^= (const _Expr& __v);
970
971 template <class _Expr>
972 typename enable_if
973 <
974 __is_val_expr<_Expr>::value,
975 valarray&
976 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000977 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000978 operator|= (const _Expr& __v);
979
980 template <class _Expr>
981 typename enable_if
982 <
983 __is_val_expr<_Expr>::value,
984 valarray&
985 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000986 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000987 operator&= (const _Expr& __v);
988
989 template <class _Expr>
990 typename enable_if
991 <
992 __is_val_expr<_Expr>::value,
993 valarray&
994 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +0000995 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +0000996 operator<<= (const _Expr& __v);
997
998 template <class _Expr>
999 typename enable_if
1000 <
1001 __is_val_expr<_Expr>::value,
1002 valarray&
1003 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001004 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001005 operator>>= (const _Expr& __v);
1006
1007 // member functions:
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001008 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant298aed92012-07-21 00:51:28 +00001009 void swap(valarray& __v) _NOEXCEPT;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001010
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001011 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant28b24882011-12-01 20:21:04 +00001012 size_t size() const {return static_cast<size_t>(__end_ - __begin_);}
Howard Hinnantc51e1022010-05-11 19:42:16 +00001013
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001014 _LIBCPP_INLINE_VISIBILITY
Douglas Gregor68902322012-05-19 07:14:17 +00001015 value_type sum() const;
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001016 _LIBCPP_INLINE_VISIBILITY
Douglas Gregor68902322012-05-19 07:14:17 +00001017 value_type min() const;
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001018 _LIBCPP_INLINE_VISIBILITY
Douglas Gregor68902322012-05-19 07:14:17 +00001019 value_type max() const;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001020
Douglas Gregor68902322012-05-19 07:14:17 +00001021 valarray shift (int __i) const;
1022 valarray cshift(int __i) const;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001023 valarray apply(value_type __f(value_type)) const;
1024 valarray apply(value_type __f(const value_type&)) const;
1025 void resize(size_t __n, value_type __x = value_type());
1026
1027private:
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00001028 template <class> friend class _LIBCPP_TEMPLATE_VIS valarray;
1029 template <class> friend class _LIBCPP_TEMPLATE_VIS slice_array;
1030 template <class> friend class _LIBCPP_TEMPLATE_VIS gslice_array;
1031 template <class> friend class _LIBCPP_TEMPLATE_VIS mask_array;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001032 template <class> friend class __mask_expr;
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00001033 template <class> friend class _LIBCPP_TEMPLATE_VIS indirect_array;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001034 template <class> friend class __indirect_expr;
1035 template <class> friend class __val_expr;
1036
1037 template <class _Up>
1038 friend
1039 _Up*
1040 begin(valarray<_Up>& __v);
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001041
Howard Hinnantc51e1022010-05-11 19:42:16 +00001042 template <class _Up>
1043 friend
1044 const _Up*
1045 begin(const valarray<_Up>& __v);
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001046
Howard Hinnantc51e1022010-05-11 19:42:16 +00001047 template <class _Up>
1048 friend
1049 _Up*
1050 end(valarray<_Up>& __v);
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001051
Howard Hinnantc51e1022010-05-11 19:42:16 +00001052 template <class _Up>
1053 friend
1054 const _Up*
1055 end(const valarray<_Up>& __v);
Mikhail Maltsev59de6f82018-02-08 11:33:48 +00001056
Eric Fiseliera119c322018-10-25 17:43:26 +00001057 _LIBCPP_INLINE_VISIBILITY
Eric Fiselier2856ef82018-10-25 17:21:30 +00001058 void __clear(size_t __capacity);
Mikhail Maltsev59de6f82018-02-08 11:33:48 +00001059 valarray& __assign_range(const value_type* __f, const value_type* __l);
Howard Hinnantc51e1022010-05-11 19:42:16 +00001060};
1061
Howard Hinnanta37d3cf2013-08-12 18:38:34 +00001062_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS valarray<size_t>::valarray(size_t))
1063_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS valarray<size_t>::~valarray())
1064_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void valarray<size_t>::resize(size_t, size_t))
1065
Howard Hinnantc51e1022010-05-11 19:42:16 +00001066template <class _Op, class _Tp>
1067struct _UnaryOp<_Op, valarray<_Tp> >
1068{
1069 typedef typename _Op::result_type result_type;
1070 typedef _Tp value_type;
1071
1072 _Op __op_;
1073 const valarray<_Tp>& __a0_;
1074
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001075 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001076 _UnaryOp(const _Op& __op, const valarray<_Tp>& __a0) : __op_(__op), __a0_(__a0) {}
1077
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001078 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001079 result_type operator[](size_t __i) const {return __op_(__a0_[__i]);}
1080
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001081 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001082 size_t size() const {return __a0_.size();}
1083};
1084
1085template <class _Op, class _Tp, class _A1>
1086struct _BinaryOp<_Op, valarray<_Tp>, _A1>
1087{
1088 typedef typename _Op::result_type result_type;
1089 typedef _Tp value_type;
1090
1091 _Op __op_;
1092 const valarray<_Tp>& __a0_;
1093 _A1 __a1_;
1094
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001095 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001096 _BinaryOp(const _Op& __op, const valarray<_Tp>& __a0, const _A1& __a1)
1097 : __op_(__op), __a0_(__a0), __a1_(__a1) {}
1098
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001099 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001100 value_type operator[](size_t __i) const {return __op_(__a0_[__i], __a1_[__i]);}
1101
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001102 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001103 size_t size() const {return __a0_.size();}
1104};
1105
1106template <class _Op, class _A0, class _Tp>
1107struct _BinaryOp<_Op, _A0, valarray<_Tp> >
1108{
1109 typedef typename _Op::result_type result_type;
1110 typedef _Tp value_type;
1111
1112 _Op __op_;
1113 _A0 __a0_;
1114 const valarray<_Tp>& __a1_;
1115
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001116 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001117 _BinaryOp(const _Op& __op, const _A0& __a0, const valarray<_Tp>& __a1)
1118 : __op_(__op), __a0_(__a0), __a1_(__a1) {}
1119
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001120 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001121 value_type operator[](size_t __i) const {return __op_(__a0_[__i], __a1_[__i]);}
1122
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001123 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001124 size_t size() const {return __a0_.size();}
1125};
1126
1127template <class _Op, class _Tp>
1128struct _BinaryOp<_Op, valarray<_Tp>, valarray<_Tp> >
1129{
1130 typedef typename _Op::result_type result_type;
1131 typedef _Tp value_type;
1132
1133 _Op __op_;
1134 const valarray<_Tp>& __a0_;
1135 const valarray<_Tp>& __a1_;
1136
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001137 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001138 _BinaryOp(const _Op& __op, const valarray<_Tp>& __a0, const valarray<_Tp>& __a1)
1139 : __op_(__op), __a0_(__a0), __a1_(__a1) {}
1140
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001141 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001142 value_type operator[](size_t __i) const {return __op_(__a0_[__i], __a1_[__i]);}
1143
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001144 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001145 size_t size() const {return __a0_.size();}
1146};
1147
1148// slice_array
1149
1150template <class _Tp>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00001151class _LIBCPP_TEMPLATE_VIS slice_array
Howard Hinnantc51e1022010-05-11 19:42:16 +00001152{
1153public:
1154 typedef _Tp value_type;
1155
1156private:
1157 value_type* __vp_;
1158 size_t __size_;
1159 size_t __stride_;
1160
1161public:
1162 template <class _Expr>
1163 typename enable_if
1164 <
1165 __is_val_expr<_Expr>::value,
1166 void
1167 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001168 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001169 operator=(const _Expr& __v) const;
1170
1171 template <class _Expr>
1172 typename enable_if
1173 <
1174 __is_val_expr<_Expr>::value,
1175 void
1176 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001177 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001178 operator*=(const _Expr& __v) const;
1179
1180 template <class _Expr>
1181 typename enable_if
1182 <
1183 __is_val_expr<_Expr>::value,
1184 void
1185 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001186 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001187 operator/=(const _Expr& __v) const;
1188
1189 template <class _Expr>
1190 typename enable_if
1191 <
1192 __is_val_expr<_Expr>::value,
1193 void
1194 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001195 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001196 operator%=(const _Expr& __v) const;
1197
1198 template <class _Expr>
1199 typename enable_if
1200 <
1201 __is_val_expr<_Expr>::value,
1202 void
1203 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001204 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001205 operator+=(const _Expr& __v) const;
1206
1207 template <class _Expr>
1208 typename enable_if
1209 <
1210 __is_val_expr<_Expr>::value,
1211 void
1212 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001213 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001214 operator-=(const _Expr& __v) const;
1215
1216 template <class _Expr>
1217 typename enable_if
1218 <
1219 __is_val_expr<_Expr>::value,
1220 void
1221 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001222 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001223 operator^=(const _Expr& __v) const;
1224
1225 template <class _Expr>
1226 typename enable_if
1227 <
1228 __is_val_expr<_Expr>::value,
1229 void
1230 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001231 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001232 operator&=(const _Expr& __v) const;
1233
1234 template <class _Expr>
1235 typename enable_if
1236 <
1237 __is_val_expr<_Expr>::value,
1238 void
1239 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001240 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001241 operator|=(const _Expr& __v) const;
1242
1243 template <class _Expr>
1244 typename enable_if
1245 <
1246 __is_val_expr<_Expr>::value,
1247 void
1248 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001249 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001250 operator<<=(const _Expr& __v) const;
1251
1252 template <class _Expr>
1253 typename enable_if
1254 <
1255 __is_val_expr<_Expr>::value,
1256 void
1257 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001258 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001259 operator>>=(const _Expr& __v) const;
1260
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001261 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001262 const slice_array& operator=(const slice_array& __sa) const;
1263
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001264 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001265 void operator=(const value_type& __x) const;
1266
1267private:
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001268 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001269 slice_array(const slice& __sl, const valarray<value_type>& __v)
1270 : __vp_(const_cast<value_type*>(__v.__begin_ + __sl.start())),
1271 __size_(__sl.size()),
1272 __stride_(__sl.stride())
1273 {}
1274
1275 template <class> friend class valarray;
1276 template <class> friend class sliceExpr;
1277};
1278
1279template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001280inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001281const slice_array<_Tp>&
1282slice_array<_Tp>::operator=(const slice_array& __sa) const
1283{
1284 value_type* __t = __vp_;
1285 const value_type* __s = __sa.__vp_;
1286 for (size_t __n = __size_; __n; --__n, __t += __stride_, __s += __sa.__stride_)
1287 *__t = *__s;
Eric Fiselier3b80ce92014-08-12 00:06:58 +00001288 return *this;
Howard Hinnantc51e1022010-05-11 19:42:16 +00001289}
1290
1291template <class _Tp>
1292template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001293inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001294typename enable_if
1295<
1296 __is_val_expr<_Expr>::value,
1297 void
1298>::type
1299slice_array<_Tp>::operator=(const _Expr& __v) const
1300{
1301 value_type* __t = __vp_;
1302 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1303 *__t = __v[__i];
1304}
1305
1306template <class _Tp>
1307template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001308inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001309typename enable_if
1310<
1311 __is_val_expr<_Expr>::value,
1312 void
1313>::type
1314slice_array<_Tp>::operator*=(const _Expr& __v) const
1315{
1316 value_type* __t = __vp_;
1317 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1318 *__t *= __v[__i];
1319}
1320
1321template <class _Tp>
1322template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001323inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001324typename enable_if
1325<
1326 __is_val_expr<_Expr>::value,
1327 void
1328>::type
1329slice_array<_Tp>::operator/=(const _Expr& __v) const
1330{
1331 value_type* __t = __vp_;
1332 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1333 *__t /= __v[__i];
1334}
1335
1336template <class _Tp>
1337template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001338inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001339typename enable_if
1340<
1341 __is_val_expr<_Expr>::value,
1342 void
1343>::type
1344slice_array<_Tp>::operator%=(const _Expr& __v) const
1345{
1346 value_type* __t = __vp_;
1347 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1348 *__t %= __v[__i];
1349}
1350
1351template <class _Tp>
1352template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001353inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001354typename enable_if
1355<
1356 __is_val_expr<_Expr>::value,
1357 void
1358>::type
1359slice_array<_Tp>::operator+=(const _Expr& __v) const
1360{
1361 value_type* __t = __vp_;
1362 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1363 *__t += __v[__i];
1364}
1365
1366template <class _Tp>
1367template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001368inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001369typename enable_if
1370<
1371 __is_val_expr<_Expr>::value,
1372 void
1373>::type
1374slice_array<_Tp>::operator-=(const _Expr& __v) const
1375{
1376 value_type* __t = __vp_;
1377 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1378 *__t -= __v[__i];
1379}
1380
1381template <class _Tp>
1382template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001383inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001384typename enable_if
1385<
1386 __is_val_expr<_Expr>::value,
1387 void
1388>::type
1389slice_array<_Tp>::operator^=(const _Expr& __v) const
1390{
1391 value_type* __t = __vp_;
1392 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1393 *__t ^= __v[__i];
1394}
1395
1396template <class _Tp>
1397template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001398inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001399typename enable_if
1400<
1401 __is_val_expr<_Expr>::value,
1402 void
1403>::type
1404slice_array<_Tp>::operator&=(const _Expr& __v) const
1405{
1406 value_type* __t = __vp_;
1407 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1408 *__t &= __v[__i];
1409}
1410
1411template <class _Tp>
1412template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001413inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001414typename enable_if
1415<
1416 __is_val_expr<_Expr>::value,
1417 void
1418>::type
1419slice_array<_Tp>::operator|=(const _Expr& __v) const
1420{
1421 value_type* __t = __vp_;
1422 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1423 *__t |= __v[__i];
1424}
1425
1426template <class _Tp>
1427template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001428inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001429typename enable_if
1430<
1431 __is_val_expr<_Expr>::value,
1432 void
1433>::type
1434slice_array<_Tp>::operator<<=(const _Expr& __v) const
1435{
1436 value_type* __t = __vp_;
1437 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1438 *__t <<= __v[__i];
1439}
1440
1441template <class _Tp>
1442template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001443inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001444typename enable_if
1445<
1446 __is_val_expr<_Expr>::value,
1447 void
1448>::type
1449slice_array<_Tp>::operator>>=(const _Expr& __v) const
1450{
1451 value_type* __t = __vp_;
1452 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1453 *__t >>= __v[__i];
1454}
1455
1456template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001457inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001458void
1459slice_array<_Tp>::operator=(const value_type& __x) const
1460{
1461 value_type* __t = __vp_;
1462 for (size_t __n = __size_; __n; --__n, __t += __stride_)
1463 *__t = __x;
1464}
1465
1466// gslice
1467
Howard Hinnant8331b762013-03-06 23:30:19 +00001468class _LIBCPP_TYPE_VIS gslice
Howard Hinnantc51e1022010-05-11 19:42:16 +00001469{
1470 valarray<size_t> __size_;
1471 valarray<size_t> __stride_;
1472 valarray<size_t> __1d_;
Howard Hinnant3b6579a2010-08-22 00:02:43 +00001473
Howard Hinnantc51e1022010-05-11 19:42:16 +00001474public:
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001475 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001476 gslice() {}
Douglas Gregor68902322012-05-19 07:14:17 +00001477
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001478 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001479 gslice(size_t __start, const valarray<size_t>& __size,
1480 const valarray<size_t>& __stride)
1481 : __size_(__size),
1482 __stride_(__stride)
1483 {__init(__start);}
1484
Eric Fiselier3b0b81f2017-04-19 00:23:45 +00001485#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001486
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001487 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001488 gslice(size_t __start, const valarray<size_t>& __size,
1489 valarray<size_t>&& __stride)
1490 : __size_(__size),
1491 __stride_(move(__stride))
1492 {__init(__start);}
1493
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001494 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001495 gslice(size_t __start, valarray<size_t>&& __size,
1496 const valarray<size_t>& __stride)
1497 : __size_(move(__size)),
1498 __stride_(__stride)
1499 {__init(__start);}
1500
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001501 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001502 gslice(size_t __start, valarray<size_t>&& __size,
1503 valarray<size_t>&& __stride)
1504 : __size_(move(__size)),
1505 __stride_(move(__stride))
1506 {__init(__start);}
1507
Eric Fiselier3b0b81f2017-04-19 00:23:45 +00001508#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001509
1510// gslice(const gslice&) = default;
1511// gslice(gslice&&) = default;
1512// gslice& operator=(const gslice&) = default;
1513// gslice& operator=(gslice&&) = default;
1514
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001515 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001516 size_t start() const {return __1d_.size() ? __1d_[0] : 0;}
1517
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001518 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001519 valarray<size_t> size() const {return __size_;}
1520
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001521 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001522 valarray<size_t> stride() const {return __stride_;}
1523
1524private:
1525 void __init(size_t __start);
1526
1527 template <class> friend class gslice_array;
1528 template <class> friend class valarray;
1529 template <class> friend class __val_expr;
1530};
1531
1532// gslice_array
1533
1534template <class _Tp>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00001535class _LIBCPP_TEMPLATE_VIS gslice_array
Howard Hinnantc51e1022010-05-11 19:42:16 +00001536{
1537public:
1538 typedef _Tp value_type;
1539
1540private:
1541 value_type* __vp_;
1542 valarray<size_t> __1d_;
1543
1544public:
1545 template <class _Expr>
1546 typename enable_if
1547 <
1548 __is_val_expr<_Expr>::value,
1549 void
1550 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001551 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001552 operator=(const _Expr& __v) const;
1553
1554 template <class _Expr>
1555 typename enable_if
1556 <
1557 __is_val_expr<_Expr>::value,
1558 void
1559 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001560 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001561 operator*=(const _Expr& __v) const;
1562
1563 template <class _Expr>
1564 typename enable_if
1565 <
1566 __is_val_expr<_Expr>::value,
1567 void
1568 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001569 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001570 operator/=(const _Expr& __v) const;
1571
1572 template <class _Expr>
1573 typename enable_if
1574 <
1575 __is_val_expr<_Expr>::value,
1576 void
1577 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001578 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001579 operator%=(const _Expr& __v) const;
1580
1581 template <class _Expr>
1582 typename enable_if
1583 <
1584 __is_val_expr<_Expr>::value,
1585 void
1586 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001587 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001588 operator+=(const _Expr& __v) const;
1589
1590 template <class _Expr>
1591 typename enable_if
1592 <
1593 __is_val_expr<_Expr>::value,
1594 void
1595 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001596 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001597 operator-=(const _Expr& __v) const;
1598
1599 template <class _Expr>
1600 typename enable_if
1601 <
1602 __is_val_expr<_Expr>::value,
1603 void
1604 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001605 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001606 operator^=(const _Expr& __v) const;
1607
1608 template <class _Expr>
1609 typename enable_if
1610 <
1611 __is_val_expr<_Expr>::value,
1612 void
1613 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001614 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001615 operator&=(const _Expr& __v) const;
1616
1617 template <class _Expr>
1618 typename enable_if
1619 <
1620 __is_val_expr<_Expr>::value,
1621 void
1622 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001623 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001624 operator|=(const _Expr& __v) const;
1625
1626 template <class _Expr>
1627 typename enable_if
1628 <
1629 __is_val_expr<_Expr>::value,
1630 void
1631 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001632 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001633 operator<<=(const _Expr& __v) const;
1634
1635 template <class _Expr>
1636 typename enable_if
1637 <
1638 __is_val_expr<_Expr>::value,
1639 void
1640 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001641 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001642 operator>>=(const _Expr& __v) const;
1643
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001644 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001645 const gslice_array& operator=(const gslice_array& __ga) const;
1646
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001647 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001648 void operator=(const value_type& __x) const;
1649
1650// gslice_array(const gslice_array&) = default;
1651// gslice_array(gslice_array&&) = default;
1652// gslice_array& operator=(const gslice_array&) = default;
1653// gslice_array& operator=(gslice_array&&) = default;
1654
1655private:
Howard Hinnantc51e1022010-05-11 19:42:16 +00001656 gslice_array(const gslice& __gs, const valarray<value_type>& __v)
1657 : __vp_(const_cast<value_type*>(__v.__begin_)),
1658 __1d_(__gs.__1d_)
1659 {}
1660
Eric Fiselier3b0b81f2017-04-19 00:23:45 +00001661#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001662 gslice_array(gslice&& __gs, const valarray<value_type>& __v)
1663 : __vp_(const_cast<value_type*>(__v.__begin_)),
1664 __1d_(move(__gs.__1d_))
1665 {}
Eric Fiselier3b0b81f2017-04-19 00:23:45 +00001666#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00001667
1668 template <class> friend class valarray;
1669};
1670
1671template <class _Tp>
1672template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001673inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001674typename enable_if
1675<
1676 __is_val_expr<_Expr>::value,
1677 void
1678>::type
1679gslice_array<_Tp>::operator=(const _Expr& __v) const
1680{
1681 typedef const size_t* _Ip;
1682 size_t __j = 0;
1683 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1684 __vp_[*__i] = __v[__j];
1685}
1686
1687template <class _Tp>
1688template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001689inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001690typename enable_if
1691<
1692 __is_val_expr<_Expr>::value,
1693 void
1694>::type
1695gslice_array<_Tp>::operator*=(const _Expr& __v) const
1696{
1697 typedef const size_t* _Ip;
1698 size_t __j = 0;
1699 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1700 __vp_[*__i] *= __v[__j];
1701}
1702
1703template <class _Tp>
1704template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001705inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001706typename enable_if
1707<
1708 __is_val_expr<_Expr>::value,
1709 void
1710>::type
1711gslice_array<_Tp>::operator/=(const _Expr& __v) const
1712{
1713 typedef const size_t* _Ip;
1714 size_t __j = 0;
1715 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1716 __vp_[*__i] /= __v[__j];
1717}
1718
1719template <class _Tp>
1720template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001721inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001722typename enable_if
1723<
1724 __is_val_expr<_Expr>::value,
1725 void
1726>::type
1727gslice_array<_Tp>::operator%=(const _Expr& __v) const
1728{
1729 typedef const size_t* _Ip;
1730 size_t __j = 0;
1731 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1732 __vp_[*__i] %= __v[__j];
1733}
1734
1735template <class _Tp>
1736template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001737inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001738typename enable_if
1739<
1740 __is_val_expr<_Expr>::value,
1741 void
1742>::type
1743gslice_array<_Tp>::operator+=(const _Expr& __v) const
1744{
1745 typedef const size_t* _Ip;
1746 size_t __j = 0;
1747 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1748 __vp_[*__i] += __v[__j];
1749}
1750
1751template <class _Tp>
1752template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001753inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001754typename enable_if
1755<
1756 __is_val_expr<_Expr>::value,
1757 void
1758>::type
1759gslice_array<_Tp>::operator-=(const _Expr& __v) const
1760{
1761 typedef const size_t* _Ip;
1762 size_t __j = 0;
1763 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1764 __vp_[*__i] -= __v[__j];
1765}
1766
1767template <class _Tp>
1768template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001769inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001770typename enable_if
1771<
1772 __is_val_expr<_Expr>::value,
1773 void
1774>::type
1775gslice_array<_Tp>::operator^=(const _Expr& __v) const
1776{
1777 typedef const size_t* _Ip;
1778 size_t __j = 0;
1779 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1780 __vp_[*__i] ^= __v[__j];
1781}
1782
1783template <class _Tp>
1784template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001785inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001786typename enable_if
1787<
1788 __is_val_expr<_Expr>::value,
1789 void
1790>::type
1791gslice_array<_Tp>::operator&=(const _Expr& __v) const
1792{
1793 typedef const size_t* _Ip;
1794 size_t __j = 0;
1795 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1796 __vp_[*__i] &= __v[__j];
1797}
1798
1799template <class _Tp>
1800template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001801inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001802typename enable_if
1803<
1804 __is_val_expr<_Expr>::value,
1805 void
1806>::type
1807gslice_array<_Tp>::operator|=(const _Expr& __v) const
1808{
1809 typedef const size_t* _Ip;
1810 size_t __j = 0;
1811 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1812 __vp_[*__i] |= __v[__j];
1813}
1814
1815template <class _Tp>
1816template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001817inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001818typename enable_if
1819<
1820 __is_val_expr<_Expr>::value,
1821 void
1822>::type
1823gslice_array<_Tp>::operator<<=(const _Expr& __v) const
1824{
1825 typedef const size_t* _Ip;
1826 size_t __j = 0;
1827 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1828 __vp_[*__i] <<= __v[__j];
1829}
1830
1831template <class _Tp>
1832template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001833inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001834typename enable_if
1835<
1836 __is_val_expr<_Expr>::value,
1837 void
1838>::type
1839gslice_array<_Tp>::operator>>=(const _Expr& __v) const
1840{
1841 typedef const size_t* _Ip;
1842 size_t __j = 0;
1843 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1844 __vp_[*__i] >>= __v[__j];
1845}
1846
1847template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001848inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001849const gslice_array<_Tp>&
1850gslice_array<_Tp>::operator=(const gslice_array& __ga) const
1851{
1852 typedef const size_t* _Ip;
1853 const value_type* __s = __ga.__vp_;
1854 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_, __j = __ga.__1d_.__begin_;
1855 __i != __e; ++__i, ++__j)
1856 __vp_[*__i] = __s[*__j];
1857 return *this;
1858}
1859
1860template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001861inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00001862void
1863gslice_array<_Tp>::operator=(const value_type& __x) const
1864{
1865 typedef const size_t* _Ip;
1866 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i)
1867 __vp_[*__i] = __x;
1868}
1869
1870// mask_array
1871
1872template <class _Tp>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00001873class _LIBCPP_TEMPLATE_VIS mask_array
Howard Hinnantc51e1022010-05-11 19:42:16 +00001874{
1875public:
1876 typedef _Tp value_type;
1877
1878private:
1879 value_type* __vp_;
1880 valarray<size_t> __1d_;
1881
1882public:
1883 template <class _Expr>
1884 typename enable_if
1885 <
1886 __is_val_expr<_Expr>::value,
1887 void
1888 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001889 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001890 operator=(const _Expr& __v) const;
1891
1892 template <class _Expr>
1893 typename enable_if
1894 <
1895 __is_val_expr<_Expr>::value,
1896 void
1897 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001898 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001899 operator*=(const _Expr& __v) const;
1900
1901 template <class _Expr>
1902 typename enable_if
1903 <
1904 __is_val_expr<_Expr>::value,
1905 void
1906 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001907 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001908 operator/=(const _Expr& __v) const;
1909
1910 template <class _Expr>
1911 typename enable_if
1912 <
1913 __is_val_expr<_Expr>::value,
1914 void
1915 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001916 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001917 operator%=(const _Expr& __v) const;
1918
1919 template <class _Expr>
1920 typename enable_if
1921 <
1922 __is_val_expr<_Expr>::value,
1923 void
1924 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001925 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001926 operator+=(const _Expr& __v) const;
1927
1928 template <class _Expr>
1929 typename enable_if
1930 <
1931 __is_val_expr<_Expr>::value,
1932 void
1933 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001934 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001935 operator-=(const _Expr& __v) const;
1936
1937 template <class _Expr>
1938 typename enable_if
1939 <
1940 __is_val_expr<_Expr>::value,
1941 void
1942 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001943 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001944 operator^=(const _Expr& __v) const;
1945
1946 template <class _Expr>
1947 typename enable_if
1948 <
1949 __is_val_expr<_Expr>::value,
1950 void
1951 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001952 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001953 operator&=(const _Expr& __v) const;
1954
1955 template <class _Expr>
1956 typename enable_if
1957 <
1958 __is_val_expr<_Expr>::value,
1959 void
1960 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001961 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001962 operator|=(const _Expr& __v) const;
1963
1964 template <class _Expr>
1965 typename enable_if
1966 <
1967 __is_val_expr<_Expr>::value,
1968 void
1969 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001970 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001971 operator<<=(const _Expr& __v) const;
1972
1973 template <class _Expr>
1974 typename enable_if
1975 <
1976 __is_val_expr<_Expr>::value,
1977 void
1978 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001979 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001980 operator>>=(const _Expr& __v) const;
1981
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001982 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001983 const mask_array& operator=(const mask_array& __ma) const;
1984
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001985 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001986 void operator=(const value_type& __x) const;
1987
1988// mask_array(const mask_array&) = default;
1989// mask_array(mask_array&&) = default;
1990// mask_array& operator=(const mask_array&) = default;
1991// mask_array& operator=(mask_array&&) = default;
1992
1993private:
Howard Hinnant1c265cd2010-09-23 18:58:28 +00001994 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00001995 mask_array(const valarray<bool>& __vb, const valarray<value_type>& __v)
1996 : __vp_(const_cast<value_type*>(__v.__begin_)),
Howard Hinnant28b24882011-12-01 20:21:04 +00001997 __1d_(static_cast<size_t>(count(__vb.__begin_, __vb.__end_, true)))
Howard Hinnantc51e1022010-05-11 19:42:16 +00001998 {
1999 size_t __j = 0;
2000 for (size_t __i = 0; __i < __vb.size(); ++__i)
2001 if (__vb[__i])
2002 __1d_[__j++] = __i;
2003 }
2004
2005 template <class> friend class valarray;
2006};
2007
2008template <class _Tp>
2009template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002010inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002011typename enable_if
2012<
2013 __is_val_expr<_Expr>::value,
2014 void
2015>::type
2016mask_array<_Tp>::operator=(const _Expr& __v) const
2017{
2018 size_t __n = __1d_.size();
2019 for (size_t __i = 0; __i < __n; ++__i)
2020 __vp_[__1d_[__i]] = __v[__i];
2021}
2022
2023template <class _Tp>
2024template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002025inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002026typename enable_if
2027<
2028 __is_val_expr<_Expr>::value,
2029 void
2030>::type
2031mask_array<_Tp>::operator*=(const _Expr& __v) const
2032{
2033 size_t __n = __1d_.size();
2034 for (size_t __i = 0; __i < __n; ++__i)
2035 __vp_[__1d_[__i]] *= __v[__i];
2036}
2037
2038template <class _Tp>
2039template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002040inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002041typename enable_if
2042<
2043 __is_val_expr<_Expr>::value,
2044 void
2045>::type
2046mask_array<_Tp>::operator/=(const _Expr& __v) const
2047{
2048 size_t __n = __1d_.size();
2049 for (size_t __i = 0; __i < __n; ++__i)
2050 __vp_[__1d_[__i]] /= __v[__i];
2051}
2052
2053template <class _Tp>
2054template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002055inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002056typename enable_if
2057<
2058 __is_val_expr<_Expr>::value,
2059 void
2060>::type
2061mask_array<_Tp>::operator%=(const _Expr& __v) const
2062{
2063 size_t __n = __1d_.size();
2064 for (size_t __i = 0; __i < __n; ++__i)
2065 __vp_[__1d_[__i]] %= __v[__i];
2066}
2067
2068template <class _Tp>
2069template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002070inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002071typename enable_if
2072<
2073 __is_val_expr<_Expr>::value,
2074 void
2075>::type
2076mask_array<_Tp>::operator+=(const _Expr& __v) const
2077{
2078 size_t __n = __1d_.size();
2079 for (size_t __i = 0; __i < __n; ++__i)
2080 __vp_[__1d_[__i]] += __v[__i];
2081}
2082
2083template <class _Tp>
2084template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002085inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002086typename enable_if
2087<
2088 __is_val_expr<_Expr>::value,
2089 void
2090>::type
2091mask_array<_Tp>::operator-=(const _Expr& __v) const
2092{
2093 size_t __n = __1d_.size();
2094 for (size_t __i = 0; __i < __n; ++__i)
2095 __vp_[__1d_[__i]] -= __v[__i];
2096}
2097
2098template <class _Tp>
2099template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002100inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002101typename enable_if
2102<
2103 __is_val_expr<_Expr>::value,
2104 void
2105>::type
2106mask_array<_Tp>::operator^=(const _Expr& __v) const
2107{
2108 size_t __n = __1d_.size();
2109 for (size_t __i = 0; __i < __n; ++__i)
2110 __vp_[__1d_[__i]] ^= __v[__i];
2111}
2112
2113template <class _Tp>
2114template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002115inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002116typename enable_if
2117<
2118 __is_val_expr<_Expr>::value,
2119 void
2120>::type
2121mask_array<_Tp>::operator&=(const _Expr& __v) const
2122{
2123 size_t __n = __1d_.size();
2124 for (size_t __i = 0; __i < __n; ++__i)
2125 __vp_[__1d_[__i]] &= __v[__i];
2126}
2127
2128template <class _Tp>
2129template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002130inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002131typename enable_if
2132<
2133 __is_val_expr<_Expr>::value,
2134 void
2135>::type
2136mask_array<_Tp>::operator|=(const _Expr& __v) const
2137{
2138 size_t __n = __1d_.size();
2139 for (size_t __i = 0; __i < __n; ++__i)
2140 __vp_[__1d_[__i]] |= __v[__i];
2141}
2142
2143template <class _Tp>
2144template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002145inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002146typename enable_if
2147<
2148 __is_val_expr<_Expr>::value,
2149 void
2150>::type
2151mask_array<_Tp>::operator<<=(const _Expr& __v) const
2152{
2153 size_t __n = __1d_.size();
2154 for (size_t __i = 0; __i < __n; ++__i)
2155 __vp_[__1d_[__i]] <<= __v[__i];
2156}
2157
2158template <class _Tp>
2159template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002160inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002161typename enable_if
2162<
2163 __is_val_expr<_Expr>::value,
2164 void
2165>::type
2166mask_array<_Tp>::operator>>=(const _Expr& __v) const
2167{
2168 size_t __n = __1d_.size();
2169 for (size_t __i = 0; __i < __n; ++__i)
2170 __vp_[__1d_[__i]] >>= __v[__i];
2171}
2172
2173template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002174inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002175const mask_array<_Tp>&
2176mask_array<_Tp>::operator=(const mask_array& __ma) const
2177{
2178 size_t __n = __1d_.size();
2179 for (size_t __i = 0; __i < __n; ++__i)
2180 __vp_[__1d_[__i]] = __ma.__vp_[__1d_[__i]];
Eric Fiselier3b80ce92014-08-12 00:06:58 +00002181 return *this;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002182}
2183
2184template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002185inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002186void
2187mask_array<_Tp>::operator=(const value_type& __x) const
2188{
2189 size_t __n = __1d_.size();
2190 for (size_t __i = 0; __i < __n; ++__i)
2191 __vp_[__1d_[__i]] = __x;
2192}
2193
2194template <class _ValExpr>
2195class __mask_expr
2196{
2197 typedef typename remove_reference<_ValExpr>::type _RmExpr;
2198public:
2199 typedef typename _RmExpr::value_type value_type;
2200 typedef value_type result_type;
2201
2202private:
2203 _ValExpr __expr_;
2204 valarray<size_t> __1d_;
2205
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002206 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002207 __mask_expr(const valarray<bool>& __vb, const _RmExpr& __e)
2208 : __expr_(__e),
Howard Hinnant28b24882011-12-01 20:21:04 +00002209 __1d_(static_cast<size_t>(count(__vb.__begin_, __vb.__end_, true)))
Howard Hinnantc51e1022010-05-11 19:42:16 +00002210 {
2211 size_t __j = 0;
2212 for (size_t __i = 0; __i < __vb.size(); ++__i)
2213 if (__vb[__i])
2214 __1d_[__j++] = __i;
2215 }
2216
2217public:
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002218 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002219 result_type operator[](size_t __i) const
2220 {return __expr_[__1d_[__i]];}
2221
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002222 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002223 size_t size() const {return __1d_.size();}
2224
Eric Fiselier7b31ed02019-04-02 08:05:23 +00002225 template <class> friend class __val_expr;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002226 template <class> friend class valarray;
2227};
2228
2229// indirect_array
2230
2231template <class _Tp>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00002232class _LIBCPP_TEMPLATE_VIS indirect_array
Howard Hinnantc51e1022010-05-11 19:42:16 +00002233{
2234public:
2235 typedef _Tp value_type;
2236
2237private:
2238 value_type* __vp_;
2239 valarray<size_t> __1d_;
2240
2241public:
2242 template <class _Expr>
2243 typename enable_if
2244 <
2245 __is_val_expr<_Expr>::value,
2246 void
2247 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002248 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002249 operator=(const _Expr& __v) const;
2250
2251 template <class _Expr>
2252 typename enable_if
2253 <
2254 __is_val_expr<_Expr>::value,
2255 void
2256 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002257 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002258 operator*=(const _Expr& __v) const;
2259
2260 template <class _Expr>
2261 typename enable_if
2262 <
2263 __is_val_expr<_Expr>::value,
2264 void
2265 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002266 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002267 operator/=(const _Expr& __v) const;
2268
2269 template <class _Expr>
2270 typename enable_if
2271 <
2272 __is_val_expr<_Expr>::value,
2273 void
2274 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002275 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002276 operator%=(const _Expr& __v) const;
2277
2278 template <class _Expr>
2279 typename enable_if
2280 <
2281 __is_val_expr<_Expr>::value,
2282 void
2283 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002284 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002285 operator+=(const _Expr& __v) const;
2286
2287 template <class _Expr>
2288 typename enable_if
2289 <
2290 __is_val_expr<_Expr>::value,
2291 void
2292 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002293 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002294 operator-=(const _Expr& __v) const;
2295
2296 template <class _Expr>
2297 typename enable_if
2298 <
2299 __is_val_expr<_Expr>::value,
2300 void
2301 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002302 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002303 operator^=(const _Expr& __v) const;
2304
2305 template <class _Expr>
2306 typename enable_if
2307 <
2308 __is_val_expr<_Expr>::value,
2309 void
2310 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002311 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002312 operator&=(const _Expr& __v) const;
2313
2314 template <class _Expr>
2315 typename enable_if
2316 <
2317 __is_val_expr<_Expr>::value,
2318 void
2319 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002320 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002321 operator|=(const _Expr& __v) const;
2322
2323 template <class _Expr>
2324 typename enable_if
2325 <
2326 __is_val_expr<_Expr>::value,
2327 void
2328 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002329 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002330 operator<<=(const _Expr& __v) const;
2331
2332 template <class _Expr>
2333 typename enable_if
2334 <
2335 __is_val_expr<_Expr>::value,
2336 void
2337 >::type
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002338 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002339 operator>>=(const _Expr& __v) const;
2340
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002341 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002342 const indirect_array& operator=(const indirect_array& __ia) const;
2343
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002344 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002345 void operator=(const value_type& __x) const;
2346
2347// indirect_array(const indirect_array&) = default;
2348// indirect_array(indirect_array&&) = default;
2349// indirect_array& operator=(const indirect_array&) = default;
2350// indirect_array& operator=(indirect_array&&) = default;
2351
2352private:
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002353 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002354 indirect_array(const valarray<size_t>& __ia, const valarray<value_type>& __v)
2355 : __vp_(const_cast<value_type*>(__v.__begin_)),
2356 __1d_(__ia)
2357 {}
2358
Eric Fiselier3b0b81f2017-04-19 00:23:45 +00002359#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00002360
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002361 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002362 indirect_array(valarray<size_t>&& __ia, const valarray<value_type>& __v)
2363 : __vp_(const_cast<value_type*>(__v.__begin_)),
2364 __1d_(move(__ia))
2365 {}
2366
Eric Fiselier3b0b81f2017-04-19 00:23:45 +00002367#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00002368
2369 template <class> friend class valarray;
2370};
2371
2372template <class _Tp>
2373template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002374inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002375typename enable_if
2376<
2377 __is_val_expr<_Expr>::value,
2378 void
2379>::type
2380indirect_array<_Tp>::operator=(const _Expr& __v) const
2381{
2382 size_t __n = __1d_.size();
2383 for (size_t __i = 0; __i < __n; ++__i)
2384 __vp_[__1d_[__i]] = __v[__i];
2385}
2386
2387template <class _Tp>
2388template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002389inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002390typename enable_if
2391<
2392 __is_val_expr<_Expr>::value,
2393 void
2394>::type
2395indirect_array<_Tp>::operator*=(const _Expr& __v) const
2396{
2397 size_t __n = __1d_.size();
2398 for (size_t __i = 0; __i < __n; ++__i)
2399 __vp_[__1d_[__i]] *= __v[__i];
2400}
2401
2402template <class _Tp>
2403template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002404inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002405typename enable_if
2406<
2407 __is_val_expr<_Expr>::value,
2408 void
2409>::type
2410indirect_array<_Tp>::operator/=(const _Expr& __v) const
2411{
2412 size_t __n = __1d_.size();
2413 for (size_t __i = 0; __i < __n; ++__i)
2414 __vp_[__1d_[__i]] /= __v[__i];
2415}
2416
2417template <class _Tp>
2418template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002419inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002420typename enable_if
2421<
2422 __is_val_expr<_Expr>::value,
2423 void
2424>::type
2425indirect_array<_Tp>::operator%=(const _Expr& __v) const
2426{
2427 size_t __n = __1d_.size();
2428 for (size_t __i = 0; __i < __n; ++__i)
2429 __vp_[__1d_[__i]] %= __v[__i];
2430}
2431
2432template <class _Tp>
2433template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002434inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002435typename enable_if
2436<
2437 __is_val_expr<_Expr>::value,
2438 void
2439>::type
2440indirect_array<_Tp>::operator+=(const _Expr& __v) const
2441{
2442 size_t __n = __1d_.size();
2443 for (size_t __i = 0; __i < __n; ++__i)
2444 __vp_[__1d_[__i]] += __v[__i];
2445}
2446
2447template <class _Tp>
2448template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002449inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002450typename enable_if
2451<
2452 __is_val_expr<_Expr>::value,
2453 void
2454>::type
2455indirect_array<_Tp>::operator-=(const _Expr& __v) const
2456{
2457 size_t __n = __1d_.size();
2458 for (size_t __i = 0; __i < __n; ++__i)
2459 __vp_[__1d_[__i]] -= __v[__i];
2460}
2461
2462template <class _Tp>
2463template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002464inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002465typename enable_if
2466<
2467 __is_val_expr<_Expr>::value,
2468 void
2469>::type
2470indirect_array<_Tp>::operator^=(const _Expr& __v) const
2471{
2472 size_t __n = __1d_.size();
2473 for (size_t __i = 0; __i < __n; ++__i)
2474 __vp_[__1d_[__i]] ^= __v[__i];
2475}
2476
2477template <class _Tp>
2478template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002479inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002480typename enable_if
2481<
2482 __is_val_expr<_Expr>::value,
2483 void
2484>::type
2485indirect_array<_Tp>::operator&=(const _Expr& __v) const
2486{
2487 size_t __n = __1d_.size();
2488 for (size_t __i = 0; __i < __n; ++__i)
2489 __vp_[__1d_[__i]] &= __v[__i];
2490}
2491
2492template <class _Tp>
2493template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002494inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002495typename enable_if
2496<
2497 __is_val_expr<_Expr>::value,
2498 void
2499>::type
2500indirect_array<_Tp>::operator|=(const _Expr& __v) const
2501{
2502 size_t __n = __1d_.size();
2503 for (size_t __i = 0; __i < __n; ++__i)
2504 __vp_[__1d_[__i]] |= __v[__i];
2505}
2506
2507template <class _Tp>
2508template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002509inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002510typename enable_if
2511<
2512 __is_val_expr<_Expr>::value,
2513 void
2514>::type
2515indirect_array<_Tp>::operator<<=(const _Expr& __v) const
2516{
2517 size_t __n = __1d_.size();
2518 for (size_t __i = 0; __i < __n; ++__i)
2519 __vp_[__1d_[__i]] <<= __v[__i];
2520}
2521
2522template <class _Tp>
2523template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002524inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002525typename enable_if
2526<
2527 __is_val_expr<_Expr>::value,
2528 void
2529>::type
2530indirect_array<_Tp>::operator>>=(const _Expr& __v) const
2531{
2532 size_t __n = __1d_.size();
2533 for (size_t __i = 0; __i < __n; ++__i)
2534 __vp_[__1d_[__i]] >>= __v[__i];
2535}
2536
2537template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002538inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002539const indirect_array<_Tp>&
2540indirect_array<_Tp>::operator=(const indirect_array& __ia) const
2541{
2542 typedef const size_t* _Ip;
2543 const value_type* __s = __ia.__vp_;
2544 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_, __j = __ia.__1d_.__begin_;
2545 __i != __e; ++__i, ++__j)
2546 __vp_[*__i] = __s[*__j];
2547 return *this;
2548}
2549
2550template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002551inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002552void
2553indirect_array<_Tp>::operator=(const value_type& __x) const
2554{
2555 typedef const size_t* _Ip;
2556 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i)
2557 __vp_[*__i] = __x;
2558}
2559
2560template <class _ValExpr>
2561class __indirect_expr
2562{
2563 typedef typename remove_reference<_ValExpr>::type _RmExpr;
2564public:
2565 typedef typename _RmExpr::value_type value_type;
2566 typedef value_type result_type;
2567
2568private:
2569 _ValExpr __expr_;
2570 valarray<size_t> __1d_;
2571
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002572 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002573 __indirect_expr(const valarray<size_t>& __ia, const _RmExpr& __e)
2574 : __expr_(__e),
2575 __1d_(__ia)
2576 {}
2577
Eric Fiselier3b0b81f2017-04-19 00:23:45 +00002578#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00002579
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002580 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002581 __indirect_expr(valarray<size_t>&& __ia, const _RmExpr& __e)
2582 : __expr_(__e),
2583 __1d_(move(__ia))
2584 {}
2585
Eric Fiselier3b0b81f2017-04-19 00:23:45 +00002586#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00002587
2588public:
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002589 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002590 result_type operator[](size_t __i) const
2591 {return __expr_[__1d_[__i]];}
2592
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002593 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002594 size_t size() const {return __1d_.size();}
2595
Eric Fiselier7b31ed02019-04-02 08:05:23 +00002596 template <class> friend class __val_expr;
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00002597 template <class> friend class _LIBCPP_TEMPLATE_VIS valarray;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002598};
2599
2600template<class _ValExpr>
2601class __val_expr
2602{
2603 typedef typename remove_reference<_ValExpr>::type _RmExpr;
2604
2605 _ValExpr __expr_;
2606public:
2607 typedef typename _RmExpr::value_type value_type;
2608 typedef typename _RmExpr::result_type result_type;
2609
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002610 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002611 explicit __val_expr(const _RmExpr& __e) : __expr_(__e) {}
2612
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002613 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002614 result_type operator[](size_t __i) const
2615 {return __expr_[__i];}
2616
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002617 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002618 __val_expr<__slice_expr<_ValExpr> > operator[](slice __s) const
Eric Fiselier7b31ed02019-04-02 08:05:23 +00002619 {
2620 typedef __slice_expr<_ValExpr> _NewExpr;
2621 return __val_expr< _NewExpr >(_NewExpr(__s, __expr_));
2622 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00002623
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002624 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002625 __val_expr<__indirect_expr<_ValExpr> > operator[](const gslice& __gs) const
Eric Fiselier7b31ed02019-04-02 08:05:23 +00002626 {
2627 typedef __indirect_expr<_ValExpr> _NewExpr;
2628 return __val_expr<_NewExpr >(_NewExpr(__gs.__1d_, __expr_));
2629 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00002630
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002631 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002632 __val_expr<__mask_expr<_ValExpr> > operator[](const valarray<bool>& __vb) const
Eric Fiselier7b31ed02019-04-02 08:05:23 +00002633 {
2634 typedef __mask_expr<_ValExpr> _NewExpr;
2635 return __val_expr< _NewExpr >( _NewExpr(__vb, __expr_));
2636 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00002637
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002638 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002639 __val_expr<__indirect_expr<_ValExpr> > operator[](const valarray<size_t>& __vs) const
Eric Fiselier7b31ed02019-04-02 08:05:23 +00002640 {
2641 typedef __indirect_expr<_ValExpr> _NewExpr;
2642 return __val_expr< _NewExpr >(_NewExpr(__vs, __expr_));
2643 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00002644
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002645 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002646 __val_expr<_UnaryOp<__unary_plus<value_type>, _ValExpr> >
2647 operator+() const
2648 {
2649 typedef _UnaryOp<__unary_plus<value_type>, _ValExpr> _NewExpr;
2650 return __val_expr<_NewExpr>(_NewExpr(__unary_plus<value_type>(), __expr_));
2651 }
2652
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002653 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002654 __val_expr<_UnaryOp<negate<value_type>, _ValExpr> >
2655 operator-() const
2656 {
2657 typedef _UnaryOp<negate<value_type>, _ValExpr> _NewExpr;
2658 return __val_expr<_NewExpr>(_NewExpr(negate<value_type>(), __expr_));
2659 }
2660
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002661 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002662 __val_expr<_UnaryOp<__bit_not<value_type>, _ValExpr> >
2663 operator~() const
2664 {
2665 typedef _UnaryOp<__bit_not<value_type>, _ValExpr> _NewExpr;
2666 return __val_expr<_NewExpr>(_NewExpr(__bit_not<value_type>(), __expr_));
2667 }
2668
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002669 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002670 __val_expr<_UnaryOp<logical_not<value_type>, _ValExpr> >
2671 operator!() const
2672 {
2673 typedef _UnaryOp<logical_not<value_type>, _ValExpr> _NewExpr;
2674 return __val_expr<_NewExpr>(_NewExpr(logical_not<value_type>(), __expr_));
2675 }
2676
2677 operator valarray<result_type>() const;
2678
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002679 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002680 size_t size() const {return __expr_.size();}
2681
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002682 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002683 result_type sum() const
2684 {
2685 size_t __n = __expr_.size();
2686 result_type __r = __n ? __expr_[0] : result_type();
2687 for (size_t __i = 1; __i < __n; ++__i)
2688 __r += __expr_[__i];
2689 return __r;
2690 }
2691
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002692 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002693 result_type min() const
2694 {
2695 size_t __n = size();
2696 result_type __r = __n ? (*this)[0] : result_type();
2697 for (size_t __i = 1; __i < __n; ++__i)
2698 {
2699 result_type __x = __expr_[__i];
2700 if (__x < __r)
2701 __r = __x;
2702 }
2703 return __r;
2704 }
2705
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002706 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002707 result_type max() const
2708 {
2709 size_t __n = size();
2710 result_type __r = __n ? (*this)[0] : result_type();
2711 for (size_t __i = 1; __i < __n; ++__i)
2712 {
2713 result_type __x = __expr_[__i];
2714 if (__r < __x)
2715 __r = __x;
2716 }
2717 return __r;
2718 }
2719
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002720 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002721 __val_expr<__shift_expr<_ValExpr> > shift (int __i) const
2722 {return __val_expr<__shift_expr<_ValExpr> >(__shift_expr<_ValExpr>(__i, __expr_));}
2723
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002724 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002725 __val_expr<__cshift_expr<_ValExpr> > cshift(int __i) const
2726 {return __val_expr<__cshift_expr<_ValExpr> >(__cshift_expr<_ValExpr>(__i, __expr_));}
2727
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002728 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002729 __val_expr<_UnaryOp<__apply_expr<value_type, value_type(*)(value_type)>, _ValExpr> >
2730 apply(value_type __f(value_type)) const
2731 {
2732 typedef __apply_expr<value_type, value_type(*)(value_type)> _Op;
2733 typedef _UnaryOp<_Op, _ValExpr> _NewExpr;
2734 return __val_expr<_NewExpr>(_NewExpr(_Op(__f), __expr_));
2735 }
2736
Howard Hinnant1c265cd2010-09-23 18:58:28 +00002737 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00002738 __val_expr<_UnaryOp<__apply_expr<value_type, value_type(*)(const value_type&)>, _ValExpr> >
2739 apply(value_type __f(const value_type&)) const
2740 {
2741 typedef __apply_expr<value_type, value_type(*)(const value_type&)> _Op;
2742 typedef _UnaryOp<_Op, _ValExpr> _NewExpr;
2743 return __val_expr<_NewExpr>(_NewExpr(_Op(__f), __expr_));
2744 }
2745};
2746
2747template<class _ValExpr>
Howard Hinnanta77b71b2013-09-13 23:27:42 +00002748__val_expr<_ValExpr>::operator valarray<__val_expr::result_type>() const
Howard Hinnantc51e1022010-05-11 19:42:16 +00002749{
2750 valarray<result_type> __r;
2751 size_t __n = __expr_.size();
2752 if (__n)
2753 {
2754 __r.__begin_ =
2755 __r.__end_ =
Eric Fiselier06548ab2018-03-22 04:42:56 +00002756 static_cast<result_type*>(
Eric Fiselier0f0ed9d2019-01-16 01:51:12 +00002757 _VSTD::__libcpp_allocate(__n * sizeof(result_type), _LIBCPP_ALIGNOF(result_type)));
Howard Hinnantc51e1022010-05-11 19:42:16 +00002758 for (size_t __i = 0; __i != __n; ++__r.__end_, ++__i)
2759 ::new (__r.__end_) result_type(__expr_[__i]);
2760 }
2761 return __r;
2762}
2763
2764// valarray
2765
2766template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002767inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002768valarray<_Tp>::valarray(size_t __n)
2769 : __begin_(0),
2770 __end_(0)
2771{
Mikhail Maltsev59de6f82018-02-08 11:33:48 +00002772 if (__n)
2773 {
Eric Fiselier06548ab2018-03-22 04:42:56 +00002774 __begin_ = __end_ = static_cast<value_type*>(
Eric Fiselier0f0ed9d2019-01-16 01:51:12 +00002775 _VSTD::__libcpp_allocate(__n * sizeof(value_type), _LIBCPP_ALIGNOF(value_type)));
Mikhail Maltsev59de6f82018-02-08 11:33:48 +00002776#ifndef _LIBCPP_NO_EXCEPTIONS
2777 try
2778 {
2779#endif // _LIBCPP_NO_EXCEPTIONS
Eric Fiselier2856ef82018-10-25 17:21:30 +00002780 for (size_t __n_left = __n; __n_left; --__n_left, ++__end_)
Mikhail Maltsev59de6f82018-02-08 11:33:48 +00002781 ::new (__end_) value_type();
2782#ifndef _LIBCPP_NO_EXCEPTIONS
2783 }
2784 catch (...)
2785 {
Eric Fiselier2856ef82018-10-25 17:21:30 +00002786 __clear(__n);
Mikhail Maltsev59de6f82018-02-08 11:33:48 +00002787 throw;
2788 }
2789#endif // _LIBCPP_NO_EXCEPTIONS
2790 }
Howard Hinnantc51e1022010-05-11 19:42:16 +00002791}
2792
2793template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002794inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00002795valarray<_Tp>::valarray(const value_type& __x, size_t __n)
2796 : __begin_(0),
2797 __end_(0)
2798{
2799 resize(__n, __x);
2800}
2801
2802template <class _Tp>
2803valarray<_Tp>::valarray(const value_type* __p, size_t __n)
2804 : __begin_(0),
2805 __end_(0)
2806{
2807 if (__n)
2808 {
Eric Fiselier06548ab2018-03-22 04:42:56 +00002809 __begin_ = __end_ = static_cast<value_type*>(
Eric Fiselier0f0ed9d2019-01-16 01:51:12 +00002810 _VSTD::__libcpp_allocate(__n * sizeof(value_type), _LIBCPP_ALIGNOF(value_type)));
Howard Hinnantc51e1022010-05-11 19:42:16 +00002811#ifndef _LIBCPP_NO_EXCEPTIONS
2812 try
2813 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +00002814#endif // _LIBCPP_NO_EXCEPTIONS
Eric Fiselier2856ef82018-10-25 17:21:30 +00002815 for (size_t __n_left = __n; __n_left; ++__end_, ++__p, --__n_left)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002816 ::new (__end_) value_type(*__p);
2817#ifndef _LIBCPP_NO_EXCEPTIONS
2818 }
2819 catch (...)
2820 {
Eric Fiselier2856ef82018-10-25 17:21:30 +00002821 __clear(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002822 throw;
2823 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +00002824#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00002825 }
2826}
2827
2828template <class _Tp>
2829valarray<_Tp>::valarray(const valarray& __v)
2830 : __begin_(0),
2831 __end_(0)
2832{
2833 if (__v.size())
2834 {
Eric Fiselier06548ab2018-03-22 04:42:56 +00002835 __begin_ = __end_ = static_cast<value_type*>(
Eric Fiselier0f0ed9d2019-01-16 01:51:12 +00002836 _VSTD::__libcpp_allocate(__v.size() * sizeof(value_type), _LIBCPP_ALIGNOF(value_type)));
Howard Hinnantc51e1022010-05-11 19:42:16 +00002837#ifndef _LIBCPP_NO_EXCEPTIONS
2838 try
2839 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +00002840#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00002841 for (value_type* __p = __v.__begin_; __p != __v.__end_; ++__end_, ++__p)
2842 ::new (__end_) value_type(*__p);
2843#ifndef _LIBCPP_NO_EXCEPTIONS
2844 }
2845 catch (...)
2846 {
Eric Fiselier2856ef82018-10-25 17:21:30 +00002847 __clear(__v.size());
Howard Hinnantc51e1022010-05-11 19:42:16 +00002848 throw;
2849 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +00002850#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00002851 }
2852}
2853
Eric Fiselier3b0b81f2017-04-19 00:23:45 +00002854#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00002855
2856template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00002857inline
Howard Hinnant298aed92012-07-21 00:51:28 +00002858valarray<_Tp>::valarray(valarray&& __v) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00002859 : __begin_(__v.__begin_),
2860 __end_(__v.__end_)
2861{
2862 __v.__begin_ = __v.__end_ = nullptr;
2863}
2864
2865template <class _Tp>
2866valarray<_Tp>::valarray(initializer_list<value_type> __il)
2867 : __begin_(0),
2868 __end_(0)
2869{
Eric Fiselier2856ef82018-10-25 17:21:30 +00002870 const size_t __n = __il.size();
Howard Hinnantc51e1022010-05-11 19:42:16 +00002871 if (__n)
2872 {
Eric Fiselier06548ab2018-03-22 04:42:56 +00002873 __begin_ = __end_ = static_cast<value_type*>(
Eric Fiselier0f0ed9d2019-01-16 01:51:12 +00002874_VSTD::__libcpp_allocate(__n * sizeof(value_type), _LIBCPP_ALIGNOF(value_type)));
Howard Hinnantc51e1022010-05-11 19:42:16 +00002875#ifndef _LIBCPP_NO_EXCEPTIONS
2876 try
2877 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +00002878#endif // _LIBCPP_NO_EXCEPTIONS
Eric Fiselier2856ef82018-10-25 17:21:30 +00002879 size_t __n_left = __n;
2880 for (const value_type* __p = __il.begin(); __n_left; ++__end_, ++__p, --__n_left)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002881 ::new (__end_) value_type(*__p);
2882#ifndef _LIBCPP_NO_EXCEPTIONS
2883 }
2884 catch (...)
2885 {
Eric Fiselier2856ef82018-10-25 17:21:30 +00002886 __clear(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002887 throw;
2888 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +00002889#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00002890 }
2891}
2892
Eric Fiselier3b0b81f2017-04-19 00:23:45 +00002893#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00002894
2895template <class _Tp>
2896valarray<_Tp>::valarray(const slice_array<value_type>& __sa)
2897 : __begin_(0),
2898 __end_(0)
2899{
Eric Fiselier2856ef82018-10-25 17:21:30 +00002900 const size_t __n = __sa.__size_;
Howard Hinnantc51e1022010-05-11 19:42:16 +00002901 if (__n)
2902 {
Eric Fiselier06548ab2018-03-22 04:42:56 +00002903 __begin_ = __end_ = static_cast<value_type*>(
Eric Fiselier0f0ed9d2019-01-16 01:51:12 +00002904 _VSTD::__libcpp_allocate(__n * sizeof(value_type), _LIBCPP_ALIGNOF(value_type)));
Howard Hinnantc51e1022010-05-11 19:42:16 +00002905#ifndef _LIBCPP_NO_EXCEPTIONS
2906 try
2907 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +00002908#endif // _LIBCPP_NO_EXCEPTIONS
Eric Fiselier2856ef82018-10-25 17:21:30 +00002909 size_t __n_left = __n;
2910 for (const value_type* __p = __sa.__vp_; __n_left; ++__end_, __p += __sa.__stride_, --__n_left)
Howard Hinnantc51e1022010-05-11 19:42:16 +00002911 ::new (__end_) value_type(*__p);
2912#ifndef _LIBCPP_NO_EXCEPTIONS
2913 }
2914 catch (...)
2915 {
Eric Fiselier2856ef82018-10-25 17:21:30 +00002916 __clear(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002917 throw;
2918 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +00002919#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00002920 }
2921}
2922
2923template <class _Tp>
2924valarray<_Tp>::valarray(const gslice_array<value_type>& __ga)
2925 : __begin_(0),
2926 __end_(0)
2927{
Eric Fiselier2856ef82018-10-25 17:21:30 +00002928 const size_t __n = __ga.__1d_.size();
Howard Hinnantc51e1022010-05-11 19:42:16 +00002929 if (__n)
2930 {
Eric Fiselier06548ab2018-03-22 04:42:56 +00002931 __begin_ = __end_ = static_cast<value_type*>(
Eric Fiselier0f0ed9d2019-01-16 01:51:12 +00002932 _VSTD::__libcpp_allocate(__n * sizeof(value_type), _LIBCPP_ALIGNOF(value_type)));
Howard Hinnantc51e1022010-05-11 19:42:16 +00002933#ifndef _LIBCPP_NO_EXCEPTIONS
2934 try
2935 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +00002936#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00002937 typedef const size_t* _Ip;
2938 const value_type* __s = __ga.__vp_;
2939 for (_Ip __i = __ga.__1d_.__begin_, __e = __ga.__1d_.__end_;
2940 __i != __e; ++__i, ++__end_)
2941 ::new (__end_) value_type(__s[*__i]);
2942#ifndef _LIBCPP_NO_EXCEPTIONS
2943 }
2944 catch (...)
2945 {
Eric Fiselier2856ef82018-10-25 17:21:30 +00002946 __clear(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002947 throw;
2948 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +00002949#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00002950 }
2951}
2952
2953template <class _Tp>
2954valarray<_Tp>::valarray(const mask_array<value_type>& __ma)
2955 : __begin_(0),
2956 __end_(0)
2957{
Eric Fiselier2856ef82018-10-25 17:21:30 +00002958 const size_t __n = __ma.__1d_.size();
Howard Hinnantc51e1022010-05-11 19:42:16 +00002959 if (__n)
2960 {
Eric Fiselier06548ab2018-03-22 04:42:56 +00002961 __begin_ = __end_ = static_cast<value_type*>(
Eric Fiselier0f0ed9d2019-01-16 01:51:12 +00002962 _VSTD::__libcpp_allocate(__n * sizeof(value_type), _LIBCPP_ALIGNOF(value_type)));
Howard Hinnantc51e1022010-05-11 19:42:16 +00002963#ifndef _LIBCPP_NO_EXCEPTIONS
2964 try
2965 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +00002966#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00002967 typedef const size_t* _Ip;
2968 const value_type* __s = __ma.__vp_;
2969 for (_Ip __i = __ma.__1d_.__begin_, __e = __ma.__1d_.__end_;
2970 __i != __e; ++__i, ++__end_)
2971 ::new (__end_) value_type(__s[*__i]);
2972#ifndef _LIBCPP_NO_EXCEPTIONS
2973 }
2974 catch (...)
2975 {
Eric Fiselier2856ef82018-10-25 17:21:30 +00002976 __clear(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00002977 throw;
2978 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +00002979#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00002980 }
2981}
2982
2983template <class _Tp>
2984valarray<_Tp>::valarray(const indirect_array<value_type>& __ia)
2985 : __begin_(0),
2986 __end_(0)
2987{
Eric Fiselier2856ef82018-10-25 17:21:30 +00002988 const size_t __n = __ia.__1d_.size();
Howard Hinnantc51e1022010-05-11 19:42:16 +00002989 if (__n)
2990 {
Eric Fiselier06548ab2018-03-22 04:42:56 +00002991 __begin_ = __end_ = static_cast<value_type*>(
Eric Fiselier0f0ed9d2019-01-16 01:51:12 +00002992 _VSTD::__libcpp_allocate(__n * sizeof(value_type), _LIBCPP_ALIGNOF(value_type)));
Howard Hinnantc51e1022010-05-11 19:42:16 +00002993#ifndef _LIBCPP_NO_EXCEPTIONS
2994 try
2995 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +00002996#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00002997 typedef const size_t* _Ip;
2998 const value_type* __s = __ia.__vp_;
2999 for (_Ip __i = __ia.__1d_.__begin_, __e = __ia.__1d_.__end_;
3000 __i != __e; ++__i, ++__end_)
3001 ::new (__end_) value_type(__s[*__i]);
3002#ifndef _LIBCPP_NO_EXCEPTIONS
3003 }
3004 catch (...)
3005 {
Eric Fiselier2856ef82018-10-25 17:21:30 +00003006 __clear(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003007 throw;
3008 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +00003009#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00003010 }
3011}
3012
3013template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003014inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003015valarray<_Tp>::~valarray()
3016{
Eric Fiselier2856ef82018-10-25 17:21:30 +00003017 __clear(size());
Mikhail Maltsev59de6f82018-02-08 11:33:48 +00003018}
3019
3020template <class _Tp>
3021valarray<_Tp>&
3022valarray<_Tp>::__assign_range(const value_type* __f, const value_type* __l)
3023{
3024 size_t __n = __l - __f;
3025 if (size() != __n)
3026 {
Eric Fiselier2856ef82018-10-25 17:21:30 +00003027 __clear(size());
Eric Fiselier06548ab2018-03-22 04:42:56 +00003028 __begin_ = static_cast<value_type*>(
Eric Fiselier0f0ed9d2019-01-16 01:51:12 +00003029 _VSTD::__libcpp_allocate(__n * sizeof(value_type), _LIBCPP_ALIGNOF(value_type)));
Mikhail Maltsev59de6f82018-02-08 11:33:48 +00003030 __end_ = __begin_ + __n;
3031 _VSTD::uninitialized_copy(__f, __l, __begin_);
3032 } else {
3033 _VSTD::copy(__f, __l, __begin_);
3034 }
3035 return *this;
Howard Hinnantc51e1022010-05-11 19:42:16 +00003036}
3037
3038template <class _Tp>
3039valarray<_Tp>&
3040valarray<_Tp>::operator=(const valarray& __v)
3041{
3042 if (this != &__v)
Mikhail Maltsev59de6f82018-02-08 11:33:48 +00003043 return __assign_range(__v.__begin_, __v.__end_);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003044 return *this;
3045}
3046
Eric Fiselier3b0b81f2017-04-19 00:23:45 +00003047#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00003048
3049template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003050inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003051valarray<_Tp>&
Howard Hinnant298aed92012-07-21 00:51:28 +00003052valarray<_Tp>::operator=(valarray&& __v) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00003053{
Eric Fiselier2856ef82018-10-25 17:21:30 +00003054 __clear(size());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003055 __begin_ = __v.__begin_;
3056 __end_ = __v.__end_;
3057 __v.__begin_ = nullptr;
3058 __v.__end_ = nullptr;
3059 return *this;
3060}
3061
3062template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003063inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003064valarray<_Tp>&
3065valarray<_Tp>::operator=(initializer_list<value_type> __il)
3066{
Mikhail Maltsev59de6f82018-02-08 11:33:48 +00003067 return __assign_range(__il.begin(), __il.end());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003068}
3069
Eric Fiselier3b0b81f2017-04-19 00:23:45 +00003070#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00003071
3072template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003073inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003074valarray<_Tp>&
3075valarray<_Tp>::operator=(const value_type& __x)
3076{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003077 _VSTD::fill(__begin_, __end_, __x);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003078 return *this;
3079}
3080
3081template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003082inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003083valarray<_Tp>&
3084valarray<_Tp>::operator=(const slice_array<value_type>& __sa)
3085{
3086 value_type* __t = __begin_;
3087 const value_type* __s = __sa.__vp_;
3088 for (size_t __n = __sa.__size_; __n; --__n, __s += __sa.__stride_, ++__t)
3089 *__t = *__s;
3090 return *this;
3091}
3092
3093template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003094inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003095valarray<_Tp>&
3096valarray<_Tp>::operator=(const gslice_array<value_type>& __ga)
3097{
3098 typedef const size_t* _Ip;
3099 value_type* __t = __begin_;
3100 const value_type* __s = __ga.__vp_;
3101 for (_Ip __i = __ga.__1d_.__begin_, __e = __ga.__1d_.__end_;
3102 __i != __e; ++__i, ++__t)
3103 *__t = __s[*__i];
3104 return *this;
3105}
3106
3107template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003108inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003109valarray<_Tp>&
3110valarray<_Tp>::operator=(const mask_array<value_type>& __ma)
3111{
3112 typedef const size_t* _Ip;
3113 value_type* __t = __begin_;
3114 const value_type* __s = __ma.__vp_;
3115 for (_Ip __i = __ma.__1d_.__begin_, __e = __ma.__1d_.__end_;
3116 __i != __e; ++__i, ++__t)
3117 *__t = __s[*__i];
3118 return *this;
3119}
3120
3121template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003122inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003123valarray<_Tp>&
3124valarray<_Tp>::operator=(const indirect_array<value_type>& __ia)
3125{
3126 typedef const size_t* _Ip;
3127 value_type* __t = __begin_;
3128 const value_type* __s = __ia.__vp_;
3129 for (_Ip __i = __ia.__1d_.__begin_, __e = __ia.__1d_.__end_;
3130 __i != __e; ++__i, ++__t)
3131 *__t = __s[*__i];
3132 return *this;
3133}
3134
3135template <class _Tp>
Howard Hinnant329cd412011-07-27 23:19:59 +00003136template <class _ValExpr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003137inline
Howard Hinnant329cd412011-07-27 23:19:59 +00003138valarray<_Tp>&
3139valarray<_Tp>::operator=(const __val_expr<_ValExpr>& __v)
3140{
3141 size_t __n = __v.size();
3142 if (size() != __n)
3143 resize(__n);
3144 value_type* __t = __begin_;
3145 for (size_t __i = 0; __i != __n; ++__t, ++__i)
3146 *__t = result_type(__v[__i]);
3147 return *this;
3148}
3149
3150template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003151inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003152__val_expr<__slice_expr<const valarray<_Tp>&> >
3153valarray<_Tp>::operator[](slice __s) const
3154{
3155 return __val_expr<__slice_expr<const valarray&> >(__slice_expr<const valarray&>(__s, *this));
3156}
3157
3158template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003159inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003160slice_array<_Tp>
3161valarray<_Tp>::operator[](slice __s)
3162{
3163 return slice_array<value_type>(__s, *this);
3164}
3165
3166template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003167inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003168__val_expr<__indirect_expr<const valarray<_Tp>&> >
3169valarray<_Tp>::operator[](const gslice& __gs) const
3170{
3171 return __val_expr<__indirect_expr<const valarray&> >(__indirect_expr<const valarray&>(__gs.__1d_, *this));
3172}
3173
3174template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003175inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003176gslice_array<_Tp>
3177valarray<_Tp>::operator[](const gslice& __gs)
3178{
3179 return gslice_array<value_type>(__gs, *this);
3180}
3181
Eric Fiselier3b0b81f2017-04-19 00:23:45 +00003182#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00003183
3184template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003185inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003186__val_expr<__indirect_expr<const valarray<_Tp>&> >
3187valarray<_Tp>::operator[](gslice&& __gs) const
3188{
3189 return __val_expr<__indirect_expr<const valarray&> >(__indirect_expr<const valarray&>(move(__gs.__1d_), *this));
3190}
3191
3192template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003193inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003194gslice_array<_Tp>
3195valarray<_Tp>::operator[](gslice&& __gs)
3196{
3197 return gslice_array<value_type>(move(__gs), *this);
3198}
3199
Eric Fiselier3b0b81f2017-04-19 00:23:45 +00003200#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00003201
3202template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003203inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003204__val_expr<__mask_expr<const valarray<_Tp>&> >
3205valarray<_Tp>::operator[](const valarray<bool>& __vb) const
3206{
3207 return __val_expr<__mask_expr<const valarray&> >(__mask_expr<const valarray&>(__vb, *this));
3208}
3209
3210template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003211inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003212mask_array<_Tp>
3213valarray<_Tp>::operator[](const valarray<bool>& __vb)
3214{
3215 return mask_array<value_type>(__vb, *this);
3216}
3217
Eric Fiselier3b0b81f2017-04-19 00:23:45 +00003218#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00003219
3220template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003221inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003222__val_expr<__mask_expr<const valarray<_Tp>&> >
3223valarray<_Tp>::operator[](valarray<bool>&& __vb) const
3224{
3225 return __val_expr<__mask_expr<const valarray&> >(__mask_expr<const valarray&>(move(__vb), *this));
3226}
3227
3228template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003229inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003230mask_array<_Tp>
3231valarray<_Tp>::operator[](valarray<bool>&& __vb)
3232{
3233 return mask_array<value_type>(move(__vb), *this);
3234}
3235
Eric Fiselier3b0b81f2017-04-19 00:23:45 +00003236#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00003237
3238template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003239inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003240__val_expr<__indirect_expr<const valarray<_Tp>&> >
3241valarray<_Tp>::operator[](const valarray<size_t>& __vs) const
3242{
3243 return __val_expr<__indirect_expr<const valarray&> >(__indirect_expr<const valarray&>(__vs, *this));
3244}
3245
3246template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003247inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003248indirect_array<_Tp>
3249valarray<_Tp>::operator[](const valarray<size_t>& __vs)
3250{
3251 return indirect_array<value_type>(__vs, *this);
3252}
3253
Eric Fiselier3b0b81f2017-04-19 00:23:45 +00003254#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00003255
3256template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003257inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003258__val_expr<__indirect_expr<const valarray<_Tp>&> >
3259valarray<_Tp>::operator[](valarray<size_t>&& __vs) const
3260{
3261 return __val_expr<__indirect_expr<const valarray&> >(__indirect_expr<const valarray&>(move(__vs), *this));
3262}
3263
3264template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003265inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003266indirect_array<_Tp>
3267valarray<_Tp>::operator[](valarray<size_t>&& __vs)
3268{
3269 return indirect_array<value_type>(move(__vs), *this);
3270}
3271
Eric Fiselier3b0b81f2017-04-19 00:23:45 +00003272#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc51e1022010-05-11 19:42:16 +00003273
3274template <class _Tp>
3275valarray<_Tp>
3276valarray<_Tp>::operator+() const
3277{
3278 valarray<value_type> __r;
3279 size_t __n = size();
3280 if (__n)
3281 {
3282 __r.__begin_ =
3283 __r.__end_ =
Eric Fiselier06548ab2018-03-22 04:42:56 +00003284 static_cast<value_type*>(
Eric Fiselier0f0ed9d2019-01-16 01:51:12 +00003285 _VSTD::__libcpp_allocate(__n * sizeof(value_type), _LIBCPP_ALIGNOF(value_type)));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003286 for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n)
3287 ::new (__r.__end_) value_type(+*__p);
3288 }
3289 return __r;
3290}
3291
3292template <class _Tp>
3293valarray<_Tp>
3294valarray<_Tp>::operator-() const
3295{
3296 valarray<value_type> __r;
3297 size_t __n = size();
3298 if (__n)
3299 {
3300 __r.__begin_ =
3301 __r.__end_ =
Eric Fiselier06548ab2018-03-22 04:42:56 +00003302 static_cast<value_type*>(
Eric Fiselier0f0ed9d2019-01-16 01:51:12 +00003303 _VSTD::__libcpp_allocate(__n * sizeof(value_type), _LIBCPP_ALIGNOF(value_type)));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003304 for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n)
3305 ::new (__r.__end_) value_type(-*__p);
3306 }
3307 return __r;
3308}
3309
3310template <class _Tp>
3311valarray<_Tp>
3312valarray<_Tp>::operator~() const
3313{
3314 valarray<value_type> __r;
3315 size_t __n = size();
3316 if (__n)
3317 {
3318 __r.__begin_ =
3319 __r.__end_ =
Eric Fiselier06548ab2018-03-22 04:42:56 +00003320 static_cast<value_type*>(
Eric Fiselier0f0ed9d2019-01-16 01:51:12 +00003321 _VSTD::__libcpp_allocate(__n * sizeof(value_type), _LIBCPP_ALIGNOF(value_type)));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003322 for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n)
3323 ::new (__r.__end_) value_type(~*__p);
3324 }
3325 return __r;
3326}
3327
3328template <class _Tp>
3329valarray<bool>
3330valarray<_Tp>::operator!() const
3331{
3332 valarray<bool> __r;
3333 size_t __n = size();
3334 if (__n)
3335 {
3336 __r.__begin_ =
3337 __r.__end_ =
Eric Fiselier0f0ed9d2019-01-16 01:51:12 +00003338 static_cast<bool*>(_VSTD::__libcpp_allocate(__n * sizeof(bool), _LIBCPP_ALIGNOF(bool)));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003339 for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n)
3340 ::new (__r.__end_) bool(!*__p);
3341 }
3342 return __r;
3343}
3344
3345template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003346inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003347valarray<_Tp>&
3348valarray<_Tp>::operator*=(const value_type& __x)
3349{
3350 for (value_type* __p = __begin_; __p != __end_; ++__p)
3351 *__p *= __x;
3352 return *this;
3353}
3354
3355template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003356inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003357valarray<_Tp>&
3358valarray<_Tp>::operator/=(const value_type& __x)
3359{
3360 for (value_type* __p = __begin_; __p != __end_; ++__p)
3361 *__p /= __x;
3362 return *this;
3363}
3364
3365template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003366inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003367valarray<_Tp>&
3368valarray<_Tp>::operator%=(const value_type& __x)
3369{
3370 for (value_type* __p = __begin_; __p != __end_; ++__p)
3371 *__p %= __x;
3372 return *this;
3373}
3374
3375template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003376inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003377valarray<_Tp>&
3378valarray<_Tp>::operator+=(const value_type& __x)
3379{
3380 for (value_type* __p = __begin_; __p != __end_; ++__p)
3381 *__p += __x;
3382 return *this;
3383}
3384
3385template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003386inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003387valarray<_Tp>&
3388valarray<_Tp>::operator-=(const value_type& __x)
3389{
3390 for (value_type* __p = __begin_; __p != __end_; ++__p)
3391 *__p -= __x;
3392 return *this;
3393}
3394
3395template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003396inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003397valarray<_Tp>&
3398valarray<_Tp>::operator^=(const value_type& __x)
3399{
3400 for (value_type* __p = __begin_; __p != __end_; ++__p)
3401 *__p ^= __x;
3402 return *this;
3403}
3404
3405template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003406inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003407valarray<_Tp>&
3408valarray<_Tp>::operator&=(const value_type& __x)
3409{
3410 for (value_type* __p = __begin_; __p != __end_; ++__p)
3411 *__p &= __x;
3412 return *this;
3413}
3414
3415template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003416inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003417valarray<_Tp>&
3418valarray<_Tp>::operator|=(const value_type& __x)
3419{
3420 for (value_type* __p = __begin_; __p != __end_; ++__p)
3421 *__p |= __x;
3422 return *this;
3423}
3424
3425template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003426inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003427valarray<_Tp>&
3428valarray<_Tp>::operator<<=(const value_type& __x)
3429{
3430 for (value_type* __p = __begin_; __p != __end_; ++__p)
3431 *__p <<= __x;
3432 return *this;
3433}
3434
3435template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003436inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003437valarray<_Tp>&
3438valarray<_Tp>::operator>>=(const value_type& __x)
3439{
3440 for (value_type* __p = __begin_; __p != __end_; ++__p)
3441 *__p >>= __x;
3442 return *this;
3443}
3444
3445template <class _Tp>
3446template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003447inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003448typename enable_if
3449<
3450 __is_val_expr<_Expr>::value,
3451 valarray<_Tp>&
3452>::type
3453valarray<_Tp>::operator*=(const _Expr& __v)
3454{
3455 size_t __i = 0;
3456 for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3457 *__t *= __v[__i];
3458 return *this;
3459}
3460
3461template <class _Tp>
3462template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003463inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003464typename enable_if
3465<
3466 __is_val_expr<_Expr>::value,
3467 valarray<_Tp>&
3468>::type
3469valarray<_Tp>::operator/=(const _Expr& __v)
3470{
3471 size_t __i = 0;
3472 for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3473 *__t /= __v[__i];
3474 return *this;
3475}
3476
3477template <class _Tp>
3478template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003479inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003480typename enable_if
3481<
3482 __is_val_expr<_Expr>::value,
3483 valarray<_Tp>&
3484>::type
3485valarray<_Tp>::operator%=(const _Expr& __v)
3486{
3487 size_t __i = 0;
3488 for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3489 *__t %= __v[__i];
3490 return *this;
3491}
3492
3493template <class _Tp>
3494template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003495inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003496typename enable_if
3497<
3498 __is_val_expr<_Expr>::value,
3499 valarray<_Tp>&
3500>::type
3501valarray<_Tp>::operator+=(const _Expr& __v)
3502{
3503 size_t __i = 0;
3504 for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3505 *__t += __v[__i];
3506 return *this;
3507}
3508
3509template <class _Tp>
3510template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003511inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003512typename enable_if
3513<
3514 __is_val_expr<_Expr>::value,
3515 valarray<_Tp>&
3516>::type
3517valarray<_Tp>::operator-=(const _Expr& __v)
3518{
3519 size_t __i = 0;
3520 for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3521 *__t -= __v[__i];
3522 return *this;
3523}
3524
3525template <class _Tp>
3526template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003527inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003528typename enable_if
3529<
3530 __is_val_expr<_Expr>::value,
3531 valarray<_Tp>&
3532>::type
3533valarray<_Tp>::operator^=(const _Expr& __v)
3534{
3535 size_t __i = 0;
3536 for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3537 *__t ^= __v[__i];
3538 return *this;
3539}
3540
3541template <class _Tp>
3542template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003543inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003544typename enable_if
3545<
3546 __is_val_expr<_Expr>::value,
3547 valarray<_Tp>&
3548>::type
3549valarray<_Tp>::operator|=(const _Expr& __v)
3550{
3551 size_t __i = 0;
3552 for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3553 *__t |= __v[__i];
3554 return *this;
3555}
3556
3557template <class _Tp>
3558template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003559inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003560typename enable_if
3561<
3562 __is_val_expr<_Expr>::value,
3563 valarray<_Tp>&
3564>::type
3565valarray<_Tp>::operator&=(const _Expr& __v)
3566{
3567 size_t __i = 0;
3568 for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3569 *__t &= __v[__i];
3570 return *this;
3571}
3572
3573template <class _Tp>
3574template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003575inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003576typename enable_if
3577<
3578 __is_val_expr<_Expr>::value,
3579 valarray<_Tp>&
3580>::type
3581valarray<_Tp>::operator<<=(const _Expr& __v)
3582{
3583 size_t __i = 0;
3584 for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3585 *__t <<= __v[__i];
3586 return *this;
3587}
3588
3589template <class _Tp>
3590template <class _Expr>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003591inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003592typename enable_if
3593<
3594 __is_val_expr<_Expr>::value,
3595 valarray<_Tp>&
3596>::type
3597valarray<_Tp>::operator>>=(const _Expr& __v)
3598{
3599 size_t __i = 0;
3600 for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3601 *__t >>= __v[__i];
3602 return *this;
3603}
3604
3605template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003606inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003607void
Howard Hinnant298aed92012-07-21 00:51:28 +00003608valarray<_Tp>::swap(valarray& __v) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00003609{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003610 _VSTD::swap(__begin_, __v.__begin_);
3611 _VSTD::swap(__end_, __v.__end_);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003612}
3613
3614template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003615inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003616_Tp
3617valarray<_Tp>::sum() const
3618{
3619 if (__begin_ == __end_)
3620 return value_type();
3621 const value_type* __p = __begin_;
3622 _Tp __r = *__p;
3623 for (++__p; __p != __end_; ++__p)
3624 __r += *__p;
3625 return __r;
3626}
3627
3628template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003629inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003630_Tp
3631valarray<_Tp>::min() const
3632{
3633 if (__begin_ == __end_)
3634 return value_type();
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003635 return *_VSTD::min_element(__begin_, __end_);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003636}
3637
3638template <class _Tp>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00003639inline
Howard Hinnantc51e1022010-05-11 19:42:16 +00003640_Tp
3641valarray<_Tp>::max() const
3642{
3643 if (__begin_ == __end_)
3644 return value_type();
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003645 return *_VSTD::max_element(__begin_, __end_);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003646}
3647
3648template <class _Tp>
3649valarray<_Tp>
3650valarray<_Tp>::shift(int __i) const
3651{
3652 valarray<value_type> __r;
3653 size_t __n = size();
3654 if (__n)
3655 {
3656 __r.__begin_ =
3657 __r.__end_ =
Eric Fiselier06548ab2018-03-22 04:42:56 +00003658 static_cast<value_type*>(
Eric Fiselier0f0ed9d2019-01-16 01:51:12 +00003659 _VSTD::__libcpp_allocate(__n * sizeof(value_type), _LIBCPP_ALIGNOF(value_type)));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003660 const value_type* __sb;
3661 value_type* __tb;
3662 value_type* __te;
3663 if (__i >= 0)
3664 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003665 __i = _VSTD::min(__i, static_cast<int>(__n));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003666 __sb = __begin_ + __i;
3667 __tb = __r.__begin_;
3668 __te = __r.__begin_ + (__n - __i);
3669 }
3670 else
3671 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003672 __i = _VSTD::min(-__i, static_cast<int>(__n));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003673 __sb = __begin_;
3674 __tb = __r.__begin_ + __i;
3675 __te = __r.__begin_ + __n;
3676 }
3677 for (; __r.__end_ != __tb; ++__r.__end_)
3678 ::new (__r.__end_) value_type();
3679 for (; __r.__end_ != __te; ++__r.__end_, ++__sb)
3680 ::new (__r.__end_) value_type(*__sb);
3681 for (__te = __r.__begin_ + __n; __r.__end_ != __te; ++__r.__end_)
3682 ::new (__r.__end_) value_type();
3683 }
3684 return __r;
3685}
3686
3687template <class _Tp>
3688valarray<_Tp>
3689valarray<_Tp>::cshift(int __i) const
3690{
3691 valarray<value_type> __r;
3692 size_t __n = size();
3693 if (__n)
3694 {
3695 __r.__begin_ =
3696 __r.__end_ =
Eric Fiselier06548ab2018-03-22 04:42:56 +00003697 static_cast<value_type*>(
Eric Fiselier0f0ed9d2019-01-16 01:51:12 +00003698 _VSTD::__libcpp_allocate(__n * sizeof(value_type), _LIBCPP_ALIGNOF(value_type)));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003699 __i %= static_cast<int>(__n);
3700 const value_type* __m = __i >= 0 ? __begin_ + __i : __end_ + __i;
3701 for (const value_type* __s = __m; __s != __end_; ++__r.__end_, ++__s)
3702 ::new (__r.__end_) value_type(*__s);
3703 for (const value_type* __s = __begin_; __s != __m; ++__r.__end_, ++__s)
3704 ::new (__r.__end_) value_type(*__s);
3705 }
3706 return __r;
3707}
3708
3709template <class _Tp>
3710valarray<_Tp>
3711valarray<_Tp>::apply(value_type __f(value_type)) const
3712{
3713 valarray<value_type> __r;
3714 size_t __n = size();
3715 if (__n)
3716 {
3717 __r.__begin_ =
3718 __r.__end_ =
Eric Fiselier06548ab2018-03-22 04:42:56 +00003719 static_cast<value_type*>(
Eric Fiselier0f0ed9d2019-01-16 01:51:12 +00003720 _VSTD::__libcpp_allocate(__n * sizeof(value_type), _LIBCPP_ALIGNOF(value_type)));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003721 for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n)
3722 ::new (__r.__end_) value_type(__f(*__p));
3723 }
3724 return __r;
3725}
3726
3727template <class _Tp>
3728valarray<_Tp>
3729valarray<_Tp>::apply(value_type __f(const value_type&)) const
3730{
3731 valarray<value_type> __r;
3732 size_t __n = size();
3733 if (__n)
3734 {
3735 __r.__begin_ =
3736 __r.__end_ =
Eric Fiselier06548ab2018-03-22 04:42:56 +00003737 static_cast<value_type*>(
Eric Fiselier0f0ed9d2019-01-16 01:51:12 +00003738 _VSTD::__libcpp_allocate(__n * sizeof(value_type), _LIBCPP_ALIGNOF(value_type)));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003739 for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n)
3740 ::new (__r.__end_) value_type(__f(*__p));
3741 }
3742 return __r;
3743}
3744
3745template <class _Tp>
Eric Fiseliera119c322018-10-25 17:43:26 +00003746inline
Eric Fiselier2856ef82018-10-25 17:21:30 +00003747void valarray<_Tp>::__clear(size_t __capacity)
Howard Hinnantc51e1022010-05-11 19:42:16 +00003748{
Eric Fiselier2856ef82018-10-25 17:21:30 +00003749 if (__begin_ != nullptr)
3750 {
3751 while (__end_ != __begin_)
3752 (--__end_)->~value_type();
Eric Fiselier0f0ed9d2019-01-16 01:51:12 +00003753 _VSTD::__libcpp_deallocate(__begin_, __capacity * sizeof(value_type), _LIBCPP_ALIGNOF(value_type));
Eric Fiselier2856ef82018-10-25 17:21:30 +00003754 __begin_ = __end_ = nullptr;
3755 }
Mikhail Maltsev59de6f82018-02-08 11:33:48 +00003756}
3757
3758template <class _Tp>
3759void
3760valarray<_Tp>::resize(size_t __n, value_type __x)
3761{
Eric Fiselier2856ef82018-10-25 17:21:30 +00003762 __clear(size());
Howard Hinnantc51e1022010-05-11 19:42:16 +00003763 if (__n)
3764 {
Eric Fiselier06548ab2018-03-22 04:42:56 +00003765 __begin_ = __end_ = static_cast<value_type*>(
Eric Fiselier0f0ed9d2019-01-16 01:51:12 +00003766 _VSTD::__libcpp_allocate(__n * sizeof(value_type), _LIBCPP_ALIGNOF(value_type)));
Howard Hinnantc51e1022010-05-11 19:42:16 +00003767#ifndef _LIBCPP_NO_EXCEPTIONS
3768 try
3769 {
Howard Hinnant3b6579a2010-08-22 00:02:43 +00003770#endif // _LIBCPP_NO_EXCEPTIONS
Eric Fiselier2856ef82018-10-25 17:21:30 +00003771 for (size_t __n_left = __n; __n_left; --__n_left, ++__end_)
Howard Hinnantc51e1022010-05-11 19:42:16 +00003772 ::new (__end_) value_type(__x);
3773#ifndef _LIBCPP_NO_EXCEPTIONS
3774 }
3775 catch (...)
3776 {
Eric Fiselier2856ef82018-10-25 17:21:30 +00003777 __clear(__n);
Howard Hinnantc51e1022010-05-11 19:42:16 +00003778 throw;
3779 }
Howard Hinnant3b6579a2010-08-22 00:02:43 +00003780#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantc51e1022010-05-11 19:42:16 +00003781 }
3782}
3783
3784template<class _Tp>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003785inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003786void
Howard Hinnant298aed92012-07-21 00:51:28 +00003787swap(valarray<_Tp>& __x, valarray<_Tp>& __y) _NOEXCEPT
Howard Hinnantc51e1022010-05-11 19:42:16 +00003788{
3789 __x.swap(__y);
3790}
3791
3792template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003793inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003794typename enable_if
3795<
3796 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
3797 __val_expr<_BinaryOp<multiplies<typename _Expr1::value_type>, _Expr1, _Expr2> >
3798>::type
3799operator*(const _Expr1& __x, const _Expr2& __y)
3800{
3801 typedef typename _Expr1::value_type value_type;
3802 typedef _BinaryOp<multiplies<value_type>, _Expr1, _Expr2> _Op;
3803 return __val_expr<_Op>(_Op(multiplies<value_type>(), __x, __y));
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 _Expr, __scalar_expr<typename _Expr::value_type> > >
3813>::type
3814operator*(const _Expr& __x, const typename _Expr::value_type& __y)
3815{
3816 typedef typename _Expr::value_type value_type;
3817 typedef _BinaryOp<multiplies<value_type>, _Expr, __scalar_expr<value_type> > _Op;
3818 return __val_expr<_Op>(_Op(multiplies<value_type>(),
3819 __x, __scalar_expr<value_type>(__y, __x.size())));
3820}
3821
3822template<class _Expr>
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<_Expr>::value,
3827 __val_expr<_BinaryOp<multiplies<typename _Expr::value_type>,
3828 __scalar_expr<typename _Expr::value_type>, _Expr> >
3829>::type
3830operator*(const typename _Expr::value_type& __x, const _Expr& __y)
3831{
3832 typedef typename _Expr::value_type value_type;
3833 typedef _BinaryOp<multiplies<value_type>, __scalar_expr<value_type>, _Expr> _Op;
3834 return __val_expr<_Op>(_Op(multiplies<value_type>(),
3835 __scalar_expr<value_type>(__x, __y.size()), __y));
3836}
3837
3838template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003839inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003840typename enable_if
3841<
3842 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
3843 __val_expr<_BinaryOp<divides<typename _Expr1::value_type>, _Expr1, _Expr2> >
3844>::type
3845operator/(const _Expr1& __x, const _Expr2& __y)
3846{
3847 typedef typename _Expr1::value_type value_type;
3848 typedef _BinaryOp<divides<value_type>, _Expr1, _Expr2> _Op;
3849 return __val_expr<_Op>(_Op(divides<value_type>(), __x, __y));
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 _Expr, __scalar_expr<typename _Expr::value_type> > >
3859>::type
3860operator/(const _Expr& __x, const typename _Expr::value_type& __y)
3861{
3862 typedef typename _Expr::value_type value_type;
3863 typedef _BinaryOp<divides<value_type>, _Expr, __scalar_expr<value_type> > _Op;
3864 return __val_expr<_Op>(_Op(divides<value_type>(),
3865 __x, __scalar_expr<value_type>(__y, __x.size())));
3866}
3867
3868template<class _Expr>
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<_Expr>::value,
3873 __val_expr<_BinaryOp<divides<typename _Expr::value_type>,
3874 __scalar_expr<typename _Expr::value_type>, _Expr> >
3875>::type
3876operator/(const typename _Expr::value_type& __x, const _Expr& __y)
3877{
3878 typedef typename _Expr::value_type value_type;
3879 typedef _BinaryOp<divides<value_type>, __scalar_expr<value_type>, _Expr> _Op;
3880 return __val_expr<_Op>(_Op(divides<value_type>(),
3881 __scalar_expr<value_type>(__x, __y.size()), __y));
3882}
3883
3884template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003885inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003886typename enable_if
3887<
3888 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
3889 __val_expr<_BinaryOp<modulus<typename _Expr1::value_type>, _Expr1, _Expr2> >
3890>::type
3891operator%(const _Expr1& __x, const _Expr2& __y)
3892{
3893 typedef typename _Expr1::value_type value_type;
3894 typedef _BinaryOp<modulus<value_type>, _Expr1, _Expr2> _Op;
3895 return __val_expr<_Op>(_Op(modulus<value_type>(), __x, __y));
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 _Expr, __scalar_expr<typename _Expr::value_type> > >
3905>::type
3906operator%(const _Expr& __x, const typename _Expr::value_type& __y)
3907{
3908 typedef typename _Expr::value_type value_type;
3909 typedef _BinaryOp<modulus<value_type>, _Expr, __scalar_expr<value_type> > _Op;
3910 return __val_expr<_Op>(_Op(modulus<value_type>(),
3911 __x, __scalar_expr<value_type>(__y, __x.size())));
3912}
3913
3914template<class _Expr>
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<_Expr>::value,
3919 __val_expr<_BinaryOp<modulus<typename _Expr::value_type>,
3920 __scalar_expr<typename _Expr::value_type>, _Expr> >
3921>::type
3922operator%(const typename _Expr::value_type& __x, const _Expr& __y)
3923{
3924 typedef typename _Expr::value_type value_type;
3925 typedef _BinaryOp<modulus<value_type>, __scalar_expr<value_type>, _Expr> _Op;
3926 return __val_expr<_Op>(_Op(modulus<value_type>(),
3927 __scalar_expr<value_type>(__x, __y.size()), __y));
3928}
3929
3930template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003931inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003932typename enable_if
3933<
3934 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
3935 __val_expr<_BinaryOp<plus<typename _Expr1::value_type>, _Expr1, _Expr2> >
3936>::type
3937operator+(const _Expr1& __x, const _Expr2& __y)
3938{
3939 typedef typename _Expr1::value_type value_type;
3940 typedef _BinaryOp<plus<value_type>, _Expr1, _Expr2> _Op;
3941 return __val_expr<_Op>(_Op(plus<value_type>(), __x, __y));
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 _Expr, __scalar_expr<typename _Expr::value_type> > >
3951>::type
3952operator+(const _Expr& __x, const typename _Expr::value_type& __y)
3953{
3954 typedef typename _Expr::value_type value_type;
3955 typedef _BinaryOp<plus<value_type>, _Expr, __scalar_expr<value_type> > _Op;
3956 return __val_expr<_Op>(_Op(plus<value_type>(),
3957 __x, __scalar_expr<value_type>(__y, __x.size())));
3958}
3959
3960template<class _Expr>
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<_Expr>::value,
3965 __val_expr<_BinaryOp<plus<typename _Expr::value_type>,
3966 __scalar_expr<typename _Expr::value_type>, _Expr> >
3967>::type
3968operator+(const typename _Expr::value_type& __x, const _Expr& __y)
3969{
3970 typedef typename _Expr::value_type value_type;
3971 typedef _BinaryOp<plus<value_type>, __scalar_expr<value_type>, _Expr> _Op;
3972 return __val_expr<_Op>(_Op(plus<value_type>(),
3973 __scalar_expr<value_type>(__x, __y.size()), __y));
3974}
3975
3976template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00003977inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00003978typename enable_if
3979<
3980 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
3981 __val_expr<_BinaryOp<minus<typename _Expr1::value_type>, _Expr1, _Expr2> >
3982>::type
3983operator-(const _Expr1& __x, const _Expr2& __y)
3984{
3985 typedef typename _Expr1::value_type value_type;
3986 typedef _BinaryOp<minus<value_type>, _Expr1, _Expr2> _Op;
3987 return __val_expr<_Op>(_Op(minus<value_type>(), __x, __y));
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 _Expr, __scalar_expr<typename _Expr::value_type> > >
3997>::type
3998operator-(const _Expr& __x, const typename _Expr::value_type& __y)
3999{
4000 typedef typename _Expr::value_type value_type;
4001 typedef _BinaryOp<minus<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4002 return __val_expr<_Op>(_Op(minus<value_type>(),
4003 __x, __scalar_expr<value_type>(__y, __x.size())));
4004}
4005
4006template<class _Expr>
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<_Expr>::value,
4011 __val_expr<_BinaryOp<minus<typename _Expr::value_type>,
4012 __scalar_expr<typename _Expr::value_type>, _Expr> >
4013>::type
4014operator-(const typename _Expr::value_type& __x, const _Expr& __y)
4015{
4016 typedef typename _Expr::value_type value_type;
4017 typedef _BinaryOp<minus<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4018 return __val_expr<_Op>(_Op(minus<value_type>(),
4019 __scalar_expr<value_type>(__x, __y.size()), __y));
4020}
4021
4022template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004023inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004024typename enable_if
4025<
4026 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4027 __val_expr<_BinaryOp<bit_xor<typename _Expr1::value_type>, _Expr1, _Expr2> >
4028>::type
4029operator^(const _Expr1& __x, const _Expr2& __y)
4030{
4031 typedef typename _Expr1::value_type value_type;
4032 typedef _BinaryOp<bit_xor<value_type>, _Expr1, _Expr2> _Op;
4033 return __val_expr<_Op>(_Op(bit_xor<value_type>(), __x, __y));
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 _Expr, __scalar_expr<typename _Expr::value_type> > >
4043>::type
4044operator^(const _Expr& __x, const typename _Expr::value_type& __y)
4045{
4046 typedef typename _Expr::value_type value_type;
4047 typedef _BinaryOp<bit_xor<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4048 return __val_expr<_Op>(_Op(bit_xor<value_type>(),
4049 __x, __scalar_expr<value_type>(__y, __x.size())));
4050}
4051
4052template<class _Expr>
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<_Expr>::value,
4057 __val_expr<_BinaryOp<bit_xor<typename _Expr::value_type>,
4058 __scalar_expr<typename _Expr::value_type>, _Expr> >
4059>::type
4060operator^(const typename _Expr::value_type& __x, const _Expr& __y)
4061{
4062 typedef typename _Expr::value_type value_type;
4063 typedef _BinaryOp<bit_xor<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4064 return __val_expr<_Op>(_Op(bit_xor<value_type>(),
4065 __scalar_expr<value_type>(__x, __y.size()), __y));
4066}
4067
4068template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004069inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004070typename enable_if
4071<
4072 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4073 __val_expr<_BinaryOp<bit_and<typename _Expr1::value_type>, _Expr1, _Expr2> >
4074>::type
4075operator&(const _Expr1& __x, const _Expr2& __y)
4076{
4077 typedef typename _Expr1::value_type value_type;
4078 typedef _BinaryOp<bit_and<value_type>, _Expr1, _Expr2> _Op;
4079 return __val_expr<_Op>(_Op(bit_and<value_type>(), __x, __y));
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 _Expr, __scalar_expr<typename _Expr::value_type> > >
4089>::type
4090operator&(const _Expr& __x, const typename _Expr::value_type& __y)
4091{
4092 typedef typename _Expr::value_type value_type;
4093 typedef _BinaryOp<bit_and<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4094 return __val_expr<_Op>(_Op(bit_and<value_type>(),
4095 __x, __scalar_expr<value_type>(__y, __x.size())));
4096}
4097
4098template<class _Expr>
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<_Expr>::value,
4103 __val_expr<_BinaryOp<bit_and<typename _Expr::value_type>,
4104 __scalar_expr<typename _Expr::value_type>, _Expr> >
4105>::type
4106operator&(const typename _Expr::value_type& __x, const _Expr& __y)
4107{
4108 typedef typename _Expr::value_type value_type;
4109 typedef _BinaryOp<bit_and<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4110 return __val_expr<_Op>(_Op(bit_and<value_type>(),
4111 __scalar_expr<value_type>(__x, __y.size()), __y));
4112}
4113
4114template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004115inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004116typename enable_if
4117<
4118 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4119 __val_expr<_BinaryOp<bit_or<typename _Expr1::value_type>, _Expr1, _Expr2> >
4120>::type
4121operator|(const _Expr1& __x, const _Expr2& __y)
4122{
4123 typedef typename _Expr1::value_type value_type;
4124 typedef _BinaryOp<bit_or<value_type>, _Expr1, _Expr2> _Op;
4125 return __val_expr<_Op>(_Op(bit_or<value_type>(), __x, __y));
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 _Expr, __scalar_expr<typename _Expr::value_type> > >
4135>::type
4136operator|(const _Expr& __x, const typename _Expr::value_type& __y)
4137{
4138 typedef typename _Expr::value_type value_type;
4139 typedef _BinaryOp<bit_or<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4140 return __val_expr<_Op>(_Op(bit_or<value_type>(),
4141 __x, __scalar_expr<value_type>(__y, __x.size())));
4142}
4143
4144template<class _Expr>
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<_Expr>::value,
4149 __val_expr<_BinaryOp<bit_or<typename _Expr::value_type>,
4150 __scalar_expr<typename _Expr::value_type>, _Expr> >
4151>::type
4152operator|(const typename _Expr::value_type& __x, const _Expr& __y)
4153{
4154 typedef typename _Expr::value_type value_type;
4155 typedef _BinaryOp<bit_or<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4156 return __val_expr<_Op>(_Op(bit_or<value_type>(),
4157 __scalar_expr<value_type>(__x, __y.size()), __y));
4158}
4159
4160template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004161inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004162typename enable_if
4163<
4164 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4165 __val_expr<_BinaryOp<__bit_shift_left<typename _Expr1::value_type>, _Expr1, _Expr2> >
4166>::type
4167operator<<(const _Expr1& __x, const _Expr2& __y)
4168{
4169 typedef typename _Expr1::value_type value_type;
4170 typedef _BinaryOp<__bit_shift_left<value_type>, _Expr1, _Expr2> _Op;
4171 return __val_expr<_Op>(_Op(__bit_shift_left<value_type>(), __x, __y));
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 _Expr, __scalar_expr<typename _Expr::value_type> > >
4181>::type
4182operator<<(const _Expr& __x, const typename _Expr::value_type& __y)
4183{
4184 typedef typename _Expr::value_type value_type;
4185 typedef _BinaryOp<__bit_shift_left<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4186 return __val_expr<_Op>(_Op(__bit_shift_left<value_type>(),
4187 __x, __scalar_expr<value_type>(__y, __x.size())));
4188}
4189
4190template<class _Expr>
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<_Expr>::value,
4195 __val_expr<_BinaryOp<__bit_shift_left<typename _Expr::value_type>,
4196 __scalar_expr<typename _Expr::value_type>, _Expr> >
4197>::type
4198operator<<(const typename _Expr::value_type& __x, const _Expr& __y)
4199{
4200 typedef typename _Expr::value_type value_type;
4201 typedef _BinaryOp<__bit_shift_left<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4202 return __val_expr<_Op>(_Op(__bit_shift_left<value_type>(),
4203 __scalar_expr<value_type>(__x, __y.size()), __y));
4204}
4205
4206template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004207inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004208typename enable_if
4209<
4210 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4211 __val_expr<_BinaryOp<__bit_shift_right<typename _Expr1::value_type>, _Expr1, _Expr2> >
4212>::type
4213operator>>(const _Expr1& __x, const _Expr2& __y)
4214{
4215 typedef typename _Expr1::value_type value_type;
4216 typedef _BinaryOp<__bit_shift_right<value_type>, _Expr1, _Expr2> _Op;
4217 return __val_expr<_Op>(_Op(__bit_shift_right<value_type>(), __x, __y));
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 _Expr, __scalar_expr<typename _Expr::value_type> > >
4227>::type
4228operator>>(const _Expr& __x, const typename _Expr::value_type& __y)
4229{
4230 typedef typename _Expr::value_type value_type;
4231 typedef _BinaryOp<__bit_shift_right<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4232 return __val_expr<_Op>(_Op(__bit_shift_right<value_type>(),
4233 __x, __scalar_expr<value_type>(__y, __x.size())));
4234}
4235
4236template<class _Expr>
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<_Expr>::value,
4241 __val_expr<_BinaryOp<__bit_shift_right<typename _Expr::value_type>,
4242 __scalar_expr<typename _Expr::value_type>, _Expr> >
4243>::type
4244operator>>(const typename _Expr::value_type& __x, const _Expr& __y)
4245{
4246 typedef typename _Expr::value_type value_type;
4247 typedef _BinaryOp<__bit_shift_right<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4248 return __val_expr<_Op>(_Op(__bit_shift_right<value_type>(),
4249 __scalar_expr<value_type>(__x, __y.size()), __y));
4250}
4251
4252template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004253inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004254typename enable_if
4255<
4256 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4257 __val_expr<_BinaryOp<logical_and<typename _Expr1::value_type>, _Expr1, _Expr2> >
4258>::type
4259operator&&(const _Expr1& __x, const _Expr2& __y)
4260{
4261 typedef typename _Expr1::value_type value_type;
4262 typedef _BinaryOp<logical_and<value_type>, _Expr1, _Expr2> _Op;
4263 return __val_expr<_Op>(_Op(logical_and<value_type>(), __x, __y));
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 _Expr, __scalar_expr<typename _Expr::value_type> > >
4273>::type
4274operator&&(const _Expr& __x, const typename _Expr::value_type& __y)
4275{
4276 typedef typename _Expr::value_type value_type;
4277 typedef _BinaryOp<logical_and<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4278 return __val_expr<_Op>(_Op(logical_and<value_type>(),
4279 __x, __scalar_expr<value_type>(__y, __x.size())));
4280}
4281
4282template<class _Expr>
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<_Expr>::value,
4287 __val_expr<_BinaryOp<logical_and<typename _Expr::value_type>,
4288 __scalar_expr<typename _Expr::value_type>, _Expr> >
4289>::type
4290operator&&(const typename _Expr::value_type& __x, const _Expr& __y)
4291{
4292 typedef typename _Expr::value_type value_type;
4293 typedef _BinaryOp<logical_and<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4294 return __val_expr<_Op>(_Op(logical_and<value_type>(),
4295 __scalar_expr<value_type>(__x, __y.size()), __y));
4296}
4297
4298template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004299inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004300typename enable_if
4301<
4302 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4303 __val_expr<_BinaryOp<logical_or<typename _Expr1::value_type>, _Expr1, _Expr2> >
4304>::type
4305operator||(const _Expr1& __x, const _Expr2& __y)
4306{
4307 typedef typename _Expr1::value_type value_type;
4308 typedef _BinaryOp<logical_or<value_type>, _Expr1, _Expr2> _Op;
4309 return __val_expr<_Op>(_Op(logical_or<value_type>(), __x, __y));
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 _Expr, __scalar_expr<typename _Expr::value_type> > >
4319>::type
4320operator||(const _Expr& __x, const typename _Expr::value_type& __y)
4321{
4322 typedef typename _Expr::value_type value_type;
4323 typedef _BinaryOp<logical_or<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4324 return __val_expr<_Op>(_Op(logical_or<value_type>(),
4325 __x, __scalar_expr<value_type>(__y, __x.size())));
4326}
4327
4328template<class _Expr>
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<_Expr>::value,
4333 __val_expr<_BinaryOp<logical_or<typename _Expr::value_type>,
4334 __scalar_expr<typename _Expr::value_type>, _Expr> >
4335>::type
4336operator||(const typename _Expr::value_type& __x, const _Expr& __y)
4337{
4338 typedef typename _Expr::value_type value_type;
4339 typedef _BinaryOp<logical_or<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4340 return __val_expr<_Op>(_Op(logical_or<value_type>(),
4341 __scalar_expr<value_type>(__x, __y.size()), __y));
4342}
4343
4344template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004345inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004346typename enable_if
4347<
4348 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4349 __val_expr<_BinaryOp<equal_to<typename _Expr1::value_type>, _Expr1, _Expr2> >
4350>::type
4351operator==(const _Expr1& __x, const _Expr2& __y)
4352{
4353 typedef typename _Expr1::value_type value_type;
4354 typedef _BinaryOp<equal_to<value_type>, _Expr1, _Expr2> _Op;
4355 return __val_expr<_Op>(_Op(equal_to<value_type>(), __x, __y));
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 _Expr, __scalar_expr<typename _Expr::value_type> > >
4365>::type
4366operator==(const _Expr& __x, const typename _Expr::value_type& __y)
4367{
4368 typedef typename _Expr::value_type value_type;
4369 typedef _BinaryOp<equal_to<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4370 return __val_expr<_Op>(_Op(equal_to<value_type>(),
4371 __x, __scalar_expr<value_type>(__y, __x.size())));
4372}
4373
4374template<class _Expr>
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<_Expr>::value,
4379 __val_expr<_BinaryOp<equal_to<typename _Expr::value_type>,
4380 __scalar_expr<typename _Expr::value_type>, _Expr> >
4381>::type
4382operator==(const typename _Expr::value_type& __x, const _Expr& __y)
4383{
4384 typedef typename _Expr::value_type value_type;
4385 typedef _BinaryOp<equal_to<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4386 return __val_expr<_Op>(_Op(equal_to<value_type>(),
4387 __scalar_expr<value_type>(__x, __y.size()), __y));
4388}
4389
4390template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004391inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004392typename enable_if
4393<
4394 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4395 __val_expr<_BinaryOp<not_equal_to<typename _Expr1::value_type>, _Expr1, _Expr2> >
4396>::type
4397operator!=(const _Expr1& __x, const _Expr2& __y)
4398{
4399 typedef typename _Expr1::value_type value_type;
4400 typedef _BinaryOp<not_equal_to<value_type>, _Expr1, _Expr2> _Op;
4401 return __val_expr<_Op>(_Op(not_equal_to<value_type>(), __x, __y));
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 _Expr, __scalar_expr<typename _Expr::value_type> > >
4411>::type
4412operator!=(const _Expr& __x, const typename _Expr::value_type& __y)
4413{
4414 typedef typename _Expr::value_type value_type;
4415 typedef _BinaryOp<not_equal_to<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4416 return __val_expr<_Op>(_Op(not_equal_to<value_type>(),
4417 __x, __scalar_expr<value_type>(__y, __x.size())));
4418}
4419
4420template<class _Expr>
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<_Expr>::value,
4425 __val_expr<_BinaryOp<not_equal_to<typename _Expr::value_type>,
4426 __scalar_expr<typename _Expr::value_type>, _Expr> >
4427>::type
4428operator!=(const typename _Expr::value_type& __x, const _Expr& __y)
4429{
4430 typedef typename _Expr::value_type value_type;
4431 typedef _BinaryOp<not_equal_to<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4432 return __val_expr<_Op>(_Op(not_equal_to<value_type>(),
4433 __scalar_expr<value_type>(__x, __y.size()), __y));
4434}
4435
4436template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004437inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004438typename enable_if
4439<
4440 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4441 __val_expr<_BinaryOp<less<typename _Expr1::value_type>, _Expr1, _Expr2> >
4442>::type
4443operator<(const _Expr1& __x, const _Expr2& __y)
4444{
4445 typedef typename _Expr1::value_type value_type;
4446 typedef _BinaryOp<less<value_type>, _Expr1, _Expr2> _Op;
4447 return __val_expr<_Op>(_Op(less<value_type>(), __x, __y));
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 _Expr, __scalar_expr<typename _Expr::value_type> > >
4457>::type
4458operator<(const _Expr& __x, const typename _Expr::value_type& __y)
4459{
4460 typedef typename _Expr::value_type value_type;
4461 typedef _BinaryOp<less<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4462 return __val_expr<_Op>(_Op(less<value_type>(),
4463 __x, __scalar_expr<value_type>(__y, __x.size())));
4464}
4465
4466template<class _Expr>
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<_Expr>::value,
4471 __val_expr<_BinaryOp<less<typename _Expr::value_type>,
4472 __scalar_expr<typename _Expr::value_type>, _Expr> >
4473>::type
4474operator<(const typename _Expr::value_type& __x, const _Expr& __y)
4475{
4476 typedef typename _Expr::value_type value_type;
4477 typedef _BinaryOp<less<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4478 return __val_expr<_Op>(_Op(less<value_type>(),
4479 __scalar_expr<value_type>(__x, __y.size()), __y));
4480}
4481
4482template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004483inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004484typename enable_if
4485<
4486 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4487 __val_expr<_BinaryOp<greater<typename _Expr1::value_type>, _Expr1, _Expr2> >
4488>::type
4489operator>(const _Expr1& __x, const _Expr2& __y)
4490{
4491 typedef typename _Expr1::value_type value_type;
4492 typedef _BinaryOp<greater<value_type>, _Expr1, _Expr2> _Op;
4493 return __val_expr<_Op>(_Op(greater<value_type>(), __x, __y));
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 _Expr, __scalar_expr<typename _Expr::value_type> > >
4503>::type
4504operator>(const _Expr& __x, const typename _Expr::value_type& __y)
4505{
4506 typedef typename _Expr::value_type value_type;
4507 typedef _BinaryOp<greater<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4508 return __val_expr<_Op>(_Op(greater<value_type>(),
4509 __x, __scalar_expr<value_type>(__y, __x.size())));
4510}
4511
4512template<class _Expr>
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<_Expr>::value,
4517 __val_expr<_BinaryOp<greater<typename _Expr::value_type>,
4518 __scalar_expr<typename _Expr::value_type>, _Expr> >
4519>::type
4520operator>(const typename _Expr::value_type& __x, const _Expr& __y)
4521{
4522 typedef typename _Expr::value_type value_type;
4523 typedef _BinaryOp<greater<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4524 return __val_expr<_Op>(_Op(greater<value_type>(),
4525 __scalar_expr<value_type>(__x, __y.size()), __y));
4526}
4527
4528template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004529inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004530typename enable_if
4531<
4532 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4533 __val_expr<_BinaryOp<less_equal<typename _Expr1::value_type>, _Expr1, _Expr2> >
4534>::type
4535operator<=(const _Expr1& __x, const _Expr2& __y)
4536{
4537 typedef typename _Expr1::value_type value_type;
4538 typedef _BinaryOp<less_equal<value_type>, _Expr1, _Expr2> _Op;
4539 return __val_expr<_Op>(_Op(less_equal<value_type>(), __x, __y));
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 _Expr, __scalar_expr<typename _Expr::value_type> > >
4549>::type
4550operator<=(const _Expr& __x, const typename _Expr::value_type& __y)
4551{
4552 typedef typename _Expr::value_type value_type;
4553 typedef _BinaryOp<less_equal<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4554 return __val_expr<_Op>(_Op(less_equal<value_type>(),
4555 __x, __scalar_expr<value_type>(__y, __x.size())));
4556}
4557
4558template<class _Expr>
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<_Expr>::value,
4563 __val_expr<_BinaryOp<less_equal<typename _Expr::value_type>,
4564 __scalar_expr<typename _Expr::value_type>, _Expr> >
4565>::type
4566operator<=(const typename _Expr::value_type& __x, const _Expr& __y)
4567{
4568 typedef typename _Expr::value_type value_type;
4569 typedef _BinaryOp<less_equal<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4570 return __val_expr<_Op>(_Op(less_equal<value_type>(),
4571 __scalar_expr<value_type>(__x, __y.size()), __y));
4572}
4573
4574template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004575inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004576typename enable_if
4577<
4578 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4579 __val_expr<_BinaryOp<greater_equal<typename _Expr1::value_type>, _Expr1, _Expr2> >
4580>::type
4581operator>=(const _Expr1& __x, const _Expr2& __y)
4582{
4583 typedef typename _Expr1::value_type value_type;
4584 typedef _BinaryOp<greater_equal<value_type>, _Expr1, _Expr2> _Op;
4585 return __val_expr<_Op>(_Op(greater_equal<value_type>(), __x, __y));
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 _Expr, __scalar_expr<typename _Expr::value_type> > >
4595>::type
4596operator>=(const _Expr& __x, const typename _Expr::value_type& __y)
4597{
4598 typedef typename _Expr::value_type value_type;
4599 typedef _BinaryOp<greater_equal<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4600 return __val_expr<_Op>(_Op(greater_equal<value_type>(),
4601 __x, __scalar_expr<value_type>(__y, __x.size())));
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<_BinaryOp<greater_equal<typename _Expr::value_type>,
4610 __scalar_expr<typename _Expr::value_type>, _Expr> >
4611>::type
4612operator>=(const typename _Expr::value_type& __x, const _Expr& __y)
4613{
4614 typedef typename _Expr::value_type value_type;
4615 typedef _BinaryOp<greater_equal<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4616 return __val_expr<_Op>(_Op(greater_equal<value_type>(),
4617 __scalar_expr<value_type>(__x, __y.size()), __y));
4618}
4619
4620template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004621inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004622typename enable_if
4623<
4624 __is_val_expr<_Expr>::value,
4625 __val_expr<_UnaryOp<__abs_expr<typename _Expr::value_type>, _Expr> >
4626>::type
4627abs(const _Expr& __x)
4628{
4629 typedef typename _Expr::value_type value_type;
4630 typedef _UnaryOp<__abs_expr<value_type>, _Expr> _Op;
4631 return __val_expr<_Op>(_Op(__abs_expr<value_type>(), __x));
4632}
4633
4634template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004635inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004636typename enable_if
4637<
4638 __is_val_expr<_Expr>::value,
4639 __val_expr<_UnaryOp<__acos_expr<typename _Expr::value_type>, _Expr> >
4640>::type
4641acos(const _Expr& __x)
4642{
4643 typedef typename _Expr::value_type value_type;
4644 typedef _UnaryOp<__acos_expr<value_type>, _Expr> _Op;
4645 return __val_expr<_Op>(_Op(__acos_expr<value_type>(), __x));
4646}
4647
4648template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004649inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004650typename enable_if
4651<
4652 __is_val_expr<_Expr>::value,
4653 __val_expr<_UnaryOp<__asin_expr<typename _Expr::value_type>, _Expr> >
4654>::type
4655asin(const _Expr& __x)
4656{
4657 typedef typename _Expr::value_type value_type;
4658 typedef _UnaryOp<__asin_expr<value_type>, _Expr> _Op;
4659 return __val_expr<_Op>(_Op(__asin_expr<value_type>(), __x));
4660}
4661
4662template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004663inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004664typename enable_if
4665<
4666 __is_val_expr<_Expr>::value,
4667 __val_expr<_UnaryOp<__atan_expr<typename _Expr::value_type>, _Expr> >
4668>::type
4669atan(const _Expr& __x)
4670{
4671 typedef typename _Expr::value_type value_type;
4672 typedef _UnaryOp<__atan_expr<value_type>, _Expr> _Op;
4673 return __val_expr<_Op>(_Op(__atan_expr<value_type>(), __x));
4674}
4675
4676template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004677inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004678typename enable_if
4679<
4680 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4681 __val_expr<_BinaryOp<__atan2_expr<typename _Expr1::value_type>, _Expr1, _Expr2> >
4682>::type
4683atan2(const _Expr1& __x, const _Expr2& __y)
4684{
4685 typedef typename _Expr1::value_type value_type;
4686 typedef _BinaryOp<__atan2_expr<value_type>, _Expr1, _Expr2> _Op;
4687 return __val_expr<_Op>(_Op(__atan2_expr<value_type>(), __x, __y));
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 _Expr, __scalar_expr<typename _Expr::value_type> > >
4697>::type
4698atan2(const _Expr& __x, const typename _Expr::value_type& __y)
4699{
4700 typedef typename _Expr::value_type value_type;
4701 typedef _BinaryOp<__atan2_expr<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4702 return __val_expr<_Op>(_Op(__atan2_expr<value_type>(),
4703 __x, __scalar_expr<value_type>(__y, __x.size())));
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<_BinaryOp<__atan2_expr<typename _Expr::value_type>,
4712 __scalar_expr<typename _Expr::value_type>, _Expr> >
4713>::type
4714atan2(const typename _Expr::value_type& __x, const _Expr& __y)
4715{
4716 typedef typename _Expr::value_type value_type;
4717 typedef _BinaryOp<__atan2_expr<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4718 return __val_expr<_Op>(_Op(__atan2_expr<value_type>(),
4719 __scalar_expr<value_type>(__x, __y.size()), __y));
4720}
4721
4722template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004723inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004724typename enable_if
4725<
4726 __is_val_expr<_Expr>::value,
4727 __val_expr<_UnaryOp<__cos_expr<typename _Expr::value_type>, _Expr> >
4728>::type
4729cos(const _Expr& __x)
4730{
4731 typedef typename _Expr::value_type value_type;
4732 typedef _UnaryOp<__cos_expr<value_type>, _Expr> _Op;
4733 return __val_expr<_Op>(_Op(__cos_expr<value_type>(), __x));
4734}
4735
4736template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004737inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004738typename enable_if
4739<
4740 __is_val_expr<_Expr>::value,
4741 __val_expr<_UnaryOp<__cosh_expr<typename _Expr::value_type>, _Expr> >
4742>::type
4743cosh(const _Expr& __x)
4744{
4745 typedef typename _Expr::value_type value_type;
4746 typedef _UnaryOp<__cosh_expr<value_type>, _Expr> _Op;
4747 return __val_expr<_Op>(_Op(__cosh_expr<value_type>(), __x));
4748}
4749
4750template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004751inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004752typename enable_if
4753<
4754 __is_val_expr<_Expr>::value,
4755 __val_expr<_UnaryOp<__exp_expr<typename _Expr::value_type>, _Expr> >
4756>::type
4757exp(const _Expr& __x)
4758{
4759 typedef typename _Expr::value_type value_type;
4760 typedef _UnaryOp<__exp_expr<value_type>, _Expr> _Op;
4761 return __val_expr<_Op>(_Op(__exp_expr<value_type>(), __x));
4762}
4763
4764template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004765inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004766typename enable_if
4767<
4768 __is_val_expr<_Expr>::value,
4769 __val_expr<_UnaryOp<__log_expr<typename _Expr::value_type>, _Expr> >
4770>::type
4771log(const _Expr& __x)
4772{
4773 typedef typename _Expr::value_type value_type;
4774 typedef _UnaryOp<__log_expr<value_type>, _Expr> _Op;
4775 return __val_expr<_Op>(_Op(__log_expr<value_type>(), __x));
4776}
4777
4778template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004779inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004780typename enable_if
4781<
4782 __is_val_expr<_Expr>::value,
4783 __val_expr<_UnaryOp<__log10_expr<typename _Expr::value_type>, _Expr> >
4784>::type
4785log10(const _Expr& __x)
4786{
4787 typedef typename _Expr::value_type value_type;
4788 typedef _UnaryOp<__log10_expr<value_type>, _Expr> _Op;
4789 return __val_expr<_Op>(_Op(__log10_expr<value_type>(), __x));
4790}
4791
4792template<class _Expr1, class _Expr2>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004793inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004794typename enable_if
4795<
4796 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4797 __val_expr<_BinaryOp<__pow_expr<typename _Expr1::value_type>, _Expr1, _Expr2> >
4798>::type
4799pow(const _Expr1& __x, const _Expr2& __y)
4800{
4801 typedef typename _Expr1::value_type value_type;
4802 typedef _BinaryOp<__pow_expr<value_type>, _Expr1, _Expr2> _Op;
4803 return __val_expr<_Op>(_Op(__pow_expr<value_type>(), __x, __y));
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 _Expr, __scalar_expr<typename _Expr::value_type> > >
4813>::type
4814pow(const _Expr& __x, const typename _Expr::value_type& __y)
4815{
4816 typedef typename _Expr::value_type value_type;
4817 typedef _BinaryOp<__pow_expr<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4818 return __val_expr<_Op>(_Op(__pow_expr<value_type>(),
4819 __x, __scalar_expr<value_type>(__y, __x.size())));
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<_BinaryOp<__pow_expr<typename _Expr::value_type>,
4828 __scalar_expr<typename _Expr::value_type>, _Expr> >
4829>::type
4830pow(const typename _Expr::value_type& __x, const _Expr& __y)
4831{
4832 typedef typename _Expr::value_type value_type;
4833 typedef _BinaryOp<__pow_expr<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4834 return __val_expr<_Op>(_Op(__pow_expr<value_type>(),
4835 __scalar_expr<value_type>(__x, __y.size()), __y));
4836}
4837
4838template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004839inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004840typename enable_if
4841<
4842 __is_val_expr<_Expr>::value,
4843 __val_expr<_UnaryOp<__sin_expr<typename _Expr::value_type>, _Expr> >
4844>::type
4845sin(const _Expr& __x)
4846{
4847 typedef typename _Expr::value_type value_type;
4848 typedef _UnaryOp<__sin_expr<value_type>, _Expr> _Op;
4849 return __val_expr<_Op>(_Op(__sin_expr<value_type>(), __x));
4850}
4851
4852template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004853inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004854typename enable_if
4855<
4856 __is_val_expr<_Expr>::value,
4857 __val_expr<_UnaryOp<__sinh_expr<typename _Expr::value_type>, _Expr> >
4858>::type
4859sinh(const _Expr& __x)
4860{
4861 typedef typename _Expr::value_type value_type;
4862 typedef _UnaryOp<__sinh_expr<value_type>, _Expr> _Op;
4863 return __val_expr<_Op>(_Op(__sinh_expr<value_type>(), __x));
4864}
4865
4866template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004867inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004868typename enable_if
4869<
4870 __is_val_expr<_Expr>::value,
4871 __val_expr<_UnaryOp<__sqrt_expr<typename _Expr::value_type>, _Expr> >
4872>::type
4873sqrt(const _Expr& __x)
4874{
4875 typedef typename _Expr::value_type value_type;
4876 typedef _UnaryOp<__sqrt_expr<value_type>, _Expr> _Op;
4877 return __val_expr<_Op>(_Op(__sqrt_expr<value_type>(), __x));
4878}
4879
4880template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004881inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004882typename enable_if
4883<
4884 __is_val_expr<_Expr>::value,
4885 __val_expr<_UnaryOp<__tan_expr<typename _Expr::value_type>, _Expr> >
4886>::type
4887tan(const _Expr& __x)
4888{
4889 typedef typename _Expr::value_type value_type;
4890 typedef _UnaryOp<__tan_expr<value_type>, _Expr> _Op;
4891 return __val_expr<_Op>(_Op(__tan_expr<value_type>(), __x));
4892}
4893
4894template<class _Expr>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004895inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004896typename enable_if
4897<
4898 __is_val_expr<_Expr>::value,
4899 __val_expr<_UnaryOp<__tanh_expr<typename _Expr::value_type>, _Expr> >
4900>::type
4901tanh(const _Expr& __x)
4902{
4903 typedef typename _Expr::value_type value_type;
4904 typedef _UnaryOp<__tanh_expr<value_type>, _Expr> _Op;
4905 return __val_expr<_Op>(_Op(__tanh_expr<value_type>(), __x));
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*
4911begin(valarray<_Tp>& __v)
4912{
4913 return __v.__begin_;
4914}
4915
4916template <class _Tp>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004917inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004918const _Tp*
4919begin(const valarray<_Tp>& __v)
4920{
4921 return __v.__begin_;
4922}
4923
4924template <class _Tp>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004925inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004926_Tp*
4927end(valarray<_Tp>& __v)
4928{
4929 return __v.__end_;
4930}
4931
4932template <class _Tp>
Howard Hinnant1c265cd2010-09-23 18:58:28 +00004933inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc51e1022010-05-11 19:42:16 +00004934const _Tp*
4935end(const valarray<_Tp>& __v)
4936{
4937 return __v.__end_;
4938}
4939
Howard Hinnantc51e1022010-05-11 19:42:16 +00004940_LIBCPP_END_NAMESPACE_STD
4941
Eric Fiselierf4433a32017-05-31 22:07:49 +00004942_LIBCPP_POP_MACROS
4943
Howard Hinnantc51e1022010-05-11 19:42:16 +00004944#endif // _LIBCPP_VALARRAY