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