• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
17namespace std
18{
19
20template<class T>
21class valarray
22{
23public:
24    typedef T value_type;
25
26    // construct/destroy:
27    valarray();
28    explicit valarray(size_t n);
29    valarray(const value_type& x, size_t n);
30    valarray(const value_type* px, size_t n);
31    valarray(const valarray& v);
32    valarray(valarray&& v) 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
109class slice
110{
111public:
112    slice();
113    slice(size_t start, size_t size, size_t stride);
114
115    size_t start()  const;
116    size_t size()   const;
117    size_t stride() const;
118};
119
120template <class T>
121class slice_array
122{
123public:
124    typedef T value_type;
125
126    const slice_array& operator=(const slice_array& sa) const;
127    void operator=  (const valarray<value_type>& v) const;
128    void operator*= (const valarray<value_type>& v) const;
129    void operator/= (const valarray<value_type>& v) const;
130    void operator%= (const valarray<value_type>& v) const;
131    void operator+= (const valarray<value_type>& v) const;
132    void operator-= (const valarray<value_type>& v) const;
133    void operator^= (const valarray<value_type>& v) const;
134    void operator&= (const valarray<value_type>& v) const;
135    void operator|= (const valarray<value_type>& v) const;
136    void operator<<=(const valarray<value_type>& v) const;
137    void operator>>=(const valarray<value_type>& v) const;
138
139    void operator=(const value_type& x) const;
140
141    slice_array() = delete;
142};
143
144class gslice
145{
146public:
147    gslice();
148    gslice(size_t start, const valarray<size_t>& size,
149                         const valarray<size_t>& stride);
150
151    size_t           start()  const;
152    valarray<size_t> size()   const;
153    valarray<size_t> stride() const;
154};
155
156template <class T>
157class gslice_array
158{
159public:
160    typedef T value_type;
161
162    void operator=  (const valarray<value_type>& v) const;
163    void operator*= (const valarray<value_type>& v) const;
164    void operator/= (const valarray<value_type>& v) const;
165    void operator%= (const valarray<value_type>& v) const;
166    void operator+= (const valarray<value_type>& v) const;
167    void operator-= (const valarray<value_type>& v) const;
168    void operator^= (const valarray<value_type>& v) const;
169    void operator&= (const valarray<value_type>& v) const;
170    void operator|= (const valarray<value_type>& v) const;
171    void operator<<=(const valarray<value_type>& v) const;
172    void operator>>=(const valarray<value_type>& v) const;
173
174    gslice_array(const gslice_array& ga);
175    ~gslice_array();
176    const gslice_array& operator=(const gslice_array& ga) const;
177    void operator=(const value_type& x) const;
178
179    gslice_array() = delete;
180};
181
182template <class T>
183class mask_array
184{
185public:
186    typedef T value_type;
187
188    void operator=  (const valarray<value_type>& v) const;
189    void operator*= (const valarray<value_type>& v) const;
190    void operator/= (const valarray<value_type>& v) const;
191    void operator%= (const valarray<value_type>& v) const;
192    void operator+= (const valarray<value_type>& v) const;
193    void operator-= (const valarray<value_type>& v) const;
194    void operator^= (const valarray<value_type>& v) const;
195    void operator&= (const valarray<value_type>& v) const;
196    void operator|= (const valarray<value_type>& v) const;
197    void operator<<=(const valarray<value_type>& v) const;
198    void operator>>=(const valarray<value_type>& v) const;
199
200    mask_array(const mask_array& ma);
201    ~mask_array();
202    const mask_array& operator=(const mask_array& ma) const;
203    void operator=(const value_type& x) const;
204
205    mask_array() = delete;
206};
207
208template <class T>
209class indirect_array
210{
211public:
212    typedef T value_type;
213
214    void operator=  (const valarray<value_type>& v) const;
215    void operator*= (const valarray<value_type>& v) const;
216    void operator/= (const valarray<value_type>& v) const;
217    void operator%= (const valarray<value_type>& v) const;
218    void operator+= (const valarray<value_type>& v) const;
219    void operator-= (const valarray<value_type>& v) const;
220    void operator^= (const valarray<value_type>& v) const;
221    void operator&= (const valarray<value_type>& v) const;
222    void operator|= (const valarray<value_type>& v) const;
223    void operator<<=(const valarray<value_type>& v) const;
224    void operator>>=(const valarray<value_type>& v) const;
225
226    indirect_array(const indirect_array& ia);
227    ~indirect_array();
228    const indirect_array& operator=(const indirect_array& ia) const;
229    void operator=(const value_type& x) const;
230
231    indirect_array() = delete;
232};
233
234template<class T> void swap(valarray<T>& x, valarray<T>& y) noexcept;
235
236template<class T> valarray<T> operator* (const valarray<T>& x, const valarray<T>& y);
237template<class T> valarray<T> operator* (const valarray<T>& x, const T& y);
238template<class T> valarray<T> operator* (const T& x, const valarray<T>& y);
239
240template<class T> valarray<T> operator/ (const valarray<T>& x, const valarray<T>& y);
241template<class T> valarray<T> operator/ (const valarray<T>& x, const T& y);
242template<class T> valarray<T> operator/ (const T& x, const valarray<T>& y);
243
244template<class T> valarray<T> operator% (const valarray<T>& x, const valarray<T>& y);
245template<class T> valarray<T> operator% (const valarray<T>& x, const T& y);
246template<class T> valarray<T> operator% (const T& x, const valarray<T>& y);
247
248template<class T> valarray<T> operator+ (const valarray<T>& x, const valarray<T>& y);
249template<class T> valarray<T> operator+ (const valarray<T>& x, const T& y);
250template<class T> valarray<T> operator+ (const T& x, const valarray<T>& y);
251
252template<class T> valarray<T> operator- (const valarray<T>& x, const valarray<T>& y);
253template<class T> valarray<T> operator- (const valarray<T>& x, const T& y);
254template<class T> valarray<T> operator- (const T& x, const valarray<T>& y);
255
256template<class T> valarray<T> operator^ (const valarray<T>& x, const valarray<T>& y);
257template<class T> valarray<T> operator^ (const valarray<T>& x, const T& y);
258template<class T> valarray<T> operator^ (const T& x, const valarray<T>& y);
259
260template<class T> valarray<T> operator& (const valarray<T>& x, const valarray<T>& y);
261template<class T> valarray<T> operator& (const valarray<T>& x, const T& y);
262template<class T> valarray<T> operator& (const T& x, const valarray<T>& y);
263
264template<class T> valarray<T> operator| (const valarray<T>& x, const valarray<T>& y);
265template<class T> valarray<T> operator| (const valarray<T>& x, const T& y);
266template<class T> valarray<T> operator| (const T& x, const valarray<T>& y);
267
268template<class T> valarray<T> operator<<(const valarray<T>& x, const valarray<T>& y);
269template<class T> valarray<T> operator<<(const valarray<T>& x, const T& y);
270template<class T> valarray<T> operator<<(const T& x, const valarray<T>& y);
271
272template<class T> valarray<T> operator>>(const valarray<T>& x, const valarray<T>& y);
273template<class T> valarray<T> operator>>(const valarray<T>& x, const T& y);
274template<class T> valarray<T> operator>>(const T& x, const valarray<T>& y);
275
276template<class T> valarray<bool> operator&&(const valarray<T>& x, const valarray<T>& y);
277template<class T> valarray<bool> operator&&(const valarray<T>& x, const T& y);
278template<class T> valarray<bool> operator&&(const T& x, const valarray<T>& y);
279
280template<class T> valarray<bool> operator||(const valarray<T>& x, const valarray<T>& y);
281template<class T> valarray<bool> operator||(const valarray<T>& x, const T& y);
282template<class T> valarray<bool> operator||(const T& x, const valarray<T>& y);
283
284template<class T> valarray<bool> operator==(const valarray<T>& x, const valarray<T>& y);
285template<class T> valarray<bool> operator==(const valarray<T>& x, const T& y);
286template<class T> valarray<bool> operator==(const T& x, const valarray<T>& y);
287
288template<class T> valarray<bool> operator!=(const valarray<T>& x, const valarray<T>& y);
289template<class T> valarray<bool> operator!=(const valarray<T>& x, const T& y);
290template<class T> valarray<bool> operator!=(const T& x, const valarray<T>& y);
291
292template<class T> valarray<bool> operator< (const valarray<T>& x, const valarray<T>& y);
293template<class T> valarray<bool> operator< (const valarray<T>& x, const T& y);
294template<class T> valarray<bool> operator< (const T& x, const valarray<T>& y);
295
296template<class T> valarray<bool> operator> (const valarray<T>& x, const valarray<T>& y);
297template<class T> valarray<bool> operator> (const valarray<T>& x, const T& y);
298template<class T> valarray<bool> operator> (const T& x, const valarray<T>& y);
299
300template<class T> valarray<bool> operator<=(const valarray<T>& x, const valarray<T>& y);
301template<class T> valarray<bool> operator<=(const valarray<T>& x, const T& y);
302template<class T> valarray<bool> operator<=(const T& x, const valarray<T>& y);
303
304template<class T> valarray<bool> operator>=(const valarray<T>& x, const valarray<T>& y);
305template<class T> valarray<bool> operator>=(const valarray<T>& x, const T& y);
306template<class T> valarray<bool> operator>=(const T& x, const valarray<T>& y);
307
308template<class T> valarray<T> abs (const valarray<T>& x);
309template<class T> valarray<T> acos (const valarray<T>& x);
310template<class T> valarray<T> asin (const valarray<T>& x);
311template<class T> valarray<T> atan (const valarray<T>& x);
312
313template<class T> valarray<T> atan2(const valarray<T>& x, const valarray<T>& y);
314template<class T> valarray<T> atan2(const valarray<T>& x, const T& y);
315template<class T> valarray<T> atan2(const T& x, const valarray<T>& y);
316
317template<class T> valarray<T> cos (const valarray<T>& x);
318template<class T> valarray<T> cosh (const valarray<T>& x);
319template<class T> valarray<T> exp (const valarray<T>& x);
320template<class T> valarray<T> log (const valarray<T>& x);
321template<class T> valarray<T> log10(const valarray<T>& x);
322
323template<class T> valarray<T> pow(const valarray<T>& x, const valarray<T>& y);
324template<class T> valarray<T> pow(const valarray<T>& x, const T& y);
325template<class T> valarray<T> pow(const T& x, const valarray<T>& y);
326
327template<class T> valarray<T> sin (const valarray<T>& x);
328template<class T> valarray<T> sinh (const valarray<T>& x);
329template<class T> valarray<T> sqrt (const valarray<T>& x);
330template<class T> valarray<T> tan (const valarray<T>& x);
331template<class T> valarray<T> tanh (const valarray<T>& x);
332
333template <class T> unspecified1 begin(valarray<T>& v);
334template <class T> unspecified2 begin(const valarray<T>& v);
335template <class T> unspecified1 end(valarray<T>& v);
336template <class T> unspecified2 end(const valarray<T>& v);
337
338}  // std
339
340*/
341
342#include <__config>
343#include <cstddef>
344#include <cmath>
345#include <initializer_list>
346#include <algorithm>
347#include <functional>
348#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
360template<class _Tp> class _LIBCPP_TEMPLATE_VIS valarray;
361
362class _LIBCPP_TEMPLATE_VIS slice
363{
364    size_t __start_;
365    size_t __size_;
366    size_t __stride_;
367public:
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
387template <class _Tp> class _LIBCPP_TEMPLATE_VIS slice_array;
388class _LIBCPP_TYPE_VIS gslice;
389template <class _Tp> class _LIBCPP_TEMPLATE_VIS gslice_array;
390template <class _Tp> class _LIBCPP_TEMPLATE_VIS mask_array;
391template <class _Tp> class _LIBCPP_TEMPLATE_VIS indirect_array;
392
393template <class _Tp>
394_LIBCPP_INLINE_VISIBILITY
395_Tp*
396begin(valarray<_Tp>& __v);
397
398template <class _Tp>
399_LIBCPP_INLINE_VISIBILITY
400const _Tp*
401begin(const valarray<_Tp>& __v);
402
403template <class _Tp>
404_LIBCPP_INLINE_VISIBILITY
405_Tp*
406end(valarray<_Tp>& __v);
407
408template <class _Tp>
409_LIBCPP_INLINE_VISIBILITY
410const _Tp*
411end(const valarray<_Tp>& __v);
412
413template <class _Op, class _A0>
414struct _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
432template <class _Op, class _A0, class _A1>
433struct _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
453template <class _Tp>
454class __scalar_expr
455{
456public:
457    typedef _Tp        value_type;
458    typedef const _Tp& result_type;
459private:
460    const value_type& __t_;
461    size_t __s_;
462public:
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
473template <class _Tp>
474struct __unary_plus : unary_function<_Tp, _Tp>
475{
476    _LIBCPP_INLINE_VISIBILITY
477    _Tp operator()(const _Tp& __x) const
478        {return +__x;}
479};
480
481template <class _Tp>
482struct __bit_not  : unary_function<_Tp, _Tp>
483{
484    _LIBCPP_INLINE_VISIBILITY
485    _Tp operator()(const _Tp& __x) const
486        {return ~__x;}
487};
488
489template <class _Tp>
490struct __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
497template <class _Tp>
498struct __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
505template <class _Tp, class _Fp>
506struct __apply_expr   : unary_function<_Tp, _Tp>
507{
508private:
509    _Fp __f_;
510public:
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
519template <class _Tp>
520struct __abs_expr : unary_function<_Tp, _Tp>
521{
522    _LIBCPP_INLINE_VISIBILITY
523    _Tp operator()(const _Tp& __x) const
524        {return abs(__x);}
525};
526
527template <class _Tp>
528struct __acos_expr : unary_function<_Tp, _Tp>
529{
530    _LIBCPP_INLINE_VISIBILITY
531    _Tp operator()(const _Tp& __x) const
532        {return acos(__x);}
533};
534
535template <class _Tp>
536struct __asin_expr : unary_function<_Tp, _Tp>
537{
538    _LIBCPP_INLINE_VISIBILITY
539    _Tp operator()(const _Tp& __x) const
540        {return asin(__x);}
541};
542
543template <class _Tp>
544struct __atan_expr : unary_function<_Tp, _Tp>
545{
546    _LIBCPP_INLINE_VISIBILITY
547    _Tp operator()(const _Tp& __x) const
548        {return atan(__x);}
549};
550
551template <class _Tp>
552struct __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
559template <class _Tp>
560struct __cos_expr : unary_function<_Tp, _Tp>
561{
562    _LIBCPP_INLINE_VISIBILITY
563    _Tp operator()(const _Tp& __x) const
564        {return cos(__x);}
565};
566
567template <class _Tp>
568struct __cosh_expr : unary_function<_Tp, _Tp>
569{
570    _LIBCPP_INLINE_VISIBILITY
571    _Tp operator()(const _Tp& __x) const
572        {return cosh(__x);}
573};
574
575template <class _Tp>
576struct __exp_expr : unary_function<_Tp, _Tp>
577{
578    _LIBCPP_INLINE_VISIBILITY
579    _Tp operator()(const _Tp& __x) const
580        {return exp(__x);}
581};
582
583template <class _Tp>
584struct __log_expr : unary_function<_Tp, _Tp>
585{
586    _LIBCPP_INLINE_VISIBILITY
587    _Tp operator()(const _Tp& __x) const
588        {return log(__x);}
589};
590
591template <class _Tp>
592struct __log10_expr : unary_function<_Tp, _Tp>
593{
594    _LIBCPP_INLINE_VISIBILITY
595    _Tp operator()(const _Tp& __x) const
596        {return log10(__x);}
597};
598
599template <class _Tp>
600struct __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
607template <class _Tp>
608struct __sin_expr : unary_function<_Tp, _Tp>
609{
610    _LIBCPP_INLINE_VISIBILITY
611    _Tp operator()(const _Tp& __x) const
612        {return sin(__x);}
613};
614
615template <class _Tp>
616struct __sinh_expr : unary_function<_Tp, _Tp>
617{
618    _LIBCPP_INLINE_VISIBILITY
619    _Tp operator()(const _Tp& __x) const
620        {return sinh(__x);}
621};
622
623template <class _Tp>
624struct __sqrt_expr : unary_function<_Tp, _Tp>
625{
626    _LIBCPP_INLINE_VISIBILITY
627    _Tp operator()(const _Tp& __x) const
628        {return sqrt(__x);}
629};
630
631template <class _Tp>
632struct __tan_expr : unary_function<_Tp, _Tp>
633{
634    _LIBCPP_INLINE_VISIBILITY
635    _Tp operator()(const _Tp& __x) const
636        {return tan(__x);}
637};
638
639template <class _Tp>
640struct __tanh_expr : unary_function<_Tp, _Tp>
641{
642    _LIBCPP_INLINE_VISIBILITY
643    _Tp operator()(const _Tp& __x) const
644        {return tanh(__x);}
645};
646
647template <class _ValExpr>
648class __slice_expr
649{
650    typedef typename remove_reference<_ValExpr>::type  _RmExpr;
651public:
652    typedef typename _RmExpr::value_type value_type;
653    typedef value_type result_type;
654
655private:
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        {}
668public:
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
680template <class _ValExpr>
681class __mask_expr;
682
683template <class _ValExpr>
684class __indirect_expr;
685
686template <class _ValExpr>
687class __shift_expr
688{
689    typedef typename remove_reference<_ValExpr>::type  _RmExpr;
690public:
691    typedef typename _RmExpr::value_type value_type;
692    typedef value_type result_type;
693
694private:
695    _ValExpr __expr_;
696    size_t __size_;
697    ptrdiff_t __ul_;
698    ptrdiff_t __sn_;
699    ptrdiff_t __n_;
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        }
713public:
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
729template <class _ValExpr>
730class __cshift_expr
731{
732    typedef typename remove_reference<_ValExpr>::type  _RmExpr;
733public:
734    typedef typename _RmExpr::value_type value_type;
735    typedef value_type result_type;
736
737private:
738    _ValExpr __expr_;
739    size_t __size_;
740    size_t __m_;
741    size_t __o1_;
742    size_t __o2_;
743
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        }
763public:
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
779template<class _ValExpr>
780class __val_expr;
781
782template<class _ValExpr>
783struct __is_val_expr : false_type {};
784
785template<class _ValExpr>
786struct __is_val_expr<__val_expr<_ValExpr> > : true_type {};
787
788template<class _Tp>
789struct __is_val_expr<valarray<_Tp> > : true_type {};
790
791template<class _Tp>
792class _LIBCPP_TEMPLATE_VIS valarray
793{
794public:
795    typedef _Tp value_type;
796    typedef _Tp result_type;
797
798private:
799    value_type* __begin_;
800    value_type* __end_;
801
802public:
803    // construct/destroy:
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
1027private:
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
1066template <class _Op, class _Tp>
1067struct _UnaryOp<_Op, valarray<_Tp> >
1068{
1069    typedef typename _Op::result_type result_type;
1070    typedef _Tp value_type;
1071
1072    _Op __op_;
1073    const valarray<_Tp>& __a0_;
1074
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
1085template <class _Op, class _Tp, class _A1>
1086struct _BinaryOp<_Op, valarray<_Tp>, _A1>
1087{
1088    typedef typename _Op::result_type result_type;
1089    typedef _Tp value_type;
1090
1091    _Op __op_;
1092    const valarray<_Tp>& __a0_;
1093    _A1 __a1_;
1094
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
1106template <class _Op, class _A0, class _Tp>
1107struct _BinaryOp<_Op, _A0, valarray<_Tp> >
1108{
1109    typedef typename _Op::result_type result_type;
1110    typedef _Tp value_type;
1111
1112    _Op __op_;
1113    _A0 __a0_;
1114    const valarray<_Tp>& __a1_;
1115
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
1127template <class _Op, class _Tp>
1128struct _BinaryOp<_Op, valarray<_Tp>, valarray<_Tp> >
1129{
1130    typedef typename _Op::result_type result_type;
1131    typedef _Tp value_type;
1132
1133    _Op __op_;
1134    const valarray<_Tp>& __a0_;
1135    const valarray<_Tp>& __a1_;
1136
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
1150template <class _Tp>
1151class _LIBCPP_TEMPLATE_VIS slice_array
1152{
1153public:
1154    typedef _Tp value_type;
1155
1156private:
1157    value_type* __vp_;
1158    size_t __size_;
1159    size_t __stride_;
1160
1161public:
1162    template <class _Expr>
1163    typename enable_if
1164    <
1165        __is_val_expr<_Expr>::value,
1166        void
1167    >::type
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
1267private:
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
1279template <class _Tp>
1280inline
1281const slice_array<_Tp>&
1282slice_array<_Tp>::operator=(const slice_array& __sa) const
1283{
1284    value_type* __t = __vp_;
1285    const value_type* __s = __sa.__vp_;
1286    for (size_t __n = __size_; __n; --__n, __t += __stride_, __s += __sa.__stride_)
1287        *__t = *__s;
1288    return *this;
1289}
1290
1291template <class _Tp>
1292template <class _Expr>
1293inline
1294typename enable_if
1295<
1296    __is_val_expr<_Expr>::value,
1297    void
1298>::type
1299slice_array<_Tp>::operator=(const _Expr& __v) const
1300{
1301    value_type* __t = __vp_;
1302    for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1303        *__t = __v[__i];
1304}
1305
1306template <class _Tp>
1307template <class _Expr>
1308inline
1309typename enable_if
1310<
1311    __is_val_expr<_Expr>::value,
1312    void
1313>::type
1314slice_array<_Tp>::operator*=(const _Expr& __v) const
1315{
1316    value_type* __t = __vp_;
1317    for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1318        *__t *= __v[__i];
1319}
1320
1321template <class _Tp>
1322template <class _Expr>
1323inline
1324typename enable_if
1325<
1326    __is_val_expr<_Expr>::value,
1327    void
1328>::type
1329slice_array<_Tp>::operator/=(const _Expr& __v) const
1330{
1331    value_type* __t = __vp_;
1332    for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1333        *__t /= __v[__i];
1334}
1335
1336template <class _Tp>
1337template <class _Expr>
1338inline
1339typename enable_if
1340<
1341    __is_val_expr<_Expr>::value,
1342    void
1343>::type
1344slice_array<_Tp>::operator%=(const _Expr& __v) const
1345{
1346    value_type* __t = __vp_;
1347    for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1348        *__t %= __v[__i];
1349}
1350
1351template <class _Tp>
1352template <class _Expr>
1353inline
1354typename enable_if
1355<
1356    __is_val_expr<_Expr>::value,
1357    void
1358>::type
1359slice_array<_Tp>::operator+=(const _Expr& __v) const
1360{
1361    value_type* __t = __vp_;
1362    for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1363        *__t += __v[__i];
1364}
1365
1366template <class _Tp>
1367template <class _Expr>
1368inline
1369typename enable_if
1370<
1371    __is_val_expr<_Expr>::value,
1372    void
1373>::type
1374slice_array<_Tp>::operator-=(const _Expr& __v) const
1375{
1376    value_type* __t = __vp_;
1377    for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1378        *__t -= __v[__i];
1379}
1380
1381template <class _Tp>
1382template <class _Expr>
1383inline
1384typename enable_if
1385<
1386    __is_val_expr<_Expr>::value,
1387    void
1388>::type
1389slice_array<_Tp>::operator^=(const _Expr& __v) const
1390{
1391    value_type* __t = __vp_;
1392    for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1393        *__t ^= __v[__i];
1394}
1395
1396template <class _Tp>
1397template <class _Expr>
1398inline
1399typename enable_if
1400<
1401    __is_val_expr<_Expr>::value,
1402    void
1403>::type
1404slice_array<_Tp>::operator&=(const _Expr& __v) const
1405{
1406    value_type* __t = __vp_;
1407    for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1408        *__t &= __v[__i];
1409}
1410
1411template <class _Tp>
1412template <class _Expr>
1413inline
1414typename enable_if
1415<
1416    __is_val_expr<_Expr>::value,
1417    void
1418>::type
1419slice_array<_Tp>::operator|=(const _Expr& __v) const
1420{
1421    value_type* __t = __vp_;
1422    for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1423        *__t |= __v[__i];
1424}
1425
1426template <class _Tp>
1427template <class _Expr>
1428inline
1429typename enable_if
1430<
1431    __is_val_expr<_Expr>::value,
1432    void
1433>::type
1434slice_array<_Tp>::operator<<=(const _Expr& __v) const
1435{
1436    value_type* __t = __vp_;
1437    for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1438        *__t <<= __v[__i];
1439}
1440
1441template <class _Tp>
1442template <class _Expr>
1443inline
1444typename enable_if
1445<
1446    __is_val_expr<_Expr>::value,
1447    void
1448>::type
1449slice_array<_Tp>::operator>>=(const _Expr& __v) const
1450{
1451    value_type* __t = __vp_;
1452    for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1453        *__t >>= __v[__i];
1454}
1455
1456template <class _Tp>
1457inline
1458void
1459slice_array<_Tp>::operator=(const value_type& __x) const
1460{
1461    value_type* __t = __vp_;
1462    for (size_t __n = __size_; __n; --__n, __t += __stride_)
1463        *__t = __x;
1464}
1465
1466// gslice
1467
1468class _LIBCPP_TYPE_VIS gslice
1469{
1470    valarray<size_t> __size_;
1471    valarray<size_t> __stride_;
1472    valarray<size_t> __1d_;
1473
1474public:
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
1524private:
1525    void __init(size_t __start);
1526
1527    template <class> friend class gslice_array;
1528    template <class> friend class valarray;
1529    template <class> friend class __val_expr;
1530};
1531
1532// gslice_array
1533
1534template <class _Tp>
1535class _LIBCPP_TEMPLATE_VIS gslice_array
1536{
1537public:
1538    typedef _Tp value_type;
1539
1540private:
1541    value_type*      __vp_;
1542    valarray<size_t> __1d_;
1543
1544public:
1545    template <class _Expr>
1546    typename enable_if
1547    <
1548        __is_val_expr<_Expr>::value,
1549        void
1550    >::type
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
1655private:
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
1671template <class _Tp>
1672template <class _Expr>
1673inline
1674typename enable_if
1675<
1676    __is_val_expr<_Expr>::value,
1677    void
1678>::type
1679gslice_array<_Tp>::operator=(const _Expr& __v) const
1680{
1681    typedef const size_t* _Ip;
1682    size_t __j = 0;
1683    for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1684        __vp_[*__i] = __v[__j];
1685}
1686
1687template <class _Tp>
1688template <class _Expr>
1689inline
1690typename enable_if
1691<
1692    __is_val_expr<_Expr>::value,
1693    void
1694>::type
1695gslice_array<_Tp>::operator*=(const _Expr& __v) const
1696{
1697    typedef const size_t* _Ip;
1698    size_t __j = 0;
1699    for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1700        __vp_[*__i] *= __v[__j];
1701}
1702
1703template <class _Tp>
1704template <class _Expr>
1705inline
1706typename enable_if
1707<
1708    __is_val_expr<_Expr>::value,
1709    void
1710>::type
1711gslice_array<_Tp>::operator/=(const _Expr& __v) const
1712{
1713    typedef const size_t* _Ip;
1714    size_t __j = 0;
1715    for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1716        __vp_[*__i] /= __v[__j];
1717}
1718
1719template <class _Tp>
1720template <class _Expr>
1721inline
1722typename enable_if
1723<
1724    __is_val_expr<_Expr>::value,
1725    void
1726>::type
1727gslice_array<_Tp>::operator%=(const _Expr& __v) const
1728{
1729    typedef const size_t* _Ip;
1730    size_t __j = 0;
1731    for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1732        __vp_[*__i] %= __v[__j];
1733}
1734
1735template <class _Tp>
1736template <class _Expr>
1737inline
1738typename enable_if
1739<
1740    __is_val_expr<_Expr>::value,
1741    void
1742>::type
1743gslice_array<_Tp>::operator+=(const _Expr& __v) const
1744{
1745    typedef const size_t* _Ip;
1746    size_t __j = 0;
1747    for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1748        __vp_[*__i] += __v[__j];
1749}
1750
1751template <class _Tp>
1752template <class _Expr>
1753inline
1754typename enable_if
1755<
1756    __is_val_expr<_Expr>::value,
1757    void
1758>::type
1759gslice_array<_Tp>::operator-=(const _Expr& __v) const
1760{
1761    typedef const size_t* _Ip;
1762    size_t __j = 0;
1763    for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1764        __vp_[*__i] -= __v[__j];
1765}
1766
1767template <class _Tp>
1768template <class _Expr>
1769inline
1770typename enable_if
1771<
1772    __is_val_expr<_Expr>::value,
1773    void
1774>::type
1775gslice_array<_Tp>::operator^=(const _Expr& __v) const
1776{
1777    typedef const size_t* _Ip;
1778    size_t __j = 0;
1779    for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1780        __vp_[*__i] ^= __v[__j];
1781}
1782
1783template <class _Tp>
1784template <class _Expr>
1785inline
1786typename enable_if
1787<
1788    __is_val_expr<_Expr>::value,
1789    void
1790>::type
1791gslice_array<_Tp>::operator&=(const _Expr& __v) const
1792{
1793    typedef const size_t* _Ip;
1794    size_t __j = 0;
1795    for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1796        __vp_[*__i] &= __v[__j];
1797}
1798
1799template <class _Tp>
1800template <class _Expr>
1801inline
1802typename enable_if
1803<
1804    __is_val_expr<_Expr>::value,
1805    void
1806>::type
1807gslice_array<_Tp>::operator|=(const _Expr& __v) const
1808{
1809    typedef const size_t* _Ip;
1810    size_t __j = 0;
1811    for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1812        __vp_[*__i] |= __v[__j];
1813}
1814
1815template <class _Tp>
1816template <class _Expr>
1817inline
1818typename enable_if
1819<
1820    __is_val_expr<_Expr>::value,
1821    void
1822>::type
1823gslice_array<_Tp>::operator<<=(const _Expr& __v) const
1824{
1825    typedef const size_t* _Ip;
1826    size_t __j = 0;
1827    for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1828        __vp_[*__i] <<= __v[__j];
1829}
1830
1831template <class _Tp>
1832template <class _Expr>
1833inline
1834typename enable_if
1835<
1836    __is_val_expr<_Expr>::value,
1837    void
1838>::type
1839gslice_array<_Tp>::operator>>=(const _Expr& __v) const
1840{
1841    typedef const size_t* _Ip;
1842    size_t __j = 0;
1843    for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1844        __vp_[*__i] >>= __v[__j];
1845}
1846
1847template <class _Tp>
1848inline
1849const gslice_array<_Tp>&
1850gslice_array<_Tp>::operator=(const gslice_array& __ga) const
1851{
1852    typedef const size_t* _Ip;
1853    const value_type* __s = __ga.__vp_;
1854    for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_, __j = __ga.__1d_.__begin_;
1855            __i != __e; ++__i, ++__j)
1856        __vp_[*__i] = __s[*__j];
1857    return *this;
1858}
1859
1860template <class _Tp>
1861inline
1862void
1863gslice_array<_Tp>::operator=(const value_type& __x) const
1864{
1865    typedef const size_t* _Ip;
1866    for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i)
1867        __vp_[*__i] = __x;
1868}
1869
1870// mask_array
1871
1872template <class _Tp>
1873class _LIBCPP_TEMPLATE_VIS mask_array
1874{
1875public:
1876    typedef _Tp value_type;
1877
1878private:
1879    value_type*      __vp_;
1880    valarray<size_t> __1d_;
1881
1882public:
1883    template <class _Expr>
1884    typename enable_if
1885    <
1886        __is_val_expr<_Expr>::value,
1887        void
1888    >::type
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
1993private:
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
2008template <class _Tp>
2009template <class _Expr>
2010inline
2011typename enable_if
2012<
2013    __is_val_expr<_Expr>::value,
2014    void
2015>::type
2016mask_array<_Tp>::operator=(const _Expr& __v) const
2017{
2018    size_t __n = __1d_.size();
2019    for (size_t __i = 0; __i < __n; ++__i)
2020        __vp_[__1d_[__i]] = __v[__i];
2021}
2022
2023template <class _Tp>
2024template <class _Expr>
2025inline
2026typename enable_if
2027<
2028    __is_val_expr<_Expr>::value,
2029    void
2030>::type
2031mask_array<_Tp>::operator*=(const _Expr& __v) const
2032{
2033    size_t __n = __1d_.size();
2034    for (size_t __i = 0; __i < __n; ++__i)
2035        __vp_[__1d_[__i]] *= __v[__i];
2036}
2037
2038template <class _Tp>
2039template <class _Expr>
2040inline
2041typename enable_if
2042<
2043    __is_val_expr<_Expr>::value,
2044    void
2045>::type
2046mask_array<_Tp>::operator/=(const _Expr& __v) const
2047{
2048    size_t __n = __1d_.size();
2049    for (size_t __i = 0; __i < __n; ++__i)
2050        __vp_[__1d_[__i]] /= __v[__i];
2051}
2052
2053template <class _Tp>
2054template <class _Expr>
2055inline
2056typename enable_if
2057<
2058    __is_val_expr<_Expr>::value,
2059    void
2060>::type
2061mask_array<_Tp>::operator%=(const _Expr& __v) const
2062{
2063    size_t __n = __1d_.size();
2064    for (size_t __i = 0; __i < __n; ++__i)
2065        __vp_[__1d_[__i]] %= __v[__i];
2066}
2067
2068template <class _Tp>
2069template <class _Expr>
2070inline
2071typename enable_if
2072<
2073    __is_val_expr<_Expr>::value,
2074    void
2075>::type
2076mask_array<_Tp>::operator+=(const _Expr& __v) const
2077{
2078    size_t __n = __1d_.size();
2079    for (size_t __i = 0; __i < __n; ++__i)
2080        __vp_[__1d_[__i]] += __v[__i];
2081}
2082
2083template <class _Tp>
2084template <class _Expr>
2085inline
2086typename enable_if
2087<
2088    __is_val_expr<_Expr>::value,
2089    void
2090>::type
2091mask_array<_Tp>::operator-=(const _Expr& __v) const
2092{
2093    size_t __n = __1d_.size();
2094    for (size_t __i = 0; __i < __n; ++__i)
2095        __vp_[__1d_[__i]] -= __v[__i];
2096}
2097
2098template <class _Tp>
2099template <class _Expr>
2100inline
2101typename enable_if
2102<
2103    __is_val_expr<_Expr>::value,
2104    void
2105>::type
2106mask_array<_Tp>::operator^=(const _Expr& __v) const
2107{
2108    size_t __n = __1d_.size();
2109    for (size_t __i = 0; __i < __n; ++__i)
2110        __vp_[__1d_[__i]] ^= __v[__i];
2111}
2112
2113template <class _Tp>
2114template <class _Expr>
2115inline
2116typename enable_if
2117<
2118    __is_val_expr<_Expr>::value,
2119    void
2120>::type
2121mask_array<_Tp>::operator&=(const _Expr& __v) const
2122{
2123    size_t __n = __1d_.size();
2124    for (size_t __i = 0; __i < __n; ++__i)
2125        __vp_[__1d_[__i]] &= __v[__i];
2126}
2127
2128template <class _Tp>
2129template <class _Expr>
2130inline
2131typename enable_if
2132<
2133    __is_val_expr<_Expr>::value,
2134    void
2135>::type
2136mask_array<_Tp>::operator|=(const _Expr& __v) const
2137{
2138    size_t __n = __1d_.size();
2139    for (size_t __i = 0; __i < __n; ++__i)
2140        __vp_[__1d_[__i]] |= __v[__i];
2141}
2142
2143template <class _Tp>
2144template <class _Expr>
2145inline
2146typename enable_if
2147<
2148    __is_val_expr<_Expr>::value,
2149    void
2150>::type
2151mask_array<_Tp>::operator<<=(const _Expr& __v) const
2152{
2153    size_t __n = __1d_.size();
2154    for (size_t __i = 0; __i < __n; ++__i)
2155        __vp_[__1d_[__i]] <<= __v[__i];
2156}
2157
2158template <class _Tp>
2159template <class _Expr>
2160inline
2161typename enable_if
2162<
2163    __is_val_expr<_Expr>::value,
2164    void
2165>::type
2166mask_array<_Tp>::operator>>=(const _Expr& __v) const
2167{
2168    size_t __n = __1d_.size();
2169    for (size_t __i = 0; __i < __n; ++__i)
2170        __vp_[__1d_[__i]] >>= __v[__i];
2171}
2172
2173template <class _Tp>
2174inline
2175const mask_array<_Tp>&
2176mask_array<_Tp>::operator=(const mask_array& __ma) const
2177{
2178    size_t __n = __1d_.size();
2179    for (size_t __i = 0; __i < __n; ++__i)
2180        __vp_[__1d_[__i]] = __ma.__vp_[__1d_[__i]];
2181    return *this;
2182}
2183
2184template <class _Tp>
2185inline
2186void
2187mask_array<_Tp>::operator=(const value_type& __x) const
2188{
2189    size_t __n = __1d_.size();
2190    for (size_t __i = 0; __i < __n; ++__i)
2191        __vp_[__1d_[__i]] = __x;
2192}
2193
2194template <class _ValExpr>
2195class __mask_expr
2196{
2197    typedef typename remove_reference<_ValExpr>::type  _RmExpr;
2198public:
2199    typedef typename _RmExpr::value_type value_type;
2200    typedef value_type result_type;
2201
2202private:
2203    _ValExpr __expr_;
2204    valarray<size_t> __1d_;
2205
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
2217public:
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
2230template <class _Tp>
2231class _LIBCPP_TEMPLATE_VIS indirect_array
2232{
2233public:
2234    typedef _Tp value_type;
2235
2236private:
2237    value_type*      __vp_;
2238    valarray<size_t> __1d_;
2239
2240public:
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
2351private:
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
2371template <class _Tp>
2372template <class _Expr>
2373inline
2374typename enable_if
2375<
2376    __is_val_expr<_Expr>::value,
2377    void
2378>::type
2379indirect_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
2386template <class _Tp>
2387template <class _Expr>
2388inline
2389typename enable_if
2390<
2391    __is_val_expr<_Expr>::value,
2392    void
2393>::type
2394indirect_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
2401template <class _Tp>
2402template <class _Expr>
2403inline
2404typename enable_if
2405<
2406    __is_val_expr<_Expr>::value,
2407    void
2408>::type
2409indirect_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
2416template <class _Tp>
2417template <class _Expr>
2418inline
2419typename enable_if
2420<
2421    __is_val_expr<_Expr>::value,
2422    void
2423>::type
2424indirect_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
2431template <class _Tp>
2432template <class _Expr>
2433inline
2434typename enable_if
2435<
2436    __is_val_expr<_Expr>::value,
2437    void
2438>::type
2439indirect_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
2446template <class _Tp>
2447template <class _Expr>
2448inline
2449typename enable_if
2450<
2451    __is_val_expr<_Expr>::value,
2452    void
2453>::type
2454indirect_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
2461template <class _Tp>
2462template <class _Expr>
2463inline
2464typename enable_if
2465<
2466    __is_val_expr<_Expr>::value,
2467    void
2468>::type
2469indirect_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
2476template <class _Tp>
2477template <class _Expr>
2478inline
2479typename enable_if
2480<
2481    __is_val_expr<_Expr>::value,
2482    void
2483>::type
2484indirect_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
2491template <class _Tp>
2492template <class _Expr>
2493inline
2494typename enable_if
2495<
2496    __is_val_expr<_Expr>::value,
2497    void
2498>::type
2499indirect_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
2506template <class _Tp>
2507template <class _Expr>
2508inline
2509typename enable_if
2510<
2511    __is_val_expr<_Expr>::value,
2512    void
2513>::type
2514indirect_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
2521template <class _Tp>
2522template <class _Expr>
2523inline
2524typename enable_if
2525<
2526    __is_val_expr<_Expr>::value,
2527    void
2528>::type
2529indirect_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
2536template <class _Tp>
2537inline
2538const indirect_array<_Tp>&
2539indirect_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
2549template <class _Tp>
2550inline
2551void
2552indirect_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
2559template <class _ValExpr>
2560class __indirect_expr
2561{
2562    typedef typename remove_reference<_ValExpr>::type  _RmExpr;
2563public:
2564    typedef typename _RmExpr::value_type value_type;
2565    typedef value_type result_type;
2566
2567private:
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
2587public:
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
2598template<class _ValExpr>
2599class __val_expr
2600{
2601    typedef typename remove_reference<_ValExpr>::type  _RmExpr;
2602
2603    _ValExpr __expr_;
2604public:
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
2733template<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), __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
2752template <class _Tp>
2753inline
2754valarray<_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), __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
2779template <class _Tp>
2780inline
2781valarray<_Tp>::valarray(const value_type& __x, size_t __n)
2782    : __begin_(0),
2783      __end_(0)
2784{
2785    resize(__n, __x);
2786}
2787
2788template <class _Tp>
2789valarray<_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), __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
2814template <class _Tp>
2815valarray<_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), __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
2842template <class _Tp>
2843inline
2844valarray<_Tp>::valarray(valarray&& __v) _NOEXCEPT
2845    : __begin_(__v.__begin_),
2846      __end_(__v.__end_)
2847{
2848    __v.__begin_ = __v.__end_ = nullptr;
2849}
2850
2851template <class _Tp>
2852valarray<_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), __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
2881template <class _Tp>
2882valarray<_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), __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
2909template <class _Tp>
2910valarray<_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), __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
2939template <class _Tp>
2940valarray<_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), __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
2969template <class _Tp>
2970valarray<_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), __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
2999template <class _Tp>
3000inline
3001valarray<_Tp>::~valarray()
3002{
3003    __clear(size());
3004}
3005
3006template <class _Tp>
3007valarray<_Tp>&
3008valarray<_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), __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
3024template <class _Tp>
3025valarray<_Tp>&
3026valarray<_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
3035template <class _Tp>
3036inline
3037valarray<_Tp>&
3038valarray<_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
3048template <class _Tp>
3049inline
3050valarray<_Tp>&
3051valarray<_Tp>::operator=(initializer_list<value_type> __il)
3052{
3053    return __assign_range(__il.begin(), __il.end());
3054}
3055
3056#endif  // _LIBCPP_CXX03_LANG
3057
3058template <class _Tp>
3059inline
3060valarray<_Tp>&
3061valarray<_Tp>::operator=(const value_type& __x)
3062{
3063    _VSTD::fill(__begin_, __end_, __x);
3064    return *this;
3065}
3066
3067template <class _Tp>
3068inline
3069valarray<_Tp>&
3070valarray<_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
3079template <class _Tp>
3080inline
3081valarray<_Tp>&
3082valarray<_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
3093template <class _Tp>
3094inline
3095valarray<_Tp>&
3096valarray<_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
3107template <class _Tp>
3108inline
3109valarray<_Tp>&
3110valarray<_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
3121template <class _Tp>
3122template <class _ValExpr>
3123inline
3124valarray<_Tp>&
3125valarray<_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
3136template <class _Tp>
3137inline
3138__val_expr<__slice_expr<const valarray<_Tp>&> >
3139valarray<_Tp>::operator[](slice __s) const
3140{
3141    return __val_expr<__slice_expr<const valarray&> >(__slice_expr<const valarray&>(__s, *this));
3142}
3143
3144template <class _Tp>
3145inline
3146slice_array<_Tp>
3147valarray<_Tp>::operator[](slice __s)
3148{
3149    return slice_array<value_type>(__s, *this);
3150}
3151
3152template <class _Tp>
3153inline
3154__val_expr<__indirect_expr<const valarray<_Tp>&> >
3155valarray<_Tp>::operator[](const gslice& __gs) const
3156{
3157    return __val_expr<__indirect_expr<const valarray&> >(__indirect_expr<const valarray&>(__gs.__1d_, *this));
3158}
3159
3160template <class _Tp>
3161inline
3162gslice_array<_Tp>
3163valarray<_Tp>::operator[](const gslice& __gs)
3164{
3165    return gslice_array<value_type>(__gs, *this);
3166}
3167
3168#ifndef _LIBCPP_CXX03_LANG
3169
3170template <class _Tp>
3171inline
3172__val_expr<__indirect_expr<const valarray<_Tp>&> >
3173valarray<_Tp>::operator[](gslice&& __gs) const
3174{
3175    return __val_expr<__indirect_expr<const valarray&> >(__indirect_expr<const valarray&>(move(__gs.__1d_), *this));
3176}
3177
3178template <class _Tp>
3179inline
3180gslice_array<_Tp>
3181valarray<_Tp>::operator[](gslice&& __gs)
3182{
3183    return gslice_array<value_type>(move(__gs), *this);
3184}
3185
3186#endif  // _LIBCPP_CXX03_LANG
3187
3188template <class _Tp>
3189inline
3190__val_expr<__mask_expr<const valarray<_Tp>&> >
3191valarray<_Tp>::operator[](const valarray<bool>& __vb) const
3192{
3193    return __val_expr<__mask_expr<const valarray&> >(__mask_expr<const valarray&>(__vb, *this));
3194}
3195
3196template <class _Tp>
3197inline
3198mask_array<_Tp>
3199valarray<_Tp>::operator[](const valarray<bool>& __vb)
3200{
3201    return mask_array<value_type>(__vb, *this);
3202}
3203
3204#ifndef _LIBCPP_CXX03_LANG
3205
3206template <class _Tp>
3207inline
3208__val_expr<__mask_expr<const valarray<_Tp>&> >
3209valarray<_Tp>::operator[](valarray<bool>&& __vb) const
3210{
3211    return __val_expr<__mask_expr<const valarray&> >(__mask_expr<const valarray&>(move(__vb), *this));
3212}
3213
3214template <class _Tp>
3215inline
3216mask_array<_Tp>
3217valarray<_Tp>::operator[](valarray<bool>&& __vb)
3218{
3219    return mask_array<value_type>(move(__vb), *this);
3220}
3221
3222#endif  // _LIBCPP_CXX03_LANG
3223
3224template <class _Tp>
3225inline
3226__val_expr<__indirect_expr<const valarray<_Tp>&> >
3227valarray<_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
3232template <class _Tp>
3233inline
3234indirect_array<_Tp>
3235valarray<_Tp>::operator[](const valarray<size_t>& __vs)
3236{
3237    return indirect_array<value_type>(__vs, *this);
3238}
3239
3240#ifndef _LIBCPP_CXX03_LANG
3241
3242template <class _Tp>
3243inline
3244__val_expr<__indirect_expr<const valarray<_Tp>&> >
3245valarray<_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
3250template <class _Tp>
3251inline
3252indirect_array<_Tp>
3253valarray<_Tp>::operator[](valarray<size_t>&& __vs)
3254{
3255    return indirect_array<value_type>(move(__vs), *this);
3256}
3257
3258#endif  // _LIBCPP_CXX03_LANG
3259
3260template <class _Tp>
3261valarray<_Tp>
3262valarray<_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), __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
3278template <class _Tp>
3279valarray<_Tp>
3280valarray<_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), __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
3296template <class _Tp>
3297valarray<_Tp>
3298valarray<_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), __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
3314template <class _Tp>
3315valarray<bool>
3316valarray<_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), __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
3331template <class _Tp>
3332inline
3333valarray<_Tp>&
3334valarray<_Tp>::operator*=(const value_type& __x)
3335{
3336    for (value_type* __p = __begin_; __p != __end_; ++__p)
3337        *__p *= __x;
3338    return *this;
3339}
3340
3341template <class _Tp>
3342inline
3343valarray<_Tp>&
3344valarray<_Tp>::operator/=(const value_type& __x)
3345{
3346    for (value_type* __p = __begin_; __p != __end_; ++__p)
3347        *__p /= __x;
3348    return *this;
3349}
3350
3351template <class _Tp>
3352inline
3353valarray<_Tp>&
3354valarray<_Tp>::operator%=(const value_type& __x)
3355{
3356    for (value_type* __p = __begin_; __p != __end_; ++__p)
3357        *__p %= __x;
3358    return *this;
3359}
3360
3361template <class _Tp>
3362inline
3363valarray<_Tp>&
3364valarray<_Tp>::operator+=(const value_type& __x)
3365{
3366    for (value_type* __p = __begin_; __p != __end_; ++__p)
3367        *__p += __x;
3368    return *this;
3369}
3370
3371template <class _Tp>
3372inline
3373valarray<_Tp>&
3374valarray<_Tp>::operator-=(const value_type& __x)
3375{
3376    for (value_type* __p = __begin_; __p != __end_; ++__p)
3377        *__p -= __x;
3378    return *this;
3379}
3380
3381template <class _Tp>
3382inline
3383valarray<_Tp>&
3384valarray<_Tp>::operator^=(const value_type& __x)
3385{
3386    for (value_type* __p = __begin_; __p != __end_; ++__p)
3387        *__p ^= __x;
3388    return *this;
3389}
3390
3391template <class _Tp>
3392inline
3393valarray<_Tp>&
3394valarray<_Tp>::operator&=(const value_type& __x)
3395{
3396    for (value_type* __p = __begin_; __p != __end_; ++__p)
3397        *__p &= __x;
3398    return *this;
3399}
3400
3401template <class _Tp>
3402inline
3403valarray<_Tp>&
3404valarray<_Tp>::operator|=(const value_type& __x)
3405{
3406    for (value_type* __p = __begin_; __p != __end_; ++__p)
3407        *__p |= __x;
3408    return *this;
3409}
3410
3411template <class _Tp>
3412inline
3413valarray<_Tp>&
3414valarray<_Tp>::operator<<=(const value_type& __x)
3415{
3416    for (value_type* __p = __begin_; __p != __end_; ++__p)
3417        *__p <<= __x;
3418    return *this;
3419}
3420
3421template <class _Tp>
3422inline
3423valarray<_Tp>&
3424valarray<_Tp>::operator>>=(const value_type& __x)
3425{
3426    for (value_type* __p = __begin_; __p != __end_; ++__p)
3427        *__p >>= __x;
3428    return *this;
3429}
3430
3431template <class _Tp>
3432template <class _Expr>
3433inline
3434typename enable_if
3435<
3436    __is_val_expr<_Expr>::value,
3437    valarray<_Tp>&
3438>::type
3439valarray<_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
3447template <class _Tp>
3448template <class _Expr>
3449inline
3450typename enable_if
3451<
3452    __is_val_expr<_Expr>::value,
3453    valarray<_Tp>&
3454>::type
3455valarray<_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
3463template <class _Tp>
3464template <class _Expr>
3465inline
3466typename enable_if
3467<
3468    __is_val_expr<_Expr>::value,
3469    valarray<_Tp>&
3470>::type
3471valarray<_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
3479template <class _Tp>
3480template <class _Expr>
3481inline
3482typename enable_if
3483<
3484    __is_val_expr<_Expr>::value,
3485    valarray<_Tp>&
3486>::type
3487valarray<_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
3495template <class _Tp>
3496template <class _Expr>
3497inline
3498typename enable_if
3499<
3500    __is_val_expr<_Expr>::value,
3501    valarray<_Tp>&
3502>::type
3503valarray<_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
3511template <class _Tp>
3512template <class _Expr>
3513inline
3514typename enable_if
3515<
3516    __is_val_expr<_Expr>::value,
3517    valarray<_Tp>&
3518>::type
3519valarray<_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
3527template <class _Tp>
3528template <class _Expr>
3529inline
3530typename enable_if
3531<
3532    __is_val_expr<_Expr>::value,
3533    valarray<_Tp>&
3534>::type
3535valarray<_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
3543template <class _Tp>
3544template <class _Expr>
3545inline
3546typename enable_if
3547<
3548    __is_val_expr<_Expr>::value,
3549    valarray<_Tp>&
3550>::type
3551valarray<_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
3559template <class _Tp>
3560template <class _Expr>
3561inline
3562typename enable_if
3563<
3564    __is_val_expr<_Expr>::value,
3565    valarray<_Tp>&
3566>::type
3567valarray<_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
3575template <class _Tp>
3576template <class _Expr>
3577inline
3578typename enable_if
3579<
3580    __is_val_expr<_Expr>::value,
3581    valarray<_Tp>&
3582>::type
3583valarray<_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
3591template <class _Tp>
3592inline
3593void
3594valarray<_Tp>::swap(valarray& __v) _NOEXCEPT
3595{
3596    _VSTD::swap(__begin_, __v.__begin_);
3597    _VSTD::swap(__end_, __v.__end_);
3598}
3599
3600template <class _Tp>
3601inline
3602_Tp
3603valarray<_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
3614template <class _Tp>
3615inline
3616_Tp
3617valarray<_Tp>::min() const
3618{
3619    if (__begin_ == __end_)
3620        return value_type();
3621    return *_VSTD::min_element(__begin_, __end_);
3622}
3623
3624template <class _Tp>
3625inline
3626_Tp
3627valarray<_Tp>::max() const
3628{
3629    if (__begin_ == __end_)
3630        return value_type();
3631    return *_VSTD::max_element(__begin_, __end_);
3632}
3633
3634template <class _Tp>
3635valarray<_Tp>
3636valarray<_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), __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
3673template <class _Tp>
3674valarray<_Tp>
3675valarray<_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), __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
3695template <class _Tp>
3696valarray<_Tp>
3697valarray<_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), __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
3713template <class _Tp>
3714valarray<_Tp>
3715valarray<_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), __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
3731template <class _Tp>
3732inline
3733void 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), __alignof(value_type));
3740    __begin_ = __end_ = nullptr;
3741  }
3742}
3743
3744template <class _Tp>
3745void
3746valarray<_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), __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
3770template<class _Tp>
3771inline _LIBCPP_INLINE_VISIBILITY
3772void
3773swap(valarray<_Tp>& __x, valarray<_Tp>& __y) _NOEXCEPT
3774{
3775    __x.swap(__y);
3776}
3777
3778template<class _Expr1, class _Expr2>
3779inline _LIBCPP_INLINE_VISIBILITY
3780typename 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
3785operator*(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
3792template<class _Expr>
3793inline _LIBCPP_INLINE_VISIBILITY
3794typename 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
3800operator*(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
3808template<class _Expr>
3809inline _LIBCPP_INLINE_VISIBILITY
3810typename 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
3816operator*(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
3824template<class _Expr1, class _Expr2>
3825inline _LIBCPP_INLINE_VISIBILITY
3826typename 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
3831operator/(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
3838template<class _Expr>
3839inline _LIBCPP_INLINE_VISIBILITY
3840typename 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
3846operator/(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
3854template<class _Expr>
3855inline _LIBCPP_INLINE_VISIBILITY
3856typename 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
3862operator/(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
3870template<class _Expr1, class _Expr2>
3871inline _LIBCPP_INLINE_VISIBILITY
3872typename 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
3877operator%(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
3884template<class _Expr>
3885inline _LIBCPP_INLINE_VISIBILITY
3886typename 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
3892operator%(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
3900template<class _Expr>
3901inline _LIBCPP_INLINE_VISIBILITY
3902typename 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
3908operator%(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
3916template<class _Expr1, class _Expr2>
3917inline _LIBCPP_INLINE_VISIBILITY
3918typename 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
3923operator+(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
3930template<class _Expr>
3931inline _LIBCPP_INLINE_VISIBILITY
3932typename 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
3938operator+(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
3946template<class _Expr>
3947inline _LIBCPP_INLINE_VISIBILITY
3948typename 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
3954operator+(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
3962template<class _Expr1, class _Expr2>
3963inline _LIBCPP_INLINE_VISIBILITY
3964typename 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
3969operator-(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
3976template<class _Expr>
3977inline _LIBCPP_INLINE_VISIBILITY
3978typename 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
3984operator-(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
3992template<class _Expr>
3993inline _LIBCPP_INLINE_VISIBILITY
3994typename 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
4000operator-(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
4008template<class _Expr1, class _Expr2>
4009inline _LIBCPP_INLINE_VISIBILITY
4010typename 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
4015operator^(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
4022template<class _Expr>
4023inline _LIBCPP_INLINE_VISIBILITY
4024typename 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
4030operator^(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
4038template<class _Expr>
4039inline _LIBCPP_INLINE_VISIBILITY
4040typename 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
4046operator^(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
4054template<class _Expr1, class _Expr2>
4055inline _LIBCPP_INLINE_VISIBILITY
4056typename 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
4061operator&(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
4068template<class _Expr>
4069inline _LIBCPP_INLINE_VISIBILITY
4070typename 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
4076operator&(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
4084template<class _Expr>
4085inline _LIBCPP_INLINE_VISIBILITY
4086typename 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
4092operator&(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
4100template<class _Expr1, class _Expr2>
4101inline _LIBCPP_INLINE_VISIBILITY
4102typename 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
4107operator|(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
4114template<class _Expr>
4115inline _LIBCPP_INLINE_VISIBILITY
4116typename 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
4122operator|(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
4130template<class _Expr>
4131inline _LIBCPP_INLINE_VISIBILITY
4132typename 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
4138operator|(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
4146template<class _Expr1, class _Expr2>
4147inline _LIBCPP_INLINE_VISIBILITY
4148typename 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
4153operator<<(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
4160template<class _Expr>
4161inline _LIBCPP_INLINE_VISIBILITY
4162typename 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
4168operator<<(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
4176template<class _Expr>
4177inline _LIBCPP_INLINE_VISIBILITY
4178typename 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
4184operator<<(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
4192template<class _Expr1, class _Expr2>
4193inline _LIBCPP_INLINE_VISIBILITY
4194typename 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
4199operator>>(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
4206template<class _Expr>
4207inline _LIBCPP_INLINE_VISIBILITY
4208typename 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
4214operator>>(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
4222template<class _Expr>
4223inline _LIBCPP_INLINE_VISIBILITY
4224typename 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
4230operator>>(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
4238template<class _Expr1, class _Expr2>
4239inline _LIBCPP_INLINE_VISIBILITY
4240typename 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
4245operator&&(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
4252template<class _Expr>
4253inline _LIBCPP_INLINE_VISIBILITY
4254typename 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
4260operator&&(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
4268template<class _Expr>
4269inline _LIBCPP_INLINE_VISIBILITY
4270typename 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
4276operator&&(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
4284template<class _Expr1, class _Expr2>
4285inline _LIBCPP_INLINE_VISIBILITY
4286typename 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
4291operator||(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
4298template<class _Expr>
4299inline _LIBCPP_INLINE_VISIBILITY
4300typename 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
4306operator||(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
4314template<class _Expr>
4315inline _LIBCPP_INLINE_VISIBILITY
4316typename 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
4322operator||(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
4330template<class _Expr1, class _Expr2>
4331inline _LIBCPP_INLINE_VISIBILITY
4332typename 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
4337operator==(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
4344template<class _Expr>
4345inline _LIBCPP_INLINE_VISIBILITY
4346typename 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
4352operator==(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
4360template<class _Expr>
4361inline _LIBCPP_INLINE_VISIBILITY
4362typename 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
4368operator==(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
4376template<class _Expr1, class _Expr2>
4377inline _LIBCPP_INLINE_VISIBILITY
4378typename 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
4383operator!=(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
4390template<class _Expr>
4391inline _LIBCPP_INLINE_VISIBILITY
4392typename 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
4398operator!=(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
4406template<class _Expr>
4407inline _LIBCPP_INLINE_VISIBILITY
4408typename 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
4414operator!=(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
4422template<class _Expr1, class _Expr2>
4423inline _LIBCPP_INLINE_VISIBILITY
4424typename 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
4429operator<(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
4436template<class _Expr>
4437inline _LIBCPP_INLINE_VISIBILITY
4438typename 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
4444operator<(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
4452template<class _Expr>
4453inline _LIBCPP_INLINE_VISIBILITY
4454typename 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
4460operator<(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
4468template<class _Expr1, class _Expr2>
4469inline _LIBCPP_INLINE_VISIBILITY
4470typename 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
4475operator>(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
4482template<class _Expr>
4483inline _LIBCPP_INLINE_VISIBILITY
4484typename 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
4490operator>(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
4498template<class _Expr>
4499inline _LIBCPP_INLINE_VISIBILITY
4500typename 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
4506operator>(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
4514template<class _Expr1, class _Expr2>
4515inline _LIBCPP_INLINE_VISIBILITY
4516typename 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
4521operator<=(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
4528template<class _Expr>
4529inline _LIBCPP_INLINE_VISIBILITY
4530typename 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
4536operator<=(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
4544template<class _Expr>
4545inline _LIBCPP_INLINE_VISIBILITY
4546typename 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
4552operator<=(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
4560template<class _Expr1, class _Expr2>
4561inline _LIBCPP_INLINE_VISIBILITY
4562typename 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
4567operator>=(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
4574template<class _Expr>
4575inline _LIBCPP_INLINE_VISIBILITY
4576typename 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
4582operator>=(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
4590template<class _Expr>
4591inline _LIBCPP_INLINE_VISIBILITY
4592typename 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
4598operator>=(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
4606template<class _Expr>
4607inline _LIBCPP_INLINE_VISIBILITY
4608typename enable_if
4609<
4610    __is_val_expr<_Expr>::value,
4611    __val_expr<_UnaryOp<__abs_expr<typename _Expr::value_type>, _Expr> >
4612>::type
4613abs(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
4620template<class _Expr>
4621inline _LIBCPP_INLINE_VISIBILITY
4622typename enable_if
4623<
4624    __is_val_expr<_Expr>::value,
4625    __val_expr<_UnaryOp<__acos_expr<typename _Expr::value_type>, _Expr> >
4626>::type
4627acos(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
4634template<class _Expr>
4635inline _LIBCPP_INLINE_VISIBILITY
4636typename enable_if
4637<
4638    __is_val_expr<_Expr>::value,
4639    __val_expr<_UnaryOp<__asin_expr<typename _Expr::value_type>, _Expr> >
4640>::type
4641asin(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
4648template<class _Expr>
4649inline _LIBCPP_INLINE_VISIBILITY
4650typename enable_if
4651<
4652    __is_val_expr<_Expr>::value,
4653    __val_expr<_UnaryOp<__atan_expr<typename _Expr::value_type>, _Expr> >
4654>::type
4655atan(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
4662template<class _Expr1, class _Expr2>
4663inline _LIBCPP_INLINE_VISIBILITY
4664typename 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
4669atan2(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
4676template<class _Expr>
4677inline _LIBCPP_INLINE_VISIBILITY
4678typename 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
4684atan2(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
4692template<class _Expr>
4693inline _LIBCPP_INLINE_VISIBILITY
4694typename 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
4700atan2(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
4708template<class _Expr>
4709inline _LIBCPP_INLINE_VISIBILITY
4710typename enable_if
4711<
4712    __is_val_expr<_Expr>::value,
4713    __val_expr<_UnaryOp<__cos_expr<typename _Expr::value_type>, _Expr> >
4714>::type
4715cos(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
4722template<class _Expr>
4723inline _LIBCPP_INLINE_VISIBILITY
4724typename enable_if
4725<
4726    __is_val_expr<_Expr>::value,
4727    __val_expr<_UnaryOp<__cosh_expr<typename _Expr::value_type>, _Expr> >
4728>::type
4729cosh(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
4736template<class _Expr>
4737inline _LIBCPP_INLINE_VISIBILITY
4738typename enable_if
4739<
4740    __is_val_expr<_Expr>::value,
4741    __val_expr<_UnaryOp<__exp_expr<typename _Expr::value_type>, _Expr> >
4742>::type
4743exp(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
4750template<class _Expr>
4751inline _LIBCPP_INLINE_VISIBILITY
4752typename enable_if
4753<
4754    __is_val_expr<_Expr>::value,
4755    __val_expr<_UnaryOp<__log_expr<typename _Expr::value_type>, _Expr> >
4756>::type
4757log(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
4764template<class _Expr>
4765inline _LIBCPP_INLINE_VISIBILITY
4766typename enable_if
4767<
4768    __is_val_expr<_Expr>::value,
4769    __val_expr<_UnaryOp<__log10_expr<typename _Expr::value_type>, _Expr> >
4770>::type
4771log10(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
4778template<class _Expr1, class _Expr2>
4779inline _LIBCPP_INLINE_VISIBILITY
4780typename 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
4785pow(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
4792template<class _Expr>
4793inline _LIBCPP_INLINE_VISIBILITY
4794typename 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
4800pow(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
4808template<class _Expr>
4809inline _LIBCPP_INLINE_VISIBILITY
4810typename 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
4816pow(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
4824template<class _Expr>
4825inline _LIBCPP_INLINE_VISIBILITY
4826typename enable_if
4827<
4828    __is_val_expr<_Expr>::value,
4829    __val_expr<_UnaryOp<__sin_expr<typename _Expr::value_type>, _Expr> >
4830>::type
4831sin(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
4838template<class _Expr>
4839inline _LIBCPP_INLINE_VISIBILITY
4840typename enable_if
4841<
4842    __is_val_expr<_Expr>::value,
4843    __val_expr<_UnaryOp<__sinh_expr<typename _Expr::value_type>, _Expr> >
4844>::type
4845sinh(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
4852template<class _Expr>
4853inline _LIBCPP_INLINE_VISIBILITY
4854typename enable_if
4855<
4856    __is_val_expr<_Expr>::value,
4857    __val_expr<_UnaryOp<__sqrt_expr<typename _Expr::value_type>, _Expr> >
4858>::type
4859sqrt(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
4866template<class _Expr>
4867inline _LIBCPP_INLINE_VISIBILITY
4868typename enable_if
4869<
4870    __is_val_expr<_Expr>::value,
4871    __val_expr<_UnaryOp<__tan_expr<typename _Expr::value_type>, _Expr> >
4872>::type
4873tan(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
4880template<class _Expr>
4881inline _LIBCPP_INLINE_VISIBILITY
4882typename enable_if
4883<
4884    __is_val_expr<_Expr>::value,
4885    __val_expr<_UnaryOp<__tanh_expr<typename _Expr::value_type>, _Expr> >
4886>::type
4887tanh(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
4894template <class _Tp>
4895inline _LIBCPP_INLINE_VISIBILITY
4896_Tp*
4897begin(valarray<_Tp>& __v)
4898{
4899    return __v.__begin_;
4900}
4901
4902template <class _Tp>
4903inline _LIBCPP_INLINE_VISIBILITY
4904const _Tp*
4905begin(const valarray<_Tp>& __v)
4906{
4907    return __v.__begin_;
4908}
4909
4910template <class _Tp>
4911inline _LIBCPP_INLINE_VISIBILITY
4912_Tp*
4913end(valarray<_Tp>& __v)
4914{
4915    return __v.__end_;
4916}
4917
4918template <class _Tp>
4919inline _LIBCPP_INLINE_VISIBILITY
4920const _Tp*
4921end(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
4931