blob: 62c1c66c344f6bca82b4ad0d0971628a54bd29ea [file] [log] [blame]
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001// -*- C++ -*-
2//===-------------------------- valarray ----------------------------------===//
3//
Howard Hinnantf5256e12010-05-11 21:36:01 +00004// The LLVM Compiler Infrastructure
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00005//
Howard Hinnantb64f8b02010-11-16 22:09:02 +00006// This file is dual licensed under the MIT and the University of Illinois Open
7// Source Licenses. See LICENSE.TXT for details.
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00008//
9//===----------------------------------------------------------------------===//
10
11#ifndef _LIBCPP_VALARRAY
12#define _LIBCPP_VALARRAY
13
14/*
15 valarray synopsis
16
17namespace std
18{
19
20template<class T>
21class valarray
22{
23public:
24 typedef T value_type;
25
26 // construct/destroy:
27 valarray();
28 explicit valarray(size_t n);
29 valarray(const value_type& x, size_t n);
30 valarray(const value_type* px, size_t n);
31 valarray(const valarray& v);
32 valarray(valarray&& v);
33 valarray(const slice_array<value_type>& sa);
34 valarray(const gslice_array<value_type>& ga);
35 valarray(const mask_array<value_type>& ma);
36 valarray(const indirect_array<value_type>& ia);
37 valarray(initializer_list<value_type> il);
38 ~valarray();
39
40 // assignment:
41 valarray& operator=(const valarray& v);
42 valarray& operator=(valarray&& v);
43 valarray& operator=(initializer_list<value_type> il);
44 valarray& operator=(const value_type& x);
45 valarray& operator=(const slice_array<value_type>& sa);
46 valarray& operator=(const gslice_array<value_type>& ga);
47 valarray& operator=(const mask_array<value_type>& ma);
48 valarray& operator=(const indirect_array<value_type>& ia);
49
50 // element access:
51 const value_type& operator[](size_t i) const;
52 value_type& operator[](size_t i);
53
54 // subset operations:
55 valarray operator[](slice s) const;
56 slice_array<value_type> operator[](slice s);
57 valarray operator[](const gslice& gs) const;
58 gslice_array<value_type> operator[](const gslice& gs);
59 valarray operator[](const valarray<bool>& vb) const;
60 mask_array<value_type> operator[](const valarray<bool>& vb);
61 valarray operator[](const valarray<size_t>& vs) const;
62 indirect_array<value_type> operator[](const valarray<size_t>& vs);
63
64 // unary operators:
65 valarray operator+() const;
66 valarray operator-() const;
67 valarray operator~() const;
68 valarray<bool> operator!() const;
69
70 // computed assignment:
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 valarray& operator>>=(const value_type& x);
81
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 valarray& operator>>=(const valarray& v);
92
93 // member functions:
94 void swap(valarray& v);
95
96 size_t size() const;
97
98 value_type sum() const;
99 value_type min() const;
100 value_type max() const;
101
102 valarray shift (int i) const;
103 valarray cshift(int i) const;
104 valarray apply(value_type f(value_type)) const;
105 valarray apply(value_type f(const value_type&)) const;
106 void resize(size_t n, value_type x = value_type());
107};
108
109class slice
110{
111public:
112 slice();
113 slice(size_t start, size_t size, size_t stride);
114
115 size_t start() const;
116 size_t size() const;
117 size_t stride() const;
118};
119
120template <class T>
121class slice_array
122{
123public:
124 typedef T value_type;
125
126 const slice_array& operator=(const slice_array& sa) 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 void operator>>=(const valarray<value_type>& v) const;
138
139 void operator=(const value_type& x) const;
140
141 slice_array() = delete;
142};
143
144class gslice
145{
146public:
147 gslice();
148 gslice(size_t start, const valarray<size_t>& size,
149 const valarray<size_t>& stride);
150
151 size_t start() const;
152 valarray<size_t> size() const;
153 valarray<size_t> stride() const;
154};
155
156template <class T>
157class gslice_array
158{
159public:
160 typedef T value_type;
161
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 void operator>>=(const valarray<value_type>& v) const;
173
174 gslice_array(const gslice_array& ga);
175 ~gslice_array();
176 const gslice_array& operator=(const gslice_array& ga) const;
177 void operator=(const value_type& x) const;
178
179 gslice_array() = delete;
180};
181
182template <class T>
183class mask_array
184{
185public:
186 typedef T value_type;
187
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 void operator>>=(const valarray<value_type>& v) const;
199
200 mask_array(const mask_array& ma);
201 ~mask_array();
202 const mask_array& operator=(const mask_array& ma) const;
203 void operator=(const value_type& x) const;
204
205 mask_array() = delete;
206};
207
208template <class T>
209class indirect_array
210{
211public:
212 typedef T value_type;
213
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 void operator>>=(const valarray<value_type>& v) const;
225
226 indirect_array(const indirect_array& ia);
227 ~indirect_array();
228 const indirect_array& operator=(const indirect_array& ia) const;
229 void operator=(const value_type& x) const;
230
231 indirect_array() = delete;
232};
233
234template<class T> void swap(valarray<T>& x, valarray<T>& y);
235
236template<class T> valarray<T> operator* (const valarray<T>& x, const valarray<T>& y);
237template<class T> valarray<T> operator* (const valarray<T>& x, const T& y);
238template<class T> valarray<T> operator* (const T& x, const valarray<T>& y);
239
240template<class T> valarray<T> operator/ (const valarray<T>& x, const valarray<T>& y);
241template<class T> valarray<T> operator/ (const valarray<T>& x, const T& y);
242template<class T> valarray<T> operator/ (const T& x, const valarray<T>& y);
243
244template<class T> valarray<T> operator% (const valarray<T>& x, const valarray<T>& y);
245template<class T> valarray<T> operator% (const valarray<T>& x, const T& y);
246template<class T> valarray<T> operator% (const T& x, const valarray<T>& y);
247
248template<class T> valarray<T> operator+ (const valarray<T>& x, const valarray<T>& y);
249template<class T> valarray<T> operator+ (const valarray<T>& x, const T& y);
250template<class T> valarray<T> operator+ (const T& x, const valarray<T>& y);
251
252template<class T> valarray<T> operator- (const valarray<T>& x, const valarray<T>& y);
253template<class T> valarray<T> operator- (const valarray<T>& x, const T& y);
254template<class T> valarray<T> operator- (const T& x, const valarray<T>& y);
255
256template<class T> valarray<T> operator^ (const valarray<T>& x, const valarray<T>& y);
257template<class T> valarray<T> operator^ (const valarray<T>& x, const T& y);
258template<class T> valarray<T> operator^ (const T& x, const valarray<T>& y);
259
260template<class T> valarray<T> operator& (const valarray<T>& x, const valarray<T>& y);
261template<class T> valarray<T> operator& (const valarray<T>& x, const T& y);
262template<class T> valarray<T> operator& (const T& x, const valarray<T>& y);
263
264template<class T> valarray<T> operator| (const valarray<T>& x, const valarray<T>& y);
265template<class T> valarray<T> operator| (const valarray<T>& x, const T& y);
266template<class T> valarray<T> operator| (const T& x, const valarray<T>& y);
267
268template<class T> valarray<T> operator<<(const valarray<T>& x, const valarray<T>& y);
269template<class T> valarray<T> operator<<(const valarray<T>& x, const T& y);
270template<class T> valarray<T> operator<<(const T& x, const valarray<T>& y);
271
272template<class T> valarray<T> operator>>(const valarray<T>& x, const valarray<T>& y);
273template<class T> valarray<T> operator>>(const valarray<T>& x, const T& y);
274template<class T> valarray<T> operator>>(const T& x, const valarray<T>& y);
275
276template<class T> valarray<bool> operator&&(const valarray<T>& x, const valarray<T>& y);
277template<class T> valarray<bool> operator&&(const valarray<T>& x, const T& y);
278template<class T> valarray<bool> operator&&(const T& x, const valarray<T>& y);
279
280template<class T> valarray<bool> operator||(const valarray<T>& x, const valarray<T>& y);
281template<class T> valarray<bool> operator||(const valarray<T>& x, const T& y);
282template<class T> valarray<bool> operator||(const T& x, const valarray<T>& y);
283
284template<class T> valarray<bool> operator==(const valarray<T>& x, const valarray<T>& y);
285template<class T> valarray<bool> operator==(const valarray<T>& x, const T& y);
286template<class T> valarray<bool> operator==(const T& x, const valarray<T>& y);
287
288template<class T> valarray<bool> operator!=(const valarray<T>& x, const valarray<T>& y);
289template<class T> valarray<bool> operator!=(const valarray<T>& x, const T& y);
290template<class T> valarray<bool> operator!=(const T& x, const valarray<T>& y);
291
292template<class T> valarray<bool> operator< (const valarray<T>& x, const valarray<T>& y);
293template<class T> valarray<bool> operator< (const valarray<T>& x, const T& y);
294template<class T> valarray<bool> operator< (const T& x, const valarray<T>& y);
295
296template<class T> valarray<bool> operator> (const valarray<T>& x, const valarray<T>& y);
297template<class T> valarray<bool> operator> (const valarray<T>& x, const T& y);
298template<class T> valarray<bool> operator> (const T& x, const valarray<T>& y);
299
300template<class T> valarray<bool> operator<=(const valarray<T>& x, const valarray<T>& y);
301template<class T> valarray<bool> operator<=(const valarray<T>& x, const T& y);
302template<class T> valarray<bool> operator<=(const T& x, const valarray<T>& y);
303
304template<class T> valarray<bool> operator>=(const valarray<T>& x, const valarray<T>& y);
305template<class T> valarray<bool> operator>=(const valarray<T>& x, const T& y);
306template<class T> valarray<bool> operator>=(const T& x, const valarray<T>& y);
307
308template<class T> valarray<T> abs (const valarray<T>& x);
309template<class T> valarray<T> acos (const valarray<T>& x);
310template<class T> valarray<T> asin (const valarray<T>& x);
311template<class T> valarray<T> atan (const valarray<T>& x);
312
313template<class T> valarray<T> atan2(const valarray<T>& x, const valarray<T>& y);
314template<class T> valarray<T> atan2(const valarray<T>& x, const T& y);
315template<class T> valarray<T> atan2(const T& x, const valarray<T>& y);
316
317template<class T> valarray<T> cos (const valarray<T>& x);
318template<class T> valarray<T> cosh (const valarray<T>& x);
319template<class T> valarray<T> exp (const valarray<T>& x);
320template<class T> valarray<T> log (const valarray<T>& x);
321template<class T> valarray<T> log10(const valarray<T>& x);
322
323template<class T> valarray<T> pow(const valarray<T>& x, const valarray<T>& y);
324template<class T> valarray<T> pow(const valarray<T>& x, const T& y);
325template<class T> valarray<T> pow(const T& x, const valarray<T>& y);
326
327template<class T> valarray<T> sin (const valarray<T>& x);
328template<class T> valarray<T> sinh (const valarray<T>& x);
329template<class T> valarray<T> sqrt (const valarray<T>& x);
330template<class T> valarray<T> tan (const valarray<T>& x);
331template<class T> valarray<T> tanh (const valarray<T>& x);
332
333template <class T> unspecified1 begin(valarray<T>& v);
334template <class T> unspecified2 begin(const valarray<T>& v);
335template <class T> unspecified1 end(valarray<T>& v);
336template <class T> unspecified2 end(const valarray<T>& v);
337
338} // std
339
340*/
341
342#include <__config>
343#include <cstddef>
344#include <cmath>
345#include <initializer_list>
346#include <algorithm>
347#include <functional>
348
349#pragma GCC system_header
350
351_LIBCPP_BEGIN_NAMESPACE_STD
352
353template<class _Tp> class valarray;
354
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000355class _LIBCPP_VISIBLE slice
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000356{
357 size_t __start_;
358 size_t __size_;
359 size_t __stride_;
360public:
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000361 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000362 slice()
363 : __start_(0),
364 __size_(0),
365 __stride_(0)
366 {}
367
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000368 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000369 slice(size_t __start, size_t __size, size_t __stride)
370 : __start_(__start),
371 __size_(__size),
372 __stride_(__stride)
373 {}
374
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000375 _LIBCPP_INLINE_VISIBILITY size_t start() const {return __start_;}
376 _LIBCPP_INLINE_VISIBILITY size_t size() const {return __size_;}
377 _LIBCPP_INLINE_VISIBILITY size_t stride() const {return __stride_;}
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000378};
379
380template <class _Tp> class slice_array;
381class gslice;
382template <class _Tp> class gslice_array;
383template <class _Tp> class mask_array;
384template <class _Tp> class indirect_array;
385
386template <class _Tp>
387_Tp*
388begin(valarray<_Tp>& __v);
389
390template <class _Tp>
391const _Tp*
392begin(const valarray<_Tp>& __v);
393
394template <class _Tp>
395_Tp*
396end(valarray<_Tp>& __v);
397
398template <class _Tp>
399const _Tp*
400end(const valarray<_Tp>& __v);
401
402template <class _Op, class _A0>
403struct _UnaryOp
404{
405 typedef typename _Op::result_type result_type;
406 typedef typename _A0::value_type value_type;
407
408 _Op __op_;
409 _A0 __a0_;
410
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000411 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000412 _UnaryOp(const _Op& __op, const _A0& __a0) : __op_(__op), __a0_(__a0) {}
413
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000414 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000415 result_type operator[](size_t __i) const {return __op_(__a0_[__i]);}
416
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000417 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000418 size_t size() const {return __a0_.size();}
419};
420
421template <class _Op, class _A0, class _A1>
422struct _BinaryOp
423{
424 typedef typename _Op::result_type result_type;
425 typedef typename _A0::value_type value_type;
426
427 _Op __op_;
428 _A0 __a0_;
429 _A1 __a1_;
430
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000431 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000432 _BinaryOp(const _Op& __op, const _A0& __a0, const _A1& __a1)
433 : __op_(__op), __a0_(__a0), __a1_(__a1) {}
434
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000435 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000436 value_type operator[](size_t __i) const {return __op_(__a0_[__i], __a1_[__i]);}
437
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000438 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000439 size_t size() const {return __a0_.size();}
440};
441
442template <class _Tp>
443class __scalar_expr
444{
445public:
446 typedef _Tp value_type;
447 typedef const _Tp& result_type;
448private:
449 const value_type& __t_;
450 size_t __s_;
451public:
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000452 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000453 explicit __scalar_expr(const value_type& __t, size_t __s) : __t_(__t), __s_(__s) {}
454
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000455 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000456 result_type operator[](size_t) const {return __t_;}
457
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000458 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000459 size_t size() const {return __s_;}
460};
461
462template <class _Tp>
463struct __unary_plus : unary_function<_Tp, _Tp>
464{
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000465 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000466 _Tp operator()(const _Tp& __x) const
467 {return +__x;}
468};
469
470template <class _Tp>
471struct __bit_not : unary_function<_Tp, _Tp>
472{
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000473 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000474 _Tp operator()(const _Tp& __x) const
475 {return ~__x;}
476};
477
478template <class _Tp>
479struct __bit_shift_left : binary_function<_Tp, _Tp, _Tp>
480{
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000481 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000482 _Tp operator()(const _Tp& __x, const _Tp& __y) const
483 {return __x << __y;}
484};
485
486template <class _Tp>
487struct __bit_shift_right : binary_function<_Tp, _Tp, _Tp>
488{
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000489 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000490 _Tp operator()(const _Tp& __x, const _Tp& __y) const
491 {return __x >> __y;}
492};
493
494template <class _Tp, class _F>
495struct __apply_expr : unary_function<_Tp, _Tp>
496{
497private:
498 _F __f_;
499public:
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000500 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000501 explicit __apply_expr(_F __f) : __f_(__f) {}
502
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000503 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000504 _Tp operator()(const _Tp& __x) const
505 {return __f_(__x);}
506};
507
508template <class _Tp>
509struct __abs_expr : unary_function<_Tp, _Tp>
510{
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000511 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000512 _Tp operator()(const _Tp& __x) const
513 {return abs(__x);}
514};
515
516template <class _Tp>
517struct __acos_expr : unary_function<_Tp, _Tp>
518{
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000519 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000520 _Tp operator()(const _Tp& __x) const
521 {return acos(__x);}
522};
523
524template <class _Tp>
525struct __asin_expr : unary_function<_Tp, _Tp>
526{
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000527 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000528 _Tp operator()(const _Tp& __x) const
529 {return asin(__x);}
530};
531
532template <class _Tp>
533struct __atan_expr : unary_function<_Tp, _Tp>
534{
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000535 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000536 _Tp operator()(const _Tp& __x) const
537 {return atan(__x);}
538};
539
540template <class _Tp>
541struct __atan2_expr : binary_function<_Tp, _Tp, _Tp>
542{
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000543 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000544 _Tp operator()(const _Tp& __x, const _Tp& __y) const
545 {return atan2(__x, __y);}
546};
547
548template <class _Tp>
549struct __cos_expr : unary_function<_Tp, _Tp>
550{
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000551 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000552 _Tp operator()(const _Tp& __x) const
553 {return cos(__x);}
554};
555
556template <class _Tp>
557struct __cosh_expr : unary_function<_Tp, _Tp>
558{
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000559 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000560 _Tp operator()(const _Tp& __x) const
561 {return cosh(__x);}
562};
563
564template <class _Tp>
565struct __exp_expr : unary_function<_Tp, _Tp>
566{
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000567 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000568 _Tp operator()(const _Tp& __x) const
569 {return exp(__x);}
570};
571
572template <class _Tp>
573struct __log_expr : unary_function<_Tp, _Tp>
574{
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000575 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000576 _Tp operator()(const _Tp& __x) const
577 {return log(__x);}
578};
579
580template <class _Tp>
581struct __log10_expr : unary_function<_Tp, _Tp>
582{
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000583 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000584 _Tp operator()(const _Tp& __x) const
585 {return log10(__x);}
586};
587
588template <class _Tp>
589struct __pow_expr : binary_function<_Tp, _Tp, _Tp>
590{
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000591 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000592 _Tp operator()(const _Tp& __x, const _Tp& __y) const
593 {return pow(__x, __y);}
594};
595
596template <class _Tp>
597struct __sin_expr : unary_function<_Tp, _Tp>
598{
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000599 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000600 _Tp operator()(const _Tp& __x) const
601 {return sin(__x);}
602};
603
604template <class _Tp>
605struct __sinh_expr : unary_function<_Tp, _Tp>
606{
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000607 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000608 _Tp operator()(const _Tp& __x) const
609 {return sinh(__x);}
610};
611
612template <class _Tp>
613struct __sqrt_expr : unary_function<_Tp, _Tp>
614{
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000615 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000616 _Tp operator()(const _Tp& __x) const
617 {return sqrt(__x);}
618};
619
620template <class _Tp>
621struct __tan_expr : unary_function<_Tp, _Tp>
622{
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000623 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000624 _Tp operator()(const _Tp& __x) const
625 {return tan(__x);}
626};
627
628template <class _Tp>
629struct __tanh_expr : unary_function<_Tp, _Tp>
630{
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000631 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000632 _Tp operator()(const _Tp& __x) const
633 {return tanh(__x);}
634};
635
636template <class _ValExpr>
637class __slice_expr
638{
639 typedef typename remove_reference<_ValExpr>::type _RmExpr;
640public:
641 typedef typename _RmExpr::value_type value_type;
642 typedef value_type result_type;
643
644private:
645 _ValExpr __expr_;
646 size_t __start_;
647 size_t __size_;
648 size_t __stride_;
649
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000650 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000651 __slice_expr(const slice& __sl, const _RmExpr& __e)
652 : __expr_(__e),
653 __start_(__sl.start()),
654 __size_(__sl.size()),
655 __stride_(__sl.stride())
656 {}
657public:
658
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000659 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000660 result_type operator[](size_t __i) const
661 {return __expr_[__start_ + __i * __stride_];}
662
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000663 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000664 size_t size() const {return __size_;}
665
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000666 template <class> friend class _LIBCPP_VISIBLE valarray;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000667};
668
669template <class _ValExpr>
670class __mask_expr;
671
672template <class _ValExpr>
673class __indirect_expr;
674
675template <class _ValExpr>
676class __shift_expr
677{
678 typedef typename remove_reference<_ValExpr>::type _RmExpr;
679public:
680 typedef typename _RmExpr::value_type value_type;
681 typedef value_type result_type;
682
683private:
684 _ValExpr __expr_;
685 size_t __size_;
686 ptrdiff_t __ul_;
687 ptrdiff_t __sn_;
688 ptrdiff_t __n_;
689 static const ptrdiff_t _N = static_cast<ptrdiff_t>(
690 sizeof(ptrdiff_t) * __CHAR_BIT__ - 1);
691
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000692 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000693 __shift_expr(int __n, const _RmExpr& __e)
694 : __expr_(__e),
695 __size_(__e.size()),
696 __n_(__n)
697 {
698 ptrdiff_t __neg_n = static_cast<ptrdiff_t>(__n_ >> _N);
699 __sn_ = __neg_n | static_cast<ptrdiff_t>(static_cast<size_t>(-__n_) >> _N);
700 __ul_ = ((__size_ - __n_) & ~__neg_n) | ((__n_ + 1) & __neg_n);
701 }
702public:
703
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000704 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000705 result_type operator[](size_t __j) const
706 {
707 ptrdiff_t __i = static_cast<size_t>(__j);
708 ptrdiff_t __m = (__sn_ * __i - __ul_) >> _N;
709 return (__expr_[(__i + __n_) & __m] & __m) | (value_type() & ~__m);
710 }
711
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000712 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000713 size_t size() const {return __size_;}
714
715 template <class> friend class __val_expr;
716};
717
718template <class _ValExpr>
719class __cshift_expr
720{
721 typedef typename remove_reference<_ValExpr>::type _RmExpr;
722public:
723 typedef typename _RmExpr::value_type value_type;
724 typedef value_type result_type;
725
726private:
727 _ValExpr __expr_;
728 size_t __size_;
729 size_t __m_;
730 size_t __o1_;
731 size_t __o2_;
732
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000733 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000734 __cshift_expr(int __n, const _RmExpr& __e)
735 : __expr_(__e),
736 __size_(__e.size())
737 {
738 __n %= static_cast<int>(__size_);
739 if (__n >= 0)
740 {
741 __m_ = __size_ - __n;
742 __o1_ = __n;
743 __o2_ = __n - __size_;
744 }
745 else
746 {
747 __m_ = -__n;
748 __o1_ = __n + __size_;
749 __o2_ = __n;
750 }
751 }
752public:
753
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000754 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000755 result_type operator[](size_t __i) const
756 {
757 if (__i < __m_)
758 return __expr_[__i + __o1_];
759 return __expr_[__i + __o2_];
760 }
761
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000762 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000763 size_t size() const {return __size_;}
764
765 template <class> friend class __val_expr;
766};
767
768template<class _ValExpr>
769class __val_expr;
770
771template<class _ValExpr>
772struct __is_val_expr : false_type {};
773
774template<class _ValExpr>
775struct __is_val_expr<__val_expr<_ValExpr> > : true_type {};
776
777template<class _Tp>
778struct __is_val_expr<valarray<_Tp> > : true_type {};
779
780template<class _Tp>
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000781class _LIBCPP_VISIBLE valarray
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000782{
783public:
784 typedef _Tp value_type;
785 typedef _Tp result_type;
786
787private:
788 value_type* __begin_;
789 value_type* __end_;
790
791public:
792 // construct/destroy:
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000793 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000794 valarray() : __begin_(0), __end_(0) {}
795 explicit valarray(size_t __n);
796 valarray(const value_type& __x, size_t __n);
797 valarray(const value_type* __p, size_t __n);
798 valarray(const valarray& __v);
Howard Hinnant73d21a42010-09-04 23:28:19 +0000799#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000800 valarray(valarray&& __v);
Howard Hinnant73d21a42010-09-04 23:28:19 +0000801#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnante3e32912011-08-12 21:56:02 +0000802#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
803 valarray(initializer_list<value_type> __il);
804#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000805 valarray(const slice_array<value_type>& __sa);
806 valarray(const gslice_array<value_type>& __ga);
807 valarray(const mask_array<value_type>& __ma);
808 valarray(const indirect_array<value_type>& __ia);
809 ~valarray();
810
811 // assignment:
812 valarray& operator=(const valarray& __v);
Howard Hinnant73d21a42010-09-04 23:28:19 +0000813#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000814 valarray& operator=(valarray&& __v);
Howard Hinnant73d21a42010-09-04 23:28:19 +0000815#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnante3e32912011-08-12 21:56:02 +0000816#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
817 valarray& operator=(initializer_list<value_type>);
818#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000819 valarray& operator=(const value_type& __x);
820 valarray& operator=(const slice_array<value_type>& __sa);
821 valarray& operator=(const gslice_array<value_type>& __ga);
822 valarray& operator=(const mask_array<value_type>& __ma);
823 valarray& operator=(const indirect_array<value_type>& __ia);
Howard Hinnantdb866632011-07-27 23:19:59 +0000824 template <class _ValExpr>
825 valarray& operator=(const __val_expr<_ValExpr>& __v);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000826
827 // element access:
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000828 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000829 const value_type& operator[](size_t __i) const {return __begin_[__i];}
830
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000831 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000832 value_type& operator[](size_t __i) {return __begin_[__i];}
833
834 // subset operations:
835 __val_expr<__slice_expr<const valarray&> > operator[](slice __s) const;
836 slice_array<value_type> operator[](slice __s);
837 __val_expr<__indirect_expr<const valarray&> > operator[](const gslice& __gs) const;
838 gslice_array<value_type> operator[](const gslice& __gs);
Howard Hinnant73d21a42010-09-04 23:28:19 +0000839#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000840 __val_expr<__indirect_expr<const valarray&> > operator[](gslice&& __gs) const;
841 gslice_array<value_type> operator[](gslice&& __gs);
Howard Hinnant73d21a42010-09-04 23:28:19 +0000842#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000843 __val_expr<__mask_expr<const valarray&> > operator[](const valarray<bool>& __vb) const;
844 mask_array<value_type> operator[](const valarray<bool>& __vb);
Howard Hinnant73d21a42010-09-04 23:28:19 +0000845#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000846 __val_expr<__mask_expr<const valarray&> > operator[](valarray<bool>&& __vb) const;
847 mask_array<value_type> operator[](valarray<bool>&& __vb);
Howard Hinnant73d21a42010-09-04 23:28:19 +0000848#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000849 __val_expr<__indirect_expr<const valarray&> > operator[](const valarray<size_t>& __vs) const;
850 indirect_array<value_type> operator[](const valarray<size_t>& __vs);
Howard Hinnant73d21a42010-09-04 23:28:19 +0000851#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000852 __val_expr<__indirect_expr<const valarray&> > operator[](valarray<size_t>&& __vs) const;
853 indirect_array<value_type> operator[](valarray<size_t>&& __vs);
Howard Hinnant73d21a42010-09-04 23:28:19 +0000854#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000855
856 // unary operators:
857 valarray operator+() const;
858 valarray operator-() const;
859 valarray operator~() const;
860 valarray<bool> operator!() const;
861
862 // computed assignment:
863 valarray& operator*= (const value_type& __x);
864 valarray& operator/= (const value_type& __x);
865 valarray& operator%= (const value_type& __x);
866 valarray& operator+= (const value_type& __x);
867 valarray& operator-= (const value_type& __x);
868 valarray& operator^= (const value_type& __x);
869 valarray& operator&= (const value_type& __x);
870 valarray& operator|= (const value_type& __x);
871 valarray& operator<<=(const value_type& __x);
872 valarray& operator>>=(const value_type& __x);
873
874 template <class _Expr>
875 typename enable_if
876 <
877 __is_val_expr<_Expr>::value,
878 valarray&
879 >::type
880 operator*= (const _Expr& __v);
881
882 template <class _Expr>
883 typename enable_if
884 <
885 __is_val_expr<_Expr>::value,
886 valarray&
887 >::type
888 operator/= (const _Expr& __v);
889
890 template <class _Expr>
891 typename enable_if
892 <
893 __is_val_expr<_Expr>::value,
894 valarray&
895 >::type
896 operator%= (const _Expr& __v);
897
898 template <class _Expr>
899 typename enable_if
900 <
901 __is_val_expr<_Expr>::value,
902 valarray&
903 >::type
904 operator+= (const _Expr& __v);
905
906 template <class _Expr>
907 typename enable_if
908 <
909 __is_val_expr<_Expr>::value,
910 valarray&
911 >::type
912 operator-= (const _Expr& __v);
913
914 template <class _Expr>
915 typename enable_if
916 <
917 __is_val_expr<_Expr>::value,
918 valarray&
919 >::type
920 operator^= (const _Expr& __v);
921
922 template <class _Expr>
923 typename enable_if
924 <
925 __is_val_expr<_Expr>::value,
926 valarray&
927 >::type
928 operator|= (const _Expr& __v);
929
930 template <class _Expr>
931 typename enable_if
932 <
933 __is_val_expr<_Expr>::value,
934 valarray&
935 >::type
936 operator&= (const _Expr& __v);
937
938 template <class _Expr>
939 typename enable_if
940 <
941 __is_val_expr<_Expr>::value,
942 valarray&
943 >::type
944 operator<<= (const _Expr& __v);
945
946 template <class _Expr>
947 typename enable_if
948 <
949 __is_val_expr<_Expr>::value,
950 valarray&
951 >::type
952 operator>>= (const _Expr& __v);
953
954 // member functions:
955 void swap(valarray& __v);
956
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000957 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000958 size_t size() const {return __end_ - __begin_;}
959
960 value_type sum() const;
961 value_type min() const;
962 value_type max() const;
963
964 valarray shift (int __i) const;
965 valarray cshift(int __i) const;
966 valarray apply(value_type __f(value_type)) const;
967 valarray apply(value_type __f(const value_type&)) const;
968 void resize(size_t __n, value_type __x = value_type());
969
970private:
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000971 template <class> friend class _LIBCPP_VISIBLE valarray;
972 template <class> friend class _LIBCPP_VISIBLE slice_array;
973 template <class> friend class _LIBCPP_VISIBLE gslice_array;
974 template <class> friend class _LIBCPP_VISIBLE mask_array;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000975 template <class> friend class __mask_expr;
Howard Hinnantee6ccd02010-09-23 18:58:28 +0000976 template <class> friend class _LIBCPP_VISIBLE indirect_array;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000977 template <class> friend class __indirect_expr;
978 template <class> friend class __val_expr;
979
980 template <class _Up>
981 friend
982 _Up*
983 begin(valarray<_Up>& __v);
Howard Hinnant324bb032010-08-22 00:02:43 +0000984
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000985 template <class _Up>
986 friend
987 const _Up*
988 begin(const valarray<_Up>& __v);
Howard Hinnant324bb032010-08-22 00:02:43 +0000989
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000990 template <class _Up>
991 friend
992 _Up*
993 end(valarray<_Up>& __v);
Howard Hinnant324bb032010-08-22 00:02:43 +0000994
Howard Hinnantbc8d3f92010-05-11 19:42:16 +0000995 template <class _Up>
996 friend
997 const _Up*
998 end(const valarray<_Up>& __v);
999};
1000
1001template <class _Op, class _Tp>
1002struct _UnaryOp<_Op, valarray<_Tp> >
1003{
1004 typedef typename _Op::result_type result_type;
1005 typedef _Tp value_type;
1006
1007 _Op __op_;
1008 const valarray<_Tp>& __a0_;
1009
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001010 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001011 _UnaryOp(const _Op& __op, const valarray<_Tp>& __a0) : __op_(__op), __a0_(__a0) {}
1012
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001013 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001014 result_type operator[](size_t __i) const {return __op_(__a0_[__i]);}
1015
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001016 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001017 size_t size() const {return __a0_.size();}
1018};
1019
1020template <class _Op, class _Tp, class _A1>
1021struct _BinaryOp<_Op, valarray<_Tp>, _A1>
1022{
1023 typedef typename _Op::result_type result_type;
1024 typedef _Tp value_type;
1025
1026 _Op __op_;
1027 const valarray<_Tp>& __a0_;
1028 _A1 __a1_;
1029
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001030 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001031 _BinaryOp(const _Op& __op, const valarray<_Tp>& __a0, const _A1& __a1)
1032 : __op_(__op), __a0_(__a0), __a1_(__a1) {}
1033
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001034 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001035 value_type operator[](size_t __i) const {return __op_(__a0_[__i], __a1_[__i]);}
1036
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001037 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001038 size_t size() const {return __a0_.size();}
1039};
1040
1041template <class _Op, class _A0, class _Tp>
1042struct _BinaryOp<_Op, _A0, valarray<_Tp> >
1043{
1044 typedef typename _Op::result_type result_type;
1045 typedef _Tp value_type;
1046
1047 _Op __op_;
1048 _A0 __a0_;
1049 const valarray<_Tp>& __a1_;
1050
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001051 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001052 _BinaryOp(const _Op& __op, const _A0& __a0, const valarray<_Tp>& __a1)
1053 : __op_(__op), __a0_(__a0), __a1_(__a1) {}
1054
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001055 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001056 value_type operator[](size_t __i) const {return __op_(__a0_[__i], __a1_[__i]);}
1057
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001058 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001059 size_t size() const {return __a0_.size();}
1060};
1061
1062template <class _Op, class _Tp>
1063struct _BinaryOp<_Op, valarray<_Tp>, valarray<_Tp> >
1064{
1065 typedef typename _Op::result_type result_type;
1066 typedef _Tp value_type;
1067
1068 _Op __op_;
1069 const valarray<_Tp>& __a0_;
1070 const valarray<_Tp>& __a1_;
1071
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001072 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001073 _BinaryOp(const _Op& __op, const valarray<_Tp>& __a0, const valarray<_Tp>& __a1)
1074 : __op_(__op), __a0_(__a0), __a1_(__a1) {}
1075
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001076 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001077 value_type operator[](size_t __i) const {return __op_(__a0_[__i], __a1_[__i]);}
1078
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001079 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001080 size_t size() const {return __a0_.size();}
1081};
1082
1083// slice_array
1084
1085template <class _Tp>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001086class _LIBCPP_VISIBLE slice_array
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001087{
1088public:
1089 typedef _Tp value_type;
1090
1091private:
1092 value_type* __vp_;
1093 size_t __size_;
1094 size_t __stride_;
1095
1096public:
1097 template <class _Expr>
1098 typename enable_if
1099 <
1100 __is_val_expr<_Expr>::value,
1101 void
1102 >::type
1103 operator=(const _Expr& __v) const;
1104
1105 template <class _Expr>
1106 typename enable_if
1107 <
1108 __is_val_expr<_Expr>::value,
1109 void
1110 >::type
1111 operator*=(const _Expr& __v) const;
1112
1113 template <class _Expr>
1114 typename enable_if
1115 <
1116 __is_val_expr<_Expr>::value,
1117 void
1118 >::type
1119 operator/=(const _Expr& __v) const;
1120
1121 template <class _Expr>
1122 typename enable_if
1123 <
1124 __is_val_expr<_Expr>::value,
1125 void
1126 >::type
1127 operator%=(const _Expr& __v) const;
1128
1129 template <class _Expr>
1130 typename enable_if
1131 <
1132 __is_val_expr<_Expr>::value,
1133 void
1134 >::type
1135 operator+=(const _Expr& __v) const;
1136
1137 template <class _Expr>
1138 typename enable_if
1139 <
1140 __is_val_expr<_Expr>::value,
1141 void
1142 >::type
1143 operator-=(const _Expr& __v) const;
1144
1145 template <class _Expr>
1146 typename enable_if
1147 <
1148 __is_val_expr<_Expr>::value,
1149 void
1150 >::type
1151 operator^=(const _Expr& __v) const;
1152
1153 template <class _Expr>
1154 typename enable_if
1155 <
1156 __is_val_expr<_Expr>::value,
1157 void
1158 >::type
1159 operator&=(const _Expr& __v) const;
1160
1161 template <class _Expr>
1162 typename enable_if
1163 <
1164 __is_val_expr<_Expr>::value,
1165 void
1166 >::type
1167 operator|=(const _Expr& __v) const;
1168
1169 template <class _Expr>
1170 typename enable_if
1171 <
1172 __is_val_expr<_Expr>::value,
1173 void
1174 >::type
1175 operator<<=(const _Expr& __v) const;
1176
1177 template <class _Expr>
1178 typename enable_if
1179 <
1180 __is_val_expr<_Expr>::value,
1181 void
1182 >::type
1183 operator>>=(const _Expr& __v) const;
1184
1185 const slice_array& operator=(const slice_array& __sa) const;
1186
1187 void operator=(const value_type& __x) const;
1188
1189private:
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001190 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001191 slice_array(const slice& __sl, const valarray<value_type>& __v)
1192 : __vp_(const_cast<value_type*>(__v.__begin_ + __sl.start())),
1193 __size_(__sl.size()),
1194 __stride_(__sl.stride())
1195 {}
1196
1197 template <class> friend class valarray;
1198 template <class> friend class sliceExpr;
1199};
1200
1201template <class _Tp>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001202inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001203const slice_array<_Tp>&
1204slice_array<_Tp>::operator=(const slice_array& __sa) const
1205{
1206 value_type* __t = __vp_;
1207 const value_type* __s = __sa.__vp_;
1208 for (size_t __n = __size_; __n; --__n, __t += __stride_, __s += __sa.__stride_)
1209 *__t = *__s;
1210}
1211
1212template <class _Tp>
1213template <class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001214inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001215typename enable_if
1216<
1217 __is_val_expr<_Expr>::value,
1218 void
1219>::type
1220slice_array<_Tp>::operator=(const _Expr& __v) const
1221{
1222 value_type* __t = __vp_;
1223 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1224 *__t = __v[__i];
1225}
1226
1227template <class _Tp>
1228template <class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001229inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001230typename enable_if
1231<
1232 __is_val_expr<_Expr>::value,
1233 void
1234>::type
1235slice_array<_Tp>::operator*=(const _Expr& __v) const
1236{
1237 value_type* __t = __vp_;
1238 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1239 *__t *= __v[__i];
1240}
1241
1242template <class _Tp>
1243template <class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001244inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001245typename enable_if
1246<
1247 __is_val_expr<_Expr>::value,
1248 void
1249>::type
1250slice_array<_Tp>::operator/=(const _Expr& __v) const
1251{
1252 value_type* __t = __vp_;
1253 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1254 *__t /= __v[__i];
1255}
1256
1257template <class _Tp>
1258template <class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001259inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001260typename enable_if
1261<
1262 __is_val_expr<_Expr>::value,
1263 void
1264>::type
1265slice_array<_Tp>::operator%=(const _Expr& __v) const
1266{
1267 value_type* __t = __vp_;
1268 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1269 *__t %= __v[__i];
1270}
1271
1272template <class _Tp>
1273template <class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001274inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001275typename enable_if
1276<
1277 __is_val_expr<_Expr>::value,
1278 void
1279>::type
1280slice_array<_Tp>::operator+=(const _Expr& __v) const
1281{
1282 value_type* __t = __vp_;
1283 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1284 *__t += __v[__i];
1285}
1286
1287template <class _Tp>
1288template <class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001289inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001290typename enable_if
1291<
1292 __is_val_expr<_Expr>::value,
1293 void
1294>::type
1295slice_array<_Tp>::operator-=(const _Expr& __v) const
1296{
1297 value_type* __t = __vp_;
1298 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1299 *__t -= __v[__i];
1300}
1301
1302template <class _Tp>
1303template <class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001304inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001305typename enable_if
1306<
1307 __is_val_expr<_Expr>::value,
1308 void
1309>::type
1310slice_array<_Tp>::operator^=(const _Expr& __v) const
1311{
1312 value_type* __t = __vp_;
1313 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1314 *__t ^= __v[__i];
1315}
1316
1317template <class _Tp>
1318template <class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001319inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001320typename enable_if
1321<
1322 __is_val_expr<_Expr>::value,
1323 void
1324>::type
1325slice_array<_Tp>::operator&=(const _Expr& __v) const
1326{
1327 value_type* __t = __vp_;
1328 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1329 *__t &= __v[__i];
1330}
1331
1332template <class _Tp>
1333template <class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001334inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001335typename enable_if
1336<
1337 __is_val_expr<_Expr>::value,
1338 void
1339>::type
1340slice_array<_Tp>::operator|=(const _Expr& __v) const
1341{
1342 value_type* __t = __vp_;
1343 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1344 *__t |= __v[__i];
1345}
1346
1347template <class _Tp>
1348template <class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001349inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001350typename enable_if
1351<
1352 __is_val_expr<_Expr>::value,
1353 void
1354>::type
1355slice_array<_Tp>::operator<<=(const _Expr& __v) const
1356{
1357 value_type* __t = __vp_;
1358 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1359 *__t <<= __v[__i];
1360}
1361
1362template <class _Tp>
1363template <class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001364inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001365typename enable_if
1366<
1367 __is_val_expr<_Expr>::value,
1368 void
1369>::type
1370slice_array<_Tp>::operator>>=(const _Expr& __v) const
1371{
1372 value_type* __t = __vp_;
1373 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1374 *__t >>= __v[__i];
1375}
1376
1377template <class _Tp>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001378inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001379void
1380slice_array<_Tp>::operator=(const value_type& __x) const
1381{
1382 value_type* __t = __vp_;
1383 for (size_t __n = __size_; __n; --__n, __t += __stride_)
1384 *__t = __x;
1385}
1386
1387// gslice
1388
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001389class _LIBCPP_VISIBLE gslice
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001390{
1391 valarray<size_t> __size_;
1392 valarray<size_t> __stride_;
1393 valarray<size_t> __1d_;
Howard Hinnant324bb032010-08-22 00:02:43 +00001394
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001395public:
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001396 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001397 gslice() {}
1398
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001399 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001400 gslice(size_t __start, const valarray<size_t>& __size,
1401 const valarray<size_t>& __stride)
1402 : __size_(__size),
1403 __stride_(__stride)
1404 {__init(__start);}
1405
Howard Hinnant73d21a42010-09-04 23:28:19 +00001406#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001407
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001408 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001409 gslice(size_t __start, const valarray<size_t>& __size,
1410 valarray<size_t>&& __stride)
1411 : __size_(__size),
1412 __stride_(move(__stride))
1413 {__init(__start);}
1414
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001415 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001416 gslice(size_t __start, valarray<size_t>&& __size,
1417 const valarray<size_t>& __stride)
1418 : __size_(move(__size)),
1419 __stride_(__stride)
1420 {__init(__start);}
1421
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001422 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001423 gslice(size_t __start, valarray<size_t>&& __size,
1424 valarray<size_t>&& __stride)
1425 : __size_(move(__size)),
1426 __stride_(move(__stride))
1427 {__init(__start);}
1428
Howard Hinnant73d21a42010-09-04 23:28:19 +00001429#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001430
1431// gslice(const gslice&) = default;
1432// gslice(gslice&&) = default;
1433// gslice& operator=(const gslice&) = default;
1434// gslice& operator=(gslice&&) = default;
1435
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001436 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001437 size_t start() const {return __1d_.size() ? __1d_[0] : 0;}
1438
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001439 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001440 valarray<size_t> size() const {return __size_;}
1441
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001442 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001443 valarray<size_t> stride() const {return __stride_;}
1444
1445private:
1446 void __init(size_t __start);
1447
1448 template <class> friend class gslice_array;
1449 template <class> friend class valarray;
1450 template <class> friend class __val_expr;
1451};
1452
1453// gslice_array
1454
1455template <class _Tp>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001456class _LIBCPP_VISIBLE gslice_array
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001457{
1458public:
1459 typedef _Tp value_type;
1460
1461private:
1462 value_type* __vp_;
1463 valarray<size_t> __1d_;
1464
1465public:
1466 template <class _Expr>
1467 typename enable_if
1468 <
1469 __is_val_expr<_Expr>::value,
1470 void
1471 >::type
1472 operator=(const _Expr& __v) const;
1473
1474 template <class _Expr>
1475 typename enable_if
1476 <
1477 __is_val_expr<_Expr>::value,
1478 void
1479 >::type
1480 operator*=(const _Expr& __v) const;
1481
1482 template <class _Expr>
1483 typename enable_if
1484 <
1485 __is_val_expr<_Expr>::value,
1486 void
1487 >::type
1488 operator/=(const _Expr& __v) const;
1489
1490 template <class _Expr>
1491 typename enable_if
1492 <
1493 __is_val_expr<_Expr>::value,
1494 void
1495 >::type
1496 operator%=(const _Expr& __v) const;
1497
1498 template <class _Expr>
1499 typename enable_if
1500 <
1501 __is_val_expr<_Expr>::value,
1502 void
1503 >::type
1504 operator+=(const _Expr& __v) const;
1505
1506 template <class _Expr>
1507 typename enable_if
1508 <
1509 __is_val_expr<_Expr>::value,
1510 void
1511 >::type
1512 operator-=(const _Expr& __v) const;
1513
1514 template <class _Expr>
1515 typename enable_if
1516 <
1517 __is_val_expr<_Expr>::value,
1518 void
1519 >::type
1520 operator^=(const _Expr& __v) const;
1521
1522 template <class _Expr>
1523 typename enable_if
1524 <
1525 __is_val_expr<_Expr>::value,
1526 void
1527 >::type
1528 operator&=(const _Expr& __v) const;
1529
1530 template <class _Expr>
1531 typename enable_if
1532 <
1533 __is_val_expr<_Expr>::value,
1534 void
1535 >::type
1536 operator|=(const _Expr& __v) const;
1537
1538 template <class _Expr>
1539 typename enable_if
1540 <
1541 __is_val_expr<_Expr>::value,
1542 void
1543 >::type
1544 operator<<=(const _Expr& __v) const;
1545
1546 template <class _Expr>
1547 typename enable_if
1548 <
1549 __is_val_expr<_Expr>::value,
1550 void
1551 >::type
1552 operator>>=(const _Expr& __v) const;
1553
1554 const gslice_array& operator=(const gslice_array& __ga) const;
1555
1556 void operator=(const value_type& __x) const;
1557
1558// gslice_array(const gslice_array&) = default;
1559// gslice_array(gslice_array&&) = default;
1560// gslice_array& operator=(const gslice_array&) = default;
1561// gslice_array& operator=(gslice_array&&) = default;
1562
1563private:
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001564 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001565 gslice_array(const gslice& __gs, const valarray<value_type>& __v)
1566 : __vp_(const_cast<value_type*>(__v.__begin_)),
1567 __1d_(__gs.__1d_)
1568 {}
1569
Howard Hinnant73d21a42010-09-04 23:28:19 +00001570#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001571
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001572 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001573 gslice_array(gslice&& __gs, const valarray<value_type>& __v)
1574 : __vp_(const_cast<value_type*>(__v.__begin_)),
1575 __1d_(move(__gs.__1d_))
1576 {}
1577
Howard Hinnant73d21a42010-09-04 23:28:19 +00001578#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001579
1580 template <class> friend class valarray;
1581};
1582
1583template <class _Tp>
1584template <class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001585inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001586typename enable_if
1587<
1588 __is_val_expr<_Expr>::value,
1589 void
1590>::type
1591gslice_array<_Tp>::operator=(const _Expr& __v) const
1592{
1593 typedef const size_t* _Ip;
1594 size_t __j = 0;
1595 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1596 __vp_[*__i] = __v[__j];
1597}
1598
1599template <class _Tp>
1600template <class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001601inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001602typename enable_if
1603<
1604 __is_val_expr<_Expr>::value,
1605 void
1606>::type
1607gslice_array<_Tp>::operator*=(const _Expr& __v) const
1608{
1609 typedef const size_t* _Ip;
1610 size_t __j = 0;
1611 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1612 __vp_[*__i] *= __v[__j];
1613}
1614
1615template <class _Tp>
1616template <class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001617inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001618typename enable_if
1619<
1620 __is_val_expr<_Expr>::value,
1621 void
1622>::type
1623gslice_array<_Tp>::operator/=(const _Expr& __v) const
1624{
1625 typedef const size_t* _Ip;
1626 size_t __j = 0;
1627 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1628 __vp_[*__i] /= __v[__j];
1629}
1630
1631template <class _Tp>
1632template <class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001633inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001634typename enable_if
1635<
1636 __is_val_expr<_Expr>::value,
1637 void
1638>::type
1639gslice_array<_Tp>::operator%=(const _Expr& __v) const
1640{
1641 typedef const size_t* _Ip;
1642 size_t __j = 0;
1643 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1644 __vp_[*__i] %= __v[__j];
1645}
1646
1647template <class _Tp>
1648template <class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001649inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001650typename enable_if
1651<
1652 __is_val_expr<_Expr>::value,
1653 void
1654>::type
1655gslice_array<_Tp>::operator+=(const _Expr& __v) const
1656{
1657 typedef const size_t* _Ip;
1658 size_t __j = 0;
1659 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1660 __vp_[*__i] += __v[__j];
1661}
1662
1663template <class _Tp>
1664template <class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001665inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001666typename enable_if
1667<
1668 __is_val_expr<_Expr>::value,
1669 void
1670>::type
1671gslice_array<_Tp>::operator-=(const _Expr& __v) const
1672{
1673 typedef const size_t* _Ip;
1674 size_t __j = 0;
1675 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1676 __vp_[*__i] -= __v[__j];
1677}
1678
1679template <class _Tp>
1680template <class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001681inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001682typename enable_if
1683<
1684 __is_val_expr<_Expr>::value,
1685 void
1686>::type
1687gslice_array<_Tp>::operator^=(const _Expr& __v) const
1688{
1689 typedef const size_t* _Ip;
1690 size_t __j = 0;
1691 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1692 __vp_[*__i] ^= __v[__j];
1693}
1694
1695template <class _Tp>
1696template <class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001697inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001698typename enable_if
1699<
1700 __is_val_expr<_Expr>::value,
1701 void
1702>::type
1703gslice_array<_Tp>::operator&=(const _Expr& __v) const
1704{
1705 typedef const size_t* _Ip;
1706 size_t __j = 0;
1707 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1708 __vp_[*__i] &= __v[__j];
1709}
1710
1711template <class _Tp>
1712template <class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001713inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001714typename enable_if
1715<
1716 __is_val_expr<_Expr>::value,
1717 void
1718>::type
1719gslice_array<_Tp>::operator|=(const _Expr& __v) const
1720{
1721 typedef const size_t* _Ip;
1722 size_t __j = 0;
1723 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1724 __vp_[*__i] |= __v[__j];
1725}
1726
1727template <class _Tp>
1728template <class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001729inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001730typename enable_if
1731<
1732 __is_val_expr<_Expr>::value,
1733 void
1734>::type
1735gslice_array<_Tp>::operator<<=(const _Expr& __v) const
1736{
1737 typedef const size_t* _Ip;
1738 size_t __j = 0;
1739 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1740 __vp_[*__i] <<= __v[__j];
1741}
1742
1743template <class _Tp>
1744template <class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001745inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001746typename enable_if
1747<
1748 __is_val_expr<_Expr>::value,
1749 void
1750>::type
1751gslice_array<_Tp>::operator>>=(const _Expr& __v) const
1752{
1753 typedef const size_t* _Ip;
1754 size_t __j = 0;
1755 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1756 __vp_[*__i] >>= __v[__j];
1757}
1758
1759template <class _Tp>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001760inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001761const gslice_array<_Tp>&
1762gslice_array<_Tp>::operator=(const gslice_array& __ga) const
1763{
1764 typedef const size_t* _Ip;
1765 const value_type* __s = __ga.__vp_;
1766 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_, __j = __ga.__1d_.__begin_;
1767 __i != __e; ++__i, ++__j)
1768 __vp_[*__i] = __s[*__j];
1769 return *this;
1770}
1771
1772template <class _Tp>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001773inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001774void
1775gslice_array<_Tp>::operator=(const value_type& __x) const
1776{
1777 typedef const size_t* _Ip;
1778 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i)
1779 __vp_[*__i] = __x;
1780}
1781
1782// mask_array
1783
1784template <class _Tp>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001785class _LIBCPP_VISIBLE mask_array
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001786{
1787public:
1788 typedef _Tp value_type;
1789
1790private:
1791 value_type* __vp_;
1792 valarray<size_t> __1d_;
1793
1794public:
1795 template <class _Expr>
1796 typename enable_if
1797 <
1798 __is_val_expr<_Expr>::value,
1799 void
1800 >::type
1801 operator=(const _Expr& __v) const;
1802
1803 template <class _Expr>
1804 typename enable_if
1805 <
1806 __is_val_expr<_Expr>::value,
1807 void
1808 >::type
1809 operator*=(const _Expr& __v) const;
1810
1811 template <class _Expr>
1812 typename enable_if
1813 <
1814 __is_val_expr<_Expr>::value,
1815 void
1816 >::type
1817 operator/=(const _Expr& __v) const;
1818
1819 template <class _Expr>
1820 typename enable_if
1821 <
1822 __is_val_expr<_Expr>::value,
1823 void
1824 >::type
1825 operator%=(const _Expr& __v) const;
1826
1827 template <class _Expr>
1828 typename enable_if
1829 <
1830 __is_val_expr<_Expr>::value,
1831 void
1832 >::type
1833 operator+=(const _Expr& __v) const;
1834
1835 template <class _Expr>
1836 typename enable_if
1837 <
1838 __is_val_expr<_Expr>::value,
1839 void
1840 >::type
1841 operator-=(const _Expr& __v) const;
1842
1843 template <class _Expr>
1844 typename enable_if
1845 <
1846 __is_val_expr<_Expr>::value,
1847 void
1848 >::type
1849 operator^=(const _Expr& __v) const;
1850
1851 template <class _Expr>
1852 typename enable_if
1853 <
1854 __is_val_expr<_Expr>::value,
1855 void
1856 >::type
1857 operator&=(const _Expr& __v) const;
1858
1859 template <class _Expr>
1860 typename enable_if
1861 <
1862 __is_val_expr<_Expr>::value,
1863 void
1864 >::type
1865 operator|=(const _Expr& __v) const;
1866
1867 template <class _Expr>
1868 typename enable_if
1869 <
1870 __is_val_expr<_Expr>::value,
1871 void
1872 >::type
1873 operator<<=(const _Expr& __v) const;
1874
1875 template <class _Expr>
1876 typename enable_if
1877 <
1878 __is_val_expr<_Expr>::value,
1879 void
1880 >::type
1881 operator>>=(const _Expr& __v) const;
1882
1883 const mask_array& operator=(const mask_array& __ma) const;
1884
1885 void operator=(const value_type& __x) const;
1886
1887// mask_array(const mask_array&) = default;
1888// mask_array(mask_array&&) = default;
1889// mask_array& operator=(const mask_array&) = default;
1890// mask_array& operator=(mask_array&&) = default;
1891
1892private:
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001893 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001894 mask_array(const valarray<bool>& __vb, const valarray<value_type>& __v)
1895 : __vp_(const_cast<value_type*>(__v.__begin_)),
1896 __1d_(count(__vb.__begin_, __vb.__end_, true))
1897 {
1898 size_t __j = 0;
1899 for (size_t __i = 0; __i < __vb.size(); ++__i)
1900 if (__vb[__i])
1901 __1d_[__j++] = __i;
1902 }
1903
1904 template <class> friend class valarray;
1905};
1906
1907template <class _Tp>
1908template <class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001909inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001910typename enable_if
1911<
1912 __is_val_expr<_Expr>::value,
1913 void
1914>::type
1915mask_array<_Tp>::operator=(const _Expr& __v) const
1916{
1917 size_t __n = __1d_.size();
1918 for (size_t __i = 0; __i < __n; ++__i)
1919 __vp_[__1d_[__i]] = __v[__i];
1920}
1921
1922template <class _Tp>
1923template <class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001924inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001925typename enable_if
1926<
1927 __is_val_expr<_Expr>::value,
1928 void
1929>::type
1930mask_array<_Tp>::operator*=(const _Expr& __v) const
1931{
1932 size_t __n = __1d_.size();
1933 for (size_t __i = 0; __i < __n; ++__i)
1934 __vp_[__1d_[__i]] *= __v[__i];
1935}
1936
1937template <class _Tp>
1938template <class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001939inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001940typename enable_if
1941<
1942 __is_val_expr<_Expr>::value,
1943 void
1944>::type
1945mask_array<_Tp>::operator/=(const _Expr& __v) const
1946{
1947 size_t __n = __1d_.size();
1948 for (size_t __i = 0; __i < __n; ++__i)
1949 __vp_[__1d_[__i]] /= __v[__i];
1950}
1951
1952template <class _Tp>
1953template <class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001954inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001955typename enable_if
1956<
1957 __is_val_expr<_Expr>::value,
1958 void
1959>::type
1960mask_array<_Tp>::operator%=(const _Expr& __v) const
1961{
1962 size_t __n = __1d_.size();
1963 for (size_t __i = 0; __i < __n; ++__i)
1964 __vp_[__1d_[__i]] %= __v[__i];
1965}
1966
1967template <class _Tp>
1968template <class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001969inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001970typename enable_if
1971<
1972 __is_val_expr<_Expr>::value,
1973 void
1974>::type
1975mask_array<_Tp>::operator+=(const _Expr& __v) const
1976{
1977 size_t __n = __1d_.size();
1978 for (size_t __i = 0; __i < __n; ++__i)
1979 __vp_[__1d_[__i]] += __v[__i];
1980}
1981
1982template <class _Tp>
1983template <class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001984inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00001985typename enable_if
1986<
1987 __is_val_expr<_Expr>::value,
1988 void
1989>::type
1990mask_array<_Tp>::operator-=(const _Expr& __v) const
1991{
1992 size_t __n = __1d_.size();
1993 for (size_t __i = 0; __i < __n; ++__i)
1994 __vp_[__1d_[__i]] -= __v[__i];
1995}
1996
1997template <class _Tp>
1998template <class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00001999inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002000typename enable_if
2001<
2002 __is_val_expr<_Expr>::value,
2003 void
2004>::type
2005mask_array<_Tp>::operator^=(const _Expr& __v) const
2006{
2007 size_t __n = __1d_.size();
2008 for (size_t __i = 0; __i < __n; ++__i)
2009 __vp_[__1d_[__i]] ^= __v[__i];
2010}
2011
2012template <class _Tp>
2013template <class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002014inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002015typename enable_if
2016<
2017 __is_val_expr<_Expr>::value,
2018 void
2019>::type
2020mask_array<_Tp>::operator&=(const _Expr& __v) const
2021{
2022 size_t __n = __1d_.size();
2023 for (size_t __i = 0; __i < __n; ++__i)
2024 __vp_[__1d_[__i]] &= __v[__i];
2025}
2026
2027template <class _Tp>
2028template <class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002029inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002030typename enable_if
2031<
2032 __is_val_expr<_Expr>::value,
2033 void
2034>::type
2035mask_array<_Tp>::operator|=(const _Expr& __v) const
2036{
2037 size_t __n = __1d_.size();
2038 for (size_t __i = 0; __i < __n; ++__i)
2039 __vp_[__1d_[__i]] |= __v[__i];
2040}
2041
2042template <class _Tp>
2043template <class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002044inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002045typename enable_if
2046<
2047 __is_val_expr<_Expr>::value,
2048 void
2049>::type
2050mask_array<_Tp>::operator<<=(const _Expr& __v) const
2051{
2052 size_t __n = __1d_.size();
2053 for (size_t __i = 0; __i < __n; ++__i)
2054 __vp_[__1d_[__i]] <<= __v[__i];
2055}
2056
2057template <class _Tp>
2058template <class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002059inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002060typename enable_if
2061<
2062 __is_val_expr<_Expr>::value,
2063 void
2064>::type
2065mask_array<_Tp>::operator>>=(const _Expr& __v) const
2066{
2067 size_t __n = __1d_.size();
2068 for (size_t __i = 0; __i < __n; ++__i)
2069 __vp_[__1d_[__i]] >>= __v[__i];
2070}
2071
2072template <class _Tp>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002073inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002074const mask_array<_Tp>&
2075mask_array<_Tp>::operator=(const mask_array& __ma) const
2076{
2077 size_t __n = __1d_.size();
2078 for (size_t __i = 0; __i < __n; ++__i)
2079 __vp_[__1d_[__i]] = __ma.__vp_[__1d_[__i]];
2080}
2081
2082template <class _Tp>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002083inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002084void
2085mask_array<_Tp>::operator=(const value_type& __x) const
2086{
2087 size_t __n = __1d_.size();
2088 for (size_t __i = 0; __i < __n; ++__i)
2089 __vp_[__1d_[__i]] = __x;
2090}
2091
2092template <class _ValExpr>
2093class __mask_expr
2094{
2095 typedef typename remove_reference<_ValExpr>::type _RmExpr;
2096public:
2097 typedef typename _RmExpr::value_type value_type;
2098 typedef value_type result_type;
2099
2100private:
2101 _ValExpr __expr_;
2102 valarray<size_t> __1d_;
2103
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002104 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002105 __mask_expr(const valarray<bool>& __vb, const _RmExpr& __e)
2106 : __expr_(__e),
2107 __1d_(count(__vb.__begin_, __vb.__end_, true))
2108 {
2109 size_t __j = 0;
2110 for (size_t __i = 0; __i < __vb.size(); ++__i)
2111 if (__vb[__i])
2112 __1d_[__j++] = __i;
2113 }
2114
2115public:
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002116 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002117 result_type operator[](size_t __i) const
2118 {return __expr_[__1d_[__i]];}
2119
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002120 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002121 size_t size() const {return __1d_.size();}
2122
2123 template <class> friend class valarray;
2124};
2125
2126// indirect_array
2127
2128template <class _Tp>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002129class _LIBCPP_VISIBLE indirect_array
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002130{
2131public:
2132 typedef _Tp value_type;
2133
2134private:
2135 value_type* __vp_;
2136 valarray<size_t> __1d_;
2137
2138public:
2139 template <class _Expr>
2140 typename enable_if
2141 <
2142 __is_val_expr<_Expr>::value,
2143 void
2144 >::type
2145 operator=(const _Expr& __v) const;
2146
2147 template <class _Expr>
2148 typename enable_if
2149 <
2150 __is_val_expr<_Expr>::value,
2151 void
2152 >::type
2153 operator*=(const _Expr& __v) const;
2154
2155 template <class _Expr>
2156 typename enable_if
2157 <
2158 __is_val_expr<_Expr>::value,
2159 void
2160 >::type
2161 operator/=(const _Expr& __v) const;
2162
2163 template <class _Expr>
2164 typename enable_if
2165 <
2166 __is_val_expr<_Expr>::value,
2167 void
2168 >::type
2169 operator%=(const _Expr& __v) const;
2170
2171 template <class _Expr>
2172 typename enable_if
2173 <
2174 __is_val_expr<_Expr>::value,
2175 void
2176 >::type
2177 operator+=(const _Expr& __v) const;
2178
2179 template <class _Expr>
2180 typename enable_if
2181 <
2182 __is_val_expr<_Expr>::value,
2183 void
2184 >::type
2185 operator-=(const _Expr& __v) const;
2186
2187 template <class _Expr>
2188 typename enable_if
2189 <
2190 __is_val_expr<_Expr>::value,
2191 void
2192 >::type
2193 operator^=(const _Expr& __v) const;
2194
2195 template <class _Expr>
2196 typename enable_if
2197 <
2198 __is_val_expr<_Expr>::value,
2199 void
2200 >::type
2201 operator&=(const _Expr& __v) const;
2202
2203 template <class _Expr>
2204 typename enable_if
2205 <
2206 __is_val_expr<_Expr>::value,
2207 void
2208 >::type
2209 operator|=(const _Expr& __v) const;
2210
2211 template <class _Expr>
2212 typename enable_if
2213 <
2214 __is_val_expr<_Expr>::value,
2215 void
2216 >::type
2217 operator<<=(const _Expr& __v) const;
2218
2219 template <class _Expr>
2220 typename enable_if
2221 <
2222 __is_val_expr<_Expr>::value,
2223 void
2224 >::type
2225 operator>>=(const _Expr& __v) const;
2226
2227 const indirect_array& operator=(const indirect_array& __ia) const;
2228
2229 void operator=(const value_type& __x) const;
2230
2231// indirect_array(const indirect_array&) = default;
2232// indirect_array(indirect_array&&) = default;
2233// indirect_array& operator=(const indirect_array&) = default;
2234// indirect_array& operator=(indirect_array&&) = default;
2235
2236private:
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002237 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002238 indirect_array(const valarray<size_t>& __ia, const valarray<value_type>& __v)
2239 : __vp_(const_cast<value_type*>(__v.__begin_)),
2240 __1d_(__ia)
2241 {}
2242
Howard Hinnant73d21a42010-09-04 23:28:19 +00002243#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002244
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002245 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002246 indirect_array(valarray<size_t>&& __ia, const valarray<value_type>& __v)
2247 : __vp_(const_cast<value_type*>(__v.__begin_)),
2248 __1d_(move(__ia))
2249 {}
2250
Howard Hinnant73d21a42010-09-04 23:28:19 +00002251#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002252
2253 template <class> friend class valarray;
2254};
2255
2256template <class _Tp>
2257template <class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002258inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002259typename enable_if
2260<
2261 __is_val_expr<_Expr>::value,
2262 void
2263>::type
2264indirect_array<_Tp>::operator=(const _Expr& __v) const
2265{
2266 size_t __n = __1d_.size();
2267 for (size_t __i = 0; __i < __n; ++__i)
2268 __vp_[__1d_[__i]] = __v[__i];
2269}
2270
2271template <class _Tp>
2272template <class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002273inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002274typename enable_if
2275<
2276 __is_val_expr<_Expr>::value,
2277 void
2278>::type
2279indirect_array<_Tp>::operator*=(const _Expr& __v) const
2280{
2281 size_t __n = __1d_.size();
2282 for (size_t __i = 0; __i < __n; ++__i)
2283 __vp_[__1d_[__i]] *= __v[__i];
2284}
2285
2286template <class _Tp>
2287template <class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002288inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002289typename enable_if
2290<
2291 __is_val_expr<_Expr>::value,
2292 void
2293>::type
2294indirect_array<_Tp>::operator/=(const _Expr& __v) const
2295{
2296 size_t __n = __1d_.size();
2297 for (size_t __i = 0; __i < __n; ++__i)
2298 __vp_[__1d_[__i]] /= __v[__i];
2299}
2300
2301template <class _Tp>
2302template <class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002303inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002304typename enable_if
2305<
2306 __is_val_expr<_Expr>::value,
2307 void
2308>::type
2309indirect_array<_Tp>::operator%=(const _Expr& __v) const
2310{
2311 size_t __n = __1d_.size();
2312 for (size_t __i = 0; __i < __n; ++__i)
2313 __vp_[__1d_[__i]] %= __v[__i];
2314}
2315
2316template <class _Tp>
2317template <class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002318inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002319typename enable_if
2320<
2321 __is_val_expr<_Expr>::value,
2322 void
2323>::type
2324indirect_array<_Tp>::operator+=(const _Expr& __v) const
2325{
2326 size_t __n = __1d_.size();
2327 for (size_t __i = 0; __i < __n; ++__i)
2328 __vp_[__1d_[__i]] += __v[__i];
2329}
2330
2331template <class _Tp>
2332template <class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002333inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002334typename enable_if
2335<
2336 __is_val_expr<_Expr>::value,
2337 void
2338>::type
2339indirect_array<_Tp>::operator-=(const _Expr& __v) const
2340{
2341 size_t __n = __1d_.size();
2342 for (size_t __i = 0; __i < __n; ++__i)
2343 __vp_[__1d_[__i]] -= __v[__i];
2344}
2345
2346template <class _Tp>
2347template <class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002348inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002349typename enable_if
2350<
2351 __is_val_expr<_Expr>::value,
2352 void
2353>::type
2354indirect_array<_Tp>::operator^=(const _Expr& __v) const
2355{
2356 size_t __n = __1d_.size();
2357 for (size_t __i = 0; __i < __n; ++__i)
2358 __vp_[__1d_[__i]] ^= __v[__i];
2359}
2360
2361template <class _Tp>
2362template <class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002363inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002364typename enable_if
2365<
2366 __is_val_expr<_Expr>::value,
2367 void
2368>::type
2369indirect_array<_Tp>::operator&=(const _Expr& __v) const
2370{
2371 size_t __n = __1d_.size();
2372 for (size_t __i = 0; __i < __n; ++__i)
2373 __vp_[__1d_[__i]] &= __v[__i];
2374}
2375
2376template <class _Tp>
2377template <class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002378inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002379typename enable_if
2380<
2381 __is_val_expr<_Expr>::value,
2382 void
2383>::type
2384indirect_array<_Tp>::operator|=(const _Expr& __v) const
2385{
2386 size_t __n = __1d_.size();
2387 for (size_t __i = 0; __i < __n; ++__i)
2388 __vp_[__1d_[__i]] |= __v[__i];
2389}
2390
2391template <class _Tp>
2392template <class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002393inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002394typename enable_if
2395<
2396 __is_val_expr<_Expr>::value,
2397 void
2398>::type
2399indirect_array<_Tp>::operator<<=(const _Expr& __v) const
2400{
2401 size_t __n = __1d_.size();
2402 for (size_t __i = 0; __i < __n; ++__i)
2403 __vp_[__1d_[__i]] <<= __v[__i];
2404}
2405
2406template <class _Tp>
2407template <class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002408inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002409typename enable_if
2410<
2411 __is_val_expr<_Expr>::value,
2412 void
2413>::type
2414indirect_array<_Tp>::operator>>=(const _Expr& __v) const
2415{
2416 size_t __n = __1d_.size();
2417 for (size_t __i = 0; __i < __n; ++__i)
2418 __vp_[__1d_[__i]] >>= __v[__i];
2419}
2420
2421template <class _Tp>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002422inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002423const indirect_array<_Tp>&
2424indirect_array<_Tp>::operator=(const indirect_array& __ia) const
2425{
2426 typedef const size_t* _Ip;
2427 const value_type* __s = __ia.__vp_;
2428 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_, __j = __ia.__1d_.__begin_;
2429 __i != __e; ++__i, ++__j)
2430 __vp_[*__i] = __s[*__j];
2431 return *this;
2432}
2433
2434template <class _Tp>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002435inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002436void
2437indirect_array<_Tp>::operator=(const value_type& __x) const
2438{
2439 typedef const size_t* _Ip;
2440 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i)
2441 __vp_[*__i] = __x;
2442}
2443
2444template <class _ValExpr>
2445class __indirect_expr
2446{
2447 typedef typename remove_reference<_ValExpr>::type _RmExpr;
2448public:
2449 typedef typename _RmExpr::value_type value_type;
2450 typedef value_type result_type;
2451
2452private:
2453 _ValExpr __expr_;
2454 valarray<size_t> __1d_;
2455
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002456 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002457 __indirect_expr(const valarray<size_t>& __ia, const _RmExpr& __e)
2458 : __expr_(__e),
2459 __1d_(__ia)
2460 {}
2461
Howard Hinnant73d21a42010-09-04 23:28:19 +00002462#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002463
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002464 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002465 __indirect_expr(valarray<size_t>&& __ia, const _RmExpr& __e)
2466 : __expr_(__e),
2467 __1d_(move(__ia))
2468 {}
2469
Howard Hinnant73d21a42010-09-04 23:28:19 +00002470#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002471
2472public:
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002473 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002474 result_type operator[](size_t __i) const
2475 {return __expr_[__1d_[__i]];}
2476
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002477 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002478 size_t size() const {return __1d_.size();}
2479
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002480 template <class> friend class _LIBCPP_VISIBLE valarray;
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002481};
2482
2483template<class _ValExpr>
2484class __val_expr
2485{
2486 typedef typename remove_reference<_ValExpr>::type _RmExpr;
2487
2488 _ValExpr __expr_;
2489public:
2490 typedef typename _RmExpr::value_type value_type;
2491 typedef typename _RmExpr::result_type result_type;
2492
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002493 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002494 explicit __val_expr(const _RmExpr& __e) : __expr_(__e) {}
2495
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002496 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002497 result_type operator[](size_t __i) const
2498 {return __expr_[__i];}
2499
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002500 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002501 __val_expr<__slice_expr<_ValExpr> > operator[](slice __s) const
2502 {return __val_expr<__slice_expr<_ValExpr> >(__expr_, __s);}
2503
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002504 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002505 __val_expr<__indirect_expr<_ValExpr> > operator[](const gslice& __gs) const
2506 {return __val_expr<__indirect_expr<_ValExpr> >(__expr_, __gs.__1d_);}
2507
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002508 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002509 __val_expr<__mask_expr<_ValExpr> > operator[](const valarray<bool>& __vb) const
2510 {return __val_expr<__mask_expr<_ValExpr> >(__expr_, __vb);}
2511
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002512 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002513 __val_expr<__indirect_expr<_ValExpr> > operator[](const valarray<size_t>& __vs) const
2514 {return __val_expr<__indirect_expr<_ValExpr> >(__expr_, __vs);}
2515
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002516 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002517 __val_expr<_UnaryOp<__unary_plus<value_type>, _ValExpr> >
2518 operator+() const
2519 {
2520 typedef _UnaryOp<__unary_plus<value_type>, _ValExpr> _NewExpr;
2521 return __val_expr<_NewExpr>(_NewExpr(__unary_plus<value_type>(), __expr_));
2522 }
2523
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002524 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002525 __val_expr<_UnaryOp<negate<value_type>, _ValExpr> >
2526 operator-() const
2527 {
2528 typedef _UnaryOp<negate<value_type>, _ValExpr> _NewExpr;
2529 return __val_expr<_NewExpr>(_NewExpr(negate<value_type>(), __expr_));
2530 }
2531
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002532 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002533 __val_expr<_UnaryOp<__bit_not<value_type>, _ValExpr> >
2534 operator~() const
2535 {
2536 typedef _UnaryOp<__bit_not<value_type>, _ValExpr> _NewExpr;
2537 return __val_expr<_NewExpr>(_NewExpr(__bit_not<value_type>(), __expr_));
2538 }
2539
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002540 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002541 __val_expr<_UnaryOp<logical_not<value_type>, _ValExpr> >
2542 operator!() const
2543 {
2544 typedef _UnaryOp<logical_not<value_type>, _ValExpr> _NewExpr;
2545 return __val_expr<_NewExpr>(_NewExpr(logical_not<value_type>(), __expr_));
2546 }
2547
2548 operator valarray<result_type>() const;
2549
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002550 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002551 size_t size() const {return __expr_.size();}
2552
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002553 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002554 result_type sum() const
2555 {
2556 size_t __n = __expr_.size();
2557 result_type __r = __n ? __expr_[0] : result_type();
2558 for (size_t __i = 1; __i < __n; ++__i)
2559 __r += __expr_[__i];
2560 return __r;
2561 }
2562
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002563 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002564 result_type min() const
2565 {
2566 size_t __n = size();
2567 result_type __r = __n ? (*this)[0] : result_type();
2568 for (size_t __i = 1; __i < __n; ++__i)
2569 {
2570 result_type __x = __expr_[__i];
2571 if (__x < __r)
2572 __r = __x;
2573 }
2574 return __r;
2575 }
2576
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002577 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002578 result_type max() const
2579 {
2580 size_t __n = size();
2581 result_type __r = __n ? (*this)[0] : result_type();
2582 for (size_t __i = 1; __i < __n; ++__i)
2583 {
2584 result_type __x = __expr_[__i];
2585 if (__r < __x)
2586 __r = __x;
2587 }
2588 return __r;
2589 }
2590
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002591 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002592 __val_expr<__shift_expr<_ValExpr> > shift (int __i) const
2593 {return __val_expr<__shift_expr<_ValExpr> >(__shift_expr<_ValExpr>(__i, __expr_));}
2594
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002595 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002596 __val_expr<__cshift_expr<_ValExpr> > cshift(int __i) const
2597 {return __val_expr<__cshift_expr<_ValExpr> >(__cshift_expr<_ValExpr>(__i, __expr_));}
2598
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002599 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002600 __val_expr<_UnaryOp<__apply_expr<value_type, value_type(*)(value_type)>, _ValExpr> >
2601 apply(value_type __f(value_type)) const
2602 {
2603 typedef __apply_expr<value_type, value_type(*)(value_type)> _Op;
2604 typedef _UnaryOp<_Op, _ValExpr> _NewExpr;
2605 return __val_expr<_NewExpr>(_NewExpr(_Op(__f), __expr_));
2606 }
2607
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002608 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002609 __val_expr<_UnaryOp<__apply_expr<value_type, value_type(*)(const value_type&)>, _ValExpr> >
2610 apply(value_type __f(const value_type&)) const
2611 {
2612 typedef __apply_expr<value_type, value_type(*)(const value_type&)> _Op;
2613 typedef _UnaryOp<_Op, _ValExpr> _NewExpr;
2614 return __val_expr<_NewExpr>(_NewExpr(_Op(__f), __expr_));
2615 }
2616};
2617
2618template<class _ValExpr>
2619__val_expr<_ValExpr>::operator valarray<result_type>() const
2620{
2621 valarray<result_type> __r;
2622 size_t __n = __expr_.size();
2623 if (__n)
2624 {
2625 __r.__begin_ =
2626 __r.__end_ =
2627 static_cast<result_type*>(::operator new(__n * sizeof(result_type)));
2628 for (size_t __i = 0; __i != __n; ++__r.__end_, ++__i)
2629 ::new (__r.__end_) result_type(__expr_[__i]);
2630 }
2631 return __r;
2632}
2633
2634// valarray
2635
2636template <class _Tp>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002637inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002638valarray<_Tp>::valarray(size_t __n)
2639 : __begin_(0),
2640 __end_(0)
2641{
2642 resize(__n);
2643}
2644
2645template <class _Tp>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002646inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002647valarray<_Tp>::valarray(const value_type& __x, size_t __n)
2648 : __begin_(0),
2649 __end_(0)
2650{
2651 resize(__n, __x);
2652}
2653
2654template <class _Tp>
2655valarray<_Tp>::valarray(const value_type* __p, size_t __n)
2656 : __begin_(0),
2657 __end_(0)
2658{
2659 if (__n)
2660 {
2661 __begin_ = __end_ = static_cast<value_type*>(::operator new(__n * sizeof(value_type)));
2662#ifndef _LIBCPP_NO_EXCEPTIONS
2663 try
2664 {
Howard Hinnant324bb032010-08-22 00:02:43 +00002665#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002666 for (; __n; ++__end_, ++__p, --__n)
2667 ::new (__end_) value_type(*__p);
2668#ifndef _LIBCPP_NO_EXCEPTIONS
2669 }
2670 catch (...)
2671 {
2672 resize(0);
2673 throw;
2674 }
Howard Hinnant324bb032010-08-22 00:02:43 +00002675#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002676 }
2677}
2678
2679template <class _Tp>
2680valarray<_Tp>::valarray(const valarray& __v)
2681 : __begin_(0),
2682 __end_(0)
2683{
2684 if (__v.size())
2685 {
2686 __begin_ = __end_ = static_cast<value_type*>(::operator new(__v.size() * sizeof(value_type)));
2687#ifndef _LIBCPP_NO_EXCEPTIONS
2688 try
2689 {
Howard Hinnant324bb032010-08-22 00:02:43 +00002690#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002691 for (value_type* __p = __v.__begin_; __p != __v.__end_; ++__end_, ++__p)
2692 ::new (__end_) value_type(*__p);
2693#ifndef _LIBCPP_NO_EXCEPTIONS
2694 }
2695 catch (...)
2696 {
2697 resize(0);
2698 throw;
2699 }
Howard Hinnant324bb032010-08-22 00:02:43 +00002700#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002701 }
2702}
2703
Howard Hinnant73d21a42010-09-04 23:28:19 +00002704#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002705
2706template <class _Tp>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002707inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002708valarray<_Tp>::valarray(valarray&& __v)
2709 : __begin_(__v.__begin_),
2710 __end_(__v.__end_)
2711{
2712 __v.__begin_ = __v.__end_ = nullptr;
2713}
2714
Howard Hinnante3e32912011-08-12 21:56:02 +00002715#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
2716
2717#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2718
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002719template <class _Tp>
2720valarray<_Tp>::valarray(initializer_list<value_type> __il)
2721 : __begin_(0),
2722 __end_(0)
2723{
2724 size_t __n = __il.size();
2725 if (__n)
2726 {
2727 __begin_ = __end_ = static_cast<value_type*>(::operator new(__n * sizeof(value_type)));
2728#ifndef _LIBCPP_NO_EXCEPTIONS
2729 try
2730 {
Howard Hinnant324bb032010-08-22 00:02:43 +00002731#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002732 for (const value_type* __p = __il.begin(); __n; ++__end_, ++__p, --__n)
2733 ::new (__end_) value_type(*__p);
2734#ifndef _LIBCPP_NO_EXCEPTIONS
2735 }
2736 catch (...)
2737 {
2738 resize(0);
2739 throw;
2740 }
Howard Hinnant324bb032010-08-22 00:02:43 +00002741#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002742 }
2743}
2744
Howard Hinnante3e32912011-08-12 21:56:02 +00002745#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002746
2747template <class _Tp>
2748valarray<_Tp>::valarray(const slice_array<value_type>& __sa)
2749 : __begin_(0),
2750 __end_(0)
2751{
2752 size_t __n = __sa.__size_;
2753 if (__n)
2754 {
2755 __begin_ = __end_ = static_cast<value_type*>(::operator new(__n * sizeof(value_type)));
2756#ifndef _LIBCPP_NO_EXCEPTIONS
2757 try
2758 {
Howard Hinnant324bb032010-08-22 00:02:43 +00002759#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002760 for (const value_type* __p = __sa.__vp_; __n; ++__end_, __p += __sa.__stride_, --__n)
2761 ::new (__end_) value_type(*__p);
2762#ifndef _LIBCPP_NO_EXCEPTIONS
2763 }
2764 catch (...)
2765 {
2766 resize(0);
2767 throw;
2768 }
Howard Hinnant324bb032010-08-22 00:02:43 +00002769#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002770 }
2771}
2772
2773template <class _Tp>
2774valarray<_Tp>::valarray(const gslice_array<value_type>& __ga)
2775 : __begin_(0),
2776 __end_(0)
2777{
2778 size_t __n = __ga.__1d_.size();
2779 if (__n)
2780 {
2781 __begin_ = __end_ = static_cast<value_type*>(::operator new(__n * sizeof(value_type)));
2782#ifndef _LIBCPP_NO_EXCEPTIONS
2783 try
2784 {
Howard Hinnant324bb032010-08-22 00:02:43 +00002785#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002786 typedef const size_t* _Ip;
2787 const value_type* __s = __ga.__vp_;
2788 for (_Ip __i = __ga.__1d_.__begin_, __e = __ga.__1d_.__end_;
2789 __i != __e; ++__i, ++__end_)
2790 ::new (__end_) value_type(__s[*__i]);
2791#ifndef _LIBCPP_NO_EXCEPTIONS
2792 }
2793 catch (...)
2794 {
2795 resize(0);
2796 throw;
2797 }
Howard Hinnant324bb032010-08-22 00:02:43 +00002798#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002799 }
2800}
2801
2802template <class _Tp>
2803valarray<_Tp>::valarray(const mask_array<value_type>& __ma)
2804 : __begin_(0),
2805 __end_(0)
2806{
2807 size_t __n = __ma.__1d_.size();
2808 if (__n)
2809 {
2810 __begin_ = __end_ = static_cast<value_type*>(::operator new(__n * sizeof(value_type)));
2811#ifndef _LIBCPP_NO_EXCEPTIONS
2812 try
2813 {
Howard Hinnant324bb032010-08-22 00:02:43 +00002814#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002815 typedef const size_t* _Ip;
2816 const value_type* __s = __ma.__vp_;
2817 for (_Ip __i = __ma.__1d_.__begin_, __e = __ma.__1d_.__end_;
2818 __i != __e; ++__i, ++__end_)
2819 ::new (__end_) value_type(__s[*__i]);
2820#ifndef _LIBCPP_NO_EXCEPTIONS
2821 }
2822 catch (...)
2823 {
2824 resize(0);
2825 throw;
2826 }
Howard Hinnant324bb032010-08-22 00:02:43 +00002827#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002828 }
2829}
2830
2831template <class _Tp>
2832valarray<_Tp>::valarray(const indirect_array<value_type>& __ia)
2833 : __begin_(0),
2834 __end_(0)
2835{
2836 size_t __n = __ia.__1d_.size();
2837 if (__n)
2838 {
2839 __begin_ = __end_ = static_cast<value_type*>(::operator new(__n * sizeof(value_type)));
2840#ifndef _LIBCPP_NO_EXCEPTIONS
2841 try
2842 {
Howard Hinnant324bb032010-08-22 00:02:43 +00002843#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002844 typedef const size_t* _Ip;
2845 const value_type* __s = __ia.__vp_;
2846 for (_Ip __i = __ia.__1d_.__begin_, __e = __ia.__1d_.__end_;
2847 __i != __e; ++__i, ++__end_)
2848 ::new (__end_) value_type(__s[*__i]);
2849#ifndef _LIBCPP_NO_EXCEPTIONS
2850 }
2851 catch (...)
2852 {
2853 resize(0);
2854 throw;
2855 }
Howard Hinnant324bb032010-08-22 00:02:43 +00002856#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002857 }
2858}
2859
2860template <class _Tp>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002861inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002862valarray<_Tp>::~valarray()
2863{
2864 resize(0);
2865}
2866
2867template <class _Tp>
2868valarray<_Tp>&
2869valarray<_Tp>::operator=(const valarray& __v)
2870{
2871 if (this != &__v)
2872 {
2873 if (size() != __v.size())
2874 resize(__v.size());
Howard Hinnant0949eed2011-06-30 21:18:19 +00002875 _VSTD::copy(__v.__begin_, __v.__end_, __begin_);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002876 }
2877 return *this;
2878}
2879
Howard Hinnant73d21a42010-09-04 23:28:19 +00002880#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002881
2882template <class _Tp>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002883inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002884valarray<_Tp>&
2885valarray<_Tp>::operator=(valarray&& __v)
2886{
2887 resize(0);
2888 __begin_ = __v.__begin_;
2889 __end_ = __v.__end_;
2890 __v.__begin_ = nullptr;
2891 __v.__end_ = nullptr;
2892 return *this;
2893}
2894
Howard Hinnante3e32912011-08-12 21:56:02 +00002895#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
2896
2897#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2898
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002899template <class _Tp>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002900inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002901valarray<_Tp>&
2902valarray<_Tp>::operator=(initializer_list<value_type> __il)
2903{
2904 if (size() != __il.size())
2905 resize(__il.size());
Howard Hinnant0949eed2011-06-30 21:18:19 +00002906 _VSTD::copy(__il.begin(), __il.end(), __begin_);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002907 return *this;
2908}
2909
Howard Hinnante3e32912011-08-12 21:56:02 +00002910#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002911
2912template <class _Tp>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002913inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002914valarray<_Tp>&
2915valarray<_Tp>::operator=(const value_type& __x)
2916{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002917 _VSTD::fill(__begin_, __end_, __x);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002918 return *this;
2919}
2920
2921template <class _Tp>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002922inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002923valarray<_Tp>&
2924valarray<_Tp>::operator=(const slice_array<value_type>& __sa)
2925{
2926 value_type* __t = __begin_;
2927 const value_type* __s = __sa.__vp_;
2928 for (size_t __n = __sa.__size_; __n; --__n, __s += __sa.__stride_, ++__t)
2929 *__t = *__s;
2930 return *this;
2931}
2932
2933template <class _Tp>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002934inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002935valarray<_Tp>&
2936valarray<_Tp>::operator=(const gslice_array<value_type>& __ga)
2937{
2938 typedef const size_t* _Ip;
2939 value_type* __t = __begin_;
2940 const value_type* __s = __ga.__vp_;
2941 for (_Ip __i = __ga.__1d_.__begin_, __e = __ga.__1d_.__end_;
2942 __i != __e; ++__i, ++__t)
2943 *__t = __s[*__i];
2944 return *this;
2945}
2946
2947template <class _Tp>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002948inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002949valarray<_Tp>&
2950valarray<_Tp>::operator=(const mask_array<value_type>& __ma)
2951{
2952 typedef const size_t* _Ip;
2953 value_type* __t = __begin_;
2954 const value_type* __s = __ma.__vp_;
2955 for (_Ip __i = __ma.__1d_.__begin_, __e = __ma.__1d_.__end_;
2956 __i != __e; ++__i, ++__t)
2957 *__t = __s[*__i];
2958 return *this;
2959}
2960
2961template <class _Tp>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002962inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002963valarray<_Tp>&
2964valarray<_Tp>::operator=(const indirect_array<value_type>& __ia)
2965{
2966 typedef const size_t* _Ip;
2967 value_type* __t = __begin_;
2968 const value_type* __s = __ia.__vp_;
2969 for (_Ip __i = __ia.__1d_.__begin_, __e = __ia.__1d_.__end_;
2970 __i != __e; ++__i, ++__t)
2971 *__t = __s[*__i];
2972 return *this;
2973}
2974
2975template <class _Tp>
Howard Hinnantdb866632011-07-27 23:19:59 +00002976template <class _ValExpr>
2977inline _LIBCPP_INLINE_VISIBILITY
2978valarray<_Tp>&
2979valarray<_Tp>::operator=(const __val_expr<_ValExpr>& __v)
2980{
2981 size_t __n = __v.size();
2982 if (size() != __n)
2983 resize(__n);
2984 value_type* __t = __begin_;
2985 for (size_t __i = 0; __i != __n; ++__t, ++__i)
2986 *__t = result_type(__v[__i]);
2987 return *this;
2988}
2989
2990template <class _Tp>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002991inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00002992__val_expr<__slice_expr<const valarray<_Tp>&> >
2993valarray<_Tp>::operator[](slice __s) const
2994{
2995 return __val_expr<__slice_expr<const valarray&> >(__slice_expr<const valarray&>(__s, *this));
2996}
2997
2998template <class _Tp>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00002999inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003000slice_array<_Tp>
3001valarray<_Tp>::operator[](slice __s)
3002{
3003 return slice_array<value_type>(__s, *this);
3004}
3005
3006template <class _Tp>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00003007inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003008__val_expr<__indirect_expr<const valarray<_Tp>&> >
3009valarray<_Tp>::operator[](const gslice& __gs) const
3010{
3011 return __val_expr<__indirect_expr<const valarray&> >(__indirect_expr<const valarray&>(__gs.__1d_, *this));
3012}
3013
3014template <class _Tp>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00003015inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003016gslice_array<_Tp>
3017valarray<_Tp>::operator[](const gslice& __gs)
3018{
3019 return gslice_array<value_type>(__gs, *this);
3020}
3021
Howard Hinnant73d21a42010-09-04 23:28:19 +00003022#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003023
3024template <class _Tp>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00003025inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003026__val_expr<__indirect_expr<const valarray<_Tp>&> >
3027valarray<_Tp>::operator[](gslice&& __gs) const
3028{
3029 return __val_expr<__indirect_expr<const valarray&> >(__indirect_expr<const valarray&>(move(__gs.__1d_), *this));
3030}
3031
3032template <class _Tp>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00003033inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003034gslice_array<_Tp>
3035valarray<_Tp>::operator[](gslice&& __gs)
3036{
3037 return gslice_array<value_type>(move(__gs), *this);
3038}
3039
Howard Hinnant73d21a42010-09-04 23:28:19 +00003040#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003041
3042template <class _Tp>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00003043inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003044__val_expr<__mask_expr<const valarray<_Tp>&> >
3045valarray<_Tp>::operator[](const valarray<bool>& __vb) const
3046{
3047 return __val_expr<__mask_expr<const valarray&> >(__mask_expr<const valarray&>(__vb, *this));
3048}
3049
3050template <class _Tp>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00003051inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003052mask_array<_Tp>
3053valarray<_Tp>::operator[](const valarray<bool>& __vb)
3054{
3055 return mask_array<value_type>(__vb, *this);
3056}
3057
Howard Hinnant73d21a42010-09-04 23:28:19 +00003058#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003059
3060template <class _Tp>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00003061inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003062__val_expr<__mask_expr<const valarray<_Tp>&> >
3063valarray<_Tp>::operator[](valarray<bool>&& __vb) const
3064{
3065 return __val_expr<__mask_expr<const valarray&> >(__mask_expr<const valarray&>(move(__vb), *this));
3066}
3067
3068template <class _Tp>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00003069inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003070mask_array<_Tp>
3071valarray<_Tp>::operator[](valarray<bool>&& __vb)
3072{
3073 return mask_array<value_type>(move(__vb), *this);
3074}
3075
Howard Hinnant73d21a42010-09-04 23:28:19 +00003076#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003077
3078template <class _Tp>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00003079inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003080__val_expr<__indirect_expr<const valarray<_Tp>&> >
3081valarray<_Tp>::operator[](const valarray<size_t>& __vs) const
3082{
3083 return __val_expr<__indirect_expr<const valarray&> >(__indirect_expr<const valarray&>(__vs, *this));
3084}
3085
3086template <class _Tp>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00003087inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003088indirect_array<_Tp>
3089valarray<_Tp>::operator[](const valarray<size_t>& __vs)
3090{
3091 return indirect_array<value_type>(__vs, *this);
3092}
3093
Howard Hinnant73d21a42010-09-04 23:28:19 +00003094#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003095
3096template <class _Tp>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00003097inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003098__val_expr<__indirect_expr<const valarray<_Tp>&> >
3099valarray<_Tp>::operator[](valarray<size_t>&& __vs) const
3100{
3101 return __val_expr<__indirect_expr<const valarray&> >(__indirect_expr<const valarray&>(move(__vs), *this));
3102}
3103
3104template <class _Tp>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00003105inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003106indirect_array<_Tp>
3107valarray<_Tp>::operator[](valarray<size_t>&& __vs)
3108{
3109 return indirect_array<value_type>(move(__vs), *this);
3110}
3111
Howard Hinnant73d21a42010-09-04 23:28:19 +00003112#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003113
3114template <class _Tp>
3115valarray<_Tp>
3116valarray<_Tp>::operator+() const
3117{
3118 valarray<value_type> __r;
3119 size_t __n = size();
3120 if (__n)
3121 {
3122 __r.__begin_ =
3123 __r.__end_ =
3124 static_cast<value_type*>(::operator new(__n * sizeof(value_type)));
3125 for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n)
3126 ::new (__r.__end_) value_type(+*__p);
3127 }
3128 return __r;
3129}
3130
3131template <class _Tp>
3132valarray<_Tp>
3133valarray<_Tp>::operator-() const
3134{
3135 valarray<value_type> __r;
3136 size_t __n = size();
3137 if (__n)
3138 {
3139 __r.__begin_ =
3140 __r.__end_ =
3141 static_cast<value_type*>(::operator new(__n * sizeof(value_type)));
3142 for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n)
3143 ::new (__r.__end_) value_type(-*__p);
3144 }
3145 return __r;
3146}
3147
3148template <class _Tp>
3149valarray<_Tp>
3150valarray<_Tp>::operator~() const
3151{
3152 valarray<value_type> __r;
3153 size_t __n = size();
3154 if (__n)
3155 {
3156 __r.__begin_ =
3157 __r.__end_ =
3158 static_cast<value_type*>(::operator new(__n * sizeof(value_type)));
3159 for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n)
3160 ::new (__r.__end_) value_type(~*__p);
3161 }
3162 return __r;
3163}
3164
3165template <class _Tp>
3166valarray<bool>
3167valarray<_Tp>::operator!() const
3168{
3169 valarray<bool> __r;
3170 size_t __n = size();
3171 if (__n)
3172 {
3173 __r.__begin_ =
3174 __r.__end_ =
3175 static_cast<bool*>(::operator new(__n * sizeof(bool)));
3176 for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n)
3177 ::new (__r.__end_) bool(!*__p);
3178 }
3179 return __r;
3180}
3181
3182template <class _Tp>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00003183inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003184valarray<_Tp>&
3185valarray<_Tp>::operator*=(const value_type& __x)
3186{
3187 for (value_type* __p = __begin_; __p != __end_; ++__p)
3188 *__p *= __x;
3189 return *this;
3190}
3191
3192template <class _Tp>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00003193inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003194valarray<_Tp>&
3195valarray<_Tp>::operator/=(const value_type& __x)
3196{
3197 for (value_type* __p = __begin_; __p != __end_; ++__p)
3198 *__p /= __x;
3199 return *this;
3200}
3201
3202template <class _Tp>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00003203inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003204valarray<_Tp>&
3205valarray<_Tp>::operator%=(const value_type& __x)
3206{
3207 for (value_type* __p = __begin_; __p != __end_; ++__p)
3208 *__p %= __x;
3209 return *this;
3210}
3211
3212template <class _Tp>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00003213inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003214valarray<_Tp>&
3215valarray<_Tp>::operator+=(const value_type& __x)
3216{
3217 for (value_type* __p = __begin_; __p != __end_; ++__p)
3218 *__p += __x;
3219 return *this;
3220}
3221
3222template <class _Tp>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00003223inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003224valarray<_Tp>&
3225valarray<_Tp>::operator-=(const value_type& __x)
3226{
3227 for (value_type* __p = __begin_; __p != __end_; ++__p)
3228 *__p -= __x;
3229 return *this;
3230}
3231
3232template <class _Tp>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00003233inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003234valarray<_Tp>&
3235valarray<_Tp>::operator^=(const value_type& __x)
3236{
3237 for (value_type* __p = __begin_; __p != __end_; ++__p)
3238 *__p ^= __x;
3239 return *this;
3240}
3241
3242template <class _Tp>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00003243inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003244valarray<_Tp>&
3245valarray<_Tp>::operator&=(const value_type& __x)
3246{
3247 for (value_type* __p = __begin_; __p != __end_; ++__p)
3248 *__p &= __x;
3249 return *this;
3250}
3251
3252template <class _Tp>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00003253inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003254valarray<_Tp>&
3255valarray<_Tp>::operator|=(const value_type& __x)
3256{
3257 for (value_type* __p = __begin_; __p != __end_; ++__p)
3258 *__p |= __x;
3259 return *this;
3260}
3261
3262template <class _Tp>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00003263inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003264valarray<_Tp>&
3265valarray<_Tp>::operator<<=(const value_type& __x)
3266{
3267 for (value_type* __p = __begin_; __p != __end_; ++__p)
3268 *__p <<= __x;
3269 return *this;
3270}
3271
3272template <class _Tp>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00003273inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003274valarray<_Tp>&
3275valarray<_Tp>::operator>>=(const value_type& __x)
3276{
3277 for (value_type* __p = __begin_; __p != __end_; ++__p)
3278 *__p >>= __x;
3279 return *this;
3280}
3281
3282template <class _Tp>
3283template <class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00003284inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003285typename enable_if
3286<
3287 __is_val_expr<_Expr>::value,
3288 valarray<_Tp>&
3289>::type
3290valarray<_Tp>::operator*=(const _Expr& __v)
3291{
3292 size_t __i = 0;
3293 for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3294 *__t *= __v[__i];
3295 return *this;
3296}
3297
3298template <class _Tp>
3299template <class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00003300inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003301typename enable_if
3302<
3303 __is_val_expr<_Expr>::value,
3304 valarray<_Tp>&
3305>::type
3306valarray<_Tp>::operator/=(const _Expr& __v)
3307{
3308 size_t __i = 0;
3309 for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3310 *__t /= __v[__i];
3311 return *this;
3312}
3313
3314template <class _Tp>
3315template <class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00003316inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003317typename enable_if
3318<
3319 __is_val_expr<_Expr>::value,
3320 valarray<_Tp>&
3321>::type
3322valarray<_Tp>::operator%=(const _Expr& __v)
3323{
3324 size_t __i = 0;
3325 for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3326 *__t %= __v[__i];
3327 return *this;
3328}
3329
3330template <class _Tp>
3331template <class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00003332inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003333typename enable_if
3334<
3335 __is_val_expr<_Expr>::value,
3336 valarray<_Tp>&
3337>::type
3338valarray<_Tp>::operator+=(const _Expr& __v)
3339{
3340 size_t __i = 0;
3341 for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3342 *__t += __v[__i];
3343 return *this;
3344}
3345
3346template <class _Tp>
3347template <class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00003348inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003349typename enable_if
3350<
3351 __is_val_expr<_Expr>::value,
3352 valarray<_Tp>&
3353>::type
3354valarray<_Tp>::operator-=(const _Expr& __v)
3355{
3356 size_t __i = 0;
3357 for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3358 *__t -= __v[__i];
3359 return *this;
3360}
3361
3362template <class _Tp>
3363template <class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00003364inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003365typename enable_if
3366<
3367 __is_val_expr<_Expr>::value,
3368 valarray<_Tp>&
3369>::type
3370valarray<_Tp>::operator^=(const _Expr& __v)
3371{
3372 size_t __i = 0;
3373 for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3374 *__t ^= __v[__i];
3375 return *this;
3376}
3377
3378template <class _Tp>
3379template <class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00003380inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003381typename enable_if
3382<
3383 __is_val_expr<_Expr>::value,
3384 valarray<_Tp>&
3385>::type
3386valarray<_Tp>::operator|=(const _Expr& __v)
3387{
3388 size_t __i = 0;
3389 for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3390 *__t |= __v[__i];
3391 return *this;
3392}
3393
3394template <class _Tp>
3395template <class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00003396inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003397typename enable_if
3398<
3399 __is_val_expr<_Expr>::value,
3400 valarray<_Tp>&
3401>::type
3402valarray<_Tp>::operator&=(const _Expr& __v)
3403{
3404 size_t __i = 0;
3405 for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3406 *__t &= __v[__i];
3407 return *this;
3408}
3409
3410template <class _Tp>
3411template <class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00003412inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003413typename enable_if
3414<
3415 __is_val_expr<_Expr>::value,
3416 valarray<_Tp>&
3417>::type
3418valarray<_Tp>::operator<<=(const _Expr& __v)
3419{
3420 size_t __i = 0;
3421 for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3422 *__t <<= __v[__i];
3423 return *this;
3424}
3425
3426template <class _Tp>
3427template <class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00003428inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003429typename enable_if
3430<
3431 __is_val_expr<_Expr>::value,
3432 valarray<_Tp>&
3433>::type
3434valarray<_Tp>::operator>>=(const _Expr& __v)
3435{
3436 size_t __i = 0;
3437 for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3438 *__t >>= __v[__i];
3439 return *this;
3440}
3441
3442template <class _Tp>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00003443inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003444void
3445valarray<_Tp>::swap(valarray& __v)
3446{
Howard Hinnant0949eed2011-06-30 21:18:19 +00003447 _VSTD::swap(__begin_, __v.__begin_);
3448 _VSTD::swap(__end_, __v.__end_);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003449}
3450
3451template <class _Tp>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00003452inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003453_Tp
3454valarray<_Tp>::sum() const
3455{
3456 if (__begin_ == __end_)
3457 return value_type();
3458 const value_type* __p = __begin_;
3459 _Tp __r = *__p;
3460 for (++__p; __p != __end_; ++__p)
3461 __r += *__p;
3462 return __r;
3463}
3464
3465template <class _Tp>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00003466inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003467_Tp
3468valarray<_Tp>::min() const
3469{
3470 if (__begin_ == __end_)
3471 return value_type();
Howard Hinnant0949eed2011-06-30 21:18:19 +00003472 return *_VSTD::min_element(__begin_, __end_);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003473}
3474
3475template <class _Tp>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00003476inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003477_Tp
3478valarray<_Tp>::max() const
3479{
3480 if (__begin_ == __end_)
3481 return value_type();
Howard Hinnant0949eed2011-06-30 21:18:19 +00003482 return *_VSTD::max_element(__begin_, __end_);
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003483}
3484
3485template <class _Tp>
3486valarray<_Tp>
3487valarray<_Tp>::shift(int __i) const
3488{
3489 valarray<value_type> __r;
3490 size_t __n = size();
3491 if (__n)
3492 {
3493 __r.__begin_ =
3494 __r.__end_ =
3495 static_cast<value_type*>(::operator new(__n * sizeof(value_type)));
3496 const value_type* __sb;
3497 value_type* __tb;
3498 value_type* __te;
3499 if (__i >= 0)
3500 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003501 __i = _VSTD::min(__i, static_cast<int>(__n));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003502 __sb = __begin_ + __i;
3503 __tb = __r.__begin_;
3504 __te = __r.__begin_ + (__n - __i);
3505 }
3506 else
3507 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003508 __i = _VSTD::min(-__i, static_cast<int>(__n));
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003509 __sb = __begin_;
3510 __tb = __r.__begin_ + __i;
3511 __te = __r.__begin_ + __n;
3512 }
3513 for (; __r.__end_ != __tb; ++__r.__end_)
3514 ::new (__r.__end_) value_type();
3515 for (; __r.__end_ != __te; ++__r.__end_, ++__sb)
3516 ::new (__r.__end_) value_type(*__sb);
3517 for (__te = __r.__begin_ + __n; __r.__end_ != __te; ++__r.__end_)
3518 ::new (__r.__end_) value_type();
3519 }
3520 return __r;
3521}
3522
3523template <class _Tp>
3524valarray<_Tp>
3525valarray<_Tp>::cshift(int __i) const
3526{
3527 valarray<value_type> __r;
3528 size_t __n = size();
3529 if (__n)
3530 {
3531 __r.__begin_ =
3532 __r.__end_ =
3533 static_cast<value_type*>(::operator new(__n * sizeof(value_type)));
3534 __i %= static_cast<int>(__n);
3535 const value_type* __m = __i >= 0 ? __begin_ + __i : __end_ + __i;
3536 for (const value_type* __s = __m; __s != __end_; ++__r.__end_, ++__s)
3537 ::new (__r.__end_) value_type(*__s);
3538 for (const value_type* __s = __begin_; __s != __m; ++__r.__end_, ++__s)
3539 ::new (__r.__end_) value_type(*__s);
3540 }
3541 return __r;
3542}
3543
3544template <class _Tp>
3545valarray<_Tp>
3546valarray<_Tp>::apply(value_type __f(value_type)) const
3547{
3548 valarray<value_type> __r;
3549 size_t __n = size();
3550 if (__n)
3551 {
3552 __r.__begin_ =
3553 __r.__end_ =
3554 static_cast<value_type*>(::operator new(__n * sizeof(value_type)));
3555 for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n)
3556 ::new (__r.__end_) value_type(__f(*__p));
3557 }
3558 return __r;
3559}
3560
3561template <class _Tp>
3562valarray<_Tp>
3563valarray<_Tp>::apply(value_type __f(const value_type&)) const
3564{
3565 valarray<value_type> __r;
3566 size_t __n = size();
3567 if (__n)
3568 {
3569 __r.__begin_ =
3570 __r.__end_ =
3571 static_cast<value_type*>(::operator new(__n * sizeof(value_type)));
3572 for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n)
3573 ::new (__r.__end_) value_type(__f(*__p));
3574 }
3575 return __r;
3576}
3577
3578template <class _Tp>
3579void
3580valarray<_Tp>::resize(size_t __n, value_type __x)
3581{
3582 if (__begin_ != nullptr)
3583 {
3584 while (__end_ != __begin_)
3585 (--__end_)->~value_type();
3586 ::operator delete(__begin_);
3587 __begin_ = __end_ = nullptr;
3588 }
3589 if (__n)
3590 {
3591 __begin_ = __end_ = static_cast<value_type*>(::operator new(__n * sizeof(value_type)));
3592#ifndef _LIBCPP_NO_EXCEPTIONS
3593 try
3594 {
Howard Hinnant324bb032010-08-22 00:02:43 +00003595#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003596 for (; __n; --__n, ++__end_)
3597 ::new (__end_) value_type(__x);
3598#ifndef _LIBCPP_NO_EXCEPTIONS
3599 }
3600 catch (...)
3601 {
3602 resize(0);
3603 throw;
3604 }
Howard Hinnant324bb032010-08-22 00:02:43 +00003605#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003606 }
3607}
3608
3609template<class _Tp>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00003610inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003611void
3612swap(valarray<_Tp>& __x, valarray<_Tp>& __y)
3613{
3614 __x.swap(__y);
3615}
3616
3617template<class _Expr1, class _Expr2>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00003618inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003619typename enable_if
3620<
3621 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
3622 __val_expr<_BinaryOp<multiplies<typename _Expr1::value_type>, _Expr1, _Expr2> >
3623>::type
3624operator*(const _Expr1& __x, const _Expr2& __y)
3625{
3626 typedef typename _Expr1::value_type value_type;
3627 typedef _BinaryOp<multiplies<value_type>, _Expr1, _Expr2> _Op;
3628 return __val_expr<_Op>(_Op(multiplies<value_type>(), __x, __y));
3629}
3630
3631template<class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00003632inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003633typename enable_if
3634<
3635 __is_val_expr<_Expr>::value,
3636 __val_expr<_BinaryOp<multiplies<typename _Expr::value_type>,
3637 _Expr, __scalar_expr<typename _Expr::value_type> > >
3638>::type
3639operator*(const _Expr& __x, const typename _Expr::value_type& __y)
3640{
3641 typedef typename _Expr::value_type value_type;
3642 typedef _BinaryOp<multiplies<value_type>, _Expr, __scalar_expr<value_type> > _Op;
3643 return __val_expr<_Op>(_Op(multiplies<value_type>(),
3644 __x, __scalar_expr<value_type>(__y, __x.size())));
3645}
3646
3647template<class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00003648inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003649typename enable_if
3650<
3651 __is_val_expr<_Expr>::value,
3652 __val_expr<_BinaryOp<multiplies<typename _Expr::value_type>,
3653 __scalar_expr<typename _Expr::value_type>, _Expr> >
3654>::type
3655operator*(const typename _Expr::value_type& __x, const _Expr& __y)
3656{
3657 typedef typename _Expr::value_type value_type;
3658 typedef _BinaryOp<multiplies<value_type>, __scalar_expr<value_type>, _Expr> _Op;
3659 return __val_expr<_Op>(_Op(multiplies<value_type>(),
3660 __scalar_expr<value_type>(__x, __y.size()), __y));
3661}
3662
3663template<class _Expr1, class _Expr2>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00003664inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003665typename enable_if
3666<
3667 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
3668 __val_expr<_BinaryOp<divides<typename _Expr1::value_type>, _Expr1, _Expr2> >
3669>::type
3670operator/(const _Expr1& __x, const _Expr2& __y)
3671{
3672 typedef typename _Expr1::value_type value_type;
3673 typedef _BinaryOp<divides<value_type>, _Expr1, _Expr2> _Op;
3674 return __val_expr<_Op>(_Op(divides<value_type>(), __x, __y));
3675}
3676
3677template<class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00003678inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003679typename enable_if
3680<
3681 __is_val_expr<_Expr>::value,
3682 __val_expr<_BinaryOp<divides<typename _Expr::value_type>,
3683 _Expr, __scalar_expr<typename _Expr::value_type> > >
3684>::type
3685operator/(const _Expr& __x, const typename _Expr::value_type& __y)
3686{
3687 typedef typename _Expr::value_type value_type;
3688 typedef _BinaryOp<divides<value_type>, _Expr, __scalar_expr<value_type> > _Op;
3689 return __val_expr<_Op>(_Op(divides<value_type>(),
3690 __x, __scalar_expr<value_type>(__y, __x.size())));
3691}
3692
3693template<class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00003694inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003695typename enable_if
3696<
3697 __is_val_expr<_Expr>::value,
3698 __val_expr<_BinaryOp<divides<typename _Expr::value_type>,
3699 __scalar_expr<typename _Expr::value_type>, _Expr> >
3700>::type
3701operator/(const typename _Expr::value_type& __x, const _Expr& __y)
3702{
3703 typedef typename _Expr::value_type value_type;
3704 typedef _BinaryOp<divides<value_type>, __scalar_expr<value_type>, _Expr> _Op;
3705 return __val_expr<_Op>(_Op(divides<value_type>(),
3706 __scalar_expr<value_type>(__x, __y.size()), __y));
3707}
3708
3709template<class _Expr1, class _Expr2>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00003710inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003711typename enable_if
3712<
3713 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
3714 __val_expr<_BinaryOp<modulus<typename _Expr1::value_type>, _Expr1, _Expr2> >
3715>::type
3716operator%(const _Expr1& __x, const _Expr2& __y)
3717{
3718 typedef typename _Expr1::value_type value_type;
3719 typedef _BinaryOp<modulus<value_type>, _Expr1, _Expr2> _Op;
3720 return __val_expr<_Op>(_Op(modulus<value_type>(), __x, __y));
3721}
3722
3723template<class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00003724inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003725typename enable_if
3726<
3727 __is_val_expr<_Expr>::value,
3728 __val_expr<_BinaryOp<modulus<typename _Expr::value_type>,
3729 _Expr, __scalar_expr<typename _Expr::value_type> > >
3730>::type
3731operator%(const _Expr& __x, const typename _Expr::value_type& __y)
3732{
3733 typedef typename _Expr::value_type value_type;
3734 typedef _BinaryOp<modulus<value_type>, _Expr, __scalar_expr<value_type> > _Op;
3735 return __val_expr<_Op>(_Op(modulus<value_type>(),
3736 __x, __scalar_expr<value_type>(__y, __x.size())));
3737}
3738
3739template<class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00003740inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003741typename enable_if
3742<
3743 __is_val_expr<_Expr>::value,
3744 __val_expr<_BinaryOp<modulus<typename _Expr::value_type>,
3745 __scalar_expr<typename _Expr::value_type>, _Expr> >
3746>::type
3747operator%(const typename _Expr::value_type& __x, const _Expr& __y)
3748{
3749 typedef typename _Expr::value_type value_type;
3750 typedef _BinaryOp<modulus<value_type>, __scalar_expr<value_type>, _Expr> _Op;
3751 return __val_expr<_Op>(_Op(modulus<value_type>(),
3752 __scalar_expr<value_type>(__x, __y.size()), __y));
3753}
3754
3755template<class _Expr1, class _Expr2>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00003756inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003757typename enable_if
3758<
3759 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
3760 __val_expr<_BinaryOp<plus<typename _Expr1::value_type>, _Expr1, _Expr2> >
3761>::type
3762operator+(const _Expr1& __x, const _Expr2& __y)
3763{
3764 typedef typename _Expr1::value_type value_type;
3765 typedef _BinaryOp<plus<value_type>, _Expr1, _Expr2> _Op;
3766 return __val_expr<_Op>(_Op(plus<value_type>(), __x, __y));
3767}
3768
3769template<class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00003770inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003771typename enable_if
3772<
3773 __is_val_expr<_Expr>::value,
3774 __val_expr<_BinaryOp<plus<typename _Expr::value_type>,
3775 _Expr, __scalar_expr<typename _Expr::value_type> > >
3776>::type
3777operator+(const _Expr& __x, const typename _Expr::value_type& __y)
3778{
3779 typedef typename _Expr::value_type value_type;
3780 typedef _BinaryOp<plus<value_type>, _Expr, __scalar_expr<value_type> > _Op;
3781 return __val_expr<_Op>(_Op(plus<value_type>(),
3782 __x, __scalar_expr<value_type>(__y, __x.size())));
3783}
3784
3785template<class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00003786inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003787typename enable_if
3788<
3789 __is_val_expr<_Expr>::value,
3790 __val_expr<_BinaryOp<plus<typename _Expr::value_type>,
3791 __scalar_expr<typename _Expr::value_type>, _Expr> >
3792>::type
3793operator+(const typename _Expr::value_type& __x, const _Expr& __y)
3794{
3795 typedef typename _Expr::value_type value_type;
3796 typedef _BinaryOp<plus<value_type>, __scalar_expr<value_type>, _Expr> _Op;
3797 return __val_expr<_Op>(_Op(plus<value_type>(),
3798 __scalar_expr<value_type>(__x, __y.size()), __y));
3799}
3800
3801template<class _Expr1, class _Expr2>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00003802inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003803typename enable_if
3804<
3805 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
3806 __val_expr<_BinaryOp<minus<typename _Expr1::value_type>, _Expr1, _Expr2> >
3807>::type
3808operator-(const _Expr1& __x, const _Expr2& __y)
3809{
3810 typedef typename _Expr1::value_type value_type;
3811 typedef _BinaryOp<minus<value_type>, _Expr1, _Expr2> _Op;
3812 return __val_expr<_Op>(_Op(minus<value_type>(), __x, __y));
3813}
3814
3815template<class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00003816inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003817typename enable_if
3818<
3819 __is_val_expr<_Expr>::value,
3820 __val_expr<_BinaryOp<minus<typename _Expr::value_type>,
3821 _Expr, __scalar_expr<typename _Expr::value_type> > >
3822>::type
3823operator-(const _Expr& __x, const typename _Expr::value_type& __y)
3824{
3825 typedef typename _Expr::value_type value_type;
3826 typedef _BinaryOp<minus<value_type>, _Expr, __scalar_expr<value_type> > _Op;
3827 return __val_expr<_Op>(_Op(minus<value_type>(),
3828 __x, __scalar_expr<value_type>(__y, __x.size())));
3829}
3830
3831template<class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00003832inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003833typename enable_if
3834<
3835 __is_val_expr<_Expr>::value,
3836 __val_expr<_BinaryOp<minus<typename _Expr::value_type>,
3837 __scalar_expr<typename _Expr::value_type>, _Expr> >
3838>::type
3839operator-(const typename _Expr::value_type& __x, const _Expr& __y)
3840{
3841 typedef typename _Expr::value_type value_type;
3842 typedef _BinaryOp<minus<value_type>, __scalar_expr<value_type>, _Expr> _Op;
3843 return __val_expr<_Op>(_Op(minus<value_type>(),
3844 __scalar_expr<value_type>(__x, __y.size()), __y));
3845}
3846
3847template<class _Expr1, class _Expr2>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00003848inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003849typename enable_if
3850<
3851 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
3852 __val_expr<_BinaryOp<bit_xor<typename _Expr1::value_type>, _Expr1, _Expr2> >
3853>::type
3854operator^(const _Expr1& __x, const _Expr2& __y)
3855{
3856 typedef typename _Expr1::value_type value_type;
3857 typedef _BinaryOp<bit_xor<value_type>, _Expr1, _Expr2> _Op;
3858 return __val_expr<_Op>(_Op(bit_xor<value_type>(), __x, __y));
3859}
3860
3861template<class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00003862inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003863typename enable_if
3864<
3865 __is_val_expr<_Expr>::value,
3866 __val_expr<_BinaryOp<bit_xor<typename _Expr::value_type>,
3867 _Expr, __scalar_expr<typename _Expr::value_type> > >
3868>::type
3869operator^(const _Expr& __x, const typename _Expr::value_type& __y)
3870{
3871 typedef typename _Expr::value_type value_type;
3872 typedef _BinaryOp<bit_xor<value_type>, _Expr, __scalar_expr<value_type> > _Op;
3873 return __val_expr<_Op>(_Op(bit_xor<value_type>(),
3874 __x, __scalar_expr<value_type>(__y, __x.size())));
3875}
3876
3877template<class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00003878inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003879typename enable_if
3880<
3881 __is_val_expr<_Expr>::value,
3882 __val_expr<_BinaryOp<bit_xor<typename _Expr::value_type>,
3883 __scalar_expr<typename _Expr::value_type>, _Expr> >
3884>::type
3885operator^(const typename _Expr::value_type& __x, const _Expr& __y)
3886{
3887 typedef typename _Expr::value_type value_type;
3888 typedef _BinaryOp<bit_xor<value_type>, __scalar_expr<value_type>, _Expr> _Op;
3889 return __val_expr<_Op>(_Op(bit_xor<value_type>(),
3890 __scalar_expr<value_type>(__x, __y.size()), __y));
3891}
3892
3893template<class _Expr1, class _Expr2>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00003894inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003895typename enable_if
3896<
3897 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
3898 __val_expr<_BinaryOp<bit_and<typename _Expr1::value_type>, _Expr1, _Expr2> >
3899>::type
3900operator&(const _Expr1& __x, const _Expr2& __y)
3901{
3902 typedef typename _Expr1::value_type value_type;
3903 typedef _BinaryOp<bit_and<value_type>, _Expr1, _Expr2> _Op;
3904 return __val_expr<_Op>(_Op(bit_and<value_type>(), __x, __y));
3905}
3906
3907template<class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00003908inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003909typename enable_if
3910<
3911 __is_val_expr<_Expr>::value,
3912 __val_expr<_BinaryOp<bit_and<typename _Expr::value_type>,
3913 _Expr, __scalar_expr<typename _Expr::value_type> > >
3914>::type
3915operator&(const _Expr& __x, const typename _Expr::value_type& __y)
3916{
3917 typedef typename _Expr::value_type value_type;
3918 typedef _BinaryOp<bit_and<value_type>, _Expr, __scalar_expr<value_type> > _Op;
3919 return __val_expr<_Op>(_Op(bit_and<value_type>(),
3920 __x, __scalar_expr<value_type>(__y, __x.size())));
3921}
3922
3923template<class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00003924inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003925typename enable_if
3926<
3927 __is_val_expr<_Expr>::value,
3928 __val_expr<_BinaryOp<bit_and<typename _Expr::value_type>,
3929 __scalar_expr<typename _Expr::value_type>, _Expr> >
3930>::type
3931operator&(const typename _Expr::value_type& __x, const _Expr& __y)
3932{
3933 typedef typename _Expr::value_type value_type;
3934 typedef _BinaryOp<bit_and<value_type>, __scalar_expr<value_type>, _Expr> _Op;
3935 return __val_expr<_Op>(_Op(bit_and<value_type>(),
3936 __scalar_expr<value_type>(__x, __y.size()), __y));
3937}
3938
3939template<class _Expr1, class _Expr2>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00003940inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003941typename enable_if
3942<
3943 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
3944 __val_expr<_BinaryOp<bit_or<typename _Expr1::value_type>, _Expr1, _Expr2> >
3945>::type
3946operator|(const _Expr1& __x, const _Expr2& __y)
3947{
3948 typedef typename _Expr1::value_type value_type;
3949 typedef _BinaryOp<bit_or<value_type>, _Expr1, _Expr2> _Op;
3950 return __val_expr<_Op>(_Op(bit_or<value_type>(), __x, __y));
3951}
3952
3953template<class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00003954inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003955typename enable_if
3956<
3957 __is_val_expr<_Expr>::value,
3958 __val_expr<_BinaryOp<bit_or<typename _Expr::value_type>,
3959 _Expr, __scalar_expr<typename _Expr::value_type> > >
3960>::type
3961operator|(const _Expr& __x, const typename _Expr::value_type& __y)
3962{
3963 typedef typename _Expr::value_type value_type;
3964 typedef _BinaryOp<bit_or<value_type>, _Expr, __scalar_expr<value_type> > _Op;
3965 return __val_expr<_Op>(_Op(bit_or<value_type>(),
3966 __x, __scalar_expr<value_type>(__y, __x.size())));
3967}
3968
3969template<class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00003970inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003971typename enable_if
3972<
3973 __is_val_expr<_Expr>::value,
3974 __val_expr<_BinaryOp<bit_or<typename _Expr::value_type>,
3975 __scalar_expr<typename _Expr::value_type>, _Expr> >
3976>::type
3977operator|(const typename _Expr::value_type& __x, const _Expr& __y)
3978{
3979 typedef typename _Expr::value_type value_type;
3980 typedef _BinaryOp<bit_or<value_type>, __scalar_expr<value_type>, _Expr> _Op;
3981 return __val_expr<_Op>(_Op(bit_or<value_type>(),
3982 __scalar_expr<value_type>(__x, __y.size()), __y));
3983}
3984
3985template<class _Expr1, class _Expr2>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00003986inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00003987typename enable_if
3988<
3989 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
3990 __val_expr<_BinaryOp<__bit_shift_left<typename _Expr1::value_type>, _Expr1, _Expr2> >
3991>::type
3992operator<<(const _Expr1& __x, const _Expr2& __y)
3993{
3994 typedef typename _Expr1::value_type value_type;
3995 typedef _BinaryOp<__bit_shift_left<value_type>, _Expr1, _Expr2> _Op;
3996 return __val_expr<_Op>(_Op(__bit_shift_left<value_type>(), __x, __y));
3997}
3998
3999template<class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00004000inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004001typename enable_if
4002<
4003 __is_val_expr<_Expr>::value,
4004 __val_expr<_BinaryOp<__bit_shift_left<typename _Expr::value_type>,
4005 _Expr, __scalar_expr<typename _Expr::value_type> > >
4006>::type
4007operator<<(const _Expr& __x, const typename _Expr::value_type& __y)
4008{
4009 typedef typename _Expr::value_type value_type;
4010 typedef _BinaryOp<__bit_shift_left<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4011 return __val_expr<_Op>(_Op(__bit_shift_left<value_type>(),
4012 __x, __scalar_expr<value_type>(__y, __x.size())));
4013}
4014
4015template<class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00004016inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004017typename enable_if
4018<
4019 __is_val_expr<_Expr>::value,
4020 __val_expr<_BinaryOp<__bit_shift_left<typename _Expr::value_type>,
4021 __scalar_expr<typename _Expr::value_type>, _Expr> >
4022>::type
4023operator<<(const typename _Expr::value_type& __x, const _Expr& __y)
4024{
4025 typedef typename _Expr::value_type value_type;
4026 typedef _BinaryOp<__bit_shift_left<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4027 return __val_expr<_Op>(_Op(__bit_shift_left<value_type>(),
4028 __scalar_expr<value_type>(__x, __y.size()), __y));
4029}
4030
4031template<class _Expr1, class _Expr2>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00004032inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004033typename enable_if
4034<
4035 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4036 __val_expr<_BinaryOp<__bit_shift_right<typename _Expr1::value_type>, _Expr1, _Expr2> >
4037>::type
4038operator>>(const _Expr1& __x, const _Expr2& __y)
4039{
4040 typedef typename _Expr1::value_type value_type;
4041 typedef _BinaryOp<__bit_shift_right<value_type>, _Expr1, _Expr2> _Op;
4042 return __val_expr<_Op>(_Op(__bit_shift_right<value_type>(), __x, __y));
4043}
4044
4045template<class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00004046inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004047typename enable_if
4048<
4049 __is_val_expr<_Expr>::value,
4050 __val_expr<_BinaryOp<__bit_shift_right<typename _Expr::value_type>,
4051 _Expr, __scalar_expr<typename _Expr::value_type> > >
4052>::type
4053operator>>(const _Expr& __x, const typename _Expr::value_type& __y)
4054{
4055 typedef typename _Expr::value_type value_type;
4056 typedef _BinaryOp<__bit_shift_right<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4057 return __val_expr<_Op>(_Op(__bit_shift_right<value_type>(),
4058 __x, __scalar_expr<value_type>(__y, __x.size())));
4059}
4060
4061template<class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00004062inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004063typename enable_if
4064<
4065 __is_val_expr<_Expr>::value,
4066 __val_expr<_BinaryOp<__bit_shift_right<typename _Expr::value_type>,
4067 __scalar_expr<typename _Expr::value_type>, _Expr> >
4068>::type
4069operator>>(const typename _Expr::value_type& __x, const _Expr& __y)
4070{
4071 typedef typename _Expr::value_type value_type;
4072 typedef _BinaryOp<__bit_shift_right<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4073 return __val_expr<_Op>(_Op(__bit_shift_right<value_type>(),
4074 __scalar_expr<value_type>(__x, __y.size()), __y));
4075}
4076
4077template<class _Expr1, class _Expr2>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00004078inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004079typename enable_if
4080<
4081 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4082 __val_expr<_BinaryOp<logical_and<typename _Expr1::value_type>, _Expr1, _Expr2> >
4083>::type
4084operator&&(const _Expr1& __x, const _Expr2& __y)
4085{
4086 typedef typename _Expr1::value_type value_type;
4087 typedef _BinaryOp<logical_and<value_type>, _Expr1, _Expr2> _Op;
4088 return __val_expr<_Op>(_Op(logical_and<value_type>(), __x, __y));
4089}
4090
4091template<class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00004092inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004093typename enable_if
4094<
4095 __is_val_expr<_Expr>::value,
4096 __val_expr<_BinaryOp<logical_and<typename _Expr::value_type>,
4097 _Expr, __scalar_expr<typename _Expr::value_type> > >
4098>::type
4099operator&&(const _Expr& __x, const typename _Expr::value_type& __y)
4100{
4101 typedef typename _Expr::value_type value_type;
4102 typedef _BinaryOp<logical_and<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4103 return __val_expr<_Op>(_Op(logical_and<value_type>(),
4104 __x, __scalar_expr<value_type>(__y, __x.size())));
4105}
4106
4107template<class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00004108inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004109typename enable_if
4110<
4111 __is_val_expr<_Expr>::value,
4112 __val_expr<_BinaryOp<logical_and<typename _Expr::value_type>,
4113 __scalar_expr<typename _Expr::value_type>, _Expr> >
4114>::type
4115operator&&(const typename _Expr::value_type& __x, const _Expr& __y)
4116{
4117 typedef typename _Expr::value_type value_type;
4118 typedef _BinaryOp<logical_and<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4119 return __val_expr<_Op>(_Op(logical_and<value_type>(),
4120 __scalar_expr<value_type>(__x, __y.size()), __y));
4121}
4122
4123template<class _Expr1, class _Expr2>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00004124inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004125typename enable_if
4126<
4127 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4128 __val_expr<_BinaryOp<logical_or<typename _Expr1::value_type>, _Expr1, _Expr2> >
4129>::type
4130operator||(const _Expr1& __x, const _Expr2& __y)
4131{
4132 typedef typename _Expr1::value_type value_type;
4133 typedef _BinaryOp<logical_or<value_type>, _Expr1, _Expr2> _Op;
4134 return __val_expr<_Op>(_Op(logical_or<value_type>(), __x, __y));
4135}
4136
4137template<class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00004138inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004139typename enable_if
4140<
4141 __is_val_expr<_Expr>::value,
4142 __val_expr<_BinaryOp<logical_or<typename _Expr::value_type>,
4143 _Expr, __scalar_expr<typename _Expr::value_type> > >
4144>::type
4145operator||(const _Expr& __x, const typename _Expr::value_type& __y)
4146{
4147 typedef typename _Expr::value_type value_type;
4148 typedef _BinaryOp<logical_or<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4149 return __val_expr<_Op>(_Op(logical_or<value_type>(),
4150 __x, __scalar_expr<value_type>(__y, __x.size())));
4151}
4152
4153template<class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00004154inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004155typename enable_if
4156<
4157 __is_val_expr<_Expr>::value,
4158 __val_expr<_BinaryOp<logical_or<typename _Expr::value_type>,
4159 __scalar_expr<typename _Expr::value_type>, _Expr> >
4160>::type
4161operator||(const typename _Expr::value_type& __x, const _Expr& __y)
4162{
4163 typedef typename _Expr::value_type value_type;
4164 typedef _BinaryOp<logical_or<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4165 return __val_expr<_Op>(_Op(logical_or<value_type>(),
4166 __scalar_expr<value_type>(__x, __y.size()), __y));
4167}
4168
4169template<class _Expr1, class _Expr2>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00004170inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004171typename enable_if
4172<
4173 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4174 __val_expr<_BinaryOp<equal_to<typename _Expr1::value_type>, _Expr1, _Expr2> >
4175>::type
4176operator==(const _Expr1& __x, const _Expr2& __y)
4177{
4178 typedef typename _Expr1::value_type value_type;
4179 typedef _BinaryOp<equal_to<value_type>, _Expr1, _Expr2> _Op;
4180 return __val_expr<_Op>(_Op(equal_to<value_type>(), __x, __y));
4181}
4182
4183template<class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00004184inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004185typename enable_if
4186<
4187 __is_val_expr<_Expr>::value,
4188 __val_expr<_BinaryOp<equal_to<typename _Expr::value_type>,
4189 _Expr, __scalar_expr<typename _Expr::value_type> > >
4190>::type
4191operator==(const _Expr& __x, const typename _Expr::value_type& __y)
4192{
4193 typedef typename _Expr::value_type value_type;
4194 typedef _BinaryOp<equal_to<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4195 return __val_expr<_Op>(_Op(equal_to<value_type>(),
4196 __x, __scalar_expr<value_type>(__y, __x.size())));
4197}
4198
4199template<class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00004200inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004201typename enable_if
4202<
4203 __is_val_expr<_Expr>::value,
4204 __val_expr<_BinaryOp<equal_to<typename _Expr::value_type>,
4205 __scalar_expr<typename _Expr::value_type>, _Expr> >
4206>::type
4207operator==(const typename _Expr::value_type& __x, const _Expr& __y)
4208{
4209 typedef typename _Expr::value_type value_type;
4210 typedef _BinaryOp<equal_to<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4211 return __val_expr<_Op>(_Op(equal_to<value_type>(),
4212 __scalar_expr<value_type>(__x, __y.size()), __y));
4213}
4214
4215template<class _Expr1, class _Expr2>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00004216inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004217typename enable_if
4218<
4219 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4220 __val_expr<_BinaryOp<not_equal_to<typename _Expr1::value_type>, _Expr1, _Expr2> >
4221>::type
4222operator!=(const _Expr1& __x, const _Expr2& __y)
4223{
4224 typedef typename _Expr1::value_type value_type;
4225 typedef _BinaryOp<not_equal_to<value_type>, _Expr1, _Expr2> _Op;
4226 return __val_expr<_Op>(_Op(not_equal_to<value_type>(), __x, __y));
4227}
4228
4229template<class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00004230inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004231typename enable_if
4232<
4233 __is_val_expr<_Expr>::value,
4234 __val_expr<_BinaryOp<not_equal_to<typename _Expr::value_type>,
4235 _Expr, __scalar_expr<typename _Expr::value_type> > >
4236>::type
4237operator!=(const _Expr& __x, const typename _Expr::value_type& __y)
4238{
4239 typedef typename _Expr::value_type value_type;
4240 typedef _BinaryOp<not_equal_to<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4241 return __val_expr<_Op>(_Op(not_equal_to<value_type>(),
4242 __x, __scalar_expr<value_type>(__y, __x.size())));
4243}
4244
4245template<class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00004246inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004247typename enable_if
4248<
4249 __is_val_expr<_Expr>::value,
4250 __val_expr<_BinaryOp<not_equal_to<typename _Expr::value_type>,
4251 __scalar_expr<typename _Expr::value_type>, _Expr> >
4252>::type
4253operator!=(const typename _Expr::value_type& __x, const _Expr& __y)
4254{
4255 typedef typename _Expr::value_type value_type;
4256 typedef _BinaryOp<not_equal_to<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4257 return __val_expr<_Op>(_Op(not_equal_to<value_type>(),
4258 __scalar_expr<value_type>(__x, __y.size()), __y));
4259}
4260
4261template<class _Expr1, class _Expr2>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00004262inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004263typename enable_if
4264<
4265 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4266 __val_expr<_BinaryOp<less<typename _Expr1::value_type>, _Expr1, _Expr2> >
4267>::type
4268operator<(const _Expr1& __x, const _Expr2& __y)
4269{
4270 typedef typename _Expr1::value_type value_type;
4271 typedef _BinaryOp<less<value_type>, _Expr1, _Expr2> _Op;
4272 return __val_expr<_Op>(_Op(less<value_type>(), __x, __y));
4273}
4274
4275template<class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00004276inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004277typename enable_if
4278<
4279 __is_val_expr<_Expr>::value,
4280 __val_expr<_BinaryOp<less<typename _Expr::value_type>,
4281 _Expr, __scalar_expr<typename _Expr::value_type> > >
4282>::type
4283operator<(const _Expr& __x, const typename _Expr::value_type& __y)
4284{
4285 typedef typename _Expr::value_type value_type;
4286 typedef _BinaryOp<less<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4287 return __val_expr<_Op>(_Op(less<value_type>(),
4288 __x, __scalar_expr<value_type>(__y, __x.size())));
4289}
4290
4291template<class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00004292inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004293typename enable_if
4294<
4295 __is_val_expr<_Expr>::value,
4296 __val_expr<_BinaryOp<less<typename _Expr::value_type>,
4297 __scalar_expr<typename _Expr::value_type>, _Expr> >
4298>::type
4299operator<(const typename _Expr::value_type& __x, const _Expr& __y)
4300{
4301 typedef typename _Expr::value_type value_type;
4302 typedef _BinaryOp<less<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4303 return __val_expr<_Op>(_Op(less<value_type>(),
4304 __scalar_expr<value_type>(__x, __y.size()), __y));
4305}
4306
4307template<class _Expr1, class _Expr2>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00004308inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004309typename enable_if
4310<
4311 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4312 __val_expr<_BinaryOp<greater<typename _Expr1::value_type>, _Expr1, _Expr2> >
4313>::type
4314operator>(const _Expr1& __x, const _Expr2& __y)
4315{
4316 typedef typename _Expr1::value_type value_type;
4317 typedef _BinaryOp<greater<value_type>, _Expr1, _Expr2> _Op;
4318 return __val_expr<_Op>(_Op(greater<value_type>(), __x, __y));
4319}
4320
4321template<class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00004322inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004323typename enable_if
4324<
4325 __is_val_expr<_Expr>::value,
4326 __val_expr<_BinaryOp<greater<typename _Expr::value_type>,
4327 _Expr, __scalar_expr<typename _Expr::value_type> > >
4328>::type
4329operator>(const _Expr& __x, const typename _Expr::value_type& __y)
4330{
4331 typedef typename _Expr::value_type value_type;
4332 typedef _BinaryOp<greater<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4333 return __val_expr<_Op>(_Op(greater<value_type>(),
4334 __x, __scalar_expr<value_type>(__y, __x.size())));
4335}
4336
4337template<class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00004338inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004339typename enable_if
4340<
4341 __is_val_expr<_Expr>::value,
4342 __val_expr<_BinaryOp<greater<typename _Expr::value_type>,
4343 __scalar_expr<typename _Expr::value_type>, _Expr> >
4344>::type
4345operator>(const typename _Expr::value_type& __x, const _Expr& __y)
4346{
4347 typedef typename _Expr::value_type value_type;
4348 typedef _BinaryOp<greater<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4349 return __val_expr<_Op>(_Op(greater<value_type>(),
4350 __scalar_expr<value_type>(__x, __y.size()), __y));
4351}
4352
4353template<class _Expr1, class _Expr2>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00004354inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004355typename enable_if
4356<
4357 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4358 __val_expr<_BinaryOp<less_equal<typename _Expr1::value_type>, _Expr1, _Expr2> >
4359>::type
4360operator<=(const _Expr1& __x, const _Expr2& __y)
4361{
4362 typedef typename _Expr1::value_type value_type;
4363 typedef _BinaryOp<less_equal<value_type>, _Expr1, _Expr2> _Op;
4364 return __val_expr<_Op>(_Op(less_equal<value_type>(), __x, __y));
4365}
4366
4367template<class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00004368inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004369typename enable_if
4370<
4371 __is_val_expr<_Expr>::value,
4372 __val_expr<_BinaryOp<less_equal<typename _Expr::value_type>,
4373 _Expr, __scalar_expr<typename _Expr::value_type> > >
4374>::type
4375operator<=(const _Expr& __x, const typename _Expr::value_type& __y)
4376{
4377 typedef typename _Expr::value_type value_type;
4378 typedef _BinaryOp<less_equal<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4379 return __val_expr<_Op>(_Op(less_equal<value_type>(),
4380 __x, __scalar_expr<value_type>(__y, __x.size())));
4381}
4382
4383template<class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00004384inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004385typename enable_if
4386<
4387 __is_val_expr<_Expr>::value,
4388 __val_expr<_BinaryOp<less_equal<typename _Expr::value_type>,
4389 __scalar_expr<typename _Expr::value_type>, _Expr> >
4390>::type
4391operator<=(const typename _Expr::value_type& __x, const _Expr& __y)
4392{
4393 typedef typename _Expr::value_type value_type;
4394 typedef _BinaryOp<less_equal<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4395 return __val_expr<_Op>(_Op(less_equal<value_type>(),
4396 __scalar_expr<value_type>(__x, __y.size()), __y));
4397}
4398
4399template<class _Expr1, class _Expr2>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00004400inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004401typename enable_if
4402<
4403 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4404 __val_expr<_BinaryOp<greater_equal<typename _Expr1::value_type>, _Expr1, _Expr2> >
4405>::type
4406operator>=(const _Expr1& __x, const _Expr2& __y)
4407{
4408 typedef typename _Expr1::value_type value_type;
4409 typedef _BinaryOp<greater_equal<value_type>, _Expr1, _Expr2> _Op;
4410 return __val_expr<_Op>(_Op(greater_equal<value_type>(), __x, __y));
4411}
4412
4413template<class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00004414inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004415typename enable_if
4416<
4417 __is_val_expr<_Expr>::value,
4418 __val_expr<_BinaryOp<greater_equal<typename _Expr::value_type>,
4419 _Expr, __scalar_expr<typename _Expr::value_type> > >
4420>::type
4421operator>=(const _Expr& __x, const typename _Expr::value_type& __y)
4422{
4423 typedef typename _Expr::value_type value_type;
4424 typedef _BinaryOp<greater_equal<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4425 return __val_expr<_Op>(_Op(greater_equal<value_type>(),
4426 __x, __scalar_expr<value_type>(__y, __x.size())));
4427}
4428
4429template<class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00004430inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004431typename enable_if
4432<
4433 __is_val_expr<_Expr>::value,
4434 __val_expr<_BinaryOp<greater_equal<typename _Expr::value_type>,
4435 __scalar_expr<typename _Expr::value_type>, _Expr> >
4436>::type
4437operator>=(const typename _Expr::value_type& __x, const _Expr& __y)
4438{
4439 typedef typename _Expr::value_type value_type;
4440 typedef _BinaryOp<greater_equal<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4441 return __val_expr<_Op>(_Op(greater_equal<value_type>(),
4442 __scalar_expr<value_type>(__x, __y.size()), __y));
4443}
4444
4445template<class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00004446inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004447typename enable_if
4448<
4449 __is_val_expr<_Expr>::value,
4450 __val_expr<_UnaryOp<__abs_expr<typename _Expr::value_type>, _Expr> >
4451>::type
4452abs(const _Expr& __x)
4453{
4454 typedef typename _Expr::value_type value_type;
4455 typedef _UnaryOp<__abs_expr<value_type>, _Expr> _Op;
4456 return __val_expr<_Op>(_Op(__abs_expr<value_type>(), __x));
4457}
4458
4459template<class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00004460inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004461typename enable_if
4462<
4463 __is_val_expr<_Expr>::value,
4464 __val_expr<_UnaryOp<__acos_expr<typename _Expr::value_type>, _Expr> >
4465>::type
4466acos(const _Expr& __x)
4467{
4468 typedef typename _Expr::value_type value_type;
4469 typedef _UnaryOp<__acos_expr<value_type>, _Expr> _Op;
4470 return __val_expr<_Op>(_Op(__acos_expr<value_type>(), __x));
4471}
4472
4473template<class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00004474inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004475typename enable_if
4476<
4477 __is_val_expr<_Expr>::value,
4478 __val_expr<_UnaryOp<__asin_expr<typename _Expr::value_type>, _Expr> >
4479>::type
4480asin(const _Expr& __x)
4481{
4482 typedef typename _Expr::value_type value_type;
4483 typedef _UnaryOp<__asin_expr<value_type>, _Expr> _Op;
4484 return __val_expr<_Op>(_Op(__asin_expr<value_type>(), __x));
4485}
4486
4487template<class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00004488inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004489typename enable_if
4490<
4491 __is_val_expr<_Expr>::value,
4492 __val_expr<_UnaryOp<__atan_expr<typename _Expr::value_type>, _Expr> >
4493>::type
4494atan(const _Expr& __x)
4495{
4496 typedef typename _Expr::value_type value_type;
4497 typedef _UnaryOp<__atan_expr<value_type>, _Expr> _Op;
4498 return __val_expr<_Op>(_Op(__atan_expr<value_type>(), __x));
4499}
4500
4501template<class _Expr1, class _Expr2>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00004502inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004503typename enable_if
4504<
4505 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4506 __val_expr<_BinaryOp<__atan2_expr<typename _Expr1::value_type>, _Expr1, _Expr2> >
4507>::type
4508atan2(const _Expr1& __x, const _Expr2& __y)
4509{
4510 typedef typename _Expr1::value_type value_type;
4511 typedef _BinaryOp<__atan2_expr<value_type>, _Expr1, _Expr2> _Op;
4512 return __val_expr<_Op>(_Op(__atan2_expr<value_type>(), __x, __y));
4513}
4514
4515template<class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00004516inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004517typename enable_if
4518<
4519 __is_val_expr<_Expr>::value,
4520 __val_expr<_BinaryOp<__atan2_expr<typename _Expr::value_type>,
4521 _Expr, __scalar_expr<typename _Expr::value_type> > >
4522>::type
4523atan2(const _Expr& __x, const typename _Expr::value_type& __y)
4524{
4525 typedef typename _Expr::value_type value_type;
4526 typedef _BinaryOp<__atan2_expr<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4527 return __val_expr<_Op>(_Op(__atan2_expr<value_type>(),
4528 __x, __scalar_expr<value_type>(__y, __x.size())));
4529}
4530
4531template<class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00004532inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004533typename enable_if
4534<
4535 __is_val_expr<_Expr>::value,
4536 __val_expr<_BinaryOp<__atan2_expr<typename _Expr::value_type>,
4537 __scalar_expr<typename _Expr::value_type>, _Expr> >
4538>::type
4539atan2(const typename _Expr::value_type& __x, const _Expr& __y)
4540{
4541 typedef typename _Expr::value_type value_type;
4542 typedef _BinaryOp<__atan2_expr<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4543 return __val_expr<_Op>(_Op(__atan2_expr<value_type>(),
4544 __scalar_expr<value_type>(__x, __y.size()), __y));
4545}
4546
4547template<class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00004548inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004549typename enable_if
4550<
4551 __is_val_expr<_Expr>::value,
4552 __val_expr<_UnaryOp<__cos_expr<typename _Expr::value_type>, _Expr> >
4553>::type
4554cos(const _Expr& __x)
4555{
4556 typedef typename _Expr::value_type value_type;
4557 typedef _UnaryOp<__cos_expr<value_type>, _Expr> _Op;
4558 return __val_expr<_Op>(_Op(__cos_expr<value_type>(), __x));
4559}
4560
4561template<class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00004562inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004563typename enable_if
4564<
4565 __is_val_expr<_Expr>::value,
4566 __val_expr<_UnaryOp<__cosh_expr<typename _Expr::value_type>, _Expr> >
4567>::type
4568cosh(const _Expr& __x)
4569{
4570 typedef typename _Expr::value_type value_type;
4571 typedef _UnaryOp<__cosh_expr<value_type>, _Expr> _Op;
4572 return __val_expr<_Op>(_Op(__cosh_expr<value_type>(), __x));
4573}
4574
4575template<class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00004576inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004577typename enable_if
4578<
4579 __is_val_expr<_Expr>::value,
4580 __val_expr<_UnaryOp<__exp_expr<typename _Expr::value_type>, _Expr> >
4581>::type
4582exp(const _Expr& __x)
4583{
4584 typedef typename _Expr::value_type value_type;
4585 typedef _UnaryOp<__exp_expr<value_type>, _Expr> _Op;
4586 return __val_expr<_Op>(_Op(__exp_expr<value_type>(), __x));
4587}
4588
4589template<class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00004590inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004591typename enable_if
4592<
4593 __is_val_expr<_Expr>::value,
4594 __val_expr<_UnaryOp<__log_expr<typename _Expr::value_type>, _Expr> >
4595>::type
4596log(const _Expr& __x)
4597{
4598 typedef typename _Expr::value_type value_type;
4599 typedef _UnaryOp<__log_expr<value_type>, _Expr> _Op;
4600 return __val_expr<_Op>(_Op(__log_expr<value_type>(), __x));
4601}
4602
4603template<class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00004604inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004605typename enable_if
4606<
4607 __is_val_expr<_Expr>::value,
4608 __val_expr<_UnaryOp<__log10_expr<typename _Expr::value_type>, _Expr> >
4609>::type
4610log10(const _Expr& __x)
4611{
4612 typedef typename _Expr::value_type value_type;
4613 typedef _UnaryOp<__log10_expr<value_type>, _Expr> _Op;
4614 return __val_expr<_Op>(_Op(__log10_expr<value_type>(), __x));
4615}
4616
4617template<class _Expr1, class _Expr2>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00004618inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004619typename enable_if
4620<
4621 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4622 __val_expr<_BinaryOp<__pow_expr<typename _Expr1::value_type>, _Expr1, _Expr2> >
4623>::type
4624pow(const _Expr1& __x, const _Expr2& __y)
4625{
4626 typedef typename _Expr1::value_type value_type;
4627 typedef _BinaryOp<__pow_expr<value_type>, _Expr1, _Expr2> _Op;
4628 return __val_expr<_Op>(_Op(__pow_expr<value_type>(), __x, __y));
4629}
4630
4631template<class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00004632inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004633typename enable_if
4634<
4635 __is_val_expr<_Expr>::value,
4636 __val_expr<_BinaryOp<__pow_expr<typename _Expr::value_type>,
4637 _Expr, __scalar_expr<typename _Expr::value_type> > >
4638>::type
4639pow(const _Expr& __x, const typename _Expr::value_type& __y)
4640{
4641 typedef typename _Expr::value_type value_type;
4642 typedef _BinaryOp<__pow_expr<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4643 return __val_expr<_Op>(_Op(__pow_expr<value_type>(),
4644 __x, __scalar_expr<value_type>(__y, __x.size())));
4645}
4646
4647template<class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00004648inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004649typename enable_if
4650<
4651 __is_val_expr<_Expr>::value,
4652 __val_expr<_BinaryOp<__pow_expr<typename _Expr::value_type>,
4653 __scalar_expr<typename _Expr::value_type>, _Expr> >
4654>::type
4655pow(const typename _Expr::value_type& __x, const _Expr& __y)
4656{
4657 typedef typename _Expr::value_type value_type;
4658 typedef _BinaryOp<__pow_expr<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4659 return __val_expr<_Op>(_Op(__pow_expr<value_type>(),
4660 __scalar_expr<value_type>(__x, __y.size()), __y));
4661}
4662
4663template<class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00004664inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004665typename enable_if
4666<
4667 __is_val_expr<_Expr>::value,
4668 __val_expr<_UnaryOp<__sin_expr<typename _Expr::value_type>, _Expr> >
4669>::type
4670sin(const _Expr& __x)
4671{
4672 typedef typename _Expr::value_type value_type;
4673 typedef _UnaryOp<__sin_expr<value_type>, _Expr> _Op;
4674 return __val_expr<_Op>(_Op(__sin_expr<value_type>(), __x));
4675}
4676
4677template<class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00004678inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004679typename enable_if
4680<
4681 __is_val_expr<_Expr>::value,
4682 __val_expr<_UnaryOp<__sinh_expr<typename _Expr::value_type>, _Expr> >
4683>::type
4684sinh(const _Expr& __x)
4685{
4686 typedef typename _Expr::value_type value_type;
4687 typedef _UnaryOp<__sinh_expr<value_type>, _Expr> _Op;
4688 return __val_expr<_Op>(_Op(__sinh_expr<value_type>(), __x));
4689}
4690
4691template<class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00004692inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004693typename enable_if
4694<
4695 __is_val_expr<_Expr>::value,
4696 __val_expr<_UnaryOp<__sqrt_expr<typename _Expr::value_type>, _Expr> >
4697>::type
4698sqrt(const _Expr& __x)
4699{
4700 typedef typename _Expr::value_type value_type;
4701 typedef _UnaryOp<__sqrt_expr<value_type>, _Expr> _Op;
4702 return __val_expr<_Op>(_Op(__sqrt_expr<value_type>(), __x));
4703}
4704
4705template<class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00004706inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004707typename enable_if
4708<
4709 __is_val_expr<_Expr>::value,
4710 __val_expr<_UnaryOp<__tan_expr<typename _Expr::value_type>, _Expr> >
4711>::type
4712tan(const _Expr& __x)
4713{
4714 typedef typename _Expr::value_type value_type;
4715 typedef _UnaryOp<__tan_expr<value_type>, _Expr> _Op;
4716 return __val_expr<_Op>(_Op(__tan_expr<value_type>(), __x));
4717}
4718
4719template<class _Expr>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00004720inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004721typename enable_if
4722<
4723 __is_val_expr<_Expr>::value,
4724 __val_expr<_UnaryOp<__tanh_expr<typename _Expr::value_type>, _Expr> >
4725>::type
4726tanh(const _Expr& __x)
4727{
4728 typedef typename _Expr::value_type value_type;
4729 typedef _UnaryOp<__tanh_expr<value_type>, _Expr> _Op;
4730 return __val_expr<_Op>(_Op(__tanh_expr<value_type>(), __x));
4731}
4732
4733template <class _Tp>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00004734inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004735_Tp*
4736begin(valarray<_Tp>& __v)
4737{
4738 return __v.__begin_;
4739}
4740
4741template <class _Tp>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00004742inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004743const _Tp*
4744begin(const valarray<_Tp>& __v)
4745{
4746 return __v.__begin_;
4747}
4748
4749template <class _Tp>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00004750inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004751_Tp*
4752end(valarray<_Tp>& __v)
4753{
4754 return __v.__end_;
4755}
4756
4757template <class _Tp>
Howard Hinnantee6ccd02010-09-23 18:58:28 +00004758inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantbc8d3f92010-05-11 19:42:16 +00004759const _Tp*
4760end(const valarray<_Tp>& __v)
4761{
4762 return __v.__end_;
4763}
4764
4765extern template valarray<size_t>::valarray(size_t);
4766extern template valarray<size_t>::~valarray();
4767extern template void valarray<size_t>::resize(size_t, size_t);
4768
4769_LIBCPP_END_NAMESPACE_STD
4770
4771#endif // _LIBCPP_VALARRAY