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