]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/libc++/include/valarray
Merge llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp
[FreeBSD/FreeBSD.git] / contrib / libc++ / include / valarray
1 // -*- C++ -*-
2 //===-------------------------- valarray ----------------------------------===//
3 //
4 //                     The LLVM Compiler Infrastructure
5 //
6 // This file is dual licensed under the MIT and the University of Illinois Open
7 // Source Licenses. See LICENSE.TXT for details.
8 //
9 //===----------------------------------------------------------------------===//
10
11 #ifndef _LIBCPP_VALARRAY
12 #define _LIBCPP_VALARRAY
13
14 /*
15     valarray synopsis
16
17 namespace std
18 {
19
20 template<class T>
21 class valarray
22 {
23 public:
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) noexcept;
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) noexcept;
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) noexcept;
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
109 class slice
110 {
111 public:
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
120 template <class T>
121 class slice_array
122 {
123 public:
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
144 class gslice
145 {
146 public:
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
156 template <class T>
157 class gslice_array
158 {
159 public:
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
182 template <class T>
183 class mask_array
184 {
185 public:
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
208 template <class T>
209 class indirect_array
210 {
211 public:
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
234 template<class T> void swap(valarray<T>& x, valarray<T>& y) noexcept;
235
236 template<class T> valarray<T> operator* (const valarray<T>& x, const valarray<T>& y);
237 template<class T> valarray<T> operator* (const valarray<T>& x, const T& y);
238 template<class T> valarray<T> operator* (const T& x, const valarray<T>& y);
239
240 template<class T> valarray<T> operator/ (const valarray<T>& x, const valarray<T>& y);
241 template<class T> valarray<T> operator/ (const valarray<T>& x, const T& y);
242 template<class T> valarray<T> operator/ (const T& x, const valarray<T>& y);
243
244 template<class T> valarray<T> operator% (const valarray<T>& x, const valarray<T>& y);
245 template<class T> valarray<T> operator% (const valarray<T>& x, const T& y);
246 template<class T> valarray<T> operator% (const T& x, const valarray<T>& y);
247
248 template<class T> valarray<T> operator+ (const valarray<T>& x, const valarray<T>& y);
249 template<class T> valarray<T> operator+ (const valarray<T>& x, const T& y);
250 template<class T> valarray<T> operator+ (const T& x, const valarray<T>& y);
251
252 template<class T> valarray<T> operator- (const valarray<T>& x, const valarray<T>& y);
253 template<class T> valarray<T> operator- (const valarray<T>& x, const T& y);
254 template<class T> valarray<T> operator- (const T& x, const valarray<T>& y);
255
256 template<class T> valarray<T> operator^ (const valarray<T>& x, const valarray<T>& y);
257 template<class T> valarray<T> operator^ (const valarray<T>& x, const T& y);
258 template<class T> valarray<T> operator^ (const T& x, const valarray<T>& y);
259
260 template<class T> valarray<T> operator& (const valarray<T>& x, const valarray<T>& y);
261 template<class T> valarray<T> operator& (const valarray<T>& x, const T& y);
262 template<class T> valarray<T> operator& (const T& x, const valarray<T>& y);
263
264 template<class T> valarray<T> operator| (const valarray<T>& x, const valarray<T>& y);
265 template<class T> valarray<T> operator| (const valarray<T>& x, const T& y);
266 template<class T> valarray<T> operator| (const T& x, const valarray<T>& y);
267
268 template<class T> valarray<T> operator<<(const valarray<T>& x, const valarray<T>& y);
269 template<class T> valarray<T> operator<<(const valarray<T>& x, const T& y);
270 template<class T> valarray<T> operator<<(const T& x, const valarray<T>& y);
271
272 template<class T> valarray<T> operator>>(const valarray<T>& x, const valarray<T>& y);
273 template<class T> valarray<T> operator>>(const valarray<T>& x, const T& y);
274 template<class T> valarray<T> operator>>(const T& x, const valarray<T>& y);
275
276 template<class T> valarray<bool> operator&&(const valarray<T>& x, const valarray<T>& y);
277 template<class T> valarray<bool> operator&&(const valarray<T>& x, const T& y);
278 template<class T> valarray<bool> operator&&(const T& x, const valarray<T>& y);
279
280 template<class T> valarray<bool> operator||(const valarray<T>& x, const valarray<T>& y);
281 template<class T> valarray<bool> operator||(const valarray<T>& x, const T& y);
282 template<class T> valarray<bool> operator||(const T& x, const valarray<T>& y);
283
284 template<class T> valarray<bool> operator==(const valarray<T>& x, const valarray<T>& y);
285 template<class T> valarray<bool> operator==(const valarray<T>& x, const T& y);
286 template<class T> valarray<bool> operator==(const T& x, const valarray<T>& y);
287
288 template<class T> valarray<bool> operator!=(const valarray<T>& x, const valarray<T>& y);
289 template<class T> valarray<bool> operator!=(const valarray<T>& x, const T& y);
290 template<class T> valarray<bool> operator!=(const T& x, const valarray<T>& y);
291
292 template<class T> valarray<bool> operator< (const valarray<T>& x, const valarray<T>& y);
293 template<class T> valarray<bool> operator< (const valarray<T>& x, const T& y);
294 template<class T> valarray<bool> operator< (const T& x, const valarray<T>& y);
295
296 template<class T> valarray<bool> operator> (const valarray<T>& x, const valarray<T>& y);
297 template<class T> valarray<bool> operator> (const valarray<T>& x, const T& y);
298 template<class T> valarray<bool> operator> (const T& x, const valarray<T>& y);
299
300 template<class T> valarray<bool> operator<=(const valarray<T>& x, const valarray<T>& y);
301 template<class T> valarray<bool> operator<=(const valarray<T>& x, const T& y);
302 template<class T> valarray<bool> operator<=(const T& x, const valarray<T>& y);
303
304 template<class T> valarray<bool> operator>=(const valarray<T>& x, const valarray<T>& y);
305 template<class T> valarray<bool> operator>=(const valarray<T>& x, const T& y);
306 template<class T> valarray<bool> operator>=(const T& x, const valarray<T>& y);
307
308 template<class T> valarray<T> abs (const valarray<T>& x);
309 template<class T> valarray<T> acos (const valarray<T>& x);
310 template<class T> valarray<T> asin (const valarray<T>& x);
311 template<class T> valarray<T> atan (const valarray<T>& x);
312
313 template<class T> valarray<T> atan2(const valarray<T>& x, const valarray<T>& y);
314 template<class T> valarray<T> atan2(const valarray<T>& x, const T& y);
315 template<class T> valarray<T> atan2(const T& x, const valarray<T>& y);
316
317 template<class T> valarray<T> cos (const valarray<T>& x);
318 template<class T> valarray<T> cosh (const valarray<T>& x);
319 template<class T> valarray<T> exp (const valarray<T>& x);
320 template<class T> valarray<T> log (const valarray<T>& x);
321 template<class T> valarray<T> log10(const valarray<T>& x);
322
323 template<class T> valarray<T> pow(const valarray<T>& x, const valarray<T>& y);
324 template<class T> valarray<T> pow(const valarray<T>& x, const T& y);
325 template<class T> valarray<T> pow(const T& x, const valarray<T>& y);
326
327 template<class T> valarray<T> sin (const valarray<T>& x);
328 template<class T> valarray<T> sinh (const valarray<T>& x);
329 template<class T> valarray<T> sqrt (const valarray<T>& x);
330 template<class T> valarray<T> tan (const valarray<T>& x);
331 template<class T> valarray<T> tanh (const valarray<T>& x);
332
333 template <class T> unspecified1 begin(valarray<T>& v);
334 template <class T> unspecified2 begin(const valarray<T>& v);
335 template <class T> unspecified1 end(valarray<T>& v);
336 template <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 #include <new>
349
350 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
351 #pragma GCC system_header
352 #endif
353
354 _LIBCPP_PUSH_MACROS
355 #include <__undef_macros>
356
357
358 _LIBCPP_BEGIN_NAMESPACE_STD
359
360 template<class _Tp> class _LIBCPP_TEMPLATE_VIS valarray;
361
362 class _LIBCPP_TEMPLATE_VIS slice
363 {
364     size_t __start_;
365     size_t __size_;
366     size_t __stride_;
367 public:
368     _LIBCPP_INLINE_VISIBILITY
369     slice()
370         : __start_(0),
371           __size_(0),
372           __stride_(0)
373           {}
374
375     _LIBCPP_INLINE_VISIBILITY
376     slice(size_t __start, size_t __size, size_t __stride)
377         : __start_(__start),
378           __size_(__size),
379           __stride_(__stride)
380           {}
381
382     _LIBCPP_INLINE_VISIBILITY size_t start()  const {return __start_;}
383     _LIBCPP_INLINE_VISIBILITY size_t size()   const {return __size_;}
384     _LIBCPP_INLINE_VISIBILITY size_t stride() const {return __stride_;}
385 };
386
387 template <class _Tp> class _LIBCPP_TEMPLATE_VIS slice_array;
388 class _LIBCPP_TYPE_VIS gslice;
389 template <class _Tp> class _LIBCPP_TEMPLATE_VIS gslice_array;
390 template <class _Tp> class _LIBCPP_TEMPLATE_VIS mask_array;
391 template <class _Tp> class _LIBCPP_TEMPLATE_VIS indirect_array;
392
393 template <class _Tp>
394 _LIBCPP_INLINE_VISIBILITY
395 _Tp*
396 begin(valarray<_Tp>& __v);
397
398 template <class _Tp>
399 _LIBCPP_INLINE_VISIBILITY
400 const _Tp*
401 begin(const valarray<_Tp>& __v);
402
403 template <class _Tp>
404 _LIBCPP_INLINE_VISIBILITY
405 _Tp*
406 end(valarray<_Tp>& __v);
407
408 template <class _Tp>
409 _LIBCPP_INLINE_VISIBILITY
410 const _Tp*
411 end(const valarray<_Tp>& __v);
412
413 template <class _Op, class _A0>
414 struct _UnaryOp
415 {
416     typedef typename _Op::result_type result_type;
417     typedef typename _A0::value_type value_type;
418
419     _Op __op_;
420     _A0 __a0_;
421
422     _LIBCPP_INLINE_VISIBILITY
423     _UnaryOp(const _Op& __op, const _A0& __a0) : __op_(__op), __a0_(__a0) {}
424
425     _LIBCPP_INLINE_VISIBILITY
426     result_type operator[](size_t __i) const {return __op_(__a0_[__i]);}
427
428     _LIBCPP_INLINE_VISIBILITY
429     size_t size() const {return __a0_.size();}
430 };
431
432 template <class _Op, class _A0, class _A1>
433 struct _BinaryOp
434 {
435     typedef typename _Op::result_type result_type;
436     typedef typename _A0::value_type value_type;
437
438     _Op __op_;
439     _A0 __a0_;
440     _A1 __a1_;
441
442     _LIBCPP_INLINE_VISIBILITY
443     _BinaryOp(const _Op& __op, const _A0& __a0, const _A1& __a1)
444         : __op_(__op), __a0_(__a0), __a1_(__a1) {}
445
446     _LIBCPP_INLINE_VISIBILITY
447     value_type operator[](size_t __i) const {return __op_(__a0_[__i], __a1_[__i]);}
448
449     _LIBCPP_INLINE_VISIBILITY
450     size_t size() const {return __a0_.size();}
451 };
452
453 template <class _Tp>
454 class __scalar_expr
455 {
456 public:
457     typedef _Tp        value_type;
458     typedef const _Tp& result_type;
459 private:
460     const value_type& __t_;
461     size_t __s_;
462 public:
463     _LIBCPP_INLINE_VISIBILITY
464     explicit __scalar_expr(const value_type& __t, size_t __s) : __t_(__t), __s_(__s) {}
465
466     _LIBCPP_INLINE_VISIBILITY
467     result_type operator[](size_t) const {return __t_;}
468
469     _LIBCPP_INLINE_VISIBILITY
470     size_t size() const {return __s_;}
471 };
472
473 template <class _Tp>
474 struct __unary_plus : unary_function<_Tp, _Tp>
475 {
476     _LIBCPP_INLINE_VISIBILITY
477     _Tp operator()(const _Tp& __x) const
478         {return +__x;}
479 };
480
481 template <class _Tp>
482 struct __bit_not  : unary_function<_Tp, _Tp>
483 {
484     _LIBCPP_INLINE_VISIBILITY
485     _Tp operator()(const _Tp& __x) const
486         {return ~__x;}
487 };
488
489 template <class _Tp>
490 struct __bit_shift_left : binary_function<_Tp, _Tp, _Tp>
491 {
492     _LIBCPP_INLINE_VISIBILITY
493     _Tp operator()(const _Tp& __x, const _Tp& __y) const
494         {return __x << __y;}
495 };
496
497 template <class _Tp>
498 struct __bit_shift_right : binary_function<_Tp, _Tp, _Tp>
499 {
500     _LIBCPP_INLINE_VISIBILITY
501     _Tp operator()(const _Tp& __x, const _Tp& __y) const
502         {return __x >> __y;}
503 };
504
505 template <class _Tp, class _Fp>
506 struct __apply_expr   : unary_function<_Tp, _Tp>
507 {
508 private:
509     _Fp __f_;
510 public:
511     _LIBCPP_INLINE_VISIBILITY
512     explicit __apply_expr(_Fp __f) : __f_(__f) {}
513
514     _LIBCPP_INLINE_VISIBILITY
515     _Tp operator()(const _Tp& __x) const
516         {return __f_(__x);}
517 };
518
519 template <class _Tp>
520 struct __abs_expr : unary_function<_Tp, _Tp>
521 {
522     _LIBCPP_INLINE_VISIBILITY
523     _Tp operator()(const _Tp& __x) const
524         {return abs(__x);}
525 };
526
527 template <class _Tp>
528 struct __acos_expr : unary_function<_Tp, _Tp>
529 {
530     _LIBCPP_INLINE_VISIBILITY
531     _Tp operator()(const _Tp& __x) const
532         {return acos(__x);}
533 };
534
535 template <class _Tp>
536 struct __asin_expr : unary_function<_Tp, _Tp>
537 {
538     _LIBCPP_INLINE_VISIBILITY
539     _Tp operator()(const _Tp& __x) const
540         {return asin(__x);}
541 };
542
543 template <class _Tp>
544 struct __atan_expr : unary_function<_Tp, _Tp>
545 {
546     _LIBCPP_INLINE_VISIBILITY
547     _Tp operator()(const _Tp& __x) const
548         {return atan(__x);}
549 };
550
551 template <class _Tp>
552 struct __atan2_expr : binary_function<_Tp, _Tp, _Tp>
553 {
554     _LIBCPP_INLINE_VISIBILITY
555     _Tp operator()(const _Tp& __x, const _Tp& __y) const
556         {return atan2(__x, __y);}
557 };
558
559 template <class _Tp>
560 struct __cos_expr : unary_function<_Tp, _Tp>
561 {
562     _LIBCPP_INLINE_VISIBILITY
563     _Tp operator()(const _Tp& __x) const
564         {return cos(__x);}
565 };
566
567 template <class _Tp>
568 struct __cosh_expr : unary_function<_Tp, _Tp>
569 {
570     _LIBCPP_INLINE_VISIBILITY
571     _Tp operator()(const _Tp& __x) const
572         {return cosh(__x);}
573 };
574
575 template <class _Tp>
576 struct __exp_expr : unary_function<_Tp, _Tp>
577 {
578     _LIBCPP_INLINE_VISIBILITY
579     _Tp operator()(const _Tp& __x) const
580         {return exp(__x);}
581 };
582
583 template <class _Tp>
584 struct __log_expr : unary_function<_Tp, _Tp>
585 {
586     _LIBCPP_INLINE_VISIBILITY
587     _Tp operator()(const _Tp& __x) const
588         {return log(__x);}
589 };
590
591 template <class _Tp>
592 struct __log10_expr : unary_function<_Tp, _Tp>
593 {
594     _LIBCPP_INLINE_VISIBILITY
595     _Tp operator()(const _Tp& __x) const
596         {return log10(__x);}
597 };
598
599 template <class _Tp>
600 struct __pow_expr : binary_function<_Tp, _Tp, _Tp>
601 {
602     _LIBCPP_INLINE_VISIBILITY
603     _Tp operator()(const _Tp& __x, const _Tp& __y) const
604         {return pow(__x, __y);}
605 };
606
607 template <class _Tp>
608 struct __sin_expr : unary_function<_Tp, _Tp>
609 {
610     _LIBCPP_INLINE_VISIBILITY
611     _Tp operator()(const _Tp& __x) const
612         {return sin(__x);}
613 };
614
615 template <class _Tp>
616 struct __sinh_expr : unary_function<_Tp, _Tp>
617 {
618     _LIBCPP_INLINE_VISIBILITY
619     _Tp operator()(const _Tp& __x) const
620         {return sinh(__x);}
621 };
622
623 template <class _Tp>
624 struct __sqrt_expr : unary_function<_Tp, _Tp>
625 {
626     _LIBCPP_INLINE_VISIBILITY
627     _Tp operator()(const _Tp& __x) const
628         {return sqrt(__x);}
629 };
630
631 template <class _Tp>
632 struct __tan_expr : unary_function<_Tp, _Tp>
633 {
634     _LIBCPP_INLINE_VISIBILITY
635     _Tp operator()(const _Tp& __x) const
636         {return tan(__x);}
637 };
638
639 template <class _Tp>
640 struct __tanh_expr : unary_function<_Tp, _Tp>
641 {
642     _LIBCPP_INLINE_VISIBILITY
643     _Tp operator()(const _Tp& __x) const
644         {return tanh(__x);}
645 };
646
647 template <class _ValExpr>
648 class __slice_expr
649 {
650     typedef typename remove_reference<_ValExpr>::type  _RmExpr;
651 public:
652     typedef typename _RmExpr::value_type value_type;
653     typedef value_type result_type;
654
655 private:
656     _ValExpr __expr_;
657     size_t __start_;
658     size_t __size_;
659     size_t __stride_;
660
661     _LIBCPP_INLINE_VISIBILITY
662     __slice_expr(const slice& __sl, const _RmExpr& __e)
663         : __expr_(__e),
664           __start_(__sl.start()),
665           __size_(__sl.size()),
666           __stride_(__sl.stride())
667         {}
668 public:
669
670     _LIBCPP_INLINE_VISIBILITY
671     result_type operator[](size_t __i) const
672         {return __expr_[__start_ + __i * __stride_];}
673
674     _LIBCPP_INLINE_VISIBILITY
675     size_t size() const {return __size_;}
676
677     template <class> friend class _LIBCPP_TEMPLATE_VIS valarray;
678 };
679
680 template <class _ValExpr>
681 class __mask_expr;
682
683 template <class _ValExpr>
684 class __indirect_expr;
685
686 template <class _ValExpr>
687 class __shift_expr
688 {
689     typedef typename remove_reference<_ValExpr>::type  _RmExpr;
690 public:
691     typedef typename _RmExpr::value_type value_type;
692     typedef value_type result_type;
693
694 private:
695     _ValExpr __expr_;
696     size_t __size_;
697     ptrdiff_t __ul_;
698     ptrdiff_t __sn_;
699     ptrdiff_t __n_;
700     static const ptrdiff_t _Np = static_cast<ptrdiff_t>(
701                                     sizeof(ptrdiff_t) * __CHAR_BIT__ - 1);
702
703     _LIBCPP_INLINE_VISIBILITY
704     __shift_expr(int __n, const _RmExpr& __e)
705         : __expr_(__e),
706           __size_(__e.size()),
707           __n_(__n)
708         {
709             ptrdiff_t __neg_n = static_cast<ptrdiff_t>(__n_ >> _Np);
710             __sn_ = __neg_n | static_cast<ptrdiff_t>(static_cast<size_t>(-__n_) >> _Np);
711             __ul_ = ((__size_ - __n_) & ~__neg_n) | ((__n_ + 1) & __neg_n);
712         }
713 public:
714
715     _LIBCPP_INLINE_VISIBILITY
716     result_type operator[](size_t __j) const
717         {
718             ptrdiff_t __i = static_cast<ptrdiff_t>(__j);
719             ptrdiff_t __m = (__sn_ * __i - __ul_) >> _Np;
720             return (__expr_[(__i + __n_) & __m] & __m) | (value_type() & ~__m);
721         }
722
723     _LIBCPP_INLINE_VISIBILITY
724     size_t size() const {return __size_;}
725
726     template <class> friend class __val_expr;
727 };
728
729 template <class _ValExpr>
730 class __cshift_expr
731 {
732     typedef typename remove_reference<_ValExpr>::type  _RmExpr;
733 public:
734     typedef typename _RmExpr::value_type value_type;
735     typedef value_type result_type;
736
737 private:
738     _ValExpr __expr_;
739     size_t __size_;
740     size_t __m_;
741     size_t __o1_;
742     size_t __o2_;
743
744     _LIBCPP_INLINE_VISIBILITY
745     __cshift_expr(int __n, const _RmExpr& __e)
746         : __expr_(__e),
747           __size_(__e.size())
748         {
749             __n %= static_cast<int>(__size_);
750             if (__n >= 0)
751             {
752                 __m_ = __size_ - __n;
753                 __o1_ = __n;
754                 __o2_ = __n - __size_;
755             }
756             else
757             {
758                 __m_ = -__n;
759                 __o1_ = __n + __size_;
760                 __o2_ = __n;
761             }
762         }
763 public:
764
765     _LIBCPP_INLINE_VISIBILITY
766     result_type operator[](size_t __i) const
767         {
768             if (__i < __m_)
769                 return __expr_[__i + __o1_];
770             return __expr_[__i + __o2_];
771         }
772
773     _LIBCPP_INLINE_VISIBILITY
774     size_t size() const {return __size_;}
775
776     template <class> friend class __val_expr;
777 };
778
779 template<class _ValExpr>
780 class __val_expr;
781
782 template<class _ValExpr>
783 struct __is_val_expr : false_type {};
784
785 template<class _ValExpr>
786 struct __is_val_expr<__val_expr<_ValExpr> > : true_type {};
787
788 template<class _Tp>
789 struct __is_val_expr<valarray<_Tp> > : true_type {};
790
791 template<class _Tp>
792 class _LIBCPP_TEMPLATE_VIS valarray
793 {
794 public:
795     typedef _Tp value_type;
796     typedef _Tp result_type;
797
798 private:
799     value_type* __begin_;
800     value_type* __end_;
801
802 public:
803     // construct/destroy:
804     _LIBCPP_INLINE_VISIBILITY
805     valarray() : __begin_(0), __end_(0) {}
806     inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
807     explicit valarray(size_t __n);
808     _LIBCPP_INLINE_VISIBILITY
809     valarray(const value_type& __x, size_t __n);
810     valarray(const value_type* __p, size_t __n);
811     valarray(const valarray& __v);
812 #ifndef _LIBCPP_CXX03_LANG
813     _LIBCPP_INLINE_VISIBILITY
814     valarray(valarray&& __v) _NOEXCEPT;
815     valarray(initializer_list<value_type> __il);
816 #endif  // _LIBCPP_CXX03_LANG
817     valarray(const slice_array<value_type>& __sa);
818     valarray(const gslice_array<value_type>& __ga);
819     valarray(const mask_array<value_type>& __ma);
820     valarray(const indirect_array<value_type>& __ia);
821     inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
822     ~valarray();
823
824     // assignment:
825     valarray& operator=(const valarray& __v);
826 #ifndef _LIBCPP_CXX03_LANG
827     _LIBCPP_INLINE_VISIBILITY
828     valarray& operator=(valarray&& __v) _NOEXCEPT;
829     _LIBCPP_INLINE_VISIBILITY
830     valarray& operator=(initializer_list<value_type>);
831 #endif  // _LIBCPP_CXX03_LANG
832     _LIBCPP_INLINE_VISIBILITY
833     valarray& operator=(const value_type& __x);
834     _LIBCPP_INLINE_VISIBILITY
835     valarray& operator=(const slice_array<value_type>& __sa);
836     _LIBCPP_INLINE_VISIBILITY
837     valarray& operator=(const gslice_array<value_type>& __ga);
838     _LIBCPP_INLINE_VISIBILITY
839     valarray& operator=(const mask_array<value_type>& __ma);
840     _LIBCPP_INLINE_VISIBILITY
841     valarray& operator=(const indirect_array<value_type>& __ia);
842     template <class _ValExpr>
843         _LIBCPP_INLINE_VISIBILITY
844         valarray& operator=(const __val_expr<_ValExpr>& __v);
845
846     // element access:
847     _LIBCPP_INLINE_VISIBILITY
848     const value_type& operator[](size_t __i) const {return __begin_[__i];}
849
850     _LIBCPP_INLINE_VISIBILITY
851     value_type&       operator[](size_t __i)       {return __begin_[__i];}
852
853     // subset operations:
854     _LIBCPP_INLINE_VISIBILITY
855     __val_expr<__slice_expr<const valarray&> >    operator[](slice __s) const;
856     _LIBCPP_INLINE_VISIBILITY
857     slice_array<value_type>                       operator[](slice __s);
858     _LIBCPP_INLINE_VISIBILITY
859     __val_expr<__indirect_expr<const valarray&> > operator[](const gslice& __gs) const;
860     _LIBCPP_INLINE_VISIBILITY
861     gslice_array<value_type>   operator[](const gslice& __gs);
862 #ifndef _LIBCPP_CXX03_LANG
863     _LIBCPP_INLINE_VISIBILITY
864     __val_expr<__indirect_expr<const valarray&> > operator[](gslice&& __gs) const;
865     _LIBCPP_INLINE_VISIBILITY
866     gslice_array<value_type>                      operator[](gslice&& __gs);
867 #endif  // _LIBCPP_CXX03_LANG
868     _LIBCPP_INLINE_VISIBILITY
869     __val_expr<__mask_expr<const valarray&> >     operator[](const valarray<bool>& __vb) const;
870     _LIBCPP_INLINE_VISIBILITY
871     mask_array<value_type>                        operator[](const valarray<bool>& __vb);
872 #ifndef _LIBCPP_CXX03_LANG
873     _LIBCPP_INLINE_VISIBILITY
874     __val_expr<__mask_expr<const valarray&> >     operator[](valarray<bool>&& __vb) const;
875     _LIBCPP_INLINE_VISIBILITY
876     mask_array<value_type>                        operator[](valarray<bool>&& __vb);
877 #endif  // _LIBCPP_CXX03_LANG
878     _LIBCPP_INLINE_VISIBILITY
879     __val_expr<__indirect_expr<const valarray&> > operator[](const valarray<size_t>& __vs) const;
880     _LIBCPP_INLINE_VISIBILITY
881     indirect_array<value_type>                    operator[](const valarray<size_t>& __vs);
882 #ifndef _LIBCPP_CXX03_LANG
883     _LIBCPP_INLINE_VISIBILITY
884     __val_expr<__indirect_expr<const valarray&> > operator[](valarray<size_t>&& __vs) const;
885     _LIBCPP_INLINE_VISIBILITY
886     indirect_array<value_type>                    operator[](valarray<size_t>&& __vs);
887 #endif  // _LIBCPP_CXX03_LANG
888
889     // unary operators:
890     valarray       operator+() const;
891     valarray       operator-() const;
892     valarray       operator~() const;
893     valarray<bool> operator!() const;
894
895     // computed assignment:
896     _LIBCPP_INLINE_VISIBILITY
897     valarray& operator*= (const value_type& __x);
898     _LIBCPP_INLINE_VISIBILITY
899     valarray& operator/= (const value_type& __x);
900     _LIBCPP_INLINE_VISIBILITY
901     valarray& operator%= (const value_type& __x);
902     _LIBCPP_INLINE_VISIBILITY
903     valarray& operator+= (const value_type& __x);
904     _LIBCPP_INLINE_VISIBILITY
905     valarray& operator-= (const value_type& __x);
906     _LIBCPP_INLINE_VISIBILITY
907     valarray& operator^= (const value_type& __x);
908     _LIBCPP_INLINE_VISIBILITY
909     valarray& operator&= (const value_type& __x);
910     _LIBCPP_INLINE_VISIBILITY
911     valarray& operator|= (const value_type& __x);
912     _LIBCPP_INLINE_VISIBILITY
913     valarray& operator<<=(const value_type& __x);
914     _LIBCPP_INLINE_VISIBILITY
915     valarray& operator>>=(const value_type& __x);
916
917     template <class _Expr>
918     typename enable_if
919     <
920         __is_val_expr<_Expr>::value,
921         valarray&
922     >::type
923     _LIBCPP_INLINE_VISIBILITY
924     operator*= (const _Expr& __v);
925
926     template <class _Expr>
927     typename enable_if
928     <
929         __is_val_expr<_Expr>::value,
930         valarray&
931     >::type
932     _LIBCPP_INLINE_VISIBILITY
933     operator/= (const _Expr& __v);
934
935     template <class _Expr>
936     typename enable_if
937     <
938         __is_val_expr<_Expr>::value,
939         valarray&
940     >::type
941     _LIBCPP_INLINE_VISIBILITY
942     operator%= (const _Expr& __v);
943
944     template <class _Expr>
945     typename enable_if
946     <
947         __is_val_expr<_Expr>::value,
948         valarray&
949     >::type
950     _LIBCPP_INLINE_VISIBILITY
951     operator+= (const _Expr& __v);
952
953     template <class _Expr>
954     typename enable_if
955     <
956         __is_val_expr<_Expr>::value,
957         valarray&
958     >::type
959     _LIBCPP_INLINE_VISIBILITY
960     operator-= (const _Expr& __v);
961
962     template <class _Expr>
963     typename enable_if
964     <
965         __is_val_expr<_Expr>::value,
966         valarray&
967     >::type
968     _LIBCPP_INLINE_VISIBILITY
969     operator^= (const _Expr& __v);
970
971     template <class _Expr>
972     typename enable_if
973     <
974         __is_val_expr<_Expr>::value,
975         valarray&
976     >::type
977     _LIBCPP_INLINE_VISIBILITY
978     operator|= (const _Expr& __v);
979
980     template <class _Expr>
981     typename enable_if
982     <
983         __is_val_expr<_Expr>::value,
984         valarray&
985     >::type
986     _LIBCPP_INLINE_VISIBILITY
987     operator&= (const _Expr& __v);
988
989     template <class _Expr>
990     typename enable_if
991     <
992         __is_val_expr<_Expr>::value,
993         valarray&
994     >::type
995     _LIBCPP_INLINE_VISIBILITY
996     operator<<= (const _Expr& __v);
997
998     template <class _Expr>
999     typename enable_if
1000     <
1001         __is_val_expr<_Expr>::value,
1002         valarray&
1003     >::type
1004     _LIBCPP_INLINE_VISIBILITY
1005     operator>>= (const _Expr& __v);
1006
1007     // member functions:
1008     _LIBCPP_INLINE_VISIBILITY
1009     void swap(valarray& __v) _NOEXCEPT;
1010
1011     _LIBCPP_INLINE_VISIBILITY
1012     size_t size() const {return static_cast<size_t>(__end_ - __begin_);}
1013
1014     _LIBCPP_INLINE_VISIBILITY
1015     value_type sum() const;
1016     _LIBCPP_INLINE_VISIBILITY
1017     value_type min() const;
1018     _LIBCPP_INLINE_VISIBILITY
1019     value_type max() const;
1020
1021     valarray shift (int __i) const;
1022     valarray cshift(int __i) const;
1023     valarray apply(value_type __f(value_type)) const;
1024     valarray apply(value_type __f(const value_type&)) const;
1025     void     resize(size_t __n, value_type __x = value_type());
1026
1027 private:
1028     template <class> friend class _LIBCPP_TEMPLATE_VIS valarray;
1029     template <class> friend class _LIBCPP_TEMPLATE_VIS slice_array;
1030     template <class> friend class _LIBCPP_TEMPLATE_VIS gslice_array;
1031     template <class> friend class _LIBCPP_TEMPLATE_VIS mask_array;
1032     template <class> friend class __mask_expr;
1033     template <class> friend class _LIBCPP_TEMPLATE_VIS indirect_array;
1034     template <class> friend class __indirect_expr;
1035     template <class> friend class __val_expr;
1036
1037     template <class _Up>
1038     friend
1039     _Up*
1040     begin(valarray<_Up>& __v);
1041
1042     template <class _Up>
1043     friend
1044     const _Up*
1045     begin(const valarray<_Up>& __v);
1046
1047     template <class _Up>
1048     friend
1049     _Up*
1050     end(valarray<_Up>& __v);
1051
1052     template <class _Up>
1053     friend
1054     const _Up*
1055     end(const valarray<_Up>& __v);
1056
1057     _LIBCPP_INLINE_VISIBILITY
1058     void __clear(size_t __capacity);
1059     valarray& __assign_range(const value_type* __f, const value_type* __l);
1060 };
1061
1062 _LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS valarray<size_t>::valarray(size_t))
1063 _LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS valarray<size_t>::~valarray())
1064 _LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void valarray<size_t>::resize(size_t, size_t))
1065
1066 template <class _Op, class _Tp>
1067 struct _UnaryOp<_Op, valarray<_Tp> >
1068 {
1069     typedef typename _Op::result_type result_type;
1070     typedef _Tp value_type;
1071
1072     _Op __op_;
1073     const valarray<_Tp>& __a0_;
1074
1075     _LIBCPP_INLINE_VISIBILITY
1076     _UnaryOp(const _Op& __op, const valarray<_Tp>& __a0) : __op_(__op), __a0_(__a0) {}
1077
1078     _LIBCPP_INLINE_VISIBILITY
1079     result_type operator[](size_t __i) const {return __op_(__a0_[__i]);}
1080
1081     _LIBCPP_INLINE_VISIBILITY
1082     size_t size() const {return __a0_.size();}
1083 };
1084
1085 template <class _Op, class _Tp, class _A1>
1086 struct _BinaryOp<_Op, valarray<_Tp>, _A1>
1087 {
1088     typedef typename _Op::result_type result_type;
1089     typedef _Tp value_type;
1090
1091     _Op __op_;
1092     const valarray<_Tp>& __a0_;
1093     _A1 __a1_;
1094
1095     _LIBCPP_INLINE_VISIBILITY
1096     _BinaryOp(const _Op& __op, const valarray<_Tp>& __a0, const _A1& __a1)
1097         : __op_(__op), __a0_(__a0), __a1_(__a1) {}
1098
1099     _LIBCPP_INLINE_VISIBILITY
1100     value_type operator[](size_t __i) const {return __op_(__a0_[__i], __a1_[__i]);}
1101
1102     _LIBCPP_INLINE_VISIBILITY
1103     size_t size() const {return __a0_.size();}
1104 };
1105
1106 template <class _Op, class _A0, class _Tp>
1107 struct _BinaryOp<_Op, _A0, valarray<_Tp> >
1108 {
1109     typedef typename _Op::result_type result_type;
1110     typedef _Tp value_type;
1111
1112     _Op __op_;
1113     _A0 __a0_;
1114     const valarray<_Tp>& __a1_;
1115
1116     _LIBCPP_INLINE_VISIBILITY
1117     _BinaryOp(const _Op& __op, const _A0& __a0, const valarray<_Tp>& __a1)
1118         : __op_(__op), __a0_(__a0), __a1_(__a1) {}
1119
1120     _LIBCPP_INLINE_VISIBILITY
1121     value_type operator[](size_t __i) const {return __op_(__a0_[__i], __a1_[__i]);}
1122
1123     _LIBCPP_INLINE_VISIBILITY
1124     size_t size() const {return __a0_.size();}
1125 };
1126
1127 template <class _Op, class _Tp>
1128 struct _BinaryOp<_Op, valarray<_Tp>, valarray<_Tp> >
1129 {
1130     typedef typename _Op::result_type result_type;
1131     typedef _Tp value_type;
1132
1133     _Op __op_;
1134     const valarray<_Tp>& __a0_;
1135     const valarray<_Tp>& __a1_;
1136
1137     _LIBCPP_INLINE_VISIBILITY
1138     _BinaryOp(const _Op& __op, const valarray<_Tp>& __a0, const valarray<_Tp>& __a1)
1139         : __op_(__op), __a0_(__a0), __a1_(__a1) {}
1140
1141     _LIBCPP_INLINE_VISIBILITY
1142     value_type operator[](size_t __i) const {return __op_(__a0_[__i], __a1_[__i]);}
1143
1144     _LIBCPP_INLINE_VISIBILITY
1145     size_t size() const {return __a0_.size();}
1146 };
1147
1148 // slice_array
1149
1150 template <class _Tp>
1151 class _LIBCPP_TEMPLATE_VIS slice_array
1152 {
1153 public:
1154     typedef _Tp value_type;
1155
1156 private:
1157     value_type* __vp_;
1158     size_t __size_;
1159     size_t __stride_;
1160
1161 public:
1162     template <class _Expr>
1163     typename enable_if
1164     <
1165         __is_val_expr<_Expr>::value,
1166         void
1167     >::type
1168     _LIBCPP_INLINE_VISIBILITY
1169     operator=(const _Expr& __v) const;
1170
1171     template <class _Expr>
1172     typename enable_if
1173     <
1174         __is_val_expr<_Expr>::value,
1175         void
1176     >::type
1177     _LIBCPP_INLINE_VISIBILITY
1178     operator*=(const _Expr& __v) const;
1179
1180     template <class _Expr>
1181     typename enable_if
1182     <
1183         __is_val_expr<_Expr>::value,
1184         void
1185     >::type
1186     _LIBCPP_INLINE_VISIBILITY
1187     operator/=(const _Expr& __v) const;
1188
1189     template <class _Expr>
1190     typename enable_if
1191     <
1192         __is_val_expr<_Expr>::value,
1193         void
1194     >::type
1195     _LIBCPP_INLINE_VISIBILITY
1196     operator%=(const _Expr& __v) const;
1197
1198     template <class _Expr>
1199     typename enable_if
1200     <
1201         __is_val_expr<_Expr>::value,
1202         void
1203     >::type
1204     _LIBCPP_INLINE_VISIBILITY
1205     operator+=(const _Expr& __v) const;
1206
1207     template <class _Expr>
1208     typename enable_if
1209     <
1210         __is_val_expr<_Expr>::value,
1211         void
1212     >::type
1213     _LIBCPP_INLINE_VISIBILITY
1214     operator-=(const _Expr& __v) const;
1215
1216     template <class _Expr>
1217     typename enable_if
1218     <
1219         __is_val_expr<_Expr>::value,
1220         void
1221     >::type
1222     _LIBCPP_INLINE_VISIBILITY
1223     operator^=(const _Expr& __v) const;
1224
1225     template <class _Expr>
1226     typename enable_if
1227     <
1228         __is_val_expr<_Expr>::value,
1229         void
1230     >::type
1231     _LIBCPP_INLINE_VISIBILITY
1232     operator&=(const _Expr& __v) const;
1233
1234     template <class _Expr>
1235     typename enable_if
1236     <
1237         __is_val_expr<_Expr>::value,
1238         void
1239     >::type
1240     _LIBCPP_INLINE_VISIBILITY
1241     operator|=(const _Expr& __v) const;
1242
1243     template <class _Expr>
1244     typename enable_if
1245     <
1246         __is_val_expr<_Expr>::value,
1247         void
1248     >::type
1249     _LIBCPP_INLINE_VISIBILITY
1250     operator<<=(const _Expr& __v) const;
1251
1252     template <class _Expr>
1253     typename enable_if
1254     <
1255         __is_val_expr<_Expr>::value,
1256         void
1257     >::type
1258     _LIBCPP_INLINE_VISIBILITY
1259     operator>>=(const _Expr& __v) const;
1260
1261     _LIBCPP_INLINE_VISIBILITY
1262     const slice_array& operator=(const slice_array& __sa) const;
1263
1264     _LIBCPP_INLINE_VISIBILITY
1265     void operator=(const value_type& __x) const;
1266
1267 private:
1268     _LIBCPP_INLINE_VISIBILITY
1269     slice_array(const slice& __sl, const valarray<value_type>& __v)
1270         : __vp_(const_cast<value_type*>(__v.__begin_ + __sl.start())),
1271           __size_(__sl.size()),
1272           __stride_(__sl.stride())
1273         {}
1274
1275     template <class> friend class valarray;
1276     template <class> friend class sliceExpr;
1277 };
1278
1279 template <class _Tp>
1280 inline
1281 const slice_array<_Tp>&
1282 slice_array<_Tp>::operator=(const slice_array& __sa) const
1283 {
1284     value_type* __t = __vp_;
1285     const value_type* __s = __sa.__vp_;
1286     for (size_t __n = __size_; __n; --__n, __t += __stride_, __s += __sa.__stride_)
1287         *__t = *__s;
1288     return *this;
1289 }
1290
1291 template <class _Tp>
1292 template <class _Expr>
1293 inline
1294 typename enable_if
1295 <
1296     __is_val_expr<_Expr>::value,
1297     void
1298 >::type
1299 slice_array<_Tp>::operator=(const _Expr& __v) const
1300 {
1301     value_type* __t = __vp_;
1302     for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1303         *__t = __v[__i];
1304 }
1305
1306 template <class _Tp>
1307 template <class _Expr>
1308 inline
1309 typename enable_if
1310 <
1311     __is_val_expr<_Expr>::value,
1312     void
1313 >::type
1314 slice_array<_Tp>::operator*=(const _Expr& __v) const
1315 {
1316     value_type* __t = __vp_;
1317     for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1318         *__t *= __v[__i];
1319 }
1320
1321 template <class _Tp>
1322 template <class _Expr>
1323 inline
1324 typename enable_if
1325 <
1326     __is_val_expr<_Expr>::value,
1327     void
1328 >::type
1329 slice_array<_Tp>::operator/=(const _Expr& __v) const
1330 {
1331     value_type* __t = __vp_;
1332     for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1333         *__t /= __v[__i];
1334 }
1335
1336 template <class _Tp>
1337 template <class _Expr>
1338 inline
1339 typename enable_if
1340 <
1341     __is_val_expr<_Expr>::value,
1342     void
1343 >::type
1344 slice_array<_Tp>::operator%=(const _Expr& __v) const
1345 {
1346     value_type* __t = __vp_;
1347     for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1348         *__t %= __v[__i];
1349 }
1350
1351 template <class _Tp>
1352 template <class _Expr>
1353 inline
1354 typename enable_if
1355 <
1356     __is_val_expr<_Expr>::value,
1357     void
1358 >::type
1359 slice_array<_Tp>::operator+=(const _Expr& __v) const
1360 {
1361     value_type* __t = __vp_;
1362     for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1363         *__t += __v[__i];
1364 }
1365
1366 template <class _Tp>
1367 template <class _Expr>
1368 inline
1369 typename enable_if
1370 <
1371     __is_val_expr<_Expr>::value,
1372     void
1373 >::type
1374 slice_array<_Tp>::operator-=(const _Expr& __v) const
1375 {
1376     value_type* __t = __vp_;
1377     for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1378         *__t -= __v[__i];
1379 }
1380
1381 template <class _Tp>
1382 template <class _Expr>
1383 inline
1384 typename enable_if
1385 <
1386     __is_val_expr<_Expr>::value,
1387     void
1388 >::type
1389 slice_array<_Tp>::operator^=(const _Expr& __v) const
1390 {
1391     value_type* __t = __vp_;
1392     for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1393         *__t ^= __v[__i];
1394 }
1395
1396 template <class _Tp>
1397 template <class _Expr>
1398 inline
1399 typename enable_if
1400 <
1401     __is_val_expr<_Expr>::value,
1402     void
1403 >::type
1404 slice_array<_Tp>::operator&=(const _Expr& __v) const
1405 {
1406     value_type* __t = __vp_;
1407     for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1408         *__t &= __v[__i];
1409 }
1410
1411 template <class _Tp>
1412 template <class _Expr>
1413 inline
1414 typename enable_if
1415 <
1416     __is_val_expr<_Expr>::value,
1417     void
1418 >::type
1419 slice_array<_Tp>::operator|=(const _Expr& __v) const
1420 {
1421     value_type* __t = __vp_;
1422     for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1423         *__t |= __v[__i];
1424 }
1425
1426 template <class _Tp>
1427 template <class _Expr>
1428 inline
1429 typename enable_if
1430 <
1431     __is_val_expr<_Expr>::value,
1432     void
1433 >::type
1434 slice_array<_Tp>::operator<<=(const _Expr& __v) const
1435 {
1436     value_type* __t = __vp_;
1437     for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1438         *__t <<= __v[__i];
1439 }
1440
1441 template <class _Tp>
1442 template <class _Expr>
1443 inline
1444 typename enable_if
1445 <
1446     __is_val_expr<_Expr>::value,
1447     void
1448 >::type
1449 slice_array<_Tp>::operator>>=(const _Expr& __v) const
1450 {
1451     value_type* __t = __vp_;
1452     for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1453         *__t >>= __v[__i];
1454 }
1455
1456 template <class _Tp>
1457 inline
1458 void
1459 slice_array<_Tp>::operator=(const value_type& __x) const
1460 {
1461     value_type* __t = __vp_;
1462     for (size_t __n = __size_; __n; --__n, __t += __stride_)
1463         *__t = __x;
1464 }
1465
1466 // gslice
1467
1468 class _LIBCPP_TYPE_VIS gslice
1469 {
1470     valarray<size_t> __size_;
1471     valarray<size_t> __stride_;
1472     valarray<size_t> __1d_;
1473
1474 public:
1475     _LIBCPP_INLINE_VISIBILITY
1476     gslice() {}
1477
1478     _LIBCPP_INLINE_VISIBILITY
1479     gslice(size_t __start, const valarray<size_t>& __size,
1480                            const valarray<size_t>& __stride)
1481         : __size_(__size),
1482           __stride_(__stride)
1483         {__init(__start);}
1484
1485 #ifndef _LIBCPP_CXX03_LANG
1486
1487     _LIBCPP_INLINE_VISIBILITY
1488     gslice(size_t __start, const valarray<size_t>&  __size,
1489                                  valarray<size_t>&& __stride)
1490         : __size_(__size),
1491           __stride_(move(__stride))
1492         {__init(__start);}
1493
1494     _LIBCPP_INLINE_VISIBILITY
1495     gslice(size_t __start,       valarray<size_t>&& __size,
1496                            const valarray<size_t>&  __stride)
1497         : __size_(move(__size)),
1498           __stride_(__stride)
1499         {__init(__start);}
1500
1501     _LIBCPP_INLINE_VISIBILITY
1502     gslice(size_t __start,       valarray<size_t>&& __size,
1503                                  valarray<size_t>&& __stride)
1504         : __size_(move(__size)),
1505           __stride_(move(__stride))
1506         {__init(__start);}
1507
1508 #endif  // _LIBCPP_CXX03_LANG
1509
1510 //  gslice(const gslice&)            = default;
1511 //  gslice(gslice&&)                 = default;
1512 //  gslice& operator=(const gslice&) = default;
1513 //  gslice& operator=(gslice&&)      = default;
1514
1515     _LIBCPP_INLINE_VISIBILITY
1516     size_t           start()  const {return __1d_.size() ? __1d_[0] : 0;}
1517
1518     _LIBCPP_INLINE_VISIBILITY
1519     valarray<size_t> size()   const {return __size_;}
1520
1521     _LIBCPP_INLINE_VISIBILITY
1522     valarray<size_t> stride() const {return __stride_;}
1523
1524 private:
1525     void __init(size_t __start);
1526
1527     template <class> friend class gslice_array;
1528     template <class> friend class valarray;
1529     template <class> friend class __val_expr;
1530 };
1531
1532 // gslice_array
1533
1534 template <class _Tp>
1535 class _LIBCPP_TEMPLATE_VIS gslice_array
1536 {
1537 public:
1538     typedef _Tp value_type;
1539
1540 private:
1541     value_type*      __vp_;
1542     valarray<size_t> __1d_;
1543
1544 public:
1545     template <class _Expr>
1546     typename enable_if
1547     <
1548         __is_val_expr<_Expr>::value,
1549         void
1550     >::type
1551     _LIBCPP_INLINE_VISIBILITY
1552     operator=(const _Expr& __v) const;
1553
1554     template <class _Expr>
1555     typename enable_if
1556     <
1557         __is_val_expr<_Expr>::value,
1558         void
1559     >::type
1560     _LIBCPP_INLINE_VISIBILITY
1561     operator*=(const _Expr& __v) const;
1562
1563     template <class _Expr>
1564     typename enable_if
1565     <
1566         __is_val_expr<_Expr>::value,
1567         void
1568     >::type
1569     _LIBCPP_INLINE_VISIBILITY
1570     operator/=(const _Expr& __v) const;
1571
1572     template <class _Expr>
1573     typename enable_if
1574     <
1575         __is_val_expr<_Expr>::value,
1576         void
1577     >::type
1578     _LIBCPP_INLINE_VISIBILITY
1579     operator%=(const _Expr& __v) const;
1580
1581     template <class _Expr>
1582     typename enable_if
1583     <
1584         __is_val_expr<_Expr>::value,
1585         void
1586     >::type
1587     _LIBCPP_INLINE_VISIBILITY
1588     operator+=(const _Expr& __v) const;
1589
1590     template <class _Expr>
1591     typename enable_if
1592     <
1593         __is_val_expr<_Expr>::value,
1594         void
1595     >::type
1596     _LIBCPP_INLINE_VISIBILITY
1597     operator-=(const _Expr& __v) const;
1598
1599     template <class _Expr>
1600     typename enable_if
1601     <
1602         __is_val_expr<_Expr>::value,
1603         void
1604     >::type
1605     _LIBCPP_INLINE_VISIBILITY
1606     operator^=(const _Expr& __v) const;
1607
1608     template <class _Expr>
1609     typename enable_if
1610     <
1611         __is_val_expr<_Expr>::value,
1612         void
1613     >::type
1614     _LIBCPP_INLINE_VISIBILITY
1615     operator&=(const _Expr& __v) const;
1616
1617     template <class _Expr>
1618     typename enable_if
1619     <
1620         __is_val_expr<_Expr>::value,
1621         void
1622     >::type
1623     _LIBCPP_INLINE_VISIBILITY
1624     operator|=(const _Expr& __v) const;
1625
1626     template <class _Expr>
1627     typename enable_if
1628     <
1629         __is_val_expr<_Expr>::value,
1630         void
1631     >::type
1632     _LIBCPP_INLINE_VISIBILITY
1633     operator<<=(const _Expr& __v) const;
1634
1635     template <class _Expr>
1636     typename enable_if
1637     <
1638         __is_val_expr<_Expr>::value,
1639         void
1640     >::type
1641     _LIBCPP_INLINE_VISIBILITY
1642     operator>>=(const _Expr& __v) const;
1643
1644     _LIBCPP_INLINE_VISIBILITY
1645     const gslice_array& operator=(const gslice_array& __ga) const;
1646
1647     _LIBCPP_INLINE_VISIBILITY
1648     void operator=(const value_type& __x) const;
1649
1650 //  gslice_array(const gslice_array&)            = default;
1651 //  gslice_array(gslice_array&&)                 = default;
1652 //  gslice_array& operator=(const gslice_array&) = default;
1653 //  gslice_array& operator=(gslice_array&&)      = default;
1654
1655 private:
1656     gslice_array(const gslice& __gs, const valarray<value_type>& __v)
1657         : __vp_(const_cast<value_type*>(__v.__begin_)),
1658           __1d_(__gs.__1d_)
1659         {}
1660
1661 #ifndef _LIBCPP_CXX03_LANG
1662     gslice_array(gslice&& __gs, const valarray<value_type>& __v)
1663         : __vp_(const_cast<value_type*>(__v.__begin_)),
1664           __1d_(move(__gs.__1d_))
1665         {}
1666 #endif  // _LIBCPP_CXX03_LANG
1667
1668     template <class> friend class valarray;
1669 };
1670
1671 template <class _Tp>
1672 template <class _Expr>
1673 inline
1674 typename enable_if
1675 <
1676     __is_val_expr<_Expr>::value,
1677     void
1678 >::type
1679 gslice_array<_Tp>::operator=(const _Expr& __v) const
1680 {
1681     typedef const size_t* _Ip;
1682     size_t __j = 0;
1683     for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1684         __vp_[*__i] = __v[__j];
1685 }
1686
1687 template <class _Tp>
1688 template <class _Expr>
1689 inline
1690 typename enable_if
1691 <
1692     __is_val_expr<_Expr>::value,
1693     void
1694 >::type
1695 gslice_array<_Tp>::operator*=(const _Expr& __v) const
1696 {
1697     typedef const size_t* _Ip;
1698     size_t __j = 0;
1699     for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1700         __vp_[*__i] *= __v[__j];
1701 }
1702
1703 template <class _Tp>
1704 template <class _Expr>
1705 inline
1706 typename enable_if
1707 <
1708     __is_val_expr<_Expr>::value,
1709     void
1710 >::type
1711 gslice_array<_Tp>::operator/=(const _Expr& __v) const
1712 {
1713     typedef const size_t* _Ip;
1714     size_t __j = 0;
1715     for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1716         __vp_[*__i] /= __v[__j];
1717 }
1718
1719 template <class _Tp>
1720 template <class _Expr>
1721 inline
1722 typename enable_if
1723 <
1724     __is_val_expr<_Expr>::value,
1725     void
1726 >::type
1727 gslice_array<_Tp>::operator%=(const _Expr& __v) const
1728 {
1729     typedef const size_t* _Ip;
1730     size_t __j = 0;
1731     for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1732         __vp_[*__i] %= __v[__j];
1733 }
1734
1735 template <class _Tp>
1736 template <class _Expr>
1737 inline
1738 typename enable_if
1739 <
1740     __is_val_expr<_Expr>::value,
1741     void
1742 >::type
1743 gslice_array<_Tp>::operator+=(const _Expr& __v) const
1744 {
1745     typedef const size_t* _Ip;
1746     size_t __j = 0;
1747     for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1748         __vp_[*__i] += __v[__j];
1749 }
1750
1751 template <class _Tp>
1752 template <class _Expr>
1753 inline
1754 typename enable_if
1755 <
1756     __is_val_expr<_Expr>::value,
1757     void
1758 >::type
1759 gslice_array<_Tp>::operator-=(const _Expr& __v) const
1760 {
1761     typedef const size_t* _Ip;
1762     size_t __j = 0;
1763     for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1764         __vp_[*__i] -= __v[__j];
1765 }
1766
1767 template <class _Tp>
1768 template <class _Expr>
1769 inline
1770 typename enable_if
1771 <
1772     __is_val_expr<_Expr>::value,
1773     void
1774 >::type
1775 gslice_array<_Tp>::operator^=(const _Expr& __v) const
1776 {
1777     typedef const size_t* _Ip;
1778     size_t __j = 0;
1779     for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1780         __vp_[*__i] ^= __v[__j];
1781 }
1782
1783 template <class _Tp>
1784 template <class _Expr>
1785 inline
1786 typename enable_if
1787 <
1788     __is_val_expr<_Expr>::value,
1789     void
1790 >::type
1791 gslice_array<_Tp>::operator&=(const _Expr& __v) const
1792 {
1793     typedef const size_t* _Ip;
1794     size_t __j = 0;
1795     for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1796         __vp_[*__i] &= __v[__j];
1797 }
1798
1799 template <class _Tp>
1800 template <class _Expr>
1801 inline
1802 typename enable_if
1803 <
1804     __is_val_expr<_Expr>::value,
1805     void
1806 >::type
1807 gslice_array<_Tp>::operator|=(const _Expr& __v) const
1808 {
1809     typedef const size_t* _Ip;
1810     size_t __j = 0;
1811     for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1812         __vp_[*__i] |= __v[__j];
1813 }
1814
1815 template <class _Tp>
1816 template <class _Expr>
1817 inline
1818 typename enable_if
1819 <
1820     __is_val_expr<_Expr>::value,
1821     void
1822 >::type
1823 gslice_array<_Tp>::operator<<=(const _Expr& __v) const
1824 {
1825     typedef const size_t* _Ip;
1826     size_t __j = 0;
1827     for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1828         __vp_[*__i] <<= __v[__j];
1829 }
1830
1831 template <class _Tp>
1832 template <class _Expr>
1833 inline
1834 typename enable_if
1835 <
1836     __is_val_expr<_Expr>::value,
1837     void
1838 >::type
1839 gslice_array<_Tp>::operator>>=(const _Expr& __v) const
1840 {
1841     typedef const size_t* _Ip;
1842     size_t __j = 0;
1843     for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1844         __vp_[*__i] >>= __v[__j];
1845 }
1846
1847 template <class _Tp>
1848 inline
1849 const gslice_array<_Tp>&
1850 gslice_array<_Tp>::operator=(const gslice_array& __ga) const
1851 {
1852     typedef const size_t* _Ip;
1853     const value_type* __s = __ga.__vp_;
1854     for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_, __j = __ga.__1d_.__begin_;
1855             __i != __e; ++__i, ++__j)
1856         __vp_[*__i] = __s[*__j];
1857     return *this;
1858 }
1859
1860 template <class _Tp>
1861 inline
1862 void
1863 gslice_array<_Tp>::operator=(const value_type& __x) const
1864 {
1865     typedef const size_t* _Ip;
1866     for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i)
1867         __vp_[*__i] = __x;
1868 }
1869
1870 // mask_array
1871
1872 template <class _Tp>
1873 class _LIBCPP_TEMPLATE_VIS mask_array
1874 {
1875 public:
1876     typedef _Tp value_type;
1877
1878 private:
1879     value_type*      __vp_;
1880     valarray<size_t> __1d_;
1881
1882 public:
1883     template <class _Expr>
1884     typename enable_if
1885     <
1886         __is_val_expr<_Expr>::value,
1887         void
1888     >::type
1889     _LIBCPP_INLINE_VISIBILITY
1890     operator=(const _Expr& __v) const;
1891
1892     template <class _Expr>
1893     typename enable_if
1894     <
1895         __is_val_expr<_Expr>::value,
1896         void
1897     >::type
1898     _LIBCPP_INLINE_VISIBILITY
1899     operator*=(const _Expr& __v) const;
1900
1901     template <class _Expr>
1902     typename enable_if
1903     <
1904         __is_val_expr<_Expr>::value,
1905         void
1906     >::type
1907     _LIBCPP_INLINE_VISIBILITY
1908     operator/=(const _Expr& __v) const;
1909
1910     template <class _Expr>
1911     typename enable_if
1912     <
1913         __is_val_expr<_Expr>::value,
1914         void
1915     >::type
1916     _LIBCPP_INLINE_VISIBILITY
1917     operator%=(const _Expr& __v) const;
1918
1919     template <class _Expr>
1920     typename enable_if
1921     <
1922         __is_val_expr<_Expr>::value,
1923         void
1924     >::type
1925     _LIBCPP_INLINE_VISIBILITY
1926     operator+=(const _Expr& __v) const;
1927
1928     template <class _Expr>
1929     typename enable_if
1930     <
1931         __is_val_expr<_Expr>::value,
1932         void
1933     >::type
1934     _LIBCPP_INLINE_VISIBILITY
1935     operator-=(const _Expr& __v) const;
1936
1937     template <class _Expr>
1938     typename enable_if
1939     <
1940         __is_val_expr<_Expr>::value,
1941         void
1942     >::type
1943     _LIBCPP_INLINE_VISIBILITY
1944     operator^=(const _Expr& __v) const;
1945
1946     template <class _Expr>
1947     typename enable_if
1948     <
1949         __is_val_expr<_Expr>::value,
1950         void
1951     >::type
1952     _LIBCPP_INLINE_VISIBILITY
1953     operator&=(const _Expr& __v) const;
1954
1955     template <class _Expr>
1956     typename enable_if
1957     <
1958         __is_val_expr<_Expr>::value,
1959         void
1960     >::type
1961     _LIBCPP_INLINE_VISIBILITY
1962     operator|=(const _Expr& __v) const;
1963
1964     template <class _Expr>
1965     typename enable_if
1966     <
1967         __is_val_expr<_Expr>::value,
1968         void
1969     >::type
1970     _LIBCPP_INLINE_VISIBILITY
1971     operator<<=(const _Expr& __v) const;
1972
1973     template <class _Expr>
1974     typename enable_if
1975     <
1976         __is_val_expr<_Expr>::value,
1977         void
1978     >::type
1979     _LIBCPP_INLINE_VISIBILITY
1980     operator>>=(const _Expr& __v) const;
1981
1982     _LIBCPP_INLINE_VISIBILITY
1983     const mask_array& operator=(const mask_array& __ma) const;
1984
1985     _LIBCPP_INLINE_VISIBILITY
1986     void operator=(const value_type& __x) const;
1987
1988 //  mask_array(const mask_array&)            = default;
1989 //  mask_array(mask_array&&)                 = default;
1990 //  mask_array& operator=(const mask_array&) = default;
1991 //  mask_array& operator=(mask_array&&)      = default;
1992
1993 private:
1994     _LIBCPP_INLINE_VISIBILITY
1995     mask_array(const valarray<bool>& __vb, const valarray<value_type>& __v)
1996         : __vp_(const_cast<value_type*>(__v.__begin_)),
1997           __1d_(static_cast<size_t>(count(__vb.__begin_, __vb.__end_, true)))
1998           {
1999               size_t __j = 0;
2000               for (size_t __i = 0; __i < __vb.size(); ++__i)
2001                   if (__vb[__i])
2002                       __1d_[__j++] = __i;
2003           }
2004
2005     template <class> friend class valarray;
2006 };
2007
2008 template <class _Tp>
2009 template <class _Expr>
2010 inline
2011 typename enable_if
2012 <
2013     __is_val_expr<_Expr>::value,
2014     void
2015 >::type
2016 mask_array<_Tp>::operator=(const _Expr& __v) const
2017 {
2018     size_t __n = __1d_.size();
2019     for (size_t __i = 0; __i < __n; ++__i)
2020         __vp_[__1d_[__i]] = __v[__i];
2021 }
2022
2023 template <class _Tp>
2024 template <class _Expr>
2025 inline
2026 typename enable_if
2027 <
2028     __is_val_expr<_Expr>::value,
2029     void
2030 >::type
2031 mask_array<_Tp>::operator*=(const _Expr& __v) const
2032 {
2033     size_t __n = __1d_.size();
2034     for (size_t __i = 0; __i < __n; ++__i)
2035         __vp_[__1d_[__i]] *= __v[__i];
2036 }
2037
2038 template <class _Tp>
2039 template <class _Expr>
2040 inline
2041 typename enable_if
2042 <
2043     __is_val_expr<_Expr>::value,
2044     void
2045 >::type
2046 mask_array<_Tp>::operator/=(const _Expr& __v) const
2047 {
2048     size_t __n = __1d_.size();
2049     for (size_t __i = 0; __i < __n; ++__i)
2050         __vp_[__1d_[__i]] /= __v[__i];
2051 }
2052
2053 template <class _Tp>
2054 template <class _Expr>
2055 inline
2056 typename enable_if
2057 <
2058     __is_val_expr<_Expr>::value,
2059     void
2060 >::type
2061 mask_array<_Tp>::operator%=(const _Expr& __v) const
2062 {
2063     size_t __n = __1d_.size();
2064     for (size_t __i = 0; __i < __n; ++__i)
2065         __vp_[__1d_[__i]] %= __v[__i];
2066 }
2067
2068 template <class _Tp>
2069 template <class _Expr>
2070 inline
2071 typename enable_if
2072 <
2073     __is_val_expr<_Expr>::value,
2074     void
2075 >::type
2076 mask_array<_Tp>::operator+=(const _Expr& __v) const
2077 {
2078     size_t __n = __1d_.size();
2079     for (size_t __i = 0; __i < __n; ++__i)
2080         __vp_[__1d_[__i]] += __v[__i];
2081 }
2082
2083 template <class _Tp>
2084 template <class _Expr>
2085 inline
2086 typename enable_if
2087 <
2088     __is_val_expr<_Expr>::value,
2089     void
2090 >::type
2091 mask_array<_Tp>::operator-=(const _Expr& __v) const
2092 {
2093     size_t __n = __1d_.size();
2094     for (size_t __i = 0; __i < __n; ++__i)
2095         __vp_[__1d_[__i]] -= __v[__i];
2096 }
2097
2098 template <class _Tp>
2099 template <class _Expr>
2100 inline
2101 typename enable_if
2102 <
2103     __is_val_expr<_Expr>::value,
2104     void
2105 >::type
2106 mask_array<_Tp>::operator^=(const _Expr& __v) const
2107 {
2108     size_t __n = __1d_.size();
2109     for (size_t __i = 0; __i < __n; ++__i)
2110         __vp_[__1d_[__i]] ^= __v[__i];
2111 }
2112
2113 template <class _Tp>
2114 template <class _Expr>
2115 inline
2116 typename enable_if
2117 <
2118     __is_val_expr<_Expr>::value,
2119     void
2120 >::type
2121 mask_array<_Tp>::operator&=(const _Expr& __v) const
2122 {
2123     size_t __n = __1d_.size();
2124     for (size_t __i = 0; __i < __n; ++__i)
2125         __vp_[__1d_[__i]] &= __v[__i];
2126 }
2127
2128 template <class _Tp>
2129 template <class _Expr>
2130 inline
2131 typename enable_if
2132 <
2133     __is_val_expr<_Expr>::value,
2134     void
2135 >::type
2136 mask_array<_Tp>::operator|=(const _Expr& __v) const
2137 {
2138     size_t __n = __1d_.size();
2139     for (size_t __i = 0; __i < __n; ++__i)
2140         __vp_[__1d_[__i]] |= __v[__i];
2141 }
2142
2143 template <class _Tp>
2144 template <class _Expr>
2145 inline
2146 typename enable_if
2147 <
2148     __is_val_expr<_Expr>::value,
2149     void
2150 >::type
2151 mask_array<_Tp>::operator<<=(const _Expr& __v) const
2152 {
2153     size_t __n = __1d_.size();
2154     for (size_t __i = 0; __i < __n; ++__i)
2155         __vp_[__1d_[__i]] <<= __v[__i];
2156 }
2157
2158 template <class _Tp>
2159 template <class _Expr>
2160 inline
2161 typename enable_if
2162 <
2163     __is_val_expr<_Expr>::value,
2164     void
2165 >::type
2166 mask_array<_Tp>::operator>>=(const _Expr& __v) const
2167 {
2168     size_t __n = __1d_.size();
2169     for (size_t __i = 0; __i < __n; ++__i)
2170         __vp_[__1d_[__i]] >>= __v[__i];
2171 }
2172
2173 template <class _Tp>
2174 inline
2175 const mask_array<_Tp>&
2176 mask_array<_Tp>::operator=(const mask_array& __ma) const
2177 {
2178     size_t __n = __1d_.size();
2179     for (size_t __i = 0; __i < __n; ++__i)
2180         __vp_[__1d_[__i]] = __ma.__vp_[__1d_[__i]];
2181     return *this;
2182 }
2183
2184 template <class _Tp>
2185 inline
2186 void
2187 mask_array<_Tp>::operator=(const value_type& __x) const
2188 {
2189     size_t __n = __1d_.size();
2190     for (size_t __i = 0; __i < __n; ++__i)
2191         __vp_[__1d_[__i]] = __x;
2192 }
2193
2194 template <class _ValExpr>
2195 class __mask_expr
2196 {
2197     typedef typename remove_reference<_ValExpr>::type  _RmExpr;
2198 public:
2199     typedef typename _RmExpr::value_type value_type;
2200     typedef value_type result_type;
2201
2202 private:
2203     _ValExpr __expr_;
2204     valarray<size_t> __1d_;
2205
2206     _LIBCPP_INLINE_VISIBILITY
2207     __mask_expr(const valarray<bool>& __vb, const _RmExpr& __e)
2208         : __expr_(__e),
2209           __1d_(static_cast<size_t>(count(__vb.__begin_, __vb.__end_, true)))
2210           {
2211               size_t __j = 0;
2212               for (size_t __i = 0; __i < __vb.size(); ++__i)
2213                   if (__vb[__i])
2214                       __1d_[__j++] = __i;
2215           }
2216
2217 public:
2218     _LIBCPP_INLINE_VISIBILITY
2219     result_type operator[](size_t __i) const
2220         {return __expr_[__1d_[__i]];}
2221
2222     _LIBCPP_INLINE_VISIBILITY
2223     size_t size() const {return __1d_.size();}
2224
2225     template <class> friend class valarray;
2226 };
2227
2228 // indirect_array
2229
2230 template <class _Tp>
2231 class _LIBCPP_TEMPLATE_VIS indirect_array
2232 {
2233 public:
2234     typedef _Tp value_type;
2235
2236 private:
2237     value_type*      __vp_;
2238     valarray<size_t> __1d_;
2239
2240 public:
2241     template <class _Expr>
2242     typename enable_if
2243     <
2244         __is_val_expr<_Expr>::value,
2245         void
2246     >::type
2247     _LIBCPP_INLINE_VISIBILITY
2248     operator=(const _Expr& __v) const;
2249
2250     template <class _Expr>
2251     typename enable_if
2252     <
2253         __is_val_expr<_Expr>::value,
2254         void
2255     >::type
2256     _LIBCPP_INLINE_VISIBILITY
2257     operator*=(const _Expr& __v) const;
2258
2259     template <class _Expr>
2260     typename enable_if
2261     <
2262         __is_val_expr<_Expr>::value,
2263         void
2264     >::type
2265     _LIBCPP_INLINE_VISIBILITY
2266     operator/=(const _Expr& __v) const;
2267
2268     template <class _Expr>
2269     typename enable_if
2270     <
2271         __is_val_expr<_Expr>::value,
2272         void
2273     >::type
2274     _LIBCPP_INLINE_VISIBILITY
2275     operator%=(const _Expr& __v) const;
2276
2277     template <class _Expr>
2278     typename enable_if
2279     <
2280         __is_val_expr<_Expr>::value,
2281         void
2282     >::type
2283     _LIBCPP_INLINE_VISIBILITY
2284     operator+=(const _Expr& __v) const;
2285
2286     template <class _Expr>
2287     typename enable_if
2288     <
2289         __is_val_expr<_Expr>::value,
2290         void
2291     >::type
2292     _LIBCPP_INLINE_VISIBILITY
2293     operator-=(const _Expr& __v) const;
2294
2295     template <class _Expr>
2296     typename enable_if
2297     <
2298         __is_val_expr<_Expr>::value,
2299         void
2300     >::type
2301     _LIBCPP_INLINE_VISIBILITY
2302     operator^=(const _Expr& __v) const;
2303
2304     template <class _Expr>
2305     typename enable_if
2306     <
2307         __is_val_expr<_Expr>::value,
2308         void
2309     >::type
2310     _LIBCPP_INLINE_VISIBILITY
2311     operator&=(const _Expr& __v) const;
2312
2313     template <class _Expr>
2314     typename enable_if
2315     <
2316         __is_val_expr<_Expr>::value,
2317         void
2318     >::type
2319     _LIBCPP_INLINE_VISIBILITY
2320     operator|=(const _Expr& __v) const;
2321
2322     template <class _Expr>
2323     typename enable_if
2324     <
2325         __is_val_expr<_Expr>::value,
2326         void
2327     >::type
2328     _LIBCPP_INLINE_VISIBILITY
2329     operator<<=(const _Expr& __v) const;
2330
2331     template <class _Expr>
2332     typename enable_if
2333     <
2334         __is_val_expr<_Expr>::value,
2335         void
2336     >::type
2337     _LIBCPP_INLINE_VISIBILITY
2338     operator>>=(const _Expr& __v) const;
2339
2340     _LIBCPP_INLINE_VISIBILITY
2341     const indirect_array& operator=(const indirect_array& __ia) const;
2342
2343     _LIBCPP_INLINE_VISIBILITY
2344     void operator=(const value_type& __x) const;
2345
2346 //  indirect_array(const indirect_array&)            = default;
2347 //  indirect_array(indirect_array&&)                 = default;
2348 //  indirect_array& operator=(const indirect_array&) = default;
2349 //  indirect_array& operator=(indirect_array&&)      = default;
2350
2351 private:
2352      _LIBCPP_INLINE_VISIBILITY
2353    indirect_array(const valarray<size_t>& __ia, const valarray<value_type>& __v)
2354         : __vp_(const_cast<value_type*>(__v.__begin_)),
2355           __1d_(__ia)
2356         {}
2357
2358 #ifndef _LIBCPP_CXX03_LANG
2359
2360     _LIBCPP_INLINE_VISIBILITY
2361     indirect_array(valarray<size_t>&& __ia, const valarray<value_type>& __v)
2362         : __vp_(const_cast<value_type*>(__v.__begin_)),
2363           __1d_(move(__ia))
2364         {}
2365
2366 #endif  // _LIBCPP_CXX03_LANG
2367
2368     template <class> friend class valarray;
2369 };
2370
2371 template <class _Tp>
2372 template <class _Expr>
2373 inline
2374 typename enable_if
2375 <
2376     __is_val_expr<_Expr>::value,
2377     void
2378 >::type
2379 indirect_array<_Tp>::operator=(const _Expr& __v) const
2380 {
2381     size_t __n = __1d_.size();
2382     for (size_t __i = 0; __i < __n; ++__i)
2383         __vp_[__1d_[__i]] = __v[__i];
2384 }
2385
2386 template <class _Tp>
2387 template <class _Expr>
2388 inline
2389 typename enable_if
2390 <
2391     __is_val_expr<_Expr>::value,
2392     void
2393 >::type
2394 indirect_array<_Tp>::operator*=(const _Expr& __v) const
2395 {
2396     size_t __n = __1d_.size();
2397     for (size_t __i = 0; __i < __n; ++__i)
2398         __vp_[__1d_[__i]] *= __v[__i];
2399 }
2400
2401 template <class _Tp>
2402 template <class _Expr>
2403 inline
2404 typename enable_if
2405 <
2406     __is_val_expr<_Expr>::value,
2407     void
2408 >::type
2409 indirect_array<_Tp>::operator/=(const _Expr& __v) const
2410 {
2411     size_t __n = __1d_.size();
2412     for (size_t __i = 0; __i < __n; ++__i)
2413         __vp_[__1d_[__i]] /= __v[__i];
2414 }
2415
2416 template <class _Tp>
2417 template <class _Expr>
2418 inline
2419 typename enable_if
2420 <
2421     __is_val_expr<_Expr>::value,
2422     void
2423 >::type
2424 indirect_array<_Tp>::operator%=(const _Expr& __v) const
2425 {
2426     size_t __n = __1d_.size();
2427     for (size_t __i = 0; __i < __n; ++__i)
2428         __vp_[__1d_[__i]] %= __v[__i];
2429 }
2430
2431 template <class _Tp>
2432 template <class _Expr>
2433 inline
2434 typename enable_if
2435 <
2436     __is_val_expr<_Expr>::value,
2437     void
2438 >::type
2439 indirect_array<_Tp>::operator+=(const _Expr& __v) const
2440 {
2441     size_t __n = __1d_.size();
2442     for (size_t __i = 0; __i < __n; ++__i)
2443         __vp_[__1d_[__i]] += __v[__i];
2444 }
2445
2446 template <class _Tp>
2447 template <class _Expr>
2448 inline
2449 typename enable_if
2450 <
2451     __is_val_expr<_Expr>::value,
2452     void
2453 >::type
2454 indirect_array<_Tp>::operator-=(const _Expr& __v) const
2455 {
2456     size_t __n = __1d_.size();
2457     for (size_t __i = 0; __i < __n; ++__i)
2458         __vp_[__1d_[__i]] -= __v[__i];
2459 }
2460
2461 template <class _Tp>
2462 template <class _Expr>
2463 inline
2464 typename enable_if
2465 <
2466     __is_val_expr<_Expr>::value,
2467     void
2468 >::type
2469 indirect_array<_Tp>::operator^=(const _Expr& __v) const
2470 {
2471     size_t __n = __1d_.size();
2472     for (size_t __i = 0; __i < __n; ++__i)
2473         __vp_[__1d_[__i]] ^= __v[__i];
2474 }
2475
2476 template <class _Tp>
2477 template <class _Expr>
2478 inline
2479 typename enable_if
2480 <
2481     __is_val_expr<_Expr>::value,
2482     void
2483 >::type
2484 indirect_array<_Tp>::operator&=(const _Expr& __v) const
2485 {
2486     size_t __n = __1d_.size();
2487     for (size_t __i = 0; __i < __n; ++__i)
2488         __vp_[__1d_[__i]] &= __v[__i];
2489 }
2490
2491 template <class _Tp>
2492 template <class _Expr>
2493 inline
2494 typename enable_if
2495 <
2496     __is_val_expr<_Expr>::value,
2497     void
2498 >::type
2499 indirect_array<_Tp>::operator|=(const _Expr& __v) const
2500 {
2501     size_t __n = __1d_.size();
2502     for (size_t __i = 0; __i < __n; ++__i)
2503         __vp_[__1d_[__i]] |= __v[__i];
2504 }
2505
2506 template <class _Tp>
2507 template <class _Expr>
2508 inline
2509 typename enable_if
2510 <
2511     __is_val_expr<_Expr>::value,
2512     void
2513 >::type
2514 indirect_array<_Tp>::operator<<=(const _Expr& __v) const
2515 {
2516     size_t __n = __1d_.size();
2517     for (size_t __i = 0; __i < __n; ++__i)
2518         __vp_[__1d_[__i]] <<= __v[__i];
2519 }
2520
2521 template <class _Tp>
2522 template <class _Expr>
2523 inline
2524 typename enable_if
2525 <
2526     __is_val_expr<_Expr>::value,
2527     void
2528 >::type
2529 indirect_array<_Tp>::operator>>=(const _Expr& __v) const
2530 {
2531     size_t __n = __1d_.size();
2532     for (size_t __i = 0; __i < __n; ++__i)
2533         __vp_[__1d_[__i]] >>= __v[__i];
2534 }
2535
2536 template <class _Tp>
2537 inline
2538 const indirect_array<_Tp>&
2539 indirect_array<_Tp>::operator=(const indirect_array& __ia) const
2540 {
2541     typedef const size_t* _Ip;
2542     const value_type* __s = __ia.__vp_;
2543     for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_, __j = __ia.__1d_.__begin_;
2544             __i != __e; ++__i, ++__j)
2545         __vp_[*__i] = __s[*__j];
2546     return *this;
2547 }
2548
2549 template <class _Tp>
2550 inline
2551 void
2552 indirect_array<_Tp>::operator=(const value_type& __x) const
2553 {
2554     typedef const size_t* _Ip;
2555     for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i)
2556         __vp_[*__i] = __x;
2557 }
2558
2559 template <class _ValExpr>
2560 class __indirect_expr
2561 {
2562     typedef typename remove_reference<_ValExpr>::type  _RmExpr;
2563 public:
2564     typedef typename _RmExpr::value_type value_type;
2565     typedef value_type result_type;
2566
2567 private:
2568     _ValExpr __expr_;
2569     valarray<size_t> __1d_;
2570
2571     _LIBCPP_INLINE_VISIBILITY
2572     __indirect_expr(const valarray<size_t>& __ia, const _RmExpr& __e)
2573         : __expr_(__e),
2574           __1d_(__ia)
2575           {}
2576
2577 #ifndef _LIBCPP_CXX03_LANG
2578
2579     _LIBCPP_INLINE_VISIBILITY
2580     __indirect_expr(valarray<size_t>&& __ia, const _RmExpr& __e)
2581         : __expr_(__e),
2582           __1d_(move(__ia))
2583           {}
2584
2585 #endif  // _LIBCPP_CXX03_LANG
2586
2587 public:
2588     _LIBCPP_INLINE_VISIBILITY
2589     result_type operator[](size_t __i) const
2590         {return __expr_[__1d_[__i]];}
2591
2592     _LIBCPP_INLINE_VISIBILITY
2593     size_t size() const {return __1d_.size();}
2594
2595     template <class> friend class _LIBCPP_TEMPLATE_VIS valarray;
2596 };
2597
2598 template<class _ValExpr>
2599 class __val_expr
2600 {
2601     typedef typename remove_reference<_ValExpr>::type  _RmExpr;
2602
2603     _ValExpr __expr_;
2604 public:
2605     typedef typename _RmExpr::value_type value_type;
2606     typedef typename _RmExpr::result_type result_type;
2607
2608     _LIBCPP_INLINE_VISIBILITY
2609     explicit __val_expr(const _RmExpr& __e) : __expr_(__e) {}
2610
2611     _LIBCPP_INLINE_VISIBILITY
2612     result_type operator[](size_t __i) const
2613         {return __expr_[__i];}
2614
2615     _LIBCPP_INLINE_VISIBILITY
2616     __val_expr<__slice_expr<_ValExpr> > operator[](slice __s) const
2617         {return __val_expr<__slice_expr<_ValExpr> >(__expr_, __s);}
2618
2619     _LIBCPP_INLINE_VISIBILITY
2620     __val_expr<__indirect_expr<_ValExpr> > operator[](const gslice& __gs) const
2621         {return __val_expr<__indirect_expr<_ValExpr> >(__expr_, __gs.__1d_);}
2622
2623     _LIBCPP_INLINE_VISIBILITY
2624     __val_expr<__mask_expr<_ValExpr> > operator[](const valarray<bool>& __vb) const
2625         {return __val_expr<__mask_expr<_ValExpr> >(__expr_, __vb);}
2626
2627     _LIBCPP_INLINE_VISIBILITY
2628     __val_expr<__indirect_expr<_ValExpr> > operator[](const valarray<size_t>& __vs) const
2629         {return __val_expr<__indirect_expr<_ValExpr> >(__expr_, __vs);}
2630
2631     _LIBCPP_INLINE_VISIBILITY
2632     __val_expr<_UnaryOp<__unary_plus<value_type>, _ValExpr> >
2633     operator+() const
2634     {
2635         typedef _UnaryOp<__unary_plus<value_type>, _ValExpr> _NewExpr;
2636         return __val_expr<_NewExpr>(_NewExpr(__unary_plus<value_type>(), __expr_));
2637     }
2638
2639     _LIBCPP_INLINE_VISIBILITY
2640     __val_expr<_UnaryOp<negate<value_type>, _ValExpr> >
2641     operator-() const
2642     {
2643         typedef _UnaryOp<negate<value_type>, _ValExpr> _NewExpr;
2644         return __val_expr<_NewExpr>(_NewExpr(negate<value_type>(), __expr_));
2645     }
2646
2647     _LIBCPP_INLINE_VISIBILITY
2648     __val_expr<_UnaryOp<__bit_not<value_type>, _ValExpr> >
2649     operator~() const
2650     {
2651         typedef _UnaryOp<__bit_not<value_type>, _ValExpr> _NewExpr;
2652         return __val_expr<_NewExpr>(_NewExpr(__bit_not<value_type>(), __expr_));
2653     }
2654
2655     _LIBCPP_INLINE_VISIBILITY
2656     __val_expr<_UnaryOp<logical_not<value_type>, _ValExpr> >
2657     operator!() const
2658     {
2659         typedef _UnaryOp<logical_not<value_type>, _ValExpr> _NewExpr;
2660         return __val_expr<_NewExpr>(_NewExpr(logical_not<value_type>(), __expr_));
2661     }
2662
2663     operator valarray<result_type>() const;
2664
2665     _LIBCPP_INLINE_VISIBILITY
2666     size_t size() const {return __expr_.size();}
2667
2668     _LIBCPP_INLINE_VISIBILITY
2669     result_type sum() const
2670     {
2671         size_t __n = __expr_.size();
2672         result_type __r = __n ? __expr_[0] : result_type();
2673         for (size_t __i = 1; __i < __n; ++__i)
2674             __r += __expr_[__i];
2675         return __r;
2676     }
2677
2678     _LIBCPP_INLINE_VISIBILITY
2679     result_type min() const
2680     {
2681         size_t __n = size();
2682         result_type __r = __n ? (*this)[0] : result_type();
2683         for (size_t __i = 1; __i < __n; ++__i)
2684         {
2685             result_type __x = __expr_[__i];
2686             if (__x < __r)
2687                 __r = __x;
2688         }
2689         return __r;
2690     }
2691
2692     _LIBCPP_INLINE_VISIBILITY
2693     result_type max() const
2694     {
2695         size_t __n = size();
2696         result_type __r = __n ? (*this)[0] : result_type();
2697         for (size_t __i = 1; __i < __n; ++__i)
2698         {
2699             result_type __x = __expr_[__i];
2700             if (__r < __x)
2701                 __r = __x;
2702         }
2703         return __r;
2704     }
2705
2706     _LIBCPP_INLINE_VISIBILITY
2707     __val_expr<__shift_expr<_ValExpr> > shift (int __i) const
2708         {return __val_expr<__shift_expr<_ValExpr> >(__shift_expr<_ValExpr>(__i, __expr_));}
2709
2710     _LIBCPP_INLINE_VISIBILITY
2711     __val_expr<__cshift_expr<_ValExpr> > cshift(int __i) const
2712         {return __val_expr<__cshift_expr<_ValExpr> >(__cshift_expr<_ValExpr>(__i, __expr_));}
2713
2714     _LIBCPP_INLINE_VISIBILITY
2715     __val_expr<_UnaryOp<__apply_expr<value_type, value_type(*)(value_type)>, _ValExpr> >
2716     apply(value_type __f(value_type)) const
2717     {
2718         typedef __apply_expr<value_type, value_type(*)(value_type)> _Op;
2719         typedef _UnaryOp<_Op, _ValExpr> _NewExpr;
2720         return __val_expr<_NewExpr>(_NewExpr(_Op(__f), __expr_));
2721     }
2722
2723     _LIBCPP_INLINE_VISIBILITY
2724     __val_expr<_UnaryOp<__apply_expr<value_type, value_type(*)(const value_type&)>, _ValExpr> >
2725     apply(value_type __f(const value_type&)) const
2726     {
2727         typedef __apply_expr<value_type, value_type(*)(const value_type&)> _Op;
2728         typedef _UnaryOp<_Op, _ValExpr> _NewExpr;
2729         return __val_expr<_NewExpr>(_NewExpr(_Op(__f), __expr_));
2730     }
2731 };
2732
2733 template<class _ValExpr>
2734 __val_expr<_ValExpr>::operator valarray<__val_expr::result_type>() const
2735 {
2736     valarray<result_type> __r;
2737     size_t __n = __expr_.size();
2738     if (__n)
2739     {
2740         __r.__begin_ =
2741             __r.__end_ =
2742                 static_cast<result_type*>(
2743                     _VSTD::__libcpp_allocate(__n * sizeof(result_type), _LIBCPP_ALIGNOF(result_type)));
2744         for (size_t __i = 0; __i != __n; ++__r.__end_, ++__i)
2745             ::new (__r.__end_) result_type(__expr_[__i]);
2746     }
2747     return __r;
2748 }
2749
2750 // valarray
2751
2752 template <class _Tp>
2753 inline
2754 valarray<_Tp>::valarray(size_t __n)
2755     : __begin_(0),
2756       __end_(0)
2757 {
2758     if (__n)
2759     {
2760         __begin_ = __end_ = static_cast<value_type*>(
2761             _VSTD::__libcpp_allocate(__n * sizeof(value_type), _LIBCPP_ALIGNOF(value_type)));
2762 #ifndef _LIBCPP_NO_EXCEPTIONS
2763         try
2764         {
2765 #endif  // _LIBCPP_NO_EXCEPTIONS
2766             for (size_t __n_left = __n; __n_left; --__n_left, ++__end_)
2767                 ::new (__end_) value_type();
2768 #ifndef _LIBCPP_NO_EXCEPTIONS
2769         }
2770         catch (...)
2771         {
2772             __clear(__n);
2773             throw;
2774         }
2775 #endif  // _LIBCPP_NO_EXCEPTIONS
2776     }
2777 }
2778
2779 template <class _Tp>
2780 inline
2781 valarray<_Tp>::valarray(const value_type& __x, size_t __n)
2782     : __begin_(0),
2783       __end_(0)
2784 {
2785     resize(__n, __x);
2786 }
2787
2788 template <class _Tp>
2789 valarray<_Tp>::valarray(const value_type* __p, size_t __n)
2790     : __begin_(0),
2791       __end_(0)
2792 {
2793     if (__n)
2794     {
2795         __begin_ = __end_ = static_cast<value_type*>(
2796             _VSTD::__libcpp_allocate(__n * sizeof(value_type), _LIBCPP_ALIGNOF(value_type)));
2797 #ifndef _LIBCPP_NO_EXCEPTIONS
2798         try
2799         {
2800 #endif  // _LIBCPP_NO_EXCEPTIONS
2801             for (size_t __n_left = __n; __n_left; ++__end_, ++__p, --__n_left)
2802                 ::new (__end_) value_type(*__p);
2803 #ifndef _LIBCPP_NO_EXCEPTIONS
2804         }
2805         catch (...)
2806         {
2807             __clear(__n);
2808             throw;
2809         }
2810 #endif  // _LIBCPP_NO_EXCEPTIONS
2811     }
2812 }
2813
2814 template <class _Tp>
2815 valarray<_Tp>::valarray(const valarray& __v)
2816     : __begin_(0),
2817       __end_(0)
2818 {
2819     if (__v.size())
2820     {
2821         __begin_ = __end_ = static_cast<value_type*>(
2822             _VSTD::__libcpp_allocate(__v.size() * sizeof(value_type), _LIBCPP_ALIGNOF(value_type)));
2823 #ifndef _LIBCPP_NO_EXCEPTIONS
2824         try
2825         {
2826 #endif  // _LIBCPP_NO_EXCEPTIONS
2827             for (value_type* __p = __v.__begin_; __p != __v.__end_; ++__end_, ++__p)
2828                 ::new (__end_) value_type(*__p);
2829 #ifndef _LIBCPP_NO_EXCEPTIONS
2830         }
2831         catch (...)
2832         {
2833             __clear(__v.size());
2834             throw;
2835         }
2836 #endif  // _LIBCPP_NO_EXCEPTIONS
2837     }
2838 }
2839
2840 #ifndef _LIBCPP_CXX03_LANG
2841
2842 template <class _Tp>
2843 inline
2844 valarray<_Tp>::valarray(valarray&& __v) _NOEXCEPT
2845     : __begin_(__v.__begin_),
2846       __end_(__v.__end_)
2847 {
2848     __v.__begin_ = __v.__end_ = nullptr;
2849 }
2850
2851 template <class _Tp>
2852 valarray<_Tp>::valarray(initializer_list<value_type> __il)
2853     : __begin_(0),
2854       __end_(0)
2855 {
2856     const size_t __n = __il.size();
2857     if (__n)
2858     {
2859         __begin_ = __end_ = static_cast<value_type*>(
2860 _VSTD::__libcpp_allocate(__n * sizeof(value_type), _LIBCPP_ALIGNOF(value_type)));
2861 #ifndef _LIBCPP_NO_EXCEPTIONS
2862         try
2863         {
2864 #endif  // _LIBCPP_NO_EXCEPTIONS
2865             size_t __n_left = __n;
2866             for (const value_type* __p = __il.begin(); __n_left; ++__end_, ++__p, --__n_left)
2867                 ::new (__end_) value_type(*__p);
2868 #ifndef _LIBCPP_NO_EXCEPTIONS
2869         }
2870         catch (...)
2871         {
2872             __clear(__n);
2873             throw;
2874         }
2875 #endif  // _LIBCPP_NO_EXCEPTIONS
2876     }
2877 }
2878
2879 #endif  // _LIBCPP_CXX03_LANG
2880
2881 template <class _Tp>
2882 valarray<_Tp>::valarray(const slice_array<value_type>& __sa)
2883     : __begin_(0),
2884       __end_(0)
2885 {
2886     const size_t __n = __sa.__size_;
2887     if (__n)
2888     {
2889         __begin_ = __end_ = static_cast<value_type*>(
2890           _VSTD::__libcpp_allocate(__n * sizeof(value_type), _LIBCPP_ALIGNOF(value_type)));
2891 #ifndef _LIBCPP_NO_EXCEPTIONS
2892         try
2893         {
2894 #endif  // _LIBCPP_NO_EXCEPTIONS
2895             size_t __n_left = __n;
2896             for (const value_type* __p = __sa.__vp_; __n_left; ++__end_, __p += __sa.__stride_, --__n_left)
2897                 ::new (__end_) value_type(*__p);
2898 #ifndef _LIBCPP_NO_EXCEPTIONS
2899         }
2900         catch (...)
2901         {
2902             __clear(__n);
2903             throw;
2904         }
2905 #endif  // _LIBCPP_NO_EXCEPTIONS
2906     }
2907 }
2908
2909 template <class _Tp>
2910 valarray<_Tp>::valarray(const gslice_array<value_type>& __ga)
2911     : __begin_(0),
2912       __end_(0)
2913 {
2914     const size_t __n = __ga.__1d_.size();
2915     if (__n)
2916     {
2917         __begin_ = __end_ = static_cast<value_type*>(
2918            _VSTD::__libcpp_allocate(__n * sizeof(value_type), _LIBCPP_ALIGNOF(value_type)));
2919 #ifndef _LIBCPP_NO_EXCEPTIONS
2920         try
2921         {
2922 #endif  // _LIBCPP_NO_EXCEPTIONS
2923             typedef const size_t* _Ip;
2924             const value_type* __s = __ga.__vp_;
2925             for (_Ip __i = __ga.__1d_.__begin_, __e = __ga.__1d_.__end_;
2926                     __i != __e; ++__i, ++__end_)
2927                 ::new (__end_) value_type(__s[*__i]);
2928 #ifndef _LIBCPP_NO_EXCEPTIONS
2929         }
2930         catch (...)
2931         {
2932             __clear(__n);
2933             throw;
2934         }
2935 #endif  // _LIBCPP_NO_EXCEPTIONS
2936     }
2937 }
2938
2939 template <class _Tp>
2940 valarray<_Tp>::valarray(const mask_array<value_type>& __ma)
2941     : __begin_(0),
2942       __end_(0)
2943 {
2944     const size_t __n = __ma.__1d_.size();
2945     if (__n)
2946     {
2947         __begin_ = __end_ = static_cast<value_type*>(
2948            _VSTD::__libcpp_allocate(__n * sizeof(value_type), _LIBCPP_ALIGNOF(value_type)));
2949 #ifndef _LIBCPP_NO_EXCEPTIONS
2950         try
2951         {
2952 #endif  // _LIBCPP_NO_EXCEPTIONS
2953             typedef const size_t* _Ip;
2954             const value_type* __s = __ma.__vp_;
2955             for (_Ip __i = __ma.__1d_.__begin_, __e = __ma.__1d_.__end_;
2956                     __i != __e; ++__i, ++__end_)
2957                 ::new (__end_) value_type(__s[*__i]);
2958 #ifndef _LIBCPP_NO_EXCEPTIONS
2959         }
2960         catch (...)
2961         {
2962             __clear(__n);
2963             throw;
2964         }
2965 #endif  // _LIBCPP_NO_EXCEPTIONS
2966     }
2967 }
2968
2969 template <class _Tp>
2970 valarray<_Tp>::valarray(const indirect_array<value_type>& __ia)
2971     : __begin_(0),
2972       __end_(0)
2973 {
2974     const size_t __n = __ia.__1d_.size();
2975     if (__n)
2976     {
2977         __begin_ = __end_ = static_cast<value_type*>(
2978            _VSTD::__libcpp_allocate(__n * sizeof(value_type), _LIBCPP_ALIGNOF(value_type)));
2979 #ifndef _LIBCPP_NO_EXCEPTIONS
2980         try
2981         {
2982 #endif  // _LIBCPP_NO_EXCEPTIONS
2983             typedef const size_t* _Ip;
2984             const value_type* __s = __ia.__vp_;
2985             for (_Ip __i = __ia.__1d_.__begin_, __e = __ia.__1d_.__end_;
2986                     __i != __e; ++__i, ++__end_)
2987                 ::new (__end_) value_type(__s[*__i]);
2988 #ifndef _LIBCPP_NO_EXCEPTIONS
2989         }
2990         catch (...)
2991         {
2992             __clear(__n);
2993             throw;
2994         }
2995 #endif  // _LIBCPP_NO_EXCEPTIONS
2996     }
2997 }
2998
2999 template <class _Tp>
3000 inline
3001 valarray<_Tp>::~valarray()
3002 {
3003     __clear(size());
3004 }
3005
3006 template <class _Tp>
3007 valarray<_Tp>&
3008 valarray<_Tp>::__assign_range(const value_type* __f, const value_type* __l)
3009 {
3010     size_t __n = __l - __f;
3011     if (size() != __n)
3012     {
3013         __clear(size());
3014         __begin_ = static_cast<value_type*>(
3015            _VSTD::__libcpp_allocate(__n * sizeof(value_type), _LIBCPP_ALIGNOF(value_type)));
3016         __end_ = __begin_ + __n;
3017         _VSTD::uninitialized_copy(__f, __l, __begin_);
3018     } else {
3019         _VSTD::copy(__f, __l, __begin_);
3020     }
3021     return *this;
3022 }
3023
3024 template <class _Tp>
3025 valarray<_Tp>&
3026 valarray<_Tp>::operator=(const valarray& __v)
3027 {
3028     if (this != &__v)
3029         return __assign_range(__v.__begin_, __v.__end_);
3030     return *this;
3031 }
3032
3033 #ifndef _LIBCPP_CXX03_LANG
3034
3035 template <class _Tp>
3036 inline
3037 valarray<_Tp>&
3038 valarray<_Tp>::operator=(valarray&& __v) _NOEXCEPT
3039 {
3040     __clear(size());
3041     __begin_ = __v.__begin_;
3042     __end_ = __v.__end_;
3043     __v.__begin_ = nullptr;
3044     __v.__end_ = nullptr;
3045     return *this;
3046 }
3047
3048 template <class _Tp>
3049 inline
3050 valarray<_Tp>&
3051 valarray<_Tp>::operator=(initializer_list<value_type> __il)
3052 {
3053     return __assign_range(__il.begin(), __il.end());
3054 }
3055
3056 #endif  // _LIBCPP_CXX03_LANG
3057
3058 template <class _Tp>
3059 inline
3060 valarray<_Tp>&
3061 valarray<_Tp>::operator=(const value_type& __x)
3062 {
3063     _VSTD::fill(__begin_, __end_, __x);
3064     return *this;
3065 }
3066
3067 template <class _Tp>
3068 inline
3069 valarray<_Tp>&
3070 valarray<_Tp>::operator=(const slice_array<value_type>& __sa)
3071 {
3072     value_type* __t = __begin_;
3073     const value_type* __s = __sa.__vp_;
3074     for (size_t __n = __sa.__size_; __n; --__n, __s += __sa.__stride_, ++__t)
3075         *__t = *__s;
3076     return *this;
3077 }
3078
3079 template <class _Tp>
3080 inline
3081 valarray<_Tp>&
3082 valarray<_Tp>::operator=(const gslice_array<value_type>& __ga)
3083 {
3084     typedef const size_t* _Ip;
3085     value_type* __t = __begin_;
3086     const value_type* __s = __ga.__vp_;
3087     for (_Ip __i = __ga.__1d_.__begin_, __e = __ga.__1d_.__end_;
3088                     __i != __e; ++__i, ++__t)
3089         *__t = __s[*__i];
3090     return *this;
3091 }
3092
3093 template <class _Tp>
3094 inline
3095 valarray<_Tp>&
3096 valarray<_Tp>::operator=(const mask_array<value_type>& __ma)
3097 {
3098     typedef const size_t* _Ip;
3099     value_type* __t = __begin_;
3100     const value_type* __s = __ma.__vp_;
3101     for (_Ip __i = __ma.__1d_.__begin_, __e = __ma.__1d_.__end_;
3102                     __i != __e; ++__i, ++__t)
3103         *__t = __s[*__i];
3104     return *this;
3105 }
3106
3107 template <class _Tp>
3108 inline
3109 valarray<_Tp>&
3110 valarray<_Tp>::operator=(const indirect_array<value_type>& __ia)
3111 {
3112     typedef const size_t* _Ip;
3113     value_type* __t = __begin_;
3114     const value_type* __s = __ia.__vp_;
3115     for (_Ip __i = __ia.__1d_.__begin_, __e = __ia.__1d_.__end_;
3116                     __i != __e; ++__i, ++__t)
3117         *__t = __s[*__i];
3118     return *this;
3119 }
3120
3121 template <class _Tp>
3122 template <class _ValExpr>
3123 inline
3124 valarray<_Tp>&
3125 valarray<_Tp>::operator=(const __val_expr<_ValExpr>& __v)
3126 {
3127     size_t __n = __v.size();
3128     if (size() != __n)
3129         resize(__n);
3130     value_type* __t = __begin_;
3131     for (size_t __i = 0; __i != __n; ++__t, ++__i)
3132         *__t = result_type(__v[__i]);
3133     return *this;
3134 }
3135
3136 template <class _Tp>
3137 inline
3138 __val_expr<__slice_expr<const valarray<_Tp>&> >
3139 valarray<_Tp>::operator[](slice __s) const
3140 {
3141     return __val_expr<__slice_expr<const valarray&> >(__slice_expr<const valarray&>(__s, *this));
3142 }
3143
3144 template <class _Tp>
3145 inline
3146 slice_array<_Tp>
3147 valarray<_Tp>::operator[](slice __s)
3148 {
3149     return slice_array<value_type>(__s, *this);
3150 }
3151
3152 template <class _Tp>
3153 inline
3154 __val_expr<__indirect_expr<const valarray<_Tp>&> >
3155 valarray<_Tp>::operator[](const gslice& __gs) const
3156 {
3157     return __val_expr<__indirect_expr<const valarray&> >(__indirect_expr<const valarray&>(__gs.__1d_, *this));
3158 }
3159
3160 template <class _Tp>
3161 inline
3162 gslice_array<_Tp>
3163 valarray<_Tp>::operator[](const gslice& __gs)
3164 {
3165     return gslice_array<value_type>(__gs, *this);
3166 }
3167
3168 #ifndef _LIBCPP_CXX03_LANG
3169
3170 template <class _Tp>
3171 inline
3172 __val_expr<__indirect_expr<const valarray<_Tp>&> >
3173 valarray<_Tp>::operator[](gslice&& __gs) const
3174 {
3175     return __val_expr<__indirect_expr<const valarray&> >(__indirect_expr<const valarray&>(move(__gs.__1d_), *this));
3176 }
3177
3178 template <class _Tp>
3179 inline
3180 gslice_array<_Tp>
3181 valarray<_Tp>::operator[](gslice&& __gs)
3182 {
3183     return gslice_array<value_type>(move(__gs), *this);
3184 }
3185
3186 #endif  // _LIBCPP_CXX03_LANG
3187
3188 template <class _Tp>
3189 inline
3190 __val_expr<__mask_expr<const valarray<_Tp>&> >
3191 valarray<_Tp>::operator[](const valarray<bool>& __vb) const
3192 {
3193     return __val_expr<__mask_expr<const valarray&> >(__mask_expr<const valarray&>(__vb, *this));
3194 }
3195
3196 template <class _Tp>
3197 inline
3198 mask_array<_Tp>
3199 valarray<_Tp>::operator[](const valarray<bool>& __vb)
3200 {
3201     return mask_array<value_type>(__vb, *this);
3202 }
3203
3204 #ifndef _LIBCPP_CXX03_LANG
3205
3206 template <class _Tp>
3207 inline
3208 __val_expr<__mask_expr<const valarray<_Tp>&> >
3209 valarray<_Tp>::operator[](valarray<bool>&& __vb) const
3210 {
3211     return __val_expr<__mask_expr<const valarray&> >(__mask_expr<const valarray&>(move(__vb), *this));
3212 }
3213
3214 template <class _Tp>
3215 inline
3216 mask_array<_Tp>
3217 valarray<_Tp>::operator[](valarray<bool>&& __vb)
3218 {
3219     return mask_array<value_type>(move(__vb), *this);
3220 }
3221
3222 #endif  // _LIBCPP_CXX03_LANG
3223
3224 template <class _Tp>
3225 inline
3226 __val_expr<__indirect_expr<const valarray<_Tp>&> >
3227 valarray<_Tp>::operator[](const valarray<size_t>& __vs) const
3228 {
3229     return __val_expr<__indirect_expr<const valarray&> >(__indirect_expr<const valarray&>(__vs, *this));
3230 }
3231
3232 template <class _Tp>
3233 inline
3234 indirect_array<_Tp>
3235 valarray<_Tp>::operator[](const valarray<size_t>& __vs)
3236 {
3237     return indirect_array<value_type>(__vs, *this);
3238 }
3239
3240 #ifndef _LIBCPP_CXX03_LANG
3241
3242 template <class _Tp>
3243 inline
3244 __val_expr<__indirect_expr<const valarray<_Tp>&> >
3245 valarray<_Tp>::operator[](valarray<size_t>&& __vs) const
3246 {
3247     return __val_expr<__indirect_expr<const valarray&> >(__indirect_expr<const valarray&>(move(__vs), *this));
3248 }
3249
3250 template <class _Tp>
3251 inline
3252 indirect_array<_Tp>
3253 valarray<_Tp>::operator[](valarray<size_t>&& __vs)
3254 {
3255     return indirect_array<value_type>(move(__vs), *this);
3256 }
3257
3258 #endif  // _LIBCPP_CXX03_LANG
3259
3260 template <class _Tp>
3261 valarray<_Tp>
3262 valarray<_Tp>::operator+() const
3263 {
3264     valarray<value_type> __r;
3265     size_t __n = size();
3266     if (__n)
3267     {
3268         __r.__begin_ =
3269             __r.__end_ =
3270                 static_cast<value_type*>(
3271            _VSTD::__libcpp_allocate(__n * sizeof(value_type), _LIBCPP_ALIGNOF(value_type)));
3272         for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n)
3273             ::new (__r.__end_) value_type(+*__p);
3274     }
3275     return __r;
3276 }
3277
3278 template <class _Tp>
3279 valarray<_Tp>
3280 valarray<_Tp>::operator-() const
3281 {
3282     valarray<value_type> __r;
3283     size_t __n = size();
3284     if (__n)
3285     {
3286         __r.__begin_ =
3287             __r.__end_ =
3288                 static_cast<value_type*>(
3289            _VSTD::__libcpp_allocate(__n * sizeof(value_type), _LIBCPP_ALIGNOF(value_type)));
3290         for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n)
3291             ::new (__r.__end_) value_type(-*__p);
3292     }
3293     return __r;
3294 }
3295
3296 template <class _Tp>
3297 valarray<_Tp>
3298 valarray<_Tp>::operator~() const
3299 {
3300     valarray<value_type> __r;
3301     size_t __n = size();
3302     if (__n)
3303     {
3304         __r.__begin_ =
3305             __r.__end_ =
3306                 static_cast<value_type*>(
3307            _VSTD::__libcpp_allocate(__n * sizeof(value_type), _LIBCPP_ALIGNOF(value_type)));
3308         for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n)
3309             ::new (__r.__end_) value_type(~*__p);
3310     }
3311     return __r;
3312 }
3313
3314 template <class _Tp>
3315 valarray<bool>
3316 valarray<_Tp>::operator!() const
3317 {
3318     valarray<bool> __r;
3319     size_t __n = size();
3320     if (__n)
3321     {
3322         __r.__begin_ =
3323             __r.__end_ =
3324                 static_cast<bool*>(_VSTD::__libcpp_allocate(__n * sizeof(bool), _LIBCPP_ALIGNOF(bool)));
3325         for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n)
3326             ::new (__r.__end_) bool(!*__p);
3327     }
3328     return __r;
3329 }
3330
3331 template <class _Tp>
3332 inline
3333 valarray<_Tp>&
3334 valarray<_Tp>::operator*=(const value_type& __x)
3335 {
3336     for (value_type* __p = __begin_; __p != __end_; ++__p)
3337         *__p *= __x;
3338     return *this;
3339 }
3340
3341 template <class _Tp>
3342 inline
3343 valarray<_Tp>&
3344 valarray<_Tp>::operator/=(const value_type& __x)
3345 {
3346     for (value_type* __p = __begin_; __p != __end_; ++__p)
3347         *__p /= __x;
3348     return *this;
3349 }
3350
3351 template <class _Tp>
3352 inline
3353 valarray<_Tp>&
3354 valarray<_Tp>::operator%=(const value_type& __x)
3355 {
3356     for (value_type* __p = __begin_; __p != __end_; ++__p)
3357         *__p %= __x;
3358     return *this;
3359 }
3360
3361 template <class _Tp>
3362 inline
3363 valarray<_Tp>&
3364 valarray<_Tp>::operator+=(const value_type& __x)
3365 {
3366     for (value_type* __p = __begin_; __p != __end_; ++__p)
3367         *__p += __x;
3368     return *this;
3369 }
3370
3371 template <class _Tp>
3372 inline
3373 valarray<_Tp>&
3374 valarray<_Tp>::operator-=(const value_type& __x)
3375 {
3376     for (value_type* __p = __begin_; __p != __end_; ++__p)
3377         *__p -= __x;
3378     return *this;
3379 }
3380
3381 template <class _Tp>
3382 inline
3383 valarray<_Tp>&
3384 valarray<_Tp>::operator^=(const value_type& __x)
3385 {
3386     for (value_type* __p = __begin_; __p != __end_; ++__p)
3387         *__p ^= __x;
3388     return *this;
3389 }
3390
3391 template <class _Tp>
3392 inline
3393 valarray<_Tp>&
3394 valarray<_Tp>::operator&=(const value_type& __x)
3395 {
3396     for (value_type* __p = __begin_; __p != __end_; ++__p)
3397         *__p &= __x;
3398     return *this;
3399 }
3400
3401 template <class _Tp>
3402 inline
3403 valarray<_Tp>&
3404 valarray<_Tp>::operator|=(const value_type& __x)
3405 {
3406     for (value_type* __p = __begin_; __p != __end_; ++__p)
3407         *__p |= __x;
3408     return *this;
3409 }
3410
3411 template <class _Tp>
3412 inline
3413 valarray<_Tp>&
3414 valarray<_Tp>::operator<<=(const value_type& __x)
3415 {
3416     for (value_type* __p = __begin_; __p != __end_; ++__p)
3417         *__p <<= __x;
3418     return *this;
3419 }
3420
3421 template <class _Tp>
3422 inline
3423 valarray<_Tp>&
3424 valarray<_Tp>::operator>>=(const value_type& __x)
3425 {
3426     for (value_type* __p = __begin_; __p != __end_; ++__p)
3427         *__p >>= __x;
3428     return *this;
3429 }
3430
3431 template <class _Tp>
3432 template <class _Expr>
3433 inline
3434 typename enable_if
3435 <
3436     __is_val_expr<_Expr>::value,
3437     valarray<_Tp>&
3438 >::type
3439 valarray<_Tp>::operator*=(const _Expr& __v)
3440 {
3441     size_t __i = 0;
3442     for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3443         *__t *= __v[__i];
3444     return *this;
3445 }
3446
3447 template <class _Tp>
3448 template <class _Expr>
3449 inline
3450 typename enable_if
3451 <
3452     __is_val_expr<_Expr>::value,
3453     valarray<_Tp>&
3454 >::type
3455 valarray<_Tp>::operator/=(const _Expr& __v)
3456 {
3457     size_t __i = 0;
3458     for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3459         *__t /= __v[__i];
3460     return *this;
3461 }
3462
3463 template <class _Tp>
3464 template <class _Expr>
3465 inline
3466 typename enable_if
3467 <
3468     __is_val_expr<_Expr>::value,
3469     valarray<_Tp>&
3470 >::type
3471 valarray<_Tp>::operator%=(const _Expr& __v)
3472 {
3473     size_t __i = 0;
3474     for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3475         *__t %= __v[__i];
3476     return *this;
3477 }
3478
3479 template <class _Tp>
3480 template <class _Expr>
3481 inline
3482 typename enable_if
3483 <
3484     __is_val_expr<_Expr>::value,
3485     valarray<_Tp>&
3486 >::type
3487 valarray<_Tp>::operator+=(const _Expr& __v)
3488 {
3489     size_t __i = 0;
3490     for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3491         *__t += __v[__i];
3492     return *this;
3493 }
3494
3495 template <class _Tp>
3496 template <class _Expr>
3497 inline
3498 typename enable_if
3499 <
3500     __is_val_expr<_Expr>::value,
3501     valarray<_Tp>&
3502 >::type
3503 valarray<_Tp>::operator-=(const _Expr& __v)
3504 {
3505     size_t __i = 0;
3506     for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3507         *__t -= __v[__i];
3508     return *this;
3509 }
3510
3511 template <class _Tp>
3512 template <class _Expr>
3513 inline
3514 typename enable_if
3515 <
3516     __is_val_expr<_Expr>::value,
3517     valarray<_Tp>&
3518 >::type
3519 valarray<_Tp>::operator^=(const _Expr& __v)
3520 {
3521     size_t __i = 0;
3522     for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3523         *__t ^= __v[__i];
3524     return *this;
3525 }
3526
3527 template <class _Tp>
3528 template <class _Expr>
3529 inline
3530 typename enable_if
3531 <
3532     __is_val_expr<_Expr>::value,
3533     valarray<_Tp>&
3534 >::type
3535 valarray<_Tp>::operator|=(const _Expr& __v)
3536 {
3537     size_t __i = 0;
3538     for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3539         *__t |= __v[__i];
3540     return *this;
3541 }
3542
3543 template <class _Tp>
3544 template <class _Expr>
3545 inline
3546 typename enable_if
3547 <
3548     __is_val_expr<_Expr>::value,
3549     valarray<_Tp>&
3550 >::type
3551 valarray<_Tp>::operator&=(const _Expr& __v)
3552 {
3553     size_t __i = 0;
3554     for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3555         *__t &= __v[__i];
3556     return *this;
3557 }
3558
3559 template <class _Tp>
3560 template <class _Expr>
3561 inline
3562 typename enable_if
3563 <
3564     __is_val_expr<_Expr>::value,
3565     valarray<_Tp>&
3566 >::type
3567 valarray<_Tp>::operator<<=(const _Expr& __v)
3568 {
3569     size_t __i = 0;
3570     for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3571         *__t <<= __v[__i];
3572     return *this;
3573 }
3574
3575 template <class _Tp>
3576 template <class _Expr>
3577 inline
3578 typename enable_if
3579 <
3580     __is_val_expr<_Expr>::value,
3581     valarray<_Tp>&
3582 >::type
3583 valarray<_Tp>::operator>>=(const _Expr& __v)
3584 {
3585     size_t __i = 0;
3586     for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
3587         *__t >>= __v[__i];
3588     return *this;
3589 }
3590
3591 template <class _Tp>
3592 inline
3593 void
3594 valarray<_Tp>::swap(valarray& __v) _NOEXCEPT
3595 {
3596     _VSTD::swap(__begin_, __v.__begin_);
3597     _VSTD::swap(__end_, __v.__end_);
3598 }
3599
3600 template <class _Tp>
3601 inline
3602 _Tp
3603 valarray<_Tp>::sum() const
3604 {
3605     if (__begin_ == __end_)
3606         return value_type();
3607     const value_type* __p = __begin_;
3608     _Tp __r = *__p;
3609     for (++__p; __p != __end_; ++__p)
3610         __r += *__p;
3611     return __r;
3612 }
3613
3614 template <class _Tp>
3615 inline
3616 _Tp
3617 valarray<_Tp>::min() const
3618 {
3619     if (__begin_ == __end_)
3620         return value_type();
3621     return *_VSTD::min_element(__begin_, __end_);
3622 }
3623
3624 template <class _Tp>
3625 inline
3626 _Tp
3627 valarray<_Tp>::max() const
3628 {
3629     if (__begin_ == __end_)
3630         return value_type();
3631     return *_VSTD::max_element(__begin_, __end_);
3632 }
3633
3634 template <class _Tp>
3635 valarray<_Tp>
3636 valarray<_Tp>::shift(int __i) const
3637 {
3638     valarray<value_type> __r;
3639     size_t __n = size();
3640     if (__n)
3641     {
3642         __r.__begin_ =
3643             __r.__end_ =
3644                 static_cast<value_type*>(
3645            _VSTD::__libcpp_allocate(__n * sizeof(value_type), _LIBCPP_ALIGNOF(value_type)));
3646         const value_type* __sb;
3647         value_type* __tb;
3648         value_type* __te;
3649         if (__i >= 0)
3650         {
3651             __i = _VSTD::min(__i, static_cast<int>(__n));
3652             __sb = __begin_ + __i;
3653             __tb = __r.__begin_;
3654             __te = __r.__begin_ + (__n - __i);
3655         }
3656         else
3657         {
3658             __i = _VSTD::min(-__i, static_cast<int>(__n));
3659             __sb = __begin_;
3660             __tb = __r.__begin_ + __i;
3661             __te = __r.__begin_ + __n;
3662         }
3663         for (; __r.__end_ != __tb; ++__r.__end_)
3664             ::new (__r.__end_) value_type();
3665         for (; __r.__end_ != __te; ++__r.__end_, ++__sb)
3666             ::new (__r.__end_) value_type(*__sb);
3667         for (__te = __r.__begin_ + __n; __r.__end_ != __te; ++__r.__end_)
3668             ::new (__r.__end_) value_type();
3669     }
3670     return __r;
3671 }
3672
3673 template <class _Tp>
3674 valarray<_Tp>
3675 valarray<_Tp>::cshift(int __i) const
3676 {
3677     valarray<value_type> __r;
3678     size_t __n = size();
3679     if (__n)
3680     {
3681         __r.__begin_ =
3682             __r.__end_ =
3683                 static_cast<value_type*>(
3684            _VSTD::__libcpp_allocate(__n * sizeof(value_type), _LIBCPP_ALIGNOF(value_type)));
3685         __i %= static_cast<int>(__n);
3686         const value_type* __m = __i >= 0 ? __begin_ + __i : __end_ + __i;
3687         for (const value_type* __s = __m; __s != __end_; ++__r.__end_, ++__s)
3688             ::new (__r.__end_) value_type(*__s);
3689         for (const value_type* __s = __begin_; __s != __m; ++__r.__end_, ++__s)
3690             ::new (__r.__end_) value_type(*__s);
3691     }
3692     return __r;
3693 }
3694
3695 template <class _Tp>
3696 valarray<_Tp>
3697 valarray<_Tp>::apply(value_type __f(value_type)) const
3698 {
3699     valarray<value_type> __r;
3700     size_t __n = size();
3701     if (__n)
3702     {
3703         __r.__begin_ =
3704             __r.__end_ =
3705                 static_cast<value_type*>(
3706            _VSTD::__libcpp_allocate(__n * sizeof(value_type), _LIBCPP_ALIGNOF(value_type)));
3707         for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n)
3708             ::new (__r.__end_) value_type(__f(*__p));
3709     }
3710     return __r;
3711 }
3712
3713 template <class _Tp>
3714 valarray<_Tp>
3715 valarray<_Tp>::apply(value_type __f(const value_type&)) const
3716 {
3717     valarray<value_type> __r;
3718     size_t __n = size();
3719     if (__n)
3720     {
3721         __r.__begin_ =
3722             __r.__end_ =
3723                 static_cast<value_type*>(
3724            _VSTD::__libcpp_allocate(__n * sizeof(value_type), _LIBCPP_ALIGNOF(value_type)));
3725         for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n)
3726             ::new (__r.__end_) value_type(__f(*__p));
3727     }
3728     return __r;
3729 }
3730
3731 template <class _Tp>
3732 inline
3733 void valarray<_Tp>::__clear(size_t __capacity)
3734 {
3735   if (__begin_ != nullptr)
3736   {
3737     while (__end_ != __begin_)
3738       (--__end_)->~value_type();
3739     _VSTD::__libcpp_deallocate(__begin_, __capacity * sizeof(value_type), _LIBCPP_ALIGNOF(value_type));
3740     __begin_ = __end_ = nullptr;
3741   }
3742 }
3743
3744 template <class _Tp>
3745 void
3746 valarray<_Tp>::resize(size_t __n, value_type __x)
3747 {
3748     __clear(size());
3749     if (__n)
3750     {
3751         __begin_ = __end_ = static_cast<value_type*>(
3752            _VSTD::__libcpp_allocate(__n * sizeof(value_type), _LIBCPP_ALIGNOF(value_type)));
3753 #ifndef _LIBCPP_NO_EXCEPTIONS
3754         try
3755         {
3756 #endif  // _LIBCPP_NO_EXCEPTIONS
3757             for (size_t __n_left = __n; __n_left; --__n_left, ++__end_)
3758                 ::new (__end_) value_type(__x);
3759 #ifndef _LIBCPP_NO_EXCEPTIONS
3760         }
3761         catch (...)
3762         {
3763             __clear(__n);
3764             throw;
3765         }
3766 #endif  // _LIBCPP_NO_EXCEPTIONS
3767     }
3768 }
3769
3770 template<class _Tp>
3771 inline _LIBCPP_INLINE_VISIBILITY
3772 void
3773 swap(valarray<_Tp>& __x, valarray<_Tp>& __y) _NOEXCEPT
3774 {
3775     __x.swap(__y);
3776 }
3777
3778 template<class _Expr1, class _Expr2>
3779 inline _LIBCPP_INLINE_VISIBILITY
3780 typename enable_if
3781 <
3782     __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
3783     __val_expr<_BinaryOp<multiplies<typename _Expr1::value_type>, _Expr1, _Expr2> >
3784 >::type
3785 operator*(const _Expr1& __x, const _Expr2& __y)
3786 {
3787     typedef typename _Expr1::value_type value_type;
3788     typedef _BinaryOp<multiplies<value_type>, _Expr1, _Expr2> _Op;
3789     return __val_expr<_Op>(_Op(multiplies<value_type>(), __x, __y));
3790 }
3791
3792 template<class _Expr>
3793 inline _LIBCPP_INLINE_VISIBILITY
3794 typename enable_if
3795 <
3796     __is_val_expr<_Expr>::value,
3797     __val_expr<_BinaryOp<multiplies<typename _Expr::value_type>,
3798                _Expr, __scalar_expr<typename _Expr::value_type> > >
3799 >::type
3800 operator*(const _Expr& __x, const typename _Expr::value_type& __y)
3801 {
3802     typedef typename _Expr::value_type value_type;
3803     typedef _BinaryOp<multiplies<value_type>, _Expr, __scalar_expr<value_type> > _Op;
3804     return __val_expr<_Op>(_Op(multiplies<value_type>(),
3805                            __x, __scalar_expr<value_type>(__y, __x.size())));
3806 }
3807
3808 template<class _Expr>
3809 inline _LIBCPP_INLINE_VISIBILITY
3810 typename enable_if
3811 <
3812     __is_val_expr<_Expr>::value,
3813     __val_expr<_BinaryOp<multiplies<typename _Expr::value_type>,
3814                __scalar_expr<typename _Expr::value_type>, _Expr> >
3815 >::type
3816 operator*(const typename _Expr::value_type& __x, const _Expr& __y)
3817 {
3818     typedef typename _Expr::value_type value_type;
3819     typedef _BinaryOp<multiplies<value_type>, __scalar_expr<value_type>, _Expr> _Op;
3820     return __val_expr<_Op>(_Op(multiplies<value_type>(),
3821                            __scalar_expr<value_type>(__x, __y.size()), __y));
3822 }
3823
3824 template<class _Expr1, class _Expr2>
3825 inline _LIBCPP_INLINE_VISIBILITY
3826 typename enable_if
3827 <
3828     __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
3829     __val_expr<_BinaryOp<divides<typename _Expr1::value_type>, _Expr1, _Expr2> >
3830 >::type
3831 operator/(const _Expr1& __x, const _Expr2& __y)
3832 {
3833     typedef typename _Expr1::value_type value_type;
3834     typedef _BinaryOp<divides<value_type>, _Expr1, _Expr2> _Op;
3835     return __val_expr<_Op>(_Op(divides<value_type>(), __x, __y));
3836 }
3837
3838 template<class _Expr>
3839 inline _LIBCPP_INLINE_VISIBILITY
3840 typename enable_if
3841 <
3842     __is_val_expr<_Expr>::value,
3843     __val_expr<_BinaryOp<divides<typename _Expr::value_type>,
3844                _Expr, __scalar_expr<typename _Expr::value_type> > >
3845 >::type
3846 operator/(const _Expr& __x, const typename _Expr::value_type& __y)
3847 {
3848     typedef typename _Expr::value_type value_type;
3849     typedef _BinaryOp<divides<value_type>, _Expr, __scalar_expr<value_type> > _Op;
3850     return __val_expr<_Op>(_Op(divides<value_type>(),
3851                            __x, __scalar_expr<value_type>(__y, __x.size())));
3852 }
3853
3854 template<class _Expr>
3855 inline _LIBCPP_INLINE_VISIBILITY
3856 typename enable_if
3857 <
3858     __is_val_expr<_Expr>::value,
3859     __val_expr<_BinaryOp<divides<typename _Expr::value_type>,
3860                __scalar_expr<typename _Expr::value_type>, _Expr> >
3861 >::type
3862 operator/(const typename _Expr::value_type& __x, const _Expr& __y)
3863 {
3864     typedef typename _Expr::value_type value_type;
3865     typedef _BinaryOp<divides<value_type>, __scalar_expr<value_type>, _Expr> _Op;
3866     return __val_expr<_Op>(_Op(divides<value_type>(),
3867                            __scalar_expr<value_type>(__x, __y.size()), __y));
3868 }
3869
3870 template<class _Expr1, class _Expr2>
3871 inline _LIBCPP_INLINE_VISIBILITY
3872 typename enable_if
3873 <
3874     __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
3875     __val_expr<_BinaryOp<modulus<typename _Expr1::value_type>, _Expr1, _Expr2> >
3876 >::type
3877 operator%(const _Expr1& __x, const _Expr2& __y)
3878 {
3879     typedef typename _Expr1::value_type value_type;
3880     typedef _BinaryOp<modulus<value_type>, _Expr1, _Expr2> _Op;
3881     return __val_expr<_Op>(_Op(modulus<value_type>(), __x, __y));
3882 }
3883
3884 template<class _Expr>
3885 inline _LIBCPP_INLINE_VISIBILITY
3886 typename enable_if
3887 <
3888     __is_val_expr<_Expr>::value,
3889     __val_expr<_BinaryOp<modulus<typename _Expr::value_type>,
3890                _Expr, __scalar_expr<typename _Expr::value_type> > >
3891 >::type
3892 operator%(const _Expr& __x, const typename _Expr::value_type& __y)
3893 {
3894     typedef typename _Expr::value_type value_type;
3895     typedef _BinaryOp<modulus<value_type>, _Expr, __scalar_expr<value_type> > _Op;
3896     return __val_expr<_Op>(_Op(modulus<value_type>(),
3897                            __x, __scalar_expr<value_type>(__y, __x.size())));
3898 }
3899
3900 template<class _Expr>
3901 inline _LIBCPP_INLINE_VISIBILITY
3902 typename enable_if
3903 <
3904     __is_val_expr<_Expr>::value,
3905     __val_expr<_BinaryOp<modulus<typename _Expr::value_type>,
3906                __scalar_expr<typename _Expr::value_type>, _Expr> >
3907 >::type
3908 operator%(const typename _Expr::value_type& __x, const _Expr& __y)
3909 {
3910     typedef typename _Expr::value_type value_type;
3911     typedef _BinaryOp<modulus<value_type>, __scalar_expr<value_type>, _Expr> _Op;
3912     return __val_expr<_Op>(_Op(modulus<value_type>(),
3913                            __scalar_expr<value_type>(__x, __y.size()), __y));
3914 }
3915
3916 template<class _Expr1, class _Expr2>
3917 inline _LIBCPP_INLINE_VISIBILITY
3918 typename enable_if
3919 <
3920     __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
3921     __val_expr<_BinaryOp<plus<typename _Expr1::value_type>, _Expr1, _Expr2> >
3922 >::type
3923 operator+(const _Expr1& __x, const _Expr2& __y)
3924 {
3925     typedef typename _Expr1::value_type value_type;
3926     typedef _BinaryOp<plus<value_type>, _Expr1, _Expr2> _Op;
3927     return __val_expr<_Op>(_Op(plus<value_type>(), __x, __y));
3928 }
3929
3930 template<class _Expr>
3931 inline _LIBCPP_INLINE_VISIBILITY
3932 typename enable_if
3933 <
3934     __is_val_expr<_Expr>::value,
3935     __val_expr<_BinaryOp<plus<typename _Expr::value_type>,
3936                _Expr, __scalar_expr<typename _Expr::value_type> > >
3937 >::type
3938 operator+(const _Expr& __x, const typename _Expr::value_type& __y)
3939 {
3940     typedef typename _Expr::value_type value_type;
3941     typedef _BinaryOp<plus<value_type>, _Expr, __scalar_expr<value_type> > _Op;
3942     return __val_expr<_Op>(_Op(plus<value_type>(),
3943                            __x, __scalar_expr<value_type>(__y, __x.size())));
3944 }
3945
3946 template<class _Expr>
3947 inline _LIBCPP_INLINE_VISIBILITY
3948 typename enable_if
3949 <
3950     __is_val_expr<_Expr>::value,
3951     __val_expr<_BinaryOp<plus<typename _Expr::value_type>,
3952                __scalar_expr<typename _Expr::value_type>, _Expr> >
3953 >::type
3954 operator+(const typename _Expr::value_type& __x, const _Expr& __y)
3955 {
3956     typedef typename _Expr::value_type value_type;
3957     typedef _BinaryOp<plus<value_type>, __scalar_expr<value_type>, _Expr> _Op;
3958     return __val_expr<_Op>(_Op(plus<value_type>(),
3959                            __scalar_expr<value_type>(__x, __y.size()), __y));
3960 }
3961
3962 template<class _Expr1, class _Expr2>
3963 inline _LIBCPP_INLINE_VISIBILITY
3964 typename enable_if
3965 <
3966     __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
3967     __val_expr<_BinaryOp<minus<typename _Expr1::value_type>, _Expr1, _Expr2> >
3968 >::type
3969 operator-(const _Expr1& __x, const _Expr2& __y)
3970 {
3971     typedef typename _Expr1::value_type value_type;
3972     typedef _BinaryOp<minus<value_type>, _Expr1, _Expr2> _Op;
3973     return __val_expr<_Op>(_Op(minus<value_type>(), __x, __y));
3974 }
3975
3976 template<class _Expr>
3977 inline _LIBCPP_INLINE_VISIBILITY
3978 typename enable_if
3979 <
3980     __is_val_expr<_Expr>::value,
3981     __val_expr<_BinaryOp<minus<typename _Expr::value_type>,
3982                _Expr, __scalar_expr<typename _Expr::value_type> > >
3983 >::type
3984 operator-(const _Expr& __x, const typename _Expr::value_type& __y)
3985 {
3986     typedef typename _Expr::value_type value_type;
3987     typedef _BinaryOp<minus<value_type>, _Expr, __scalar_expr<value_type> > _Op;
3988     return __val_expr<_Op>(_Op(minus<value_type>(),
3989                            __x, __scalar_expr<value_type>(__y, __x.size())));
3990 }
3991
3992 template<class _Expr>
3993 inline _LIBCPP_INLINE_VISIBILITY
3994 typename enable_if
3995 <
3996     __is_val_expr<_Expr>::value,
3997     __val_expr<_BinaryOp<minus<typename _Expr::value_type>,
3998                __scalar_expr<typename _Expr::value_type>, _Expr> >
3999 >::type
4000 operator-(const typename _Expr::value_type& __x, const _Expr& __y)
4001 {
4002     typedef typename _Expr::value_type value_type;
4003     typedef _BinaryOp<minus<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4004     return __val_expr<_Op>(_Op(minus<value_type>(),
4005                            __scalar_expr<value_type>(__x, __y.size()), __y));
4006 }
4007
4008 template<class _Expr1, class _Expr2>
4009 inline _LIBCPP_INLINE_VISIBILITY
4010 typename enable_if
4011 <
4012     __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4013     __val_expr<_BinaryOp<bit_xor<typename _Expr1::value_type>, _Expr1, _Expr2> >
4014 >::type
4015 operator^(const _Expr1& __x, const _Expr2& __y)
4016 {
4017     typedef typename _Expr1::value_type value_type;
4018     typedef _BinaryOp<bit_xor<value_type>, _Expr1, _Expr2> _Op;
4019     return __val_expr<_Op>(_Op(bit_xor<value_type>(), __x, __y));
4020 }
4021
4022 template<class _Expr>
4023 inline _LIBCPP_INLINE_VISIBILITY
4024 typename enable_if
4025 <
4026     __is_val_expr<_Expr>::value,
4027     __val_expr<_BinaryOp<bit_xor<typename _Expr::value_type>,
4028                _Expr, __scalar_expr<typename _Expr::value_type> > >
4029 >::type
4030 operator^(const _Expr& __x, const typename _Expr::value_type& __y)
4031 {
4032     typedef typename _Expr::value_type value_type;
4033     typedef _BinaryOp<bit_xor<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4034     return __val_expr<_Op>(_Op(bit_xor<value_type>(),
4035                            __x, __scalar_expr<value_type>(__y, __x.size())));
4036 }
4037
4038 template<class _Expr>
4039 inline _LIBCPP_INLINE_VISIBILITY
4040 typename enable_if
4041 <
4042     __is_val_expr<_Expr>::value,
4043     __val_expr<_BinaryOp<bit_xor<typename _Expr::value_type>,
4044                __scalar_expr<typename _Expr::value_type>, _Expr> >
4045 >::type
4046 operator^(const typename _Expr::value_type& __x, const _Expr& __y)
4047 {
4048     typedef typename _Expr::value_type value_type;
4049     typedef _BinaryOp<bit_xor<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4050     return __val_expr<_Op>(_Op(bit_xor<value_type>(),
4051                            __scalar_expr<value_type>(__x, __y.size()), __y));
4052 }
4053
4054 template<class _Expr1, class _Expr2>
4055 inline _LIBCPP_INLINE_VISIBILITY
4056 typename enable_if
4057 <
4058     __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4059     __val_expr<_BinaryOp<bit_and<typename _Expr1::value_type>, _Expr1, _Expr2> >
4060 >::type
4061 operator&(const _Expr1& __x, const _Expr2& __y)
4062 {
4063     typedef typename _Expr1::value_type value_type;
4064     typedef _BinaryOp<bit_and<value_type>, _Expr1, _Expr2> _Op;
4065     return __val_expr<_Op>(_Op(bit_and<value_type>(), __x, __y));
4066 }
4067
4068 template<class _Expr>
4069 inline _LIBCPP_INLINE_VISIBILITY
4070 typename enable_if
4071 <
4072     __is_val_expr<_Expr>::value,
4073     __val_expr<_BinaryOp<bit_and<typename _Expr::value_type>,
4074                _Expr, __scalar_expr<typename _Expr::value_type> > >
4075 >::type
4076 operator&(const _Expr& __x, const typename _Expr::value_type& __y)
4077 {
4078     typedef typename _Expr::value_type value_type;
4079     typedef _BinaryOp<bit_and<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4080     return __val_expr<_Op>(_Op(bit_and<value_type>(),
4081                            __x, __scalar_expr<value_type>(__y, __x.size())));
4082 }
4083
4084 template<class _Expr>
4085 inline _LIBCPP_INLINE_VISIBILITY
4086 typename enable_if
4087 <
4088     __is_val_expr<_Expr>::value,
4089     __val_expr<_BinaryOp<bit_and<typename _Expr::value_type>,
4090                __scalar_expr<typename _Expr::value_type>, _Expr> >
4091 >::type
4092 operator&(const typename _Expr::value_type& __x, const _Expr& __y)
4093 {
4094     typedef typename _Expr::value_type value_type;
4095     typedef _BinaryOp<bit_and<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4096     return __val_expr<_Op>(_Op(bit_and<value_type>(),
4097                            __scalar_expr<value_type>(__x, __y.size()), __y));
4098 }
4099
4100 template<class _Expr1, class _Expr2>
4101 inline _LIBCPP_INLINE_VISIBILITY
4102 typename enable_if
4103 <
4104     __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4105     __val_expr<_BinaryOp<bit_or<typename _Expr1::value_type>, _Expr1, _Expr2> >
4106 >::type
4107 operator|(const _Expr1& __x, const _Expr2& __y)
4108 {
4109     typedef typename _Expr1::value_type value_type;
4110     typedef _BinaryOp<bit_or<value_type>, _Expr1, _Expr2> _Op;
4111     return __val_expr<_Op>(_Op(bit_or<value_type>(), __x, __y));
4112 }
4113
4114 template<class _Expr>
4115 inline _LIBCPP_INLINE_VISIBILITY
4116 typename enable_if
4117 <
4118     __is_val_expr<_Expr>::value,
4119     __val_expr<_BinaryOp<bit_or<typename _Expr::value_type>,
4120                _Expr, __scalar_expr<typename _Expr::value_type> > >
4121 >::type
4122 operator|(const _Expr& __x, const typename _Expr::value_type& __y)
4123 {
4124     typedef typename _Expr::value_type value_type;
4125     typedef _BinaryOp<bit_or<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4126     return __val_expr<_Op>(_Op(bit_or<value_type>(),
4127                            __x, __scalar_expr<value_type>(__y, __x.size())));
4128 }
4129
4130 template<class _Expr>
4131 inline _LIBCPP_INLINE_VISIBILITY
4132 typename enable_if
4133 <
4134     __is_val_expr<_Expr>::value,
4135     __val_expr<_BinaryOp<bit_or<typename _Expr::value_type>,
4136                __scalar_expr<typename _Expr::value_type>, _Expr> >
4137 >::type
4138 operator|(const typename _Expr::value_type& __x, const _Expr& __y)
4139 {
4140     typedef typename _Expr::value_type value_type;
4141     typedef _BinaryOp<bit_or<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4142     return __val_expr<_Op>(_Op(bit_or<value_type>(),
4143                            __scalar_expr<value_type>(__x, __y.size()), __y));
4144 }
4145
4146 template<class _Expr1, class _Expr2>
4147 inline _LIBCPP_INLINE_VISIBILITY
4148 typename enable_if
4149 <
4150     __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4151     __val_expr<_BinaryOp<__bit_shift_left<typename _Expr1::value_type>, _Expr1, _Expr2> >
4152 >::type
4153 operator<<(const _Expr1& __x, const _Expr2& __y)
4154 {
4155     typedef typename _Expr1::value_type value_type;
4156     typedef _BinaryOp<__bit_shift_left<value_type>, _Expr1, _Expr2> _Op;
4157     return __val_expr<_Op>(_Op(__bit_shift_left<value_type>(), __x, __y));
4158 }
4159
4160 template<class _Expr>
4161 inline _LIBCPP_INLINE_VISIBILITY
4162 typename enable_if
4163 <
4164     __is_val_expr<_Expr>::value,
4165     __val_expr<_BinaryOp<__bit_shift_left<typename _Expr::value_type>,
4166                _Expr, __scalar_expr<typename _Expr::value_type> > >
4167 >::type
4168 operator<<(const _Expr& __x, const typename _Expr::value_type& __y)
4169 {
4170     typedef typename _Expr::value_type value_type;
4171     typedef _BinaryOp<__bit_shift_left<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4172     return __val_expr<_Op>(_Op(__bit_shift_left<value_type>(),
4173                            __x, __scalar_expr<value_type>(__y, __x.size())));
4174 }
4175
4176 template<class _Expr>
4177 inline _LIBCPP_INLINE_VISIBILITY
4178 typename enable_if
4179 <
4180     __is_val_expr<_Expr>::value,
4181     __val_expr<_BinaryOp<__bit_shift_left<typename _Expr::value_type>,
4182                __scalar_expr<typename _Expr::value_type>, _Expr> >
4183 >::type
4184 operator<<(const typename _Expr::value_type& __x, const _Expr& __y)
4185 {
4186     typedef typename _Expr::value_type value_type;
4187     typedef _BinaryOp<__bit_shift_left<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4188     return __val_expr<_Op>(_Op(__bit_shift_left<value_type>(),
4189                            __scalar_expr<value_type>(__x, __y.size()), __y));
4190 }
4191
4192 template<class _Expr1, class _Expr2>
4193 inline _LIBCPP_INLINE_VISIBILITY
4194 typename enable_if
4195 <
4196     __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4197     __val_expr<_BinaryOp<__bit_shift_right<typename _Expr1::value_type>, _Expr1, _Expr2> >
4198 >::type
4199 operator>>(const _Expr1& __x, const _Expr2& __y)
4200 {
4201     typedef typename _Expr1::value_type value_type;
4202     typedef _BinaryOp<__bit_shift_right<value_type>, _Expr1, _Expr2> _Op;
4203     return __val_expr<_Op>(_Op(__bit_shift_right<value_type>(), __x, __y));
4204 }
4205
4206 template<class _Expr>
4207 inline _LIBCPP_INLINE_VISIBILITY
4208 typename enable_if
4209 <
4210     __is_val_expr<_Expr>::value,
4211     __val_expr<_BinaryOp<__bit_shift_right<typename _Expr::value_type>,
4212                _Expr, __scalar_expr<typename _Expr::value_type> > >
4213 >::type
4214 operator>>(const _Expr& __x, const typename _Expr::value_type& __y)
4215 {
4216     typedef typename _Expr::value_type value_type;
4217     typedef _BinaryOp<__bit_shift_right<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4218     return __val_expr<_Op>(_Op(__bit_shift_right<value_type>(),
4219                            __x, __scalar_expr<value_type>(__y, __x.size())));
4220 }
4221
4222 template<class _Expr>
4223 inline _LIBCPP_INLINE_VISIBILITY
4224 typename enable_if
4225 <
4226     __is_val_expr<_Expr>::value,
4227     __val_expr<_BinaryOp<__bit_shift_right<typename _Expr::value_type>,
4228                __scalar_expr<typename _Expr::value_type>, _Expr> >
4229 >::type
4230 operator>>(const typename _Expr::value_type& __x, const _Expr& __y)
4231 {
4232     typedef typename _Expr::value_type value_type;
4233     typedef _BinaryOp<__bit_shift_right<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4234     return __val_expr<_Op>(_Op(__bit_shift_right<value_type>(),
4235                            __scalar_expr<value_type>(__x, __y.size()), __y));
4236 }
4237
4238 template<class _Expr1, class _Expr2>
4239 inline _LIBCPP_INLINE_VISIBILITY
4240 typename enable_if
4241 <
4242     __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4243     __val_expr<_BinaryOp<logical_and<typename _Expr1::value_type>, _Expr1, _Expr2> >
4244 >::type
4245 operator&&(const _Expr1& __x, const _Expr2& __y)
4246 {
4247     typedef typename _Expr1::value_type value_type;
4248     typedef _BinaryOp<logical_and<value_type>, _Expr1, _Expr2> _Op;
4249     return __val_expr<_Op>(_Op(logical_and<value_type>(), __x, __y));
4250 }
4251
4252 template<class _Expr>
4253 inline _LIBCPP_INLINE_VISIBILITY
4254 typename enable_if
4255 <
4256     __is_val_expr<_Expr>::value,
4257     __val_expr<_BinaryOp<logical_and<typename _Expr::value_type>,
4258                _Expr, __scalar_expr<typename _Expr::value_type> > >
4259 >::type
4260 operator&&(const _Expr& __x, const typename _Expr::value_type& __y)
4261 {
4262     typedef typename _Expr::value_type value_type;
4263     typedef _BinaryOp<logical_and<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4264     return __val_expr<_Op>(_Op(logical_and<value_type>(),
4265                            __x, __scalar_expr<value_type>(__y, __x.size())));
4266 }
4267
4268 template<class _Expr>
4269 inline _LIBCPP_INLINE_VISIBILITY
4270 typename enable_if
4271 <
4272     __is_val_expr<_Expr>::value,
4273     __val_expr<_BinaryOp<logical_and<typename _Expr::value_type>,
4274                __scalar_expr<typename _Expr::value_type>, _Expr> >
4275 >::type
4276 operator&&(const typename _Expr::value_type& __x, const _Expr& __y)
4277 {
4278     typedef typename _Expr::value_type value_type;
4279     typedef _BinaryOp<logical_and<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4280     return __val_expr<_Op>(_Op(logical_and<value_type>(),
4281                            __scalar_expr<value_type>(__x, __y.size()), __y));
4282 }
4283
4284 template<class _Expr1, class _Expr2>
4285 inline _LIBCPP_INLINE_VISIBILITY
4286 typename enable_if
4287 <
4288     __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4289     __val_expr<_BinaryOp<logical_or<typename _Expr1::value_type>, _Expr1, _Expr2> >
4290 >::type
4291 operator||(const _Expr1& __x, const _Expr2& __y)
4292 {
4293     typedef typename _Expr1::value_type value_type;
4294     typedef _BinaryOp<logical_or<value_type>, _Expr1, _Expr2> _Op;
4295     return __val_expr<_Op>(_Op(logical_or<value_type>(), __x, __y));
4296 }
4297
4298 template<class _Expr>
4299 inline _LIBCPP_INLINE_VISIBILITY
4300 typename enable_if
4301 <
4302     __is_val_expr<_Expr>::value,
4303     __val_expr<_BinaryOp<logical_or<typename _Expr::value_type>,
4304                _Expr, __scalar_expr<typename _Expr::value_type> > >
4305 >::type
4306 operator||(const _Expr& __x, const typename _Expr::value_type& __y)
4307 {
4308     typedef typename _Expr::value_type value_type;
4309     typedef _BinaryOp<logical_or<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4310     return __val_expr<_Op>(_Op(logical_or<value_type>(),
4311                            __x, __scalar_expr<value_type>(__y, __x.size())));
4312 }
4313
4314 template<class _Expr>
4315 inline _LIBCPP_INLINE_VISIBILITY
4316 typename enable_if
4317 <
4318     __is_val_expr<_Expr>::value,
4319     __val_expr<_BinaryOp<logical_or<typename _Expr::value_type>,
4320                __scalar_expr<typename _Expr::value_type>, _Expr> >
4321 >::type
4322 operator||(const typename _Expr::value_type& __x, const _Expr& __y)
4323 {
4324     typedef typename _Expr::value_type value_type;
4325     typedef _BinaryOp<logical_or<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4326     return __val_expr<_Op>(_Op(logical_or<value_type>(),
4327                            __scalar_expr<value_type>(__x, __y.size()), __y));
4328 }
4329
4330 template<class _Expr1, class _Expr2>
4331 inline _LIBCPP_INLINE_VISIBILITY
4332 typename enable_if
4333 <
4334     __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4335     __val_expr<_BinaryOp<equal_to<typename _Expr1::value_type>, _Expr1, _Expr2> >
4336 >::type
4337 operator==(const _Expr1& __x, const _Expr2& __y)
4338 {
4339     typedef typename _Expr1::value_type value_type;
4340     typedef _BinaryOp<equal_to<value_type>, _Expr1, _Expr2> _Op;
4341     return __val_expr<_Op>(_Op(equal_to<value_type>(), __x, __y));
4342 }
4343
4344 template<class _Expr>
4345 inline _LIBCPP_INLINE_VISIBILITY
4346 typename enable_if
4347 <
4348     __is_val_expr<_Expr>::value,
4349     __val_expr<_BinaryOp<equal_to<typename _Expr::value_type>,
4350                _Expr, __scalar_expr<typename _Expr::value_type> > >
4351 >::type
4352 operator==(const _Expr& __x, const typename _Expr::value_type& __y)
4353 {
4354     typedef typename _Expr::value_type value_type;
4355     typedef _BinaryOp<equal_to<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4356     return __val_expr<_Op>(_Op(equal_to<value_type>(),
4357                            __x, __scalar_expr<value_type>(__y, __x.size())));
4358 }
4359
4360 template<class _Expr>
4361 inline _LIBCPP_INLINE_VISIBILITY
4362 typename enable_if
4363 <
4364     __is_val_expr<_Expr>::value,
4365     __val_expr<_BinaryOp<equal_to<typename _Expr::value_type>,
4366                __scalar_expr<typename _Expr::value_type>, _Expr> >
4367 >::type
4368 operator==(const typename _Expr::value_type& __x, const _Expr& __y)
4369 {
4370     typedef typename _Expr::value_type value_type;
4371     typedef _BinaryOp<equal_to<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4372     return __val_expr<_Op>(_Op(equal_to<value_type>(),
4373                            __scalar_expr<value_type>(__x, __y.size()), __y));
4374 }
4375
4376 template<class _Expr1, class _Expr2>
4377 inline _LIBCPP_INLINE_VISIBILITY
4378 typename enable_if
4379 <
4380     __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4381     __val_expr<_BinaryOp<not_equal_to<typename _Expr1::value_type>, _Expr1, _Expr2> >
4382 >::type
4383 operator!=(const _Expr1& __x, const _Expr2& __y)
4384 {
4385     typedef typename _Expr1::value_type value_type;
4386     typedef _BinaryOp<not_equal_to<value_type>, _Expr1, _Expr2> _Op;
4387     return __val_expr<_Op>(_Op(not_equal_to<value_type>(), __x, __y));
4388 }
4389
4390 template<class _Expr>
4391 inline _LIBCPP_INLINE_VISIBILITY
4392 typename enable_if
4393 <
4394     __is_val_expr<_Expr>::value,
4395     __val_expr<_BinaryOp<not_equal_to<typename _Expr::value_type>,
4396                _Expr, __scalar_expr<typename _Expr::value_type> > >
4397 >::type
4398 operator!=(const _Expr& __x, const typename _Expr::value_type& __y)
4399 {
4400     typedef typename _Expr::value_type value_type;
4401     typedef _BinaryOp<not_equal_to<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4402     return __val_expr<_Op>(_Op(not_equal_to<value_type>(),
4403                            __x, __scalar_expr<value_type>(__y, __x.size())));
4404 }
4405
4406 template<class _Expr>
4407 inline _LIBCPP_INLINE_VISIBILITY
4408 typename enable_if
4409 <
4410     __is_val_expr<_Expr>::value,
4411     __val_expr<_BinaryOp<not_equal_to<typename _Expr::value_type>,
4412                __scalar_expr<typename _Expr::value_type>, _Expr> >
4413 >::type
4414 operator!=(const typename _Expr::value_type& __x, const _Expr& __y)
4415 {
4416     typedef typename _Expr::value_type value_type;
4417     typedef _BinaryOp<not_equal_to<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4418     return __val_expr<_Op>(_Op(not_equal_to<value_type>(),
4419                            __scalar_expr<value_type>(__x, __y.size()), __y));
4420 }
4421
4422 template<class _Expr1, class _Expr2>
4423 inline _LIBCPP_INLINE_VISIBILITY
4424 typename enable_if
4425 <
4426     __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4427     __val_expr<_BinaryOp<less<typename _Expr1::value_type>, _Expr1, _Expr2> >
4428 >::type
4429 operator<(const _Expr1& __x, const _Expr2& __y)
4430 {
4431     typedef typename _Expr1::value_type value_type;
4432     typedef _BinaryOp<less<value_type>, _Expr1, _Expr2> _Op;
4433     return __val_expr<_Op>(_Op(less<value_type>(), __x, __y));
4434 }
4435
4436 template<class _Expr>
4437 inline _LIBCPP_INLINE_VISIBILITY
4438 typename enable_if
4439 <
4440     __is_val_expr<_Expr>::value,
4441     __val_expr<_BinaryOp<less<typename _Expr::value_type>,
4442                _Expr, __scalar_expr<typename _Expr::value_type> > >
4443 >::type
4444 operator<(const _Expr& __x, const typename _Expr::value_type& __y)
4445 {
4446     typedef typename _Expr::value_type value_type;
4447     typedef _BinaryOp<less<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4448     return __val_expr<_Op>(_Op(less<value_type>(),
4449                            __x, __scalar_expr<value_type>(__y, __x.size())));
4450 }
4451
4452 template<class _Expr>
4453 inline _LIBCPP_INLINE_VISIBILITY
4454 typename enable_if
4455 <
4456     __is_val_expr<_Expr>::value,
4457     __val_expr<_BinaryOp<less<typename _Expr::value_type>,
4458                __scalar_expr<typename _Expr::value_type>, _Expr> >
4459 >::type
4460 operator<(const typename _Expr::value_type& __x, const _Expr& __y)
4461 {
4462     typedef typename _Expr::value_type value_type;
4463     typedef _BinaryOp<less<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4464     return __val_expr<_Op>(_Op(less<value_type>(),
4465                            __scalar_expr<value_type>(__x, __y.size()), __y));
4466 }
4467
4468 template<class _Expr1, class _Expr2>
4469 inline _LIBCPP_INLINE_VISIBILITY
4470 typename enable_if
4471 <
4472     __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4473     __val_expr<_BinaryOp<greater<typename _Expr1::value_type>, _Expr1, _Expr2> >
4474 >::type
4475 operator>(const _Expr1& __x, const _Expr2& __y)
4476 {
4477     typedef typename _Expr1::value_type value_type;
4478     typedef _BinaryOp<greater<value_type>, _Expr1, _Expr2> _Op;
4479     return __val_expr<_Op>(_Op(greater<value_type>(), __x, __y));
4480 }
4481
4482 template<class _Expr>
4483 inline _LIBCPP_INLINE_VISIBILITY
4484 typename enable_if
4485 <
4486     __is_val_expr<_Expr>::value,
4487     __val_expr<_BinaryOp<greater<typename _Expr::value_type>,
4488                _Expr, __scalar_expr<typename _Expr::value_type> > >
4489 >::type
4490 operator>(const _Expr& __x, const typename _Expr::value_type& __y)
4491 {
4492     typedef typename _Expr::value_type value_type;
4493     typedef _BinaryOp<greater<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4494     return __val_expr<_Op>(_Op(greater<value_type>(),
4495                            __x, __scalar_expr<value_type>(__y, __x.size())));
4496 }
4497
4498 template<class _Expr>
4499 inline _LIBCPP_INLINE_VISIBILITY
4500 typename enable_if
4501 <
4502     __is_val_expr<_Expr>::value,
4503     __val_expr<_BinaryOp<greater<typename _Expr::value_type>,
4504                __scalar_expr<typename _Expr::value_type>, _Expr> >
4505 >::type
4506 operator>(const typename _Expr::value_type& __x, const _Expr& __y)
4507 {
4508     typedef typename _Expr::value_type value_type;
4509     typedef _BinaryOp<greater<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4510     return __val_expr<_Op>(_Op(greater<value_type>(),
4511                            __scalar_expr<value_type>(__x, __y.size()), __y));
4512 }
4513
4514 template<class _Expr1, class _Expr2>
4515 inline _LIBCPP_INLINE_VISIBILITY
4516 typename enable_if
4517 <
4518     __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4519     __val_expr<_BinaryOp<less_equal<typename _Expr1::value_type>, _Expr1, _Expr2> >
4520 >::type
4521 operator<=(const _Expr1& __x, const _Expr2& __y)
4522 {
4523     typedef typename _Expr1::value_type value_type;
4524     typedef _BinaryOp<less_equal<value_type>, _Expr1, _Expr2> _Op;
4525     return __val_expr<_Op>(_Op(less_equal<value_type>(), __x, __y));
4526 }
4527
4528 template<class _Expr>
4529 inline _LIBCPP_INLINE_VISIBILITY
4530 typename enable_if
4531 <
4532     __is_val_expr<_Expr>::value,
4533     __val_expr<_BinaryOp<less_equal<typename _Expr::value_type>,
4534                _Expr, __scalar_expr<typename _Expr::value_type> > >
4535 >::type
4536 operator<=(const _Expr& __x, const typename _Expr::value_type& __y)
4537 {
4538     typedef typename _Expr::value_type value_type;
4539     typedef _BinaryOp<less_equal<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4540     return __val_expr<_Op>(_Op(less_equal<value_type>(),
4541                            __x, __scalar_expr<value_type>(__y, __x.size())));
4542 }
4543
4544 template<class _Expr>
4545 inline _LIBCPP_INLINE_VISIBILITY
4546 typename enable_if
4547 <
4548     __is_val_expr<_Expr>::value,
4549     __val_expr<_BinaryOp<less_equal<typename _Expr::value_type>,
4550                __scalar_expr<typename _Expr::value_type>, _Expr> >
4551 >::type
4552 operator<=(const typename _Expr::value_type& __x, const _Expr& __y)
4553 {
4554     typedef typename _Expr::value_type value_type;
4555     typedef _BinaryOp<less_equal<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4556     return __val_expr<_Op>(_Op(less_equal<value_type>(),
4557                            __scalar_expr<value_type>(__x, __y.size()), __y));
4558 }
4559
4560 template<class _Expr1, class _Expr2>
4561 inline _LIBCPP_INLINE_VISIBILITY
4562 typename enable_if
4563 <
4564     __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4565     __val_expr<_BinaryOp<greater_equal<typename _Expr1::value_type>, _Expr1, _Expr2> >
4566 >::type
4567 operator>=(const _Expr1& __x, const _Expr2& __y)
4568 {
4569     typedef typename _Expr1::value_type value_type;
4570     typedef _BinaryOp<greater_equal<value_type>, _Expr1, _Expr2> _Op;
4571     return __val_expr<_Op>(_Op(greater_equal<value_type>(), __x, __y));
4572 }
4573
4574 template<class _Expr>
4575 inline _LIBCPP_INLINE_VISIBILITY
4576 typename enable_if
4577 <
4578     __is_val_expr<_Expr>::value,
4579     __val_expr<_BinaryOp<greater_equal<typename _Expr::value_type>,
4580                _Expr, __scalar_expr<typename _Expr::value_type> > >
4581 >::type
4582 operator>=(const _Expr& __x, const typename _Expr::value_type& __y)
4583 {
4584     typedef typename _Expr::value_type value_type;
4585     typedef _BinaryOp<greater_equal<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4586     return __val_expr<_Op>(_Op(greater_equal<value_type>(),
4587                            __x, __scalar_expr<value_type>(__y, __x.size())));
4588 }
4589
4590 template<class _Expr>
4591 inline _LIBCPP_INLINE_VISIBILITY
4592 typename enable_if
4593 <
4594     __is_val_expr<_Expr>::value,
4595     __val_expr<_BinaryOp<greater_equal<typename _Expr::value_type>,
4596                __scalar_expr<typename _Expr::value_type>, _Expr> >
4597 >::type
4598 operator>=(const typename _Expr::value_type& __x, const _Expr& __y)
4599 {
4600     typedef typename _Expr::value_type value_type;
4601     typedef _BinaryOp<greater_equal<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4602     return __val_expr<_Op>(_Op(greater_equal<value_type>(),
4603                            __scalar_expr<value_type>(__x, __y.size()), __y));
4604 }
4605
4606 template<class _Expr>
4607 inline _LIBCPP_INLINE_VISIBILITY
4608 typename enable_if
4609 <
4610     __is_val_expr<_Expr>::value,
4611     __val_expr<_UnaryOp<__abs_expr<typename _Expr::value_type>, _Expr> >
4612 >::type
4613 abs(const _Expr& __x)
4614 {
4615     typedef typename _Expr::value_type value_type;
4616     typedef _UnaryOp<__abs_expr<value_type>, _Expr> _Op;
4617     return __val_expr<_Op>(_Op(__abs_expr<value_type>(), __x));
4618 }
4619
4620 template<class _Expr>
4621 inline _LIBCPP_INLINE_VISIBILITY
4622 typename enable_if
4623 <
4624     __is_val_expr<_Expr>::value,
4625     __val_expr<_UnaryOp<__acos_expr<typename _Expr::value_type>, _Expr> >
4626 >::type
4627 acos(const _Expr& __x)
4628 {
4629     typedef typename _Expr::value_type value_type;
4630     typedef _UnaryOp<__acos_expr<value_type>, _Expr> _Op;
4631     return __val_expr<_Op>(_Op(__acos_expr<value_type>(), __x));
4632 }
4633
4634 template<class _Expr>
4635 inline _LIBCPP_INLINE_VISIBILITY
4636 typename enable_if
4637 <
4638     __is_val_expr<_Expr>::value,
4639     __val_expr<_UnaryOp<__asin_expr<typename _Expr::value_type>, _Expr> >
4640 >::type
4641 asin(const _Expr& __x)
4642 {
4643     typedef typename _Expr::value_type value_type;
4644     typedef _UnaryOp<__asin_expr<value_type>, _Expr> _Op;
4645     return __val_expr<_Op>(_Op(__asin_expr<value_type>(), __x));
4646 }
4647
4648 template<class _Expr>
4649 inline _LIBCPP_INLINE_VISIBILITY
4650 typename enable_if
4651 <
4652     __is_val_expr<_Expr>::value,
4653     __val_expr<_UnaryOp<__atan_expr<typename _Expr::value_type>, _Expr> >
4654 >::type
4655 atan(const _Expr& __x)
4656 {
4657     typedef typename _Expr::value_type value_type;
4658     typedef _UnaryOp<__atan_expr<value_type>, _Expr> _Op;
4659     return __val_expr<_Op>(_Op(__atan_expr<value_type>(), __x));
4660 }
4661
4662 template<class _Expr1, class _Expr2>
4663 inline _LIBCPP_INLINE_VISIBILITY
4664 typename enable_if
4665 <
4666     __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4667     __val_expr<_BinaryOp<__atan2_expr<typename _Expr1::value_type>, _Expr1, _Expr2> >
4668 >::type
4669 atan2(const _Expr1& __x, const _Expr2& __y)
4670 {
4671     typedef typename _Expr1::value_type value_type;
4672     typedef _BinaryOp<__atan2_expr<value_type>, _Expr1, _Expr2> _Op;
4673     return __val_expr<_Op>(_Op(__atan2_expr<value_type>(), __x, __y));
4674 }
4675
4676 template<class _Expr>
4677 inline _LIBCPP_INLINE_VISIBILITY
4678 typename enable_if
4679 <
4680     __is_val_expr<_Expr>::value,
4681     __val_expr<_BinaryOp<__atan2_expr<typename _Expr::value_type>,
4682                _Expr, __scalar_expr<typename _Expr::value_type> > >
4683 >::type
4684 atan2(const _Expr& __x, const typename _Expr::value_type& __y)
4685 {
4686     typedef typename _Expr::value_type value_type;
4687     typedef _BinaryOp<__atan2_expr<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4688     return __val_expr<_Op>(_Op(__atan2_expr<value_type>(),
4689                            __x, __scalar_expr<value_type>(__y, __x.size())));
4690 }
4691
4692 template<class _Expr>
4693 inline _LIBCPP_INLINE_VISIBILITY
4694 typename enable_if
4695 <
4696     __is_val_expr<_Expr>::value,
4697     __val_expr<_BinaryOp<__atan2_expr<typename _Expr::value_type>,
4698                __scalar_expr<typename _Expr::value_type>, _Expr> >
4699 >::type
4700 atan2(const typename _Expr::value_type& __x, const _Expr& __y)
4701 {
4702     typedef typename _Expr::value_type value_type;
4703     typedef _BinaryOp<__atan2_expr<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4704     return __val_expr<_Op>(_Op(__atan2_expr<value_type>(),
4705                            __scalar_expr<value_type>(__x, __y.size()), __y));
4706 }
4707
4708 template<class _Expr>
4709 inline _LIBCPP_INLINE_VISIBILITY
4710 typename enable_if
4711 <
4712     __is_val_expr<_Expr>::value,
4713     __val_expr<_UnaryOp<__cos_expr<typename _Expr::value_type>, _Expr> >
4714 >::type
4715 cos(const _Expr& __x)
4716 {
4717     typedef typename _Expr::value_type value_type;
4718     typedef _UnaryOp<__cos_expr<value_type>, _Expr> _Op;
4719     return __val_expr<_Op>(_Op(__cos_expr<value_type>(), __x));
4720 }
4721
4722 template<class _Expr>
4723 inline _LIBCPP_INLINE_VISIBILITY
4724 typename enable_if
4725 <
4726     __is_val_expr<_Expr>::value,
4727     __val_expr<_UnaryOp<__cosh_expr<typename _Expr::value_type>, _Expr> >
4728 >::type
4729 cosh(const _Expr& __x)
4730 {
4731     typedef typename _Expr::value_type value_type;
4732     typedef _UnaryOp<__cosh_expr<value_type>, _Expr> _Op;
4733     return __val_expr<_Op>(_Op(__cosh_expr<value_type>(), __x));
4734 }
4735
4736 template<class _Expr>
4737 inline _LIBCPP_INLINE_VISIBILITY
4738 typename enable_if
4739 <
4740     __is_val_expr<_Expr>::value,
4741     __val_expr<_UnaryOp<__exp_expr<typename _Expr::value_type>, _Expr> >
4742 >::type
4743 exp(const _Expr& __x)
4744 {
4745     typedef typename _Expr::value_type value_type;
4746     typedef _UnaryOp<__exp_expr<value_type>, _Expr> _Op;
4747     return __val_expr<_Op>(_Op(__exp_expr<value_type>(), __x));
4748 }
4749
4750 template<class _Expr>
4751 inline _LIBCPP_INLINE_VISIBILITY
4752 typename enable_if
4753 <
4754     __is_val_expr<_Expr>::value,
4755     __val_expr<_UnaryOp<__log_expr<typename _Expr::value_type>, _Expr> >
4756 >::type
4757 log(const _Expr& __x)
4758 {
4759     typedef typename _Expr::value_type value_type;
4760     typedef _UnaryOp<__log_expr<value_type>, _Expr> _Op;
4761     return __val_expr<_Op>(_Op(__log_expr<value_type>(), __x));
4762 }
4763
4764 template<class _Expr>
4765 inline _LIBCPP_INLINE_VISIBILITY
4766 typename enable_if
4767 <
4768     __is_val_expr<_Expr>::value,
4769     __val_expr<_UnaryOp<__log10_expr<typename _Expr::value_type>, _Expr> >
4770 >::type
4771 log10(const _Expr& __x)
4772 {
4773     typedef typename _Expr::value_type value_type;
4774     typedef _UnaryOp<__log10_expr<value_type>, _Expr> _Op;
4775     return __val_expr<_Op>(_Op(__log10_expr<value_type>(), __x));
4776 }
4777
4778 template<class _Expr1, class _Expr2>
4779 inline _LIBCPP_INLINE_VISIBILITY
4780 typename enable_if
4781 <
4782     __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
4783     __val_expr<_BinaryOp<__pow_expr<typename _Expr1::value_type>, _Expr1, _Expr2> >
4784 >::type
4785 pow(const _Expr1& __x, const _Expr2& __y)
4786 {
4787     typedef typename _Expr1::value_type value_type;
4788     typedef _BinaryOp<__pow_expr<value_type>, _Expr1, _Expr2> _Op;
4789     return __val_expr<_Op>(_Op(__pow_expr<value_type>(), __x, __y));
4790 }
4791
4792 template<class _Expr>
4793 inline _LIBCPP_INLINE_VISIBILITY
4794 typename enable_if
4795 <
4796     __is_val_expr<_Expr>::value,
4797     __val_expr<_BinaryOp<__pow_expr<typename _Expr::value_type>,
4798                _Expr, __scalar_expr<typename _Expr::value_type> > >
4799 >::type
4800 pow(const _Expr& __x, const typename _Expr::value_type& __y)
4801 {
4802     typedef typename _Expr::value_type value_type;
4803     typedef _BinaryOp<__pow_expr<value_type>, _Expr, __scalar_expr<value_type> > _Op;
4804     return __val_expr<_Op>(_Op(__pow_expr<value_type>(),
4805                            __x, __scalar_expr<value_type>(__y, __x.size())));
4806 }
4807
4808 template<class _Expr>
4809 inline _LIBCPP_INLINE_VISIBILITY
4810 typename enable_if
4811 <
4812     __is_val_expr<_Expr>::value,
4813     __val_expr<_BinaryOp<__pow_expr<typename _Expr::value_type>,
4814                __scalar_expr<typename _Expr::value_type>, _Expr> >
4815 >::type
4816 pow(const typename _Expr::value_type& __x, const _Expr& __y)
4817 {
4818     typedef typename _Expr::value_type value_type;
4819     typedef _BinaryOp<__pow_expr<value_type>, __scalar_expr<value_type>, _Expr> _Op;
4820     return __val_expr<_Op>(_Op(__pow_expr<value_type>(),
4821                            __scalar_expr<value_type>(__x, __y.size()), __y));
4822 }
4823
4824 template<class _Expr>
4825 inline _LIBCPP_INLINE_VISIBILITY
4826 typename enable_if
4827 <
4828     __is_val_expr<_Expr>::value,
4829     __val_expr<_UnaryOp<__sin_expr<typename _Expr::value_type>, _Expr> >
4830 >::type
4831 sin(const _Expr& __x)
4832 {
4833     typedef typename _Expr::value_type value_type;
4834     typedef _UnaryOp<__sin_expr<value_type>, _Expr> _Op;
4835     return __val_expr<_Op>(_Op(__sin_expr<value_type>(), __x));
4836 }
4837
4838 template<class _Expr>
4839 inline _LIBCPP_INLINE_VISIBILITY
4840 typename enable_if
4841 <
4842     __is_val_expr<_Expr>::value,
4843     __val_expr<_UnaryOp<__sinh_expr<typename _Expr::value_type>, _Expr> >
4844 >::type
4845 sinh(const _Expr& __x)
4846 {
4847     typedef typename _Expr::value_type value_type;
4848     typedef _UnaryOp<__sinh_expr<value_type>, _Expr> _Op;
4849     return __val_expr<_Op>(_Op(__sinh_expr<value_type>(), __x));
4850 }
4851
4852 template<class _Expr>
4853 inline _LIBCPP_INLINE_VISIBILITY
4854 typename enable_if
4855 <
4856     __is_val_expr<_Expr>::value,
4857     __val_expr<_UnaryOp<__sqrt_expr<typename _Expr::value_type>, _Expr> >
4858 >::type
4859 sqrt(const _Expr& __x)
4860 {
4861     typedef typename _Expr::value_type value_type;
4862     typedef _UnaryOp<__sqrt_expr<value_type>, _Expr> _Op;
4863     return __val_expr<_Op>(_Op(__sqrt_expr<value_type>(), __x));
4864 }
4865
4866 template<class _Expr>
4867 inline _LIBCPP_INLINE_VISIBILITY
4868 typename enable_if
4869 <
4870     __is_val_expr<_Expr>::value,
4871     __val_expr<_UnaryOp<__tan_expr<typename _Expr::value_type>, _Expr> >
4872 >::type
4873 tan(const _Expr& __x)
4874 {
4875     typedef typename _Expr::value_type value_type;
4876     typedef _UnaryOp<__tan_expr<value_type>, _Expr> _Op;
4877     return __val_expr<_Op>(_Op(__tan_expr<value_type>(), __x));
4878 }
4879
4880 template<class _Expr>
4881 inline _LIBCPP_INLINE_VISIBILITY
4882 typename enable_if
4883 <
4884     __is_val_expr<_Expr>::value,
4885     __val_expr<_UnaryOp<__tanh_expr<typename _Expr::value_type>, _Expr> >
4886 >::type
4887 tanh(const _Expr& __x)
4888 {
4889     typedef typename _Expr::value_type value_type;
4890     typedef _UnaryOp<__tanh_expr<value_type>, _Expr> _Op;
4891     return __val_expr<_Op>(_Op(__tanh_expr<value_type>(), __x));
4892 }
4893
4894 template <class _Tp>
4895 inline _LIBCPP_INLINE_VISIBILITY
4896 _Tp*
4897 begin(valarray<_Tp>& __v)
4898 {
4899     return __v.__begin_;
4900 }
4901
4902 template <class _Tp>
4903 inline _LIBCPP_INLINE_VISIBILITY
4904 const _Tp*
4905 begin(const valarray<_Tp>& __v)
4906 {
4907     return __v.__begin_;
4908 }
4909
4910 template <class _Tp>
4911 inline _LIBCPP_INLINE_VISIBILITY
4912 _Tp*
4913 end(valarray<_Tp>& __v)
4914 {
4915     return __v.__end_;
4916 }
4917
4918 template <class _Tp>
4919 inline _LIBCPP_INLINE_VISIBILITY
4920 const _Tp*
4921 end(const valarray<_Tp>& __v)
4922 {
4923     return __v.__end_;
4924 }
4925
4926 _LIBCPP_END_NAMESPACE_STD
4927
4928 _LIBCPP_POP_MACROS
4929
4930 #endif  // _LIBCPP_VALARRAY