// -*- C++ -*-
//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#ifndef _LIBCPP_VALARRAY
#define _LIBCPP_VALARRAY

/*
    valarray synopsis

namespace std
{

template<class T>
class valarray
{
public:
    typedef T value_type;

    // construct/destroy:
    valarray();
    explicit valarray(size_t n);
    valarray(const value_type& x, size_t n);
    valarray(const value_type* px, size_t n);
    valarray(const valarray& v);
    valarray(valarray&& v) noexcept;
    valarray(const slice_array<value_type>& sa);
    valarray(const gslice_array<value_type>& ga);
    valarray(const mask_array<value_type>& ma);
    valarray(const indirect_array<value_type>& ia);
    valarray(initializer_list<value_type> il);
    ~valarray();

    // assignment:
    valarray& operator=(const valarray& v);
    valarray& operator=(valarray&& v) noexcept;
    valarray& operator=(initializer_list<value_type> il);
    valarray& operator=(const value_type& x);
    valarray& operator=(const slice_array<value_type>& sa);
    valarray& operator=(const gslice_array<value_type>& ga);
    valarray& operator=(const mask_array<value_type>& ma);
    valarray& operator=(const indirect_array<value_type>& ia);

    // element access:
    const value_type& operator[](size_t i) const;
    value_type&       operator[](size_t i);

    // subset operations:
    valarray                   operator[](slice s) const;
    slice_array<value_type>    operator[](slice s);
    valarray                   operator[](const gslice& gs) const;
    gslice_array<value_type>   operator[](const gslice& gs);
    valarray                   operator[](const valarray<bool>& vb) const;
    mask_array<value_type>     operator[](const valarray<bool>& vb);
    valarray                   operator[](const valarray<size_t>& vs) const;
    indirect_array<value_type> operator[](const valarray<size_t>& vs);

    // unary operators:
    valarray       operator+() const;
    valarray       operator-() const;
    valarray       operator~() const;
    valarray<bool> operator!() const;

    // computed assignment:
    valarray& operator*= (const value_type& x);
    valarray& operator/= (const value_type& x);
    valarray& operator%= (const value_type& x);
    valarray& operator+= (const value_type& x);
    valarray& operator-= (const value_type& x);
    valarray& operator^= (const value_type& x);
    valarray& operator&= (const value_type& x);
    valarray& operator|= (const value_type& x);
    valarray& operator<<=(const value_type& x);
    valarray& operator>>=(const value_type& x);

    valarray& operator*= (const valarray& v);
    valarray& operator/= (const valarray& v);
    valarray& operator%= (const valarray& v);
    valarray& operator+= (const valarray& v);
    valarray& operator-= (const valarray& v);
    valarray& operator^= (const valarray& v);
    valarray& operator|= (const valarray& v);
    valarray& operator&= (const valarray& v);
    valarray& operator<<=(const valarray& v);
    valarray& operator>>=(const valarray& v);

    // member functions:
    void swap(valarray& v) noexcept;

    size_t size() const;

    value_type sum() const;
    value_type min() const;
    value_type max() const;

    valarray shift (int i) const;
    valarray cshift(int i) const;
    valarray apply(value_type f(value_type)) const;
    valarray apply(value_type f(const value_type&)) const;
    void resize(size_t n, value_type x = value_type());
};

template<class T, size_t cnt> valarray(const T(&)[cnt], size_t) -> valarray<T>;

class slice
{
public:
    slice();
    slice(size_t start, size_t size, size_t stride);

    size_t start()  const;
    size_t size()   const;
    size_t stride() const;

    friend bool operator==(const slice& x, const slice& y); // since C++20
};

template <class T>
class slice_array
{
public:
    typedef T value_type;

    const slice_array& operator=(const slice_array& sa) const;
    void operator=  (const valarray<value_type>& v) const;
    void operator*= (const valarray<value_type>& v) const;
    void operator/= (const valarray<value_type>& v) const;
    void operator%= (const valarray<value_type>& v) const;
    void operator+= (const valarray<value_type>& v) const;
    void operator-= (const valarray<value_type>& v) const;
    void operator^= (const valarray<value_type>& v) const;
    void operator&= (const valarray<value_type>& v) const;
    void operator|= (const valarray<value_type>& v) const;
    void operator<<=(const valarray<value_type>& v) const;
    void operator>>=(const valarray<value_type>& v) const;

    void operator=(const value_type& x) const;
    void operator=(const valarray<T>& val_arr) const;

    slice_array() = delete;
};

class gslice
{
public:
    gslice();
    gslice(size_t start, const valarray<size_t>& size,
                         const valarray<size_t>& stride);

    size_t           start()  const;
    valarray<size_t> size()   const;
    valarray<size_t> stride() const;
};

template <class T>
class gslice_array
{
public:
    typedef T value_type;

    void operator=  (const valarray<value_type>& v) const;
    void operator*= (const valarray<value_type>& v) const;
    void operator/= (const valarray<value_type>& v) const;
    void operator%= (const valarray<value_type>& v) const;
    void operator+= (const valarray<value_type>& v) const;
    void operator-= (const valarray<value_type>& v) const;
    void operator^= (const valarray<value_type>& v) const;
    void operator&= (const valarray<value_type>& v) const;
    void operator|= (const valarray<value_type>& v) const;
    void operator<<=(const valarray<value_type>& v) const;
    void operator>>=(const valarray<value_type>& v) const;

    gslice_array(const gslice_array& ga);
    ~gslice_array();
    const gslice_array& operator=(const gslice_array& ga) const;
    void operator=(const value_type& x) const;

    gslice_array() = delete;
};

template <class T>
class mask_array
{
public:
    typedef T value_type;

    void operator=  (const valarray<value_type>& v) const;
    void operator*= (const valarray<value_type>& v) const;
    void operator/= (const valarray<value_type>& v) const;
    void operator%= (const valarray<value_type>& v) const;
    void operator+= (const valarray<value_type>& v) const;
    void operator-= (const valarray<value_type>& v) const;
    void operator^= (const valarray<value_type>& v) const;
    void operator&= (const valarray<value_type>& v) const;
    void operator|= (const valarray<value_type>& v) const;
    void operator<<=(const valarray<value_type>& v) const;
    void operator>>=(const valarray<value_type>& v) const;

    mask_array(const mask_array& ma);
    ~mask_array();
    const mask_array& operator=(const mask_array& ma) const;
    void operator=(const value_type& x) const;

    mask_array() = delete;
};

template <class T>
class indirect_array
{
public:
    typedef T value_type;

    void operator=  (const valarray<value_type>& v) const;
    void operator*= (const valarray<value_type>& v) const;
    void operator/= (const valarray<value_type>& v) const;
    void operator%= (const valarray<value_type>& v) const;
    void operator+= (const valarray<value_type>& v) const;
    void operator-= (const valarray<value_type>& v) const;
    void operator^= (const valarray<value_type>& v) const;
    void operator&= (const valarray<value_type>& v) const;
    void operator|= (const valarray<value_type>& v) const;
    void operator<<=(const valarray<value_type>& v) const;
    void operator>>=(const valarray<value_type>& v) const;

    indirect_array(const indirect_array& ia);
    ~indirect_array();
    const indirect_array& operator=(const indirect_array& ia) const;
    void operator=(const value_type& x) const;

    indirect_array() = delete;
};

template<class T> void swap(valarray<T>& x, valarray<T>& y) noexcept;

template<class T> valarray<T> operator* (const valarray<T>& x, const valarray<T>& y);
template<class T> valarray<T> operator* (const valarray<T>& x, const T& y);
template<class T> valarray<T> operator* (const T& x, const valarray<T>& y);

template<class T> valarray<T> operator/ (const valarray<T>& x, const valarray<T>& y);
template<class T> valarray<T> operator/ (const valarray<T>& x, const T& y);
template<class T> valarray<T> operator/ (const T& x, const valarray<T>& y);

template<class T> valarray<T> operator% (const valarray<T>& x, const valarray<T>& y);
template<class T> valarray<T> operator% (const valarray<T>& x, const T& y);
template<class T> valarray<T> operator% (const T& x, const valarray<T>& y);

template<class T> valarray<T> operator+ (const valarray<T>& x, const valarray<T>& y);
template<class T> valarray<T> operator+ (const valarray<T>& x, const T& y);
template<class T> valarray<T> operator+ (const T& x, const valarray<T>& y);

template<class T> valarray<T> operator- (const valarray<T>& x, const valarray<T>& y);
template<class T> valarray<T> operator- (const valarray<T>& x, const T& y);
template<class T> valarray<T> operator- (const T& x, const valarray<T>& y);

template<class T> valarray<T> operator^ (const valarray<T>& x, const valarray<T>& y);
template<class T> valarray<T> operator^ (const valarray<T>& x, const T& y);
template<class T> valarray<T> operator^ (const T& x, const valarray<T>& y);

template<class T> valarray<T> operator& (const valarray<T>& x, const valarray<T>& y);
template<class T> valarray<T> operator& (const valarray<T>& x, const T& y);
template<class T> valarray<T> operator& (const T& x, const valarray<T>& y);

template<class T> valarray<T> operator| (const valarray<T>& x, const valarray<T>& y);
template<class T> valarray<T> operator| (const valarray<T>& x, const T& y);
template<class T> valarray<T> operator| (const T& x, const valarray<T>& y);

template<class T> valarray<T> operator<<(const valarray<T>& x, const valarray<T>& y);
template<class T> valarray<T> operator<<(const valarray<T>& x, const T& y);
template<class T> valarray<T> operator<<(const T& x, const valarray<T>& y);

template<class T> valarray<T> operator>>(const valarray<T>& x, const valarray<T>& y);
template<class T> valarray<T> operator>>(const valarray<T>& x, const T& y);
template<class T> valarray<T> operator>>(const T& x, const valarray<T>& y);

template<class T> valarray<bool> operator&&(const valarray<T>& x, const valarray<T>& y);
template<class T> valarray<bool> operator&&(const valarray<T>& x, const T& y);
template<class T> valarray<bool> operator&&(const T& x, const valarray<T>& y);

template<class T> valarray<bool> operator||(const valarray<T>& x, const valarray<T>& y);
template<class T> valarray<bool> operator||(const valarray<T>& x, const T& y);
template<class T> valarray<bool> operator||(const T& x, const valarray<T>& y);

template<class T> valarray<bool> operator==(const valarray<T>& x, const valarray<T>& y);
template<class T> valarray<bool> operator==(const valarray<T>& x, const T& y);
template<class T> valarray<bool> operator==(const T& x, const valarray<T>& y);

template<class T> valarray<bool> operator!=(const valarray<T>& x, const valarray<T>& y);
template<class T> valarray<bool> operator!=(const valarray<T>& x, const T& y);
template<class T> valarray<bool> operator!=(const T& x, const valarray<T>& y);

template<class T> valarray<bool> operator< (const valarray<T>& x, const valarray<T>& y);
template<class T> valarray<bool> operator< (const valarray<T>& x, const T& y);
template<class T> valarray<bool> operator< (const T& x, const valarray<T>& y);

template<class T> valarray<bool> operator> (const valarray<T>& x, const valarray<T>& y);
template<class T> valarray<bool> operator> (const valarray<T>& x, const T& y);
template<class T> valarray<bool> operator> (const T& x, const valarray<T>& y);

template<class T> valarray<bool> operator<=(const valarray<T>& x, const valarray<T>& y);
template<class T> valarray<bool> operator<=(const valarray<T>& x, const T& y);
template<class T> valarray<bool> operator<=(const T& x, const valarray<T>& y);

template<class T> valarray<bool> operator>=(const valarray<T>& x, const valarray<T>& y);
template<class T> valarray<bool> operator>=(const valarray<T>& x, const T& y);
template<class T> valarray<bool> operator>=(const T& x, const valarray<T>& y);

template<class T> valarray<T> abs (const valarray<T>& x);
template<class T> valarray<T> acos (const valarray<T>& x);
template<class T> valarray<T> asin (const valarray<T>& x);
template<class T> valarray<T> atan (const valarray<T>& x);

template<class T> valarray<T> atan2(const valarray<T>& x, const valarray<T>& y);
template<class T> valarray<T> atan2(const valarray<T>& x, const T& y);
template<class T> valarray<T> atan2(const T& x, const valarray<T>& y);

template<class T> valarray<T> cos (const valarray<T>& x);
template<class T> valarray<T> cosh (const valarray<T>& x);
template<class T> valarray<T> exp (const valarray<T>& x);
template<class T> valarray<T> log (const valarray<T>& x);
template<class T> valarray<T> log10(const valarray<T>& x);

template<class T> valarray<T> pow(const valarray<T>& x, const valarray<T>& y);
template<class T> valarray<T> pow(const valarray<T>& x, const T& y);
template<class T> valarray<T> pow(const T& x, const valarray<T>& y);

template<class T> valarray<T> sin (const valarray<T>& x);
template<class T> valarray<T> sinh (const valarray<T>& x);
template<class T> valarray<T> sqrt (const valarray<T>& x);
template<class T> valarray<T> tan (const valarray<T>& x);
template<class T> valarray<T> tanh (const valarray<T>& x);

template <class T> unspecified1 begin(valarray<T>& v);
template <class T> unspecified2 begin(const valarray<T>& v);
template <class T> unspecified1 end(valarray<T>& v);
template <class T> unspecified2 end(const valarray<T>& v);

}  // std

*/

#include <__algorithm/copy.h>
#include <__algorithm/count.h>
#include <__algorithm/fill.h>
#include <__algorithm/max_element.h>
#include <__algorithm/min.h>
#include <__algorithm/min_element.h>
#include <__algorithm/unwrap_iter.h>
#include <__assert>
#include <__config>
#include <__cstddef/ptrdiff_t.h>
#include <__functional/operations.h>
#include <__memory/addressof.h>
#include <__memory/allocator.h>
#include <__memory/uninitialized_algorithms.h>
#include <__type_traits/decay.h>
#include <__type_traits/remove_reference.h>
#include <__utility/move.h>
#include <__utility/swap.h>
#include <cmath>
#include <new>
#include <version>

// standard-mandated includes

// [valarray.syn]
#include <initializer_list>

#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
#  pragma GCC system_header
#endif

_LIBCPP_PUSH_MACROS
#include <__undef_macros>

_LIBCPP_BEGIN_NAMESPACE_STD

template <class _Tp>
class _LIBCPP_TEMPLATE_VIS valarray;

class _LIBCPP_TEMPLATE_VIS slice {
  size_t __start_;
  size_t __size_;
  size_t __stride_;

public:
  _LIBCPP_HIDE_FROM_ABI slice() : __start_(0), __size_(0), __stride_(0) {}

  _LIBCPP_HIDE_FROM_ABI slice(size_t __start, size_t __size, size_t __stride)
      : __start_(__start), __size_(__size), __stride_(__stride) {}

  _LIBCPP_HIDE_FROM_ABI size_t start() const { return __start_; }
  _LIBCPP_HIDE_FROM_ABI size_t size() const { return __size_; }
  _LIBCPP_HIDE_FROM_ABI size_t stride() const { return __stride_; }

#if _LIBCPP_STD_VER >= 20

  _LIBCPP_HIDE_FROM_ABI friend bool operator==(const slice& __x, const slice& __y) {
    return __x.start() == __y.start() && __x.size() == __y.size() && __x.stride() == __y.stride();
  }

#endif
};

template <class _Tp>
class _LIBCPP_TEMPLATE_VIS slice_array;
class _LIBCPP_EXPORTED_FROM_ABI gslice;
template <class _Tp>
class _LIBCPP_TEMPLATE_VIS gslice_array;
template <class _Tp>
class _LIBCPP_TEMPLATE_VIS mask_array;
template <class _Tp>
class _LIBCPP_TEMPLATE_VIS indirect_array;

template <class _Tp>
_LIBCPP_HIDE_FROM_ABI _Tp* begin(valarray<_Tp>& __v);

template <class _Tp>
_LIBCPP_HIDE_FROM_ABI const _Tp* begin(const valarray<_Tp>& __v);

template <class _Tp>
_LIBCPP_HIDE_FROM_ABI _Tp* end(valarray<_Tp>& __v);

template <class _Tp>
_LIBCPP_HIDE_FROM_ABI const _Tp* end(const valarray<_Tp>& __v);

template <class _Op, class _A0>
struct _UnaryOp {
  typedef typename _Op::__result_type __result_type;
  using value_type = __decay_t<__result_type>;

  _Op __op_;
  _A0 __a0_;

  _LIBCPP_HIDE_FROM_ABI _UnaryOp(const _Op& __op, const _A0& __a0) : __op_(__op), __a0_(__a0) {}

  _LIBCPP_HIDE_FROM_ABI __result_type operator[](size_t __i) const { return __op_(__a0_[__i]); }

  _LIBCPP_HIDE_FROM_ABI size_t size() const { return __a0_.size(); }
};

template <class _Op, class _A0, class _A1>
struct _BinaryOp {
  typedef typename _Op::__result_type __result_type;
  using value_type = __decay_t<__result_type>;

  _Op __op_;
  _A0 __a0_;
  _A1 __a1_;

  _LIBCPP_HIDE_FROM_ABI _BinaryOp(const _Op& __op, const _A0& __a0, const _A1& __a1)
      : __op_(__op), __a0_(__a0), __a1_(__a1) {}

  _LIBCPP_HIDE_FROM_ABI __result_type operator[](size_t __i) const { return __op_(__a0_[__i], __a1_[__i]); }

  _LIBCPP_HIDE_FROM_ABI size_t size() const { return __a0_.size(); }
};

template <class _Tp>
class __scalar_expr {
public:
  typedef _Tp value_type;
  typedef const _Tp& __result_type;

private:
  const value_type& __t_;
  size_t __s_;

public:
  _LIBCPP_HIDE_FROM_ABI explicit __scalar_expr(const value_type& __t, size_t __s) : __t_(__t), __s_(__s) {}

  _LIBCPP_HIDE_FROM_ABI __result_type operator[](size_t) const { return __t_; }

  _LIBCPP_HIDE_FROM_ABI size_t size() const { return __s_; }
};

template <class _Tp>
struct __unary_plus {
  typedef _Tp __result_type;
  _LIBCPP_HIDE_FROM_ABI _Tp operator()(const _Tp& __x) const { return +__x; }
};

template <class _Tp>
struct __bit_not {
  typedef _Tp __result_type;
  _LIBCPP_HIDE_FROM_ABI _Tp operator()(const _Tp& __x) const { return ~__x; }
};

template <class _Tp>
struct __bit_shift_left {
  typedef _Tp __result_type;
  _LIBCPP_HIDE_FROM_ABI _Tp operator()(const _Tp& __x, const _Tp& __y) const { return __x << __y; }
};

template <class _Tp>
struct __bit_shift_right {
  typedef _Tp __result_type;
  _LIBCPP_HIDE_FROM_ABI _Tp operator()(const _Tp& __x, const _Tp& __y) const { return __x >> __y; }
};

template <class _Tp, class _Fp>
struct __apply_expr {
private:
  _Fp __f_;

public:
  typedef _Tp __result_type;

  _LIBCPP_HIDE_FROM_ABI explicit __apply_expr(_Fp __f) : __f_(__f) {}

  _LIBCPP_HIDE_FROM_ABI _Tp operator()(const _Tp& __x) const { return __f_(__x); }
};

template <class _Tp>
struct __abs_expr {
  typedef _Tp __result_type;
  _LIBCPP_HIDE_FROM_ABI _Tp operator()(const _Tp& __x) const { return std::abs(__x); }
};

template <class _Tp>
struct __acos_expr {
  typedef _Tp __result_type;
  _LIBCPP_HIDE_FROM_ABI _Tp operator()(const _Tp& __x) const { return std::acos(__x); }
};

template <class _Tp>
struct __asin_expr {
  typedef _Tp __result_type;
  _LIBCPP_HIDE_FROM_ABI _Tp operator()(const _Tp& __x) const { return std::asin(__x); }
};

template <class _Tp>
struct __atan_expr {
  typedef _Tp __result_type;
  _LIBCPP_HIDE_FROM_ABI _Tp operator()(const _Tp& __x) const { return std::atan(__x); }
};

template <class _Tp>
struct __atan2_expr {
  typedef _Tp __result_type;
  _LIBCPP_HIDE_FROM_ABI _Tp operator()(const _Tp& __x, const _Tp& __y) const { return std::atan2(__x, __y); }
};

template <class _Tp>
struct __cos_expr {
  typedef _Tp __result_type;
  _LIBCPP_HIDE_FROM_ABI _Tp operator()(const _Tp& __x) const { return std::cos(__x); }
};

template <class _Tp>
struct __cosh_expr {
  typedef _Tp __result_type;
  _LIBCPP_HIDE_FROM_ABI _Tp operator()(const _Tp& __x) const { return std::cosh(__x); }
};

template <class _Tp>
struct __exp_expr {
  typedef _Tp __result_type;
  _LIBCPP_HIDE_FROM_ABI _Tp operator()(const _Tp& __x) const { return std::exp(__x); }
};

template <class _Tp>
struct __log_expr {
  typedef _Tp __result_type;
  _LIBCPP_HIDE_FROM_ABI _Tp operator()(const _Tp& __x) const { return std::log(__x); }
};

template <class _Tp>
struct __log10_expr {
  typedef _Tp __result_type;
  _LIBCPP_HIDE_FROM_ABI _Tp operator()(const _Tp& __x) const { return std::log10(__x); }
};

template <class _Tp>
struct __pow_expr {
  typedef _Tp __result_type;
  _LIBCPP_HIDE_FROM_ABI _Tp operator()(const _Tp& __x, const _Tp& __y) const { return std::pow(__x, __y); }
};

template <class _Tp>
struct __sin_expr {
  typedef _Tp __result_type;
  _LIBCPP_HIDE_FROM_ABI _Tp operator()(const _Tp& __x) const { return std::sin(__x); }
};

template <class _Tp>
struct __sinh_expr {
  typedef _Tp __result_type;
  _LIBCPP_HIDE_FROM_ABI _Tp operator()(const _Tp& __x) const { return std::sinh(__x); }
};

template <class _Tp>
struct __sqrt_expr {
  typedef _Tp __result_type;
  _LIBCPP_HIDE_FROM_ABI _Tp operator()(const _Tp& __x) const { return std::sqrt(__x); }
};

template <class _Tp>
struct __tan_expr {
  typedef _Tp __result_type;
  _LIBCPP_HIDE_FROM_ABI _Tp operator()(const _Tp& __x) const { return std::tan(__x); }
};

template <class _Tp>
struct __tanh_expr {
  typedef _Tp __result_type;
  _LIBCPP_HIDE_FROM_ABI _Tp operator()(const _Tp& __x) const { return std::tanh(__x); }
};

template <class _ValExpr>
class __slice_expr {
  typedef __libcpp_remove_reference_t<_ValExpr> _RmExpr;

public:
  typedef typename _RmExpr::value_type value_type;
  typedef value_type __result_type;

private:
  _ValExpr __expr_;
  size_t __start_;
  size_t __size_;
  size_t __stride_;

  _LIBCPP_HIDE_FROM_ABI __slice_expr(const slice& __sl, const _RmExpr& __e)
      : __expr_(__e), __start_(__sl.start()), __size_(__sl.size()), __stride_(__sl.stride()) {}

public:
  _LIBCPP_HIDE_FROM_ABI __result_type operator[](size_t __i) const { return __expr_[__start_ + __i * __stride_]; }

  _LIBCPP_HIDE_FROM_ABI size_t size() const { return __size_; }

  template <class>
  friend class __val_expr;
  template <class>
  friend class _LIBCPP_TEMPLATE_VIS valarray;
};

template <class _ValExpr>
class __mask_expr;

template <class _ValExpr>
class __indirect_expr;

template <class _ValExpr>
class __shift_expr {
  typedef __libcpp_remove_reference_t<_ValExpr> _RmExpr;

public:
  typedef typename _RmExpr::value_type value_type;
  typedef value_type __result_type;

private:
  _ValExpr __expr_;
  size_t __size_;
  ptrdiff_t __ul_;
  ptrdiff_t __sn_;
  ptrdiff_t __n_;
  static const ptrdiff_t _Np = static_cast<ptrdiff_t>(sizeof(ptrdiff_t) * __CHAR_BIT__ - 1);

  _LIBCPP_HIDE_FROM_ABI __shift_expr(int __n, const _RmExpr& __e) : __expr_(__e), __size_(__e.size()), __n_(__n) {
    ptrdiff_t __neg_n = static_cast<ptrdiff_t>(__n_ >> _Np);
    __sn_             = __neg_n | static_cast<ptrdiff_t>(static_cast<size_t>(-__n_) >> _Np);
    __ul_             = ((__size_ - __n_) & ~__neg_n) | ((__n_ + 1) & __neg_n);
  }

public:
  _LIBCPP_HIDE_FROM_ABI __result_type operator[](size_t __j) const {
    ptrdiff_t __i = static_cast<ptrdiff_t>(__j);
    ptrdiff_t __m = (__sn_ * __i - __ul_) >> _Np;
    return (__expr_[(__i + __n_) & __m] & __m) | (value_type() & ~__m);
  }

  _LIBCPP_HIDE_FROM_ABI size_t size() const { return __size_; }

  template <class>
  friend class __val_expr;
};

template <class _ValExpr>
class __cshift_expr {
  typedef __libcpp_remove_reference_t<_ValExpr> _RmExpr;

public:
  typedef typename _RmExpr::value_type value_type;
  typedef value_type __result_type;

private:
  _ValExpr __expr_;
  size_t __size_;
  size_t __m_;
  size_t __o1_;
  size_t __o2_;

  _LIBCPP_HIDE_FROM_ABI __cshift_expr(int __n, const _RmExpr& __e) : __expr_(__e), __size_(__e.size()) {
    __n %= static_cast<int>(__size_);
    if (__n >= 0) {
      __m_  = __size_ - __n;
      __o1_ = __n;
      __o2_ = __n - __size_;
    } else {
      __m_  = -__n;
      __o1_ = __n + __size_;
      __o2_ = __n;
    }
  }

public:
  _LIBCPP_HIDE_FROM_ABI __result_type operator[](size_t __i) const {
    if (__i < __m_)
      return __expr_[__i + __o1_];
    return __expr_[__i + __o2_];
  }

  _LIBCPP_HIDE_FROM_ABI size_t size() const { return __size_; }

  template <class>
  friend class __val_expr;
};

template <class _ValExpr>
class __val_expr;

template <class _ValExpr>
struct __is_val_expr : false_type {};

template <class _ValExpr>
struct __is_val_expr<__val_expr<_ValExpr> > : true_type {};

template <class _Tp>
struct __is_val_expr<valarray<_Tp> > : true_type {};

template <class _Tp>
struct __is_val_expr<slice_array<_Tp> > : true_type {};

template <class _Tp>
struct __is_val_expr<gslice_array<_Tp> > : true_type {};

template <class _Tp>
struct __is_val_expr<mask_array<_Tp> > : true_type {};

template <class _Tp>
struct __is_val_expr<indirect_array<_Tp> > : true_type {};

// The functions using a __val_expr access the elements by their index.
// valarray and the libc++ lazy proxies have an operator[]. The
// Standard proxy array's don't have this operator, instead they have a
// implementation specific accessor
//   __get(size_t)
//
// The functions use the non-member function
//   __get(__val_expr, size_t)
//
// If the __val_expr is a specialization of __val_expr_use_member_functions it
// uses the __val_expr's member function
//   __get(size_t)
// else it uses the __val_expr's member function
//   operator[](size_t)
template <class _ValExpr>
struct __val_expr_use_member_functions;

template <class>
struct __val_expr_use_member_functions : false_type {};

template <class _Tp>
struct __val_expr_use_member_functions<slice_array<_Tp> > : true_type {};

template <class _Tp>
struct __val_expr_use_member_functions<gslice_array<_Tp> > : true_type {};

template <class _Tp>
struct __val_expr_use_member_functions<mask_array<_Tp> > : true_type {};

template <class _Tp>
struct __val_expr_use_member_functions<indirect_array<_Tp> > : true_type {};

template <class _Tp>
class _LIBCPP_TEMPLATE_VIS valarray {
public:
  typedef _Tp value_type;
  typedef _Tp __result_type;

private:
  value_type* __begin_;
  value_type* __end_;

public:
  // construct/destroy:
  _LIBCPP_HIDE_FROM_ABI valarray() : __begin_(nullptr), __end_(nullptr) {}
  inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 explicit valarray(size_t __n);
  _LIBCPP_HIDE_FROM_ABI valarray(const value_type& __x, size_t __n);
  valarray(const value_type* __p, size_t __n);
  valarray(const valarray& __v);
#ifndef _LIBCPP_CXX03_LANG
  _LIBCPP_HIDE_FROM_ABI valarray(valarray&& __v) _NOEXCEPT;
  valarray(initializer_list<value_type> __il);
#endif // _LIBCPP_CXX03_LANG
  valarray(const slice_array<value_type>& __sa);
  valarray(const gslice_array<value_type>& __ga);
  valarray(const mask_array<value_type>& __ma);
  valarray(const indirect_array<value_type>& __ia);
  inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 ~valarray();

  // assignment:
  valarray& operator=(const valarray& __v);
#ifndef _LIBCPP_CXX03_LANG
  _LIBCPP_HIDE_FROM_ABI valarray& operator=(valarray&& __v) _NOEXCEPT;
  _LIBCPP_HIDE_FROM_ABI valarray& operator=(initializer_list<value_type>);
#endif // _LIBCPP_CXX03_LANG
  _LIBCPP_HIDE_FROM_ABI valarray& operator=(const value_type& __x);
  _LIBCPP_HIDE_FROM_ABI valarray& operator=(const slice_array<value_type>& __sa);
  _LIBCPP_HIDE_FROM_ABI valarray& operator=(const gslice_array<value_type>& __ga);
  _LIBCPP_HIDE_FROM_ABI valarray& operator=(const mask_array<value_type>& __ma);
  _LIBCPP_HIDE_FROM_ABI valarray& operator=(const indirect_array<value_type>& __ia);
  template <class _ValExpr>
  _LIBCPP_HIDE_FROM_ABI valarray& operator=(const __val_expr<_ValExpr>& __v);

  // element access:
  _LIBCPP_HIDE_FROM_ABI const value_type& operator[](size_t __i) const { return __begin_[__i]; }

  _LIBCPP_HIDE_FROM_ABI value_type& operator[](size_t __i) { return __begin_[__i]; }

  // subset operations:
  _LIBCPP_HIDE_FROM_ABI __val_expr<__slice_expr<const valarray&> > operator[](slice __s) const;
  _LIBCPP_HIDE_FROM_ABI slice_array<value_type> operator[](slice __s);
  _LIBCPP_HIDE_FROM_ABI __val_expr<__indirect_expr<const valarray&> > operator[](const gslice& __gs) const;
  _LIBCPP_HIDE_FROM_ABI gslice_array<value_type> operator[](const gslice& __gs);
#ifndef _LIBCPP_CXX03_LANG
  _LIBCPP_HIDE_FROM_ABI __val_expr<__indirect_expr<const valarray&> > operator[](gslice&& __gs) const;
  _LIBCPP_HIDE_FROM_ABI gslice_array<value_type> operator[](gslice&& __gs);
#endif // _LIBCPP_CXX03_LANG
  _LIBCPP_HIDE_FROM_ABI __val_expr<__mask_expr<const valarray&> > operator[](const valarray<bool>& __vb) const;
  _LIBCPP_HIDE_FROM_ABI mask_array<value_type> operator[](const valarray<bool>& __vb);
#ifndef _LIBCPP_CXX03_LANG
  _LIBCPP_HIDE_FROM_ABI __val_expr<__mask_expr<const valarray&> > operator[](valarray<bool>&& __vb) const;
  _LIBCPP_HIDE_FROM_ABI mask_array<value_type> operator[](valarray<bool>&& __vb);
#endif // _LIBCPP_CXX03_LANG
  _LIBCPP_HIDE_FROM_ABI __val_expr<__indirect_expr<const valarray&> > operator[](const valarray<size_t>& __vs) const;
  _LIBCPP_HIDE_FROM_ABI indirect_array<value_type> operator[](const valarray<size_t>& __vs);
#ifndef _LIBCPP_CXX03_LANG
  _LIBCPP_HIDE_FROM_ABI __val_expr<__indirect_expr<const valarray&> > operator[](valarray<size_t>&& __vs) const;
  _LIBCPP_HIDE_FROM_ABI indirect_array<value_type> operator[](valarray<size_t>&& __vs);
#endif // _LIBCPP_CXX03_LANG

  // unary operators:
  _LIBCPP_HIDE_FROM_ABI __val_expr<_UnaryOp<__unary_plus<_Tp>, const valarray&> > operator+() const;
  _LIBCPP_HIDE_FROM_ABI __val_expr<_UnaryOp<negate<_Tp>, const valarray&> > operator-() const;
  _LIBCPP_HIDE_FROM_ABI __val_expr<_UnaryOp<__bit_not<_Tp>, const valarray&> > operator~() const;
  _LIBCPP_HIDE_FROM_ABI __val_expr<_UnaryOp<logical_not<_Tp>, const valarray&> > operator!() const;

  // computed assignment:
  _LIBCPP_HIDE_FROM_ABI valarray& operator*=(const value_type& __x);
  _LIBCPP_HIDE_FROM_ABI valarray& operator/=(const value_type& __x);
  _LIBCPP_HIDE_FROM_ABI valarray& operator%=(const value_type& __x);
  _LIBCPP_HIDE_FROM_ABI valarray& operator+=(const value_type& __x);
  _LIBCPP_HIDE_FROM_ABI valarray& operator-=(const value_type& __x);
  _LIBCPP_HIDE_FROM_ABI valarray& operator^=(const value_type& __x);
  _LIBCPP_HIDE_FROM_ABI valarray& operator&=(const value_type& __x);
  _LIBCPP_HIDE_FROM_ABI valarray& operator|=(const value_type& __x);
  _LIBCPP_HIDE_FROM_ABI valarray& operator<<=(const value_type& __x);
  _LIBCPP_HIDE_FROM_ABI valarray& operator>>=(const value_type& __x);

  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
  _LIBCPP_HIDE_FROM_ABI valarray& operator*=(const _Expr& __v);

  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
  _LIBCPP_HIDE_FROM_ABI valarray& operator/=(const _Expr& __v);

  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
  _LIBCPP_HIDE_FROM_ABI valarray& operator%=(const _Expr& __v);

  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
  _LIBCPP_HIDE_FROM_ABI valarray& operator+=(const _Expr& __v);

  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
  _LIBCPP_HIDE_FROM_ABI valarray& operator-=(const _Expr& __v);

  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
  _LIBCPP_HIDE_FROM_ABI valarray& operator^=(const _Expr& __v);

  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
  _LIBCPP_HIDE_FROM_ABI valarray& operator|=(const _Expr& __v);

  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
  _LIBCPP_HIDE_FROM_ABI valarray& operator&=(const _Expr& __v);

  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
  _LIBCPP_HIDE_FROM_ABI valarray& operator<<=(const _Expr& __v);

  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
  _LIBCPP_HIDE_FROM_ABI valarray& operator>>=(const _Expr& __v);

  // member functions:
  _LIBCPP_HIDE_FROM_ABI void swap(valarray& __v) _NOEXCEPT;

  _LIBCPP_HIDE_FROM_ABI size_t size() const { return static_cast<size_t>(__end_ - __begin_); }

  _LIBCPP_HIDE_FROM_ABI value_type sum() const;
  _LIBCPP_HIDE_FROM_ABI value_type min() const;
  _LIBCPP_HIDE_FROM_ABI value_type max() const;

  valarray shift(int __i) const;
  valarray cshift(int __i) const;
  valarray apply(value_type __f(value_type)) const;
  valarray apply(value_type __f(const value_type&)) const;
  void resize(size_t __n, value_type __x = value_type());

private:
  template <class>
  friend class _LIBCPP_TEMPLATE_VIS valarray;
  template <class>
  friend class _LIBCPP_TEMPLATE_VIS slice_array;
  template <class>
  friend class _LIBCPP_TEMPLATE_VIS gslice_array;
  template <class>
  friend class _LIBCPP_TEMPLATE_VIS mask_array;
  template <class>
  friend class __mask_expr;
  template <class>
  friend class _LIBCPP_TEMPLATE_VIS indirect_array;
  template <class>
  friend class __indirect_expr;
  template <class>
  friend class __val_expr;

  template <class _Up>
  friend _Up* begin(valarray<_Up>& __v);

  template <class _Up>
  friend const _Up* begin(const valarray<_Up>& __v);

  template <class _Up>
  friend _Up* end(valarray<_Up>& __v);

  template <class _Up>
  friend const _Up* end(const valarray<_Up>& __v);

  _LIBCPP_HIDE_FROM_ABI void __clear(size_t __capacity);
  valarray& __assign_range(const value_type* __f, const value_type* __l);
};

#if _LIBCPP_STD_VER >= 17
template <class _Tp, size_t _Size>
valarray(const _Tp (&)[_Size], size_t) -> valarray<_Tp>;
#endif

template <class _Expr,
          __enable_if_t<__is_val_expr<_Expr>::value && __val_expr_use_member_functions<_Expr>::value, int> = 0>
_LIBCPP_HIDE_FROM_ABI typename _Expr::value_type __get(const _Expr& __v, size_t __i) {
  return __v.__get(__i);
}

template <class _Expr,
          __enable_if_t<__is_val_expr<_Expr>::value && !__val_expr_use_member_functions<_Expr>::value, int> = 0>
_LIBCPP_HIDE_FROM_ABI typename _Expr::value_type __get(const _Expr& __v, size_t __i) {
  return __v[__i];
}

extern template _LIBCPP_EXPORTED_FROM_ABI void valarray<size_t>::resize(size_t, size_t);

template <class _Op, class _Tp>
struct _UnaryOp<_Op, valarray<_Tp> > {
  typedef typename _Op::__result_type __result_type;
  using value_type = __decay_t<__result_type>;

  _Op __op_;
  const valarray<_Tp>& __a0_;

  _LIBCPP_HIDE_FROM_ABI _UnaryOp(const _Op& __op, const valarray<_Tp>& __a0) : __op_(__op), __a0_(__a0) {}

  _LIBCPP_HIDE_FROM_ABI __result_type operator[](size_t __i) const { return __op_(__a0_[__i]); }

  _LIBCPP_HIDE_FROM_ABI size_t size() const { return __a0_.size(); }
};

template <class _Op, class _Tp, class _A1>
struct _BinaryOp<_Op, valarray<_Tp>, _A1> {
  typedef typename _Op::__result_type __result_type;
  using value_type = __decay_t<__result_type>;

  _Op __op_;
  const valarray<_Tp>& __a0_;
  _A1 __a1_;

  _LIBCPP_HIDE_FROM_ABI _BinaryOp(const _Op& __op, const valarray<_Tp>& __a0, const _A1& __a1)
      : __op_(__op), __a0_(__a0), __a1_(__a1) {}

  _LIBCPP_HIDE_FROM_ABI __result_type operator[](size_t __i) const { return __op_(__a0_[__i], __a1_[__i]); }

  _LIBCPP_HIDE_FROM_ABI size_t size() const { return __a0_.size(); }
};

template <class _Op, class _A0, class _Tp>
struct _BinaryOp<_Op, _A0, valarray<_Tp> > {
  typedef typename _Op::__result_type __result_type;
  using value_type = __decay_t<__result_type>;

  _Op __op_;
  _A0 __a0_;
  const valarray<_Tp>& __a1_;

  _LIBCPP_HIDE_FROM_ABI _BinaryOp(const _Op& __op, const _A0& __a0, const valarray<_Tp>& __a1)
      : __op_(__op), __a0_(__a0), __a1_(__a1) {}

  _LIBCPP_HIDE_FROM_ABI __result_type operator[](size_t __i) const { return __op_(__a0_[__i], __a1_[__i]); }

  _LIBCPP_HIDE_FROM_ABI size_t size() const { return __a0_.size(); }
};

template <class _Op, class _Tp>
struct _BinaryOp<_Op, valarray<_Tp>, valarray<_Tp> > {
  typedef typename _Op::__result_type __result_type;
  using value_type = __decay_t<__result_type>;

  _Op __op_;
  const valarray<_Tp>& __a0_;
  const valarray<_Tp>& __a1_;

  _LIBCPP_HIDE_FROM_ABI _BinaryOp(const _Op& __op, const valarray<_Tp>& __a0, const valarray<_Tp>& __a1)
      : __op_(__op), __a0_(__a0), __a1_(__a1) {}

  _LIBCPP_HIDE_FROM_ABI __result_type operator[](size_t __i) const { return __op_(__a0_[__i], __a1_[__i]); }

  _LIBCPP_HIDE_FROM_ABI size_t size() const { return __a0_.size(); }
};

// slice_array

template <class _Tp>
class _LIBCPP_TEMPLATE_VIS slice_array {
public:
  typedef _Tp value_type;

private:
  value_type* __vp_;
  size_t __size_;
  size_t __stride_;

public:
  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
  void _LIBCPP_HIDE_FROM_ABI operator=(const _Expr& __v) const;

  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
  void _LIBCPP_HIDE_FROM_ABI operator*=(const _Expr& __v) const;

  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
  void _LIBCPP_HIDE_FROM_ABI operator/=(const _Expr& __v) const;

  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
  void _LIBCPP_HIDE_FROM_ABI operator%=(const _Expr& __v) const;

  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
  void _LIBCPP_HIDE_FROM_ABI operator+=(const _Expr& __v) const;

  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
  void _LIBCPP_HIDE_FROM_ABI operator-=(const _Expr& __v) const;

  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
  void _LIBCPP_HIDE_FROM_ABI operator^=(const _Expr& __v) const;

  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
  void _LIBCPP_HIDE_FROM_ABI operator&=(const _Expr& __v) const;

  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
  void _LIBCPP_HIDE_FROM_ABI operator|=(const _Expr& __v) const;

  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
  void _LIBCPP_HIDE_FROM_ABI operator<<=(const _Expr& __v) const;

  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
  void _LIBCPP_HIDE_FROM_ABI operator>>=(const _Expr& __v) const;

  slice_array(slice_array const&) = default;

  _LIBCPP_HIDE_FROM_ABI const slice_array& operator=(const slice_array& __sa) const;

  _LIBCPP_HIDE_FROM_ABI void operator=(const value_type& __x) const;

  _LIBCPP_HIDE_FROM_ABI void operator=(const valarray<value_type>& __va) const;

  // Behaves like __val_expr::operator[], which returns by value.
  _LIBCPP_HIDE_FROM_ABI value_type __get(size_t __i) const {
    _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(__i < __size_, "slice_array.__get() index out of bounds");
    return __vp_[__i * __stride_];
  }

private:
  _LIBCPP_HIDE_FROM_ABI slice_array(const slice& __sl, const valarray<value_type>& __v)
      : __vp_(const_cast<value_type*>(__v.__begin_ + __sl.start())), __size_(__sl.size()), __stride_(__sl.stride()) {}

  template <class>
  friend class valarray;
};

template <class _Tp>
inline const slice_array<_Tp>& slice_array<_Tp>::operator=(const slice_array& __sa) const {
  value_type* __t       = __vp_;
  const value_type* __s = __sa.__vp_;
  for (size_t __n = __size_; __n; --__n, __t += __stride_, __s += __sa.__stride_)
    *__t = *__s;
  return *this;
}

template <class _Tp>
template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
inline void slice_array<_Tp>::operator=(const _Expr& __v) const {
  value_type* __t = __vp_;
  for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
    *__t = __v[__i];
}

template <class _Tp>
inline void slice_array<_Tp>::operator=(const valarray<value_type>& __va) const {
  value_type* __t = __vp_;
  for (size_t __i = 0; __i < __va.size(); ++__i, __t += __stride_)
    *__t = __va[__i];
}

template <class _Tp>
template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
inline void slice_array<_Tp>::operator*=(const _Expr& __v) const {
  value_type* __t = __vp_;
  for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
    *__t *= __v[__i];
}

template <class _Tp>
template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
inline void slice_array<_Tp>::operator/=(const _Expr& __v) const {
  value_type* __t = __vp_;
  for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
    *__t /= __v[__i];
}

template <class _Tp>
template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
inline void slice_array<_Tp>::operator%=(const _Expr& __v) const {
  value_type* __t = __vp_;
  for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
    *__t %= __v[__i];
}

template <class _Tp>
template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
inline void slice_array<_Tp>::operator+=(const _Expr& __v) const {
  value_type* __t = __vp_;
  for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
    *__t += __v[__i];
}

template <class _Tp>
template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
inline void slice_array<_Tp>::operator-=(const _Expr& __v) const {
  value_type* __t = __vp_;
  for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
    *__t -= __v[__i];
}

template <class _Tp>
template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
inline void slice_array<_Tp>::operator^=(const _Expr& __v) const {
  value_type* __t = __vp_;
  for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
    *__t ^= __v[__i];
}

template <class _Tp>
template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
inline void slice_array<_Tp>::operator&=(const _Expr& __v) const {
  value_type* __t = __vp_;
  for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
    *__t &= __v[__i];
}

template <class _Tp>
template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
inline void slice_array<_Tp>::operator|=(const _Expr& __v) const {
  value_type* __t = __vp_;
  for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
    *__t |= __v[__i];
}

template <class _Tp>
template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
inline void slice_array<_Tp>::operator<<=(const _Expr& __v) const {
  value_type* __t = __vp_;
  for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
    *__t <<= __v[__i];
}

template <class _Tp>
template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
inline void slice_array<_Tp>::operator>>=(const _Expr& __v) const {
  value_type* __t = __vp_;
  for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
    *__t >>= __v[__i];
}

template <class _Tp>
inline void slice_array<_Tp>::operator=(const value_type& __x) const {
  value_type* __t = __vp_;
  for (size_t __n = __size_; __n; --__n, __t += __stride_)
    *__t = __x;
}

// gslice

class _LIBCPP_EXPORTED_FROM_ABI gslice {
  valarray<size_t> __size_;
  valarray<size_t> __stride_;
  valarray<size_t> __1d_;

public:
  _LIBCPP_HIDE_FROM_ABI gslice() {}

  _LIBCPP_HIDE_FROM_ABI gslice(size_t __start, const valarray<size_t>& __size, const valarray<size_t>& __stride)
      : __size_(__size), __stride_(__stride) {
    __init(__start);
  }

#ifndef _LIBCPP_CXX03_LANG

  _LIBCPP_HIDE_FROM_ABI gslice(size_t __start, const valarray<size_t>& __size, valarray<size_t>&& __stride)
      : __size_(__size), __stride_(std::move(__stride)) {
    __init(__start);
  }

  _LIBCPP_HIDE_FROM_ABI gslice(size_t __start, valarray<size_t>&& __size, const valarray<size_t>& __stride)
      : __size_(std::move(__size)), __stride_(__stride) {
    __init(__start);
  }

  _LIBCPP_HIDE_FROM_ABI gslice(size_t __start, valarray<size_t>&& __size, valarray<size_t>&& __stride)
      : __size_(std::move(__size)), __stride_(std::move(__stride)) {
    __init(__start);
  }

#endif // _LIBCPP_CXX03_LANG

  _LIBCPP_HIDE_FROM_ABI size_t start() const { return __1d_.size() ? __1d_[0] : 0; }

  _LIBCPP_HIDE_FROM_ABI valarray<size_t> size() const { return __size_; }

  _LIBCPP_HIDE_FROM_ABI valarray<size_t> stride() const { return __stride_; }

private:
  void __init(size_t __start);

  template <class>
  friend class gslice_array;
  template <class>
  friend class valarray;
  template <class>
  friend class __val_expr;
};

// gslice_array

template <class _Tp>
class _LIBCPP_TEMPLATE_VIS gslice_array {
public:
  typedef _Tp value_type;

private:
  value_type* __vp_;
  valarray<size_t> __1d_;

public:
  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
  void _LIBCPP_HIDE_FROM_ABI operator=(const _Expr& __v) const;

  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
  void _LIBCPP_HIDE_FROM_ABI operator*=(const _Expr& __v) const;

  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
  void _LIBCPP_HIDE_FROM_ABI operator/=(const _Expr& __v) const;

  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
  void _LIBCPP_HIDE_FROM_ABI operator%=(const _Expr& __v) const;

  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
  void _LIBCPP_HIDE_FROM_ABI operator+=(const _Expr& __v) const;

  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
  void _LIBCPP_HIDE_FROM_ABI operator-=(const _Expr& __v) const;

  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
  void _LIBCPP_HIDE_FROM_ABI operator^=(const _Expr& __v) const;

  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
  void _LIBCPP_HIDE_FROM_ABI operator&=(const _Expr& __v) const;

  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
  void _LIBCPP_HIDE_FROM_ABI operator|=(const _Expr& __v) const;

  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
  void _LIBCPP_HIDE_FROM_ABI operator<<=(const _Expr& __v) const;

  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
  void _LIBCPP_HIDE_FROM_ABI operator>>=(const _Expr& __v) const;

  _LIBCPP_HIDE_FROM_ABI const gslice_array& operator=(const gslice_array& __ga) const;

  _LIBCPP_HIDE_FROM_ABI void operator=(const value_type& __x) const;

  gslice_array(const gslice_array&) = default;

  // Behaves like __val_expr::operator[], which returns by value.
  _LIBCPP_HIDE_FROM_ABI value_type __get(size_t __i) const {
    _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(__i < __1d_.size(), "gslice_array.__get() index out of bounds");
    return __vp_[__1d_[__i]];
  }

private:
  gslice_array(const gslice& __gs, const valarray<value_type>& __v)
      : __vp_(const_cast<value_type*>(__v.__begin_)), __1d_(__gs.__1d_) {}

#ifndef _LIBCPP_CXX03_LANG
  gslice_array(gslice&& __gs, const valarray<value_type>& __v)
      : __vp_(const_cast<value_type*>(__v.__begin_)), __1d_(std::move(__gs.__1d_)) {}
#endif // _LIBCPP_CXX03_LANG

  template <class>
  friend class valarray;
};

template <class _Tp>
template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
inline void gslice_array<_Tp>::operator=(const _Expr& __v) const {
  typedef const size_t* _Ip;
  size_t __j = 0;
  for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
    __vp_[*__i] = __v[__j];
}

template <class _Tp>
template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
inline void gslice_array<_Tp>::operator*=(const _Expr& __v) const {
  typedef const size_t* _Ip;
  size_t __j = 0;
  for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
    __vp_[*__i] *= __v[__j];
}

template <class _Tp>
template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
inline void gslice_array<_Tp>::operator/=(const _Expr& __v) const {
  typedef const size_t* _Ip;
  size_t __j = 0;
  for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
    __vp_[*__i] /= __v[__j];
}

template <class _Tp>
template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
inline void gslice_array<_Tp>::operator%=(const _Expr& __v) const {
  typedef const size_t* _Ip;
  size_t __j = 0;
  for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
    __vp_[*__i] %= __v[__j];
}

template <class _Tp>
template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
inline void gslice_array<_Tp>::operator+=(const _Expr& __v) const {
  typedef const size_t* _Ip;
  size_t __j = 0;
  for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
    __vp_[*__i] += __v[__j];
}

template <class _Tp>
template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
inline void gslice_array<_Tp>::operator-=(const _Expr& __v) const {
  typedef const size_t* _Ip;
  size_t __j = 0;
  for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
    __vp_[*__i] -= __v[__j];
}

template <class _Tp>
template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
inline void gslice_array<_Tp>::operator^=(const _Expr& __v) const {
  typedef const size_t* _Ip;
  size_t __j = 0;
  for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
    __vp_[*__i] ^= __v[__j];
}

template <class _Tp>
template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
inline void gslice_array<_Tp>::operator&=(const _Expr& __v) const {
  typedef const size_t* _Ip;
  size_t __j = 0;
  for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
    __vp_[*__i] &= __v[__j];
}

template <class _Tp>
template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
inline void gslice_array<_Tp>::operator|=(const _Expr& __v) const {
  typedef const size_t* _Ip;
  size_t __j = 0;
  for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
    __vp_[*__i] |= __v[__j];
}

template <class _Tp>
template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
inline void gslice_array<_Tp>::operator<<=(const _Expr& __v) const {
  typedef const size_t* _Ip;
  size_t __j = 0;
  for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
    __vp_[*__i] <<= __v[__j];
}

template <class _Tp>
template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
inline void gslice_array<_Tp>::operator>>=(const _Expr& __v) const {
  typedef const size_t* _Ip;
  size_t __j = 0;
  for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
    __vp_[*__i] >>= __v[__j];
}

template <class _Tp>
inline const gslice_array<_Tp>& gslice_array<_Tp>::operator=(const gslice_array& __ga) const {
  typedef const size_t* _Ip;
  const value_type* __s = __ga.__vp_;
  for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_, __j = __ga.__1d_.__begin_; __i != __e; ++__i, ++__j)
    __vp_[*__i] = __s[*__j];
  return *this;
}

template <class _Tp>
inline void gslice_array<_Tp>::operator=(const value_type& __x) const {
  typedef const size_t* _Ip;
  for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i)
    __vp_[*__i] = __x;
}

// mask_array

template <class _Tp>
class _LIBCPP_TEMPLATE_VIS mask_array {
public:
  typedef _Tp value_type;

private:
  value_type* __vp_;
  valarray<size_t> __1d_;

public:
  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
  void _LIBCPP_HIDE_FROM_ABI operator=(const _Expr& __v) const;

  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
  void _LIBCPP_HIDE_FROM_ABI operator*=(const _Expr& __v) const;

  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
  void _LIBCPP_HIDE_FROM_ABI operator/=(const _Expr& __v) const;

  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
  void _LIBCPP_HIDE_FROM_ABI operator%=(const _Expr& __v) const;

  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
  void _LIBCPP_HIDE_FROM_ABI operator+=(const _Expr& __v) const;

  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
  void _LIBCPP_HIDE_FROM_ABI operator-=(const _Expr& __v) const;

  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
  void _LIBCPP_HIDE_FROM_ABI operator^=(const _Expr& __v) const;

  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
  void _LIBCPP_HIDE_FROM_ABI operator&=(const _Expr& __v) const;

  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
  void _LIBCPP_HIDE_FROM_ABI operator|=(const _Expr& __v) const;

  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
  void _LIBCPP_HIDE_FROM_ABI operator<<=(const _Expr& __v) const;

  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
  void _LIBCPP_HIDE_FROM_ABI operator>>=(const _Expr& __v) const;

  mask_array(const mask_array&) = default;

  _LIBCPP_HIDE_FROM_ABI const mask_array& operator=(const mask_array& __ma) const;

  _LIBCPP_HIDE_FROM_ABI void operator=(const value_type& __x) const;

  // Behaves like __val_expr::operator[], which returns by value.
  _LIBCPP_HIDE_FROM_ABI value_type __get(size_t __i) const {
    _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(__i < __1d_.size(), "mask_array.__get() index out of bounds");
    return __vp_[__1d_[__i]];
  }

private:
  _LIBCPP_HIDE_FROM_ABI mask_array(const valarray<bool>& __vb, const valarray<value_type>& __v)
      : __vp_(const_cast<value_type*>(__v.__begin_)),
        __1d_(static_cast<size_t>(count(__vb.__begin_, __vb.__end_, true))) {
    size_t __j = 0;
    for (size_t __i = 0; __i < __vb.size(); ++__i)
      if (__vb[__i])
        __1d_[__j++] = __i;
  }

  template <class>
  friend class valarray;
};

template <class _Tp>
template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
inline void mask_array<_Tp>::operator=(const _Expr& __v) const {
  size_t __n = __1d_.size();
  for (size_t __i = 0; __i < __n; ++__i)
    __vp_[__1d_[__i]] = __v[__i];
}

template <class _Tp>
template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
inline void mask_array<_Tp>::operator*=(const _Expr& __v) const {
  size_t __n = __1d_.size();
  for (size_t __i = 0; __i < __n; ++__i)
    __vp_[__1d_[__i]] *= __v[__i];
}

template <class _Tp>
template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
inline void mask_array<_Tp>::operator/=(const _Expr& __v) const {
  size_t __n = __1d_.size();
  for (size_t __i = 0; __i < __n; ++__i)
    __vp_[__1d_[__i]] /= __v[__i];
}

template <class _Tp>
template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
inline void mask_array<_Tp>::operator%=(const _Expr& __v) const {
  size_t __n = __1d_.size();
  for (size_t __i = 0; __i < __n; ++__i)
    __vp_[__1d_[__i]] %= __v[__i];
}

template <class _Tp>
template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
inline void mask_array<_Tp>::operator+=(const _Expr& __v) const {
  size_t __n = __1d_.size();
  for (size_t __i = 0; __i < __n; ++__i)
    __vp_[__1d_[__i]] += __v[__i];
}

template <class _Tp>
template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
inline void mask_array<_Tp>::operator-=(const _Expr& __v) const {
  size_t __n = __1d_.size();
  for (size_t __i = 0; __i < __n; ++__i)
    __vp_[__1d_[__i]] -= __v[__i];
}

template <class _Tp>
template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
inline void mask_array<_Tp>::operator^=(const _Expr& __v) const {
  size_t __n = __1d_.size();
  for (size_t __i = 0; __i < __n; ++__i)
    __vp_[__1d_[__i]] ^= __v[__i];
}

template <class _Tp>
template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
inline void mask_array<_Tp>::operator&=(const _Expr& __v) const {
  size_t __n = __1d_.size();
  for (size_t __i = 0; __i < __n; ++__i)
    __vp_[__1d_[__i]] &= __v[__i];
}

template <class _Tp>
template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
inline void mask_array<_Tp>::operator|=(const _Expr& __v) const {
  size_t __n = __1d_.size();
  for (size_t __i = 0; __i < __n; ++__i)
    __vp_[__1d_[__i]] |= __v[__i];
}

template <class _Tp>
template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
inline void mask_array<_Tp>::operator<<=(const _Expr& __v) const {
  size_t __n = __1d_.size();
  for (size_t __i = 0; __i < __n; ++__i)
    __vp_[__1d_[__i]] <<= __v[__i];
}

template <class _Tp>
template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
inline void mask_array<_Tp>::operator>>=(const _Expr& __v) const {
  size_t __n = __1d_.size();
  for (size_t __i = 0; __i < __n; ++__i)
    __vp_[__1d_[__i]] >>= __v[__i];
}

template <class _Tp>
inline const mask_array<_Tp>& mask_array<_Tp>::operator=(const mask_array& __ma) const {
  size_t __n = __1d_.size();
  for (size_t __i = 0; __i < __n; ++__i)
    __vp_[__1d_[__i]] = __ma.__vp_[__1d_[__i]];
  return *this;
}

template <class _Tp>
inline void mask_array<_Tp>::operator=(const value_type& __x) const {
  size_t __n = __1d_.size();
  for (size_t __i = 0; __i < __n; ++__i)
    __vp_[__1d_[__i]] = __x;
}

template <class _ValExpr>
class __mask_expr {
  typedef __libcpp_remove_reference_t<_ValExpr> _RmExpr;

public:
  typedef typename _RmExpr::value_type value_type;
  typedef value_type __result_type;

private:
  _ValExpr __expr_;
  valarray<size_t> __1d_;

  _LIBCPP_HIDE_FROM_ABI __mask_expr(const valarray<bool>& __vb, const _RmExpr& __e)
      : __expr_(__e), __1d_(static_cast<size_t>(count(__vb.__begin_, __vb.__end_, true))) {
    size_t __j = 0;
    for (size_t __i = 0; __i < __vb.size(); ++__i)
      if (__vb[__i])
        __1d_[__j++] = __i;
  }

public:
  _LIBCPP_HIDE_FROM_ABI __result_type operator[](size_t __i) const { return __expr_[__1d_[__i]]; }

  _LIBCPP_HIDE_FROM_ABI size_t size() const { return __1d_.size(); }

  template <class>
  friend class __val_expr;
  template <class>
  friend class valarray;
};

// indirect_array

template <class _Tp>
class _LIBCPP_TEMPLATE_VIS indirect_array {
public:
  typedef _Tp value_type;

private:
  value_type* __vp_;
  valarray<size_t> __1d_;

public:
  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
  void _LIBCPP_HIDE_FROM_ABI operator=(const _Expr& __v) const;

  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
  void _LIBCPP_HIDE_FROM_ABI operator*=(const _Expr& __v) const;

  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
  void _LIBCPP_HIDE_FROM_ABI operator/=(const _Expr& __v) const;

  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
  void _LIBCPP_HIDE_FROM_ABI operator%=(const _Expr& __v) const;

  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
  void _LIBCPP_HIDE_FROM_ABI operator+=(const _Expr& __v) const;

  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
  void _LIBCPP_HIDE_FROM_ABI operator-=(const _Expr& __v) const;

  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
  void _LIBCPP_HIDE_FROM_ABI operator^=(const _Expr& __v) const;

  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
  void _LIBCPP_HIDE_FROM_ABI operator&=(const _Expr& __v) const;

  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
  void _LIBCPP_HIDE_FROM_ABI operator|=(const _Expr& __v) const;

  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
  void _LIBCPP_HIDE_FROM_ABI operator<<=(const _Expr& __v) const;

  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
  void _LIBCPP_HIDE_FROM_ABI operator>>=(const _Expr& __v) const;

  indirect_array(const indirect_array&) = default;

  _LIBCPP_HIDE_FROM_ABI const indirect_array& operator=(const indirect_array& __ia) const;

  _LIBCPP_HIDE_FROM_ABI void operator=(const value_type& __x) const;

  // Behaves like __val_expr::operator[], which returns by value.
  _LIBCPP_HIDE_FROM_ABI value_type __get(size_t __i) const {
    _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(__i < __1d_.size(), "indirect_array.__get() index out of bounds");
    return __vp_[__1d_[__i]];
  }

private:
  _LIBCPP_HIDE_FROM_ABI indirect_array(const valarray<size_t>& __ia, const valarray<value_type>& __v)
      : __vp_(const_cast<value_type*>(__v.__begin_)), __1d_(__ia) {}

#ifndef _LIBCPP_CXX03_LANG

  _LIBCPP_HIDE_FROM_ABI indirect_array(valarray<size_t>&& __ia, const valarray<value_type>& __v)
      : __vp_(const_cast<value_type*>(__v.__begin_)), __1d_(std::move(__ia)) {}

#endif // _LIBCPP_CXX03_LANG

  template <class>
  friend class valarray;
};

template <class _Tp>
template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
inline void indirect_array<_Tp>::operator=(const _Expr& __v) const {
  size_t __n = __1d_.size();
  for (size_t __i = 0; __i < __n; ++__i)
    __vp_[__1d_[__i]] = __v[__i];
}

template <class _Tp>
template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
inline void indirect_array<_Tp>::operator*=(const _Expr& __v) const {
  size_t __n = __1d_.size();
  for (size_t __i = 0; __i < __n; ++__i)
    __vp_[__1d_[__i]] *= __v[__i];
}

template <class _Tp>
template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
inline void indirect_array<_Tp>::operator/=(const _Expr& __v) const {
  size_t __n = __1d_.size();
  for (size_t __i = 0; __i < __n; ++__i)
    __vp_[__1d_[__i]] /= __v[__i];
}

template <class _Tp>
template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
inline void indirect_array<_Tp>::operator%=(const _Expr& __v) const {
  size_t __n = __1d_.size();
  for (size_t __i = 0; __i < __n; ++__i)
    __vp_[__1d_[__i]] %= __v[__i];
}

template <class _Tp>
template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
inline void indirect_array<_Tp>::operator+=(const _Expr& __v) const {
  size_t __n = __1d_.size();
  for (size_t __i = 0; __i < __n; ++__i)
    __vp_[__1d_[__i]] += __v[__i];
}

template <class _Tp>
template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
inline void indirect_array<_Tp>::operator-=(const _Expr& __v) const {
  size_t __n = __1d_.size();
  for (size_t __i = 0; __i < __n; ++__i)
    __vp_[__1d_[__i]] -= __v[__i];
}

template <class _Tp>
template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
inline void indirect_array<_Tp>::operator^=(const _Expr& __v) const {
  size_t __n = __1d_.size();
  for (size_t __i = 0; __i < __n; ++__i)
    __vp_[__1d_[__i]] ^= __v[__i];
}

template <class _Tp>
template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
inline void indirect_array<_Tp>::operator&=(const _Expr& __v) const {
  size_t __n = __1d_.size();
  for (size_t __i = 0; __i < __n; ++__i)
    __vp_[__1d_[__i]] &= __v[__i];
}

template <class _Tp>
template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
inline void indirect_array<_Tp>::operator|=(const _Expr& __v) const {
  size_t __n = __1d_.size();
  for (size_t __i = 0; __i < __n; ++__i)
    __vp_[__1d_[__i]] |= __v[__i];
}

template <class _Tp>
template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
inline void indirect_array<_Tp>::operator<<=(const _Expr& __v) const {
  size_t __n = __1d_.size();
  for (size_t __i = 0; __i < __n; ++__i)
    __vp_[__1d_[__i]] <<= __v[__i];
}

template <class _Tp>
template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
inline void indirect_array<_Tp>::operator>>=(const _Expr& __v) const {
  size_t __n = __1d_.size();
  for (size_t __i = 0; __i < __n; ++__i)
    __vp_[__1d_[__i]] >>= __v[__i];
}

template <class _Tp>
inline const indirect_array<_Tp>& indirect_array<_Tp>::operator=(const indirect_array& __ia) const {
  typedef const size_t* _Ip;
  const value_type* __s = __ia.__vp_;
  for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_, __j = __ia.__1d_.__begin_; __i != __e; ++__i, ++__j)
    __vp_[*__i] = __s[*__j];
  return *this;
}

template <class _Tp>
inline void indirect_array<_Tp>::operator=(const value_type& __x) const {
  typedef const size_t* _Ip;
  for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i)
    __vp_[*__i] = __x;
}

template <class _ValExpr>
class __indirect_expr {
  typedef __libcpp_remove_reference_t<_ValExpr> _RmExpr;

public:
  typedef typename _RmExpr::value_type value_type;
  typedef value_type __result_type;

private:
  _ValExpr __expr_;
  valarray<size_t> __1d_;

  _LIBCPP_HIDE_FROM_ABI __indirect_expr(const valarray<size_t>& __ia, const _RmExpr& __e) : __expr_(__e), __1d_(__ia) {}

#ifndef _LIBCPP_CXX03_LANG

  _LIBCPP_HIDE_FROM_ABI __indirect_expr(valarray<size_t>&& __ia, const _RmExpr& __e)
      : __expr_(__e), __1d_(std::move(__ia)) {}

#endif // _LIBCPP_CXX03_LANG

public:
  _LIBCPP_HIDE_FROM_ABI __result_type operator[](size_t __i) const { return __expr_[__1d_[__i]]; }

  _LIBCPP_HIDE_FROM_ABI size_t size() const { return __1d_.size(); }

  template <class>
  friend class __val_expr;
  template <class>
  friend class _LIBCPP_TEMPLATE_VIS valarray;
};

template <class _ValExpr>
class __val_expr {
  typedef __libcpp_remove_reference_t<_ValExpr> _RmExpr;

  _ValExpr __expr_;

public:
  typedef typename _RmExpr::value_type value_type;
  typedef typename _RmExpr::__result_type __result_type;

  _LIBCPP_HIDE_FROM_ABI explicit __val_expr(const _RmExpr& __e) : __expr_(__e) {}

  _LIBCPP_HIDE_FROM_ABI __result_type operator[](size_t __i) const { return __expr_[__i]; }

  _LIBCPP_HIDE_FROM_ABI __val_expr<__slice_expr<_ValExpr> > operator[](slice __s) const {
    typedef __slice_expr<_ValExpr> _NewExpr;
    return __val_expr< _NewExpr >(_NewExpr(__s, __expr_));
  }

  _LIBCPP_HIDE_FROM_ABI __val_expr<__indirect_expr<_ValExpr> > operator[](const gslice& __gs) const {
    typedef __indirect_expr<_ValExpr> _NewExpr;
    return __val_expr<_NewExpr >(_NewExpr(__gs.__1d_, __expr_));
  }

  _LIBCPP_HIDE_FROM_ABI __val_expr<__mask_expr<_ValExpr> > operator[](const valarray<bool>& __vb) const {
    typedef __mask_expr<_ValExpr> _NewExpr;
    return __val_expr< _NewExpr >(_NewExpr(__vb, __expr_));
  }

  _LIBCPP_HIDE_FROM_ABI __val_expr<__indirect_expr<_ValExpr> > operator[](const valarray<size_t>& __vs) const {
    typedef __indirect_expr<_ValExpr> _NewExpr;
    return __val_expr< _NewExpr >(_NewExpr(__vs, __expr_));
  }

  _LIBCPP_HIDE_FROM_ABI __val_expr<_UnaryOp<__unary_plus<value_type>, _ValExpr> > operator+() const {
    typedef _UnaryOp<__unary_plus<value_type>, _ValExpr> _NewExpr;
    return __val_expr<_NewExpr>(_NewExpr(__unary_plus<value_type>(), __expr_));
  }

  _LIBCPP_HIDE_FROM_ABI __val_expr<_UnaryOp<negate<value_type>, _ValExpr> > operator-() const {
    typedef _UnaryOp<negate<value_type>, _ValExpr> _NewExpr;
    return __val_expr<_NewExpr>(_NewExpr(negate<value_type>(), __expr_));
  }

  _LIBCPP_HIDE_FROM_ABI __val_expr<_UnaryOp<__bit_not<value_type>, _ValExpr> > operator~() const {
    typedef _UnaryOp<__bit_not<value_type>, _ValExpr> _NewExpr;
    return __val_expr<_NewExpr>(_NewExpr(__bit_not<value_type>(), __expr_));
  }

  _LIBCPP_HIDE_FROM_ABI __val_expr<_UnaryOp<logical_not<value_type>, _ValExpr> > operator!() const {
    typedef _UnaryOp<logical_not<value_type>, _ValExpr> _NewExpr;
    return __val_expr<_NewExpr>(_NewExpr(logical_not<value_type>(), __expr_));
  }

  operator valarray<__result_type>() const;

  _LIBCPP_HIDE_FROM_ABI size_t size() const { return __expr_.size(); }

  _LIBCPP_HIDE_FROM_ABI __result_type sum() const {
    size_t __n        = __expr_.size();
    __result_type __r = __n ? __expr_[0] : __result_type();
    for (size_t __i = 1; __i < __n; ++__i)
      __r += __expr_[__i];
    return __r;
  }

  _LIBCPP_HIDE_FROM_ABI __result_type min() const {
    size_t __n        = size();
    __result_type __r = __n ? (*this)[0] : __result_type();
    for (size_t __i = 1; __i < __n; ++__i) {
      __result_type __x = __expr_[__i];
      if (__x < __r)
        __r = __x;
    }
    return __r;
  }

  _LIBCPP_HIDE_FROM_ABI __result_type max() const {
    size_t __n        = size();
    __result_type __r = __n ? (*this)[0] : __result_type();
    for (size_t __i = 1; __i < __n; ++__i) {
      __result_type __x = __expr_[__i];
      if (__r < __x)
        __r = __x;
    }
    return __r;
  }

  _LIBCPP_HIDE_FROM_ABI __val_expr<__shift_expr<_ValExpr> > shift(int __i) const {
    return __val_expr<__shift_expr<_ValExpr> >(__shift_expr<_ValExpr>(__i, __expr_));
  }

  _LIBCPP_HIDE_FROM_ABI __val_expr<__cshift_expr<_ValExpr> > cshift(int __i) const {
    return __val_expr<__cshift_expr<_ValExpr> >(__cshift_expr<_ValExpr>(__i, __expr_));
  }

  _LIBCPP_HIDE_FROM_ABI __val_expr<_UnaryOp<__apply_expr<value_type, value_type (*)(value_type)>, _ValExpr> >
  apply(value_type __f(value_type)) const {
    typedef __apply_expr<value_type, value_type (*)(value_type)> _Op;
    typedef _UnaryOp<_Op, _ValExpr> _NewExpr;
    return __val_expr<_NewExpr>(_NewExpr(_Op(__f), __expr_));
  }

  _LIBCPP_HIDE_FROM_ABI __val_expr<_UnaryOp<__apply_expr<value_type, value_type (*)(const value_type&)>, _ValExpr> >
  apply(value_type __f(const value_type&)) const {
    typedef __apply_expr<value_type, value_type (*)(const value_type&)> _Op;
    typedef _UnaryOp<_Op, _ValExpr> _NewExpr;
    return __val_expr<_NewExpr>(_NewExpr(_Op(__f), __expr_));
  }
};

template <class _ValExpr>
__val_expr<_ValExpr>::operator valarray<__val_expr::__result_type>() const {
  valarray<__result_type> __r;
  size_t __n = __expr_.size();
  if (__n) {
    __r.__begin_ = __r.__end_ = allocator<__result_type>().allocate(__n);
    for (size_t __i = 0; __i != __n; ++__r.__end_, ++__i)
      ::new ((void*)__r.__end_) __result_type(__expr_[__i]);
  }
  return __r;
}

// valarray

template <class _Tp>
inline valarray<_Tp>::valarray(size_t __n) : __begin_(nullptr), __end_(nullptr) {
  if (__n) {
    __begin_ = __end_ = allocator<value_type>().allocate(__n);
#if _LIBCPP_HAS_EXCEPTIONS
    try {
#endif // _LIBCPP_HAS_EXCEPTIONS
      for (size_t __n_left = __n; __n_left; --__n_left, ++__end_)
        ::new ((void*)__end_) value_type();
#if _LIBCPP_HAS_EXCEPTIONS
    } catch (...) {
      __clear(__n);
      throw;
    }
#endif // _LIBCPP_HAS_EXCEPTIONS
  }
}

template <class _Tp>
inline valarray<_Tp>::valarray(const value_type& __x, size_t __n) : __begin_(nullptr), __end_(nullptr) {
  resize(__n, __x);
}

template <class _Tp>
valarray<_Tp>::valarray(const value_type* __p, size_t __n) : __begin_(nullptr), __end_(nullptr) {
  if (__n) {
    __begin_ = __end_ = allocator<value_type>().allocate(__n);
#if _LIBCPP_HAS_EXCEPTIONS
    try {
#endif // _LIBCPP_HAS_EXCEPTIONS
      for (size_t __n_left = __n; __n_left; ++__end_, ++__p, --__n_left)
        ::new ((void*)__end_) value_type(*__p);
#if _LIBCPP_HAS_EXCEPTIONS
    } catch (...) {
      __clear(__n);
      throw;
    }
#endif // _LIBCPP_HAS_EXCEPTIONS
  }
}

template <class _Tp>
valarray<_Tp>::valarray(const valarray& __v) : __begin_(nullptr), __end_(nullptr) {
  if (__v.size()) {
    __begin_ = __end_ = allocator<value_type>().allocate(__v.size());
#if _LIBCPP_HAS_EXCEPTIONS
    try {
#endif // _LIBCPP_HAS_EXCEPTIONS
      for (value_type* __p = __v.__begin_; __p != __v.__end_; ++__end_, ++__p)
        ::new ((void*)__end_) value_type(*__p);
#if _LIBCPP_HAS_EXCEPTIONS
    } catch (...) {
      __clear(__v.size());
      throw;
    }
#endif // _LIBCPP_HAS_EXCEPTIONS
  }
}

#ifndef _LIBCPP_CXX03_LANG

template <class _Tp>
inline valarray<_Tp>::valarray(valarray&& __v) _NOEXCEPT : __begin_(__v.__begin_), __end_(__v.__end_) {
  __v.__begin_ = __v.__end_ = nullptr;
}

template <class _Tp>
valarray<_Tp>::valarray(initializer_list<value_type> __il) : __begin_(nullptr), __end_(nullptr) {
  const size_t __n = __il.size();
  if (__n) {
    __begin_ = __end_ = allocator<value_type>().allocate(__n);
#  if _LIBCPP_HAS_EXCEPTIONS
    try {
#  endif // _LIBCPP_HAS_EXCEPTIONS
      size_t __n_left = __n;
      for (const value_type* __p = __il.begin(); __n_left; ++__end_, ++__p, --__n_left)
        ::new ((void*)__end_) value_type(*__p);
#  if _LIBCPP_HAS_EXCEPTIONS
    } catch (...) {
      __clear(__n);
      throw;
    }
#  endif // _LIBCPP_HAS_EXCEPTIONS
  }
}

#endif // _LIBCPP_CXX03_LANG

template <class _Tp>
valarray<_Tp>::valarray(const slice_array<value_type>& __sa) : __begin_(nullptr), __end_(nullptr) {
  const size_t __n = __sa.__size_;
  if (__n) {
    __begin_ = __end_ = allocator<value_type>().allocate(__n);
#if _LIBCPP_HAS_EXCEPTIONS
    try {
#endif // _LIBCPP_HAS_EXCEPTIONS
      size_t __n_left = __n;
      for (const value_type* __p = __sa.__vp_; __n_left; ++__end_, __p += __sa.__stride_, --__n_left)
        ::new ((void*)__end_) value_type(*__p);
#if _LIBCPP_HAS_EXCEPTIONS
    } catch (...) {
      __clear(__n);
      throw;
    }
#endif // _LIBCPP_HAS_EXCEPTIONS
  }
}

template <class _Tp>
valarray<_Tp>::valarray(const gslice_array<value_type>& __ga) : __begin_(nullptr), __end_(nullptr) {
  const size_t __n = __ga.__1d_.size();
  if (__n) {
    __begin_ = __end_ = allocator<value_type>().allocate(__n);
#if _LIBCPP_HAS_EXCEPTIONS
    try {
#endif // _LIBCPP_HAS_EXCEPTIONS
      typedef const size_t* _Ip;
      const value_type* __s = __ga.__vp_;
      for (_Ip __i = __ga.__1d_.__begin_, __e = __ga.__1d_.__end_; __i != __e; ++__i, ++__end_)
        ::new ((void*)__end_) value_type(__s[*__i]);
#if _LIBCPP_HAS_EXCEPTIONS
    } catch (...) {
      __clear(__n);
      throw;
    }
#endif // _LIBCPP_HAS_EXCEPTIONS
  }
}

template <class _Tp>
valarray<_Tp>::valarray(const mask_array<value_type>& __ma) : __begin_(nullptr), __end_(nullptr) {
  const size_t __n = __ma.__1d_.size();
  if (__n) {
    __begin_ = __end_ = allocator<value_type>().allocate(__n);
#if _LIBCPP_HAS_EXCEPTIONS
    try {
#endif // _LIBCPP_HAS_EXCEPTIONS
      typedef const size_t* _Ip;
      const value_type* __s = __ma.__vp_;
      for (_Ip __i = __ma.__1d_.__begin_, __e = __ma.__1d_.__end_; __i != __e; ++__i, ++__end_)
        ::new ((void*)__end_) value_type(__s[*__i]);
#if _LIBCPP_HAS_EXCEPTIONS
    } catch (...) {
      __clear(__n);
      throw;
    }
#endif // _LIBCPP_HAS_EXCEPTIONS
  }
}

template <class _Tp>
valarray<_Tp>::valarray(const indirect_array<value_type>& __ia) : __begin_(nullptr), __end_(nullptr) {
  const size_t __n = __ia.__1d_.size();
  if (__n) {
    __begin_ = __end_ = allocator<value_type>().allocate(__n);
#if _LIBCPP_HAS_EXCEPTIONS
    try {
#endif // _LIBCPP_HAS_EXCEPTIONS
      typedef const size_t* _Ip;
      const value_type* __s = __ia.__vp_;
      for (_Ip __i = __ia.__1d_.__begin_, __e = __ia.__1d_.__end_; __i != __e; ++__i, ++__end_)
        ::new ((void*)__end_) value_type(__s[*__i]);
#if _LIBCPP_HAS_EXCEPTIONS
    } catch (...) {
      __clear(__n);
      throw;
    }
#endif // _LIBCPP_HAS_EXCEPTIONS
  }
}

template <class _Tp>
inline valarray<_Tp>::~valarray() {
  __clear(size());
}

template <class _Tp>
valarray<_Tp>& valarray<_Tp>::__assign_range(const value_type* __f, const value_type* __l) {
  size_t __n = __l - __f;
  if (size() != __n) {
    __clear(size());
    __begin_ = allocator<value_type>().allocate(__n);
    __end_   = __begin_ + __n;
    std::uninitialized_copy(__f, __l, __begin_);
  } else {
    std::copy(__f, __l, __begin_);
  }
  return *this;
}

template <class _Tp>
valarray<_Tp>& valarray<_Tp>::operator=(const valarray& __v) {
  if (this != std::addressof(__v))
    return __assign_range(__v.__begin_, __v.__end_);
  return *this;
}

#ifndef _LIBCPP_CXX03_LANG

template <class _Tp>
inline valarray<_Tp>& valarray<_Tp>::operator=(valarray&& __v) _NOEXCEPT {
  __clear(size());
  __begin_     = __v.__begin_;
  __end_       = __v.__end_;
  __v.__begin_ = nullptr;
  __v.__end_   = nullptr;
  return *this;
}

template <class _Tp>
inline valarray<_Tp>& valarray<_Tp>::operator=(initializer_list<value_type> __il) {
  return __assign_range(__il.begin(), __il.end());
}

#endif // _LIBCPP_CXX03_LANG

template <class _Tp>
inline valarray<_Tp>& valarray<_Tp>::operator=(const value_type& __x) {
  std::fill(__begin_, __end_, __x);
  return *this;
}

template <class _Tp>
inline valarray<_Tp>& valarray<_Tp>::operator=(const slice_array<value_type>& __sa) {
  value_type* __t       = __begin_;
  const value_type* __s = __sa.__vp_;
  for (size_t __n = __sa.__size_; __n; --__n, __s += __sa.__stride_, ++__t)
    *__t = *__s;
  return *this;
}

template <class _Tp>
inline valarray<_Tp>& valarray<_Tp>::operator=(const gslice_array<value_type>& __ga) {
  typedef const size_t* _Ip;
  value_type* __t       = __begin_;
  const value_type* __s = __ga.__vp_;
  for (_Ip __i = __ga.__1d_.__begin_, __e = __ga.__1d_.__end_; __i != __e; ++__i, ++__t)
    *__t = __s[*__i];
  return *this;
}

template <class _Tp>
inline valarray<_Tp>& valarray<_Tp>::operator=(const mask_array<value_type>& __ma) {
  typedef const size_t* _Ip;
  value_type* __t       = __begin_;
  const value_type* __s = __ma.__vp_;
  for (_Ip __i = __ma.__1d_.__begin_, __e = __ma.__1d_.__end_; __i != __e; ++__i, ++__t)
    *__t = __s[*__i];
  return *this;
}

template <class _Tp>
inline valarray<_Tp>& valarray<_Tp>::operator=(const indirect_array<value_type>& __ia) {
  typedef const size_t* _Ip;
  value_type* __t       = __begin_;
  const value_type* __s = __ia.__vp_;
  for (_Ip __i = __ia.__1d_.__begin_, __e = __ia.__1d_.__end_; __i != __e; ++__i, ++__t)
    *__t = __s[*__i];
  return *this;
}

template <class _Tp>
template <class _ValExpr>
inline valarray<_Tp>& valarray<_Tp>::operator=(const __val_expr<_ValExpr>& __v) {
  size_t __n = __v.size();
  if (size() != __n)
    resize(__n);
  value_type* __t = __begin_;
  for (size_t __i = 0; __i != __n; ++__t, ++__i)
    *__t = __result_type(__v[__i]);
  return *this;
}

template <class _Tp>
inline __val_expr<__slice_expr<const valarray<_Tp>&> > valarray<_Tp>::operator[](slice __s) const {
  return __val_expr<__slice_expr<const valarray&> >(__slice_expr<const valarray&>(__s, *this));
}

template <class _Tp>
inline slice_array<_Tp> valarray<_Tp>::operator[](slice __s) {
  return slice_array<value_type>(__s, *this);
}

template <class _Tp>
inline __val_expr<__indirect_expr<const valarray<_Tp>&> > valarray<_Tp>::operator[](const gslice& __gs) const {
  return __val_expr<__indirect_expr<const valarray&> >(__indirect_expr<const valarray&>(__gs.__1d_, *this));
}

template <class _Tp>
inline gslice_array<_Tp> valarray<_Tp>::operator[](const gslice& __gs) {
  return gslice_array<value_type>(__gs, *this);
}

#ifndef _LIBCPP_CXX03_LANG

template <class _Tp>
inline __val_expr<__indirect_expr<const valarray<_Tp>&> > valarray<_Tp>::operator[](gslice&& __gs) const {
  return __val_expr<__indirect_expr<const valarray&> >(__indirect_expr<const valarray&>(std::move(__gs.__1d_), *this));
}

template <class _Tp>
inline gslice_array<_Tp> valarray<_Tp>::operator[](gslice&& __gs) {
  return gslice_array<value_type>(std::move(__gs), *this);
}

#endif // _LIBCPP_CXX03_LANG

template <class _Tp>
inline __val_expr<__mask_expr<const valarray<_Tp>&> > valarray<_Tp>::operator[](const valarray<bool>& __vb) const {
  return __val_expr<__mask_expr<const valarray&> >(__mask_expr<const valarray&>(__vb, *this));
}

template <class _Tp>
inline mask_array<_Tp> valarray<_Tp>::operator[](const valarray<bool>& __vb) {
  return mask_array<value_type>(__vb, *this);
}

#ifndef _LIBCPP_CXX03_LANG

template <class _Tp>
inline __val_expr<__mask_expr<const valarray<_Tp>&> > valarray<_Tp>::operator[](valarray<bool>&& __vb) const {
  return __val_expr<__mask_expr<const valarray&> >(__mask_expr<const valarray&>(std::move(__vb), *this));
}

template <class _Tp>
inline mask_array<_Tp> valarray<_Tp>::operator[](valarray<bool>&& __vb) {
  return mask_array<value_type>(std::move(__vb), *this);
}

#endif // _LIBCPP_CXX03_LANG

template <class _Tp>
inline __val_expr<__indirect_expr<const valarray<_Tp>&> >
valarray<_Tp>::operator[](const valarray<size_t>& __vs) const {
  return __val_expr<__indirect_expr<const valarray&> >(__indirect_expr<const valarray&>(__vs, *this));
}

template <class _Tp>
inline indirect_array<_Tp> valarray<_Tp>::operator[](const valarray<size_t>& __vs) {
  return indirect_array<value_type>(__vs, *this);
}

#ifndef _LIBCPP_CXX03_LANG

template <class _Tp>
inline __val_expr<__indirect_expr<const valarray<_Tp>&> > valarray<_Tp>::operator[](valarray<size_t>&& __vs) const {
  return __val_expr<__indirect_expr<const valarray&> >(__indirect_expr<const valarray&>(std::move(__vs), *this));
}

template <class _Tp>
inline indirect_array<_Tp> valarray<_Tp>::operator[](valarray<size_t>&& __vs) {
  return indirect_array<value_type>(std::move(__vs), *this);
}

#endif // _LIBCPP_CXX03_LANG

template <class _Tp>
inline __val_expr<_UnaryOp<__unary_plus<_Tp>, const valarray<_Tp>&> > valarray<_Tp>::operator+() const {
  using _Op = _UnaryOp<__unary_plus<_Tp>, const valarray<_Tp>&>;
  return __val_expr<_Op>(_Op(__unary_plus<_Tp>(), *this));
}

template <class _Tp>
inline __val_expr<_UnaryOp<negate<_Tp>, const valarray<_Tp>&> > valarray<_Tp>::operator-() const {
  using _Op = _UnaryOp<negate<_Tp>, const valarray<_Tp>&>;
  return __val_expr<_Op>(_Op(negate<_Tp>(), *this));
}

template <class _Tp>
inline __val_expr<_UnaryOp<__bit_not<_Tp>, const valarray<_Tp>&> > valarray<_Tp>::operator~() const {
  using _Op = _UnaryOp<__bit_not<_Tp>, const valarray<_Tp>&>;
  return __val_expr<_Op>(_Op(__bit_not<_Tp>(), *this));
}

template <class _Tp>
inline __val_expr<_UnaryOp<logical_not<_Tp>, const valarray<_Tp>&> > valarray<_Tp>::operator!() const {
  using _Op = _UnaryOp<logical_not<_Tp>, const valarray<_Tp>&>;
  return __val_expr<_Op>(_Op(logical_not<_Tp>(), *this));
}

template <class _Tp>
inline valarray<_Tp>& valarray<_Tp>::operator*=(const value_type& __x) {
  for (value_type* __p = __begin_; __p != __end_; ++__p)
    *__p *= __x;
  return *this;
}

template <class _Tp>
inline valarray<_Tp>& valarray<_Tp>::operator/=(const value_type& __x) {
  for (value_type* __p = __begin_; __p != __end_; ++__p)
    *__p /= __x;
  return *this;
}

template <class _Tp>
inline valarray<_Tp>& valarray<_Tp>::operator%=(const value_type& __x) {
  for (value_type* __p = __begin_; __p != __end_; ++__p)
    *__p %= __x;
  return *this;
}

template <class _Tp>
inline valarray<_Tp>& valarray<_Tp>::operator+=(const value_type& __x) {
  for (value_type* __p = __begin_; __p != __end_; ++__p)
    *__p += __x;
  return *this;
}

template <class _Tp>
inline valarray<_Tp>& valarray<_Tp>::operator-=(const value_type& __x) {
  for (value_type* __p = __begin_; __p != __end_; ++__p)
    *__p -= __x;
  return *this;
}

template <class _Tp>
inline valarray<_Tp>& valarray<_Tp>::operator^=(const value_type& __x) {
  for (value_type* __p = __begin_; __p != __end_; ++__p)
    *__p ^= __x;
  return *this;
}

template <class _Tp>
inline valarray<_Tp>& valarray<_Tp>::operator&=(const value_type& __x) {
  for (value_type* __p = __begin_; __p != __end_; ++__p)
    *__p &= __x;
  return *this;
}

template <class _Tp>
inline valarray<_Tp>& valarray<_Tp>::operator|=(const value_type& __x) {
  for (value_type* __p = __begin_; __p != __end_; ++__p)
    *__p |= __x;
  return *this;
}

template <class _Tp>
inline valarray<_Tp>& valarray<_Tp>::operator<<=(const value_type& __x) {
  for (value_type* __p = __begin_; __p != __end_; ++__p)
    *__p <<= __x;
  return *this;
}

template <class _Tp>
inline valarray<_Tp>& valarray<_Tp>::operator>>=(const value_type& __x) {
  for (value_type* __p = __begin_; __p != __end_; ++__p)
    *__p >>= __x;
  return *this;
}

template <class _Tp>
template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
inline valarray<_Tp>& valarray<_Tp>::operator*=(const _Expr& __v) {
  size_t __i = 0;
  for (value_type* __t = __begin_; __t != __end_; ++__t, ++__i)
    *__t *= std::__get(__v, __i);
  return *this;
}

template <class _Tp>
template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
inline valarray<_Tp>& valarray<_Tp>::operator/=(const _Expr& __v) {
  size_t __i = 0;
  for (value_type* __t = __begin_; __t != __end_; ++__t, ++__i)
    *__t /= std::__get(__v, __i);
  return *this;
}

template <class _Tp>
template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
inline valarray<_Tp>& valarray<_Tp>::operator%=(const _Expr& __v) {
  size_t __i = 0;
  for (value_type* __t = __begin_; __t != __end_; ++__t, ++__i)
    *__t %= std::__get(__v, __i);
  return *this;
}

template <class _Tp>
template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
inline valarray<_Tp>& valarray<_Tp>::operator+=(const _Expr& __v) {
  size_t __i = 0;
  for (value_type* __t = __begin_; __t != __end_; ++__t, ++__i)
    *__t += std::__get(__v, __i);
  return *this;
}

template <class _Tp>
template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
inline valarray<_Tp>& valarray<_Tp>::operator-=(const _Expr& __v) {
  size_t __i = 0;
  for (value_type* __t = __begin_; __t != __end_; ++__t, ++__i)
    *__t -= std::__get(__v, __i);
  return *this;
}

template <class _Tp>
template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
inline valarray<_Tp>& valarray<_Tp>::operator^=(const _Expr& __v) {
  size_t __i = 0;
  for (value_type* __t = __begin_; __t != __end_; ++__t, ++__i)
    *__t ^= std::__get(__v, __i);
  return *this;
}

template <class _Tp>
template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
inline valarray<_Tp>& valarray<_Tp>::operator|=(const _Expr& __v) {
  size_t __i = 0;
  for (value_type* __t = __begin_; __t != __end_; ++__t, ++__i)
    *__t |= std::__get(__v, __i);
  return *this;
}

template <class _Tp>
template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
inline valarray<_Tp>& valarray<_Tp>::operator&=(const _Expr& __v) {
  size_t __i = 0;
  for (value_type* __t = __begin_; __t != __end_; ++__t, ++__i)
    *__t &= std::__get(__v, __i);
  return *this;
}

template <class _Tp>
template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
inline valarray<_Tp>& valarray<_Tp>::operator<<=(const _Expr& __v) {
  size_t __i = 0;
  for (value_type* __t = __begin_; __t != __end_; ++__t, ++__i)
    *__t <<= std::__get(__v, __i);
  return *this;
}

template <class _Tp>
template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
inline valarray<_Tp>& valarray<_Tp>::operator>>=(const _Expr& __v) {
  size_t __i = 0;
  for (value_type* __t = __begin_; __t != __end_; ++__t, ++__i)
    *__t >>= std::__get(__v, __i);
  return *this;
}

template <class _Tp>
inline void valarray<_Tp>::swap(valarray& __v) _NOEXCEPT {
  std::swap(__begin_, __v.__begin_);
  std::swap(__end_, __v.__end_);
}

template <class _Tp>
inline _Tp valarray<_Tp>::sum() const {
  if (__begin_ == __end_)
    return value_type();
  const value_type* __p = __begin_;
  _Tp __r               = *__p;
  for (++__p; __p != __end_; ++__p)
    __r += *__p;
  return __r;
}

template <class _Tp>
inline _Tp valarray<_Tp>::min() const {
  if (__begin_ == __end_)
    return value_type();
  return *std::min_element(__begin_, __end_);
}

template <class _Tp>
inline _Tp valarray<_Tp>::max() const {
  if (__begin_ == __end_)
    return value_type();
  return *std::max_element(__begin_, __end_);
}

template <class _Tp>
valarray<_Tp> valarray<_Tp>::shift(int __i) const {
  valarray<value_type> __r;
  size_t __n = size();
  if (__n) {
    __r.__begin_ = __r.__end_ = allocator<value_type>().allocate(__n);
    const value_type* __sb;
    value_type* __tb;
    value_type* __te;
    if (__i >= 0) {
      __i  = std::min(__i, static_cast<int>(__n));
      __sb = __begin_ + __i;
      __tb = __r.__begin_;
      __te = __r.__begin_ + (__n - __i);
    } else {
      __i  = std::min(-__i, static_cast<int>(__n));
      __sb = __begin_;
      __tb = __r.__begin_ + __i;
      __te = __r.__begin_ + __n;
    }
    for (; __r.__end_ != __tb; ++__r.__end_)
      ::new ((void*)__r.__end_) value_type();
    for (; __r.__end_ != __te; ++__r.__end_, ++__sb)
      ::new ((void*)__r.__end_) value_type(*__sb);
    for (__te = __r.__begin_ + __n; __r.__end_ != __te; ++__r.__end_)
      ::new ((void*)__r.__end_) value_type();
  }
  return __r;
}

template <class _Tp>
valarray<_Tp> valarray<_Tp>::cshift(int __i) const {
  valarray<value_type> __r;
  size_t __n = size();
  if (__n) {
    __r.__begin_ = __r.__end_ = allocator<value_type>().allocate(__n);
    __i %= static_cast<int>(__n);
    const value_type* __m = __i >= 0 ? __begin_ + __i : __end_ + __i;
    for (const value_type* __s = __m; __s != __end_; ++__r.__end_, ++__s)
      ::new ((void*)__r.__end_) value_type(*__s);
    for (const value_type* __s = __begin_; __s != __m; ++__r.__end_, ++__s)
      ::new ((void*)__r.__end_) value_type(*__s);
  }
  return __r;
}

template <class _Tp>
valarray<_Tp> valarray<_Tp>::apply(value_type __f(value_type)) const {
  valarray<value_type> __r;
  size_t __n = size();
  if (__n) {
    __r.__begin_ = __r.__end_ = allocator<value_type>().allocate(__n);
    for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n)
      ::new ((void*)__r.__end_) value_type(__f(*__p));
  }
  return __r;
}

template <class _Tp>
valarray<_Tp> valarray<_Tp>::apply(value_type __f(const value_type&)) const {
  valarray<value_type> __r;
  size_t __n = size();
  if (__n) {
    __r.__begin_ = __r.__end_ = allocator<value_type>().allocate(__n);
    for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n)
      ::new ((void*)__r.__end_) value_type(__f(*__p));
  }
  return __r;
}

template <class _Tp>
inline void valarray<_Tp>::__clear(size_t __capacity) {
  if (__begin_ != nullptr) {
    while (__end_ != __begin_)
      (--__end_)->~value_type();
    allocator<value_type>().deallocate(__begin_, __capacity);
    __begin_ = __end_ = nullptr;
  }
}

template <class _Tp>
void valarray<_Tp>::resize(size_t __n, value_type __x) {
  __clear(size());
  if (__n) {
    __begin_ = __end_ = allocator<value_type>().allocate(__n);
#if _LIBCPP_HAS_EXCEPTIONS
    try {
#endif // _LIBCPP_HAS_EXCEPTIONS
      for (size_t __n_left = __n; __n_left; --__n_left, ++__end_)
        ::new ((void*)__end_) value_type(__x);
#if _LIBCPP_HAS_EXCEPTIONS
    } catch (...) {
      __clear(__n);
      throw;
    }
#endif // _LIBCPP_HAS_EXCEPTIONS
  }
}

template <class _Tp>
inline _LIBCPP_HIDE_FROM_ABI void swap(valarray<_Tp>& __x, valarray<_Tp>& __y) _NOEXCEPT {
  __x.swap(__y);
}

template <class _Expr1,
          class _Expr2,
          __enable_if_t<__is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, int> = 0>
inline _LIBCPP_HIDE_FROM_ABI __val_expr<_BinaryOp<multiplies<typename _Expr1::value_type>, _Expr1, _Expr2> >
operator*(const _Expr1& __x, const _Expr2& __y) {
  typedef typename _Expr1::value_type value_type;
  typedef _BinaryOp<multiplies<value_type>, _Expr1, _Expr2> _Op;
  return __val_expr<_Op>(_Op(multiplies<value_type>(), __x, __y));
}

template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
inline _LIBCPP_HIDE_FROM_ABI
__val_expr<_BinaryOp<multiplies<typename _Expr::value_type>, _Expr, __scalar_expr<typename _Expr::value_type> > >
operator*(const _Expr& __x, const typename _Expr::value_type& __y) {
  typedef typename _Expr::value_type value_type;
  typedef _BinaryOp<multiplies<value_type>, _Expr, __scalar_expr<value_type> > _Op;
  return __val_expr<_Op>(_Op(multiplies<value_type>(), __x, __scalar_expr<value_type>(__y, __x.size())));
}

template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
inline _LIBCPP_HIDE_FROM_ABI
__val_expr<_BinaryOp<multiplies<typename _Expr::value_type>, __scalar_expr<typename _Expr::value_type>, _Expr> >
operator*(const typename _Expr::value_type& __x, const _Expr& __y) {
  typedef typename _Expr::value_type value_type;
  typedef _BinaryOp<multiplies<value_type>, __scalar_expr<value_type>, _Expr> _Op;
  return __val_expr<_Op>(_Op(multiplies<value_type>(), __scalar_expr<value_type>(__x, __y.size()), __y));
}

template <class _Expr1,
          class _Expr2,
          __enable_if_t<__is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, int> = 0>
inline _LIBCPP_HIDE_FROM_ABI __val_expr<_BinaryOp<divides<typename _Expr1::value_type>, _Expr1, _Expr2> >
operator/(const _Expr1& __x, const _Expr2& __y) {
  typedef typename _Expr1::value_type value_type;
  typedef _BinaryOp<divides<value_type>, _Expr1, _Expr2> _Op;
  return __val_expr<_Op>(_Op(divides<value_type>(), __x, __y));
}

template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
inline _LIBCPP_HIDE_FROM_ABI
__val_expr<_BinaryOp<divides<typename _Expr::value_type>, _Expr, __scalar_expr<typename _Expr::value_type> > >
operator/(const _Expr& __x, const typename _Expr::value_type& __y) {
  typedef typename _Expr::value_type value_type;
  typedef _BinaryOp<divides<value_type>, _Expr, __scalar_expr<value_type> > _Op;
  return __val_expr<_Op>(_Op(divides<value_type>(), __x, __scalar_expr<value_type>(__y, __x.size())));
}

template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
inline _LIBCPP_HIDE_FROM_ABI
__val_expr<_BinaryOp<divides<typename _Expr::value_type>, __scalar_expr<typename _Expr::value_type>, _Expr> >
operator/(const typename _Expr::value_type& __x, const _Expr& __y) {
  typedef typename _Expr::value_type value_type;
  typedef _BinaryOp<divides<value_type>, __scalar_expr<value_type>, _Expr> _Op;
  return __val_expr<_Op>(_Op(divides<value_type>(), __scalar_expr<value_type>(__x, __y.size()), __y));
}

template <class _Expr1,
          class _Expr2,
          __enable_if_t<__is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, int> = 0>
inline _LIBCPP_HIDE_FROM_ABI __val_expr<_BinaryOp<modulus<typename _Expr1::value_type>, _Expr1, _Expr2> >
operator%(const _Expr1& __x, const _Expr2& __y) {
  typedef typename _Expr1::value_type value_type;
  typedef _BinaryOp<modulus<value_type>, _Expr1, _Expr2> _Op;
  return __val_expr<_Op>(_Op(modulus<value_type>(), __x, __y));
}

template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
inline _LIBCPP_HIDE_FROM_ABI
__val_expr<_BinaryOp<modulus<typename _Expr::value_type>, _Expr, __scalar_expr<typename _Expr::value_type> > >
operator%(const _Expr& __x, const typename _Expr::value_type& __y) {
  typedef typename _Expr::value_type value_type;
  typedef _BinaryOp<modulus<value_type>, _Expr, __scalar_expr<value_type> > _Op;
  return __val_expr<_Op>(_Op(modulus<value_type>(), __x, __scalar_expr<value_type>(__y, __x.size())));
}

template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
inline _LIBCPP_HIDE_FROM_ABI
__val_expr<_BinaryOp<modulus<typename _Expr::value_type>, __scalar_expr<typename _Expr::value_type>, _Expr> >
operator%(const typename _Expr::value_type& __x, const _Expr& __y) {
  typedef typename _Expr::value_type value_type;
  typedef _BinaryOp<modulus<value_type>, __scalar_expr<value_type>, _Expr> _Op;
  return __val_expr<_Op>(_Op(modulus<value_type>(), __scalar_expr<value_type>(__x, __y.size()), __y));
}

template <class _Expr1,
          class _Expr2,
          __enable_if_t<__is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, int> = 0>
inline _LIBCPP_HIDE_FROM_ABI __val_expr<_BinaryOp<plus<typename _Expr1::value_type>, _Expr1, _Expr2> >
operator+(const _Expr1& __x, const _Expr2& __y) {
  typedef typename _Expr1::value_type value_type;
  typedef _BinaryOp<plus<value_type>, _Expr1, _Expr2> _Op;
  return __val_expr<_Op>(_Op(plus<value_type>(), __x, __y));
}

template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
inline _LIBCPP_HIDE_FROM_ABI
__val_expr<_BinaryOp<plus<typename _Expr::value_type>, _Expr, __scalar_expr<typename _Expr::value_type> > >
operator+(const _Expr& __x, const typename _Expr::value_type& __y) {
  typedef typename _Expr::value_type value_type;
  typedef _BinaryOp<plus<value_type>, _Expr, __scalar_expr<value_type> > _Op;
  return __val_expr<_Op>(_Op(plus<value_type>(), __x, __scalar_expr<value_type>(__y, __x.size())));
}

template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
inline _LIBCPP_HIDE_FROM_ABI
__val_expr<_BinaryOp<plus<typename _Expr::value_type>, __scalar_expr<typename _Expr::value_type>, _Expr> >
operator+(const typename _Expr::value_type& __x, const _Expr& __y) {
  typedef typename _Expr::value_type value_type;
  typedef _BinaryOp<plus<value_type>, __scalar_expr<value_type>, _Expr> _Op;
  return __val_expr<_Op>(_Op(plus<value_type>(), __scalar_expr<value_type>(__x, __y.size()), __y));
}

template <class _Expr1,
          class _Expr2,
          __enable_if_t<__is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, int> = 0>
inline _LIBCPP_HIDE_FROM_ABI __val_expr<_BinaryOp<minus<typename _Expr1::value_type>, _Expr1, _Expr2> >
operator-(const _Expr1& __x, const _Expr2& __y) {
  typedef typename _Expr1::value_type value_type;
  typedef _BinaryOp<minus<value_type>, _Expr1, _Expr2> _Op;
  return __val_expr<_Op>(_Op(minus<value_type>(), __x, __y));
}

template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
inline _LIBCPP_HIDE_FROM_ABI
__val_expr<_BinaryOp<minus<typename _Expr::value_type>, _Expr, __scalar_expr<typename _Expr::value_type> > >
operator-(const _Expr& __x, const typename _Expr::value_type& __y) {
  typedef typename _Expr::value_type value_type;
  typedef _BinaryOp<minus<value_type>, _Expr, __scalar_expr<value_type> > _Op;
  return __val_expr<_Op>(_Op(minus<value_type>(), __x, __scalar_expr<value_type>(__y, __x.size())));
}

template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
inline _LIBCPP_HIDE_FROM_ABI
__val_expr<_BinaryOp<minus<typename _Expr::value_type>, __scalar_expr<typename _Expr::value_type>, _Expr> >
operator-(const typename _Expr::value_type& __x, const _Expr& __y) {
  typedef typename _Expr::value_type value_type;
  typedef _BinaryOp<minus<value_type>, __scalar_expr<value_type>, _Expr> _Op;
  return __val_expr<_Op>(_Op(minus<value_type>(), __scalar_expr<value_type>(__x, __y.size()), __y));
}

template <class _Expr1,
          class _Expr2,
          __enable_if_t<__is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, int> = 0>
inline _LIBCPP_HIDE_FROM_ABI __val_expr<_BinaryOp<bit_xor<typename _Expr1::value_type>, _Expr1, _Expr2> >
operator^(const _Expr1& __x, const _Expr2& __y) {
  typedef typename _Expr1::value_type value_type;
  typedef _BinaryOp<bit_xor<value_type>, _Expr1, _Expr2> _Op;
  return __val_expr<_Op>(_Op(bit_xor<value_type>(), __x, __y));
}

template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
inline _LIBCPP_HIDE_FROM_ABI
__val_expr<_BinaryOp<bit_xor<typename _Expr::value_type>, _Expr, __scalar_expr<typename _Expr::value_type> > >
operator^(const _Expr& __x, const typename _Expr::value_type& __y) {
  typedef typename _Expr::value_type value_type;
  typedef _BinaryOp<bit_xor<value_type>, _Expr, __scalar_expr<value_type> > _Op;
  return __val_expr<_Op>(_Op(bit_xor<value_type>(), __x, __scalar_expr<value_type>(__y, __x.size())));
}

template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
inline _LIBCPP_HIDE_FROM_ABI
__val_expr<_BinaryOp<bit_xor<typename _Expr::value_type>, __scalar_expr<typename _Expr::value_type>, _Expr> >
operator^(const typename _Expr::value_type& __x, const _Expr& __y) {
  typedef typename _Expr::value_type value_type;
  typedef _BinaryOp<bit_xor<value_type>, __scalar_expr<value_type>, _Expr> _Op;
  return __val_expr<_Op>(_Op(bit_xor<value_type>(), __scalar_expr<value_type>(__x, __y.size()), __y));
}

template <class _Expr1,
          class _Expr2,
          __enable_if_t<__is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, int> = 0>
inline _LIBCPP_HIDE_FROM_ABI __val_expr<_BinaryOp<bit_and<typename _Expr1::value_type>, _Expr1, _Expr2> >
operator&(const _Expr1& __x, const _Expr2& __y) {
  typedef typename _Expr1::value_type value_type;
  typedef _BinaryOp<bit_and<value_type>, _Expr1, _Expr2> _Op;
  return __val_expr<_Op>(_Op(bit_and<value_type>(), __x, __y));
}

template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
inline _LIBCPP_HIDE_FROM_ABI
__val_expr<_BinaryOp<bit_and<typename _Expr::value_type>, _Expr, __scalar_expr<typename _Expr::value_type> > >
operator&(const _Expr& __x, const typename _Expr::value_type& __y) {
  typedef typename _Expr::value_type value_type;
  typedef _BinaryOp<bit_and<value_type>, _Expr, __scalar_expr<value_type> > _Op;
  return __val_expr<_Op>(_Op(bit_and<value_type>(), __x, __scalar_expr<value_type>(__y, __x.size())));
}

template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
inline _LIBCPP_HIDE_FROM_ABI
__val_expr<_BinaryOp<bit_and<typename _Expr::value_type>, __scalar_expr<typename _Expr::value_type>, _Expr> >
operator&(const typename _Expr::value_type& __x, const _Expr& __y) {
  typedef typename _Expr::value_type value_type;
  typedef _BinaryOp<bit_and<value_type>, __scalar_expr<value_type>, _Expr> _Op;
  return __val_expr<_Op>(_Op(bit_and<value_type>(), __scalar_expr<value_type>(__x, __y.size()), __y));
}

template <class _Expr1,
          class _Expr2,
          __enable_if_t<__is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, int> = 0>
inline _LIBCPP_HIDE_FROM_ABI __val_expr<_BinaryOp<bit_or<typename _Expr1::value_type>, _Expr1, _Expr2> >
operator|(const _Expr1& __x, const _Expr2& __y) {
  typedef typename _Expr1::value_type value_type;
  typedef _BinaryOp<bit_or<value_type>, _Expr1, _Expr2> _Op;
  return __val_expr<_Op>(_Op(bit_or<value_type>(), __x, __y));
}

template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
inline _LIBCPP_HIDE_FROM_ABI
__val_expr<_BinaryOp<bit_or<typename _Expr::value_type>, _Expr, __scalar_expr<typename _Expr::value_type> > >
operator|(const _Expr& __x, const typename _Expr::value_type& __y) {
  typedef typename _Expr::value_type value_type;
  typedef _BinaryOp<bit_or<value_type>, _Expr, __scalar_expr<value_type> > _Op;
  return __val_expr<_Op>(_Op(bit_or<value_type>(), __x, __scalar_expr<value_type>(__y, __x.size())));
}

template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
inline _LIBCPP_HIDE_FROM_ABI
__val_expr<_BinaryOp<bit_or<typename _Expr::value_type>, __scalar_expr<typename _Expr::value_type>, _Expr> >
operator|(const typename _Expr::value_type& __x, const _Expr& __y) {
  typedef typename _Expr::value_type value_type;
  typedef _BinaryOp<bit_or<value_type>, __scalar_expr<value_type>, _Expr> _Op;
  return __val_expr<_Op>(_Op(bit_or<value_type>(), __scalar_expr<value_type>(__x, __y.size()), __y));
}

template <class _Expr1,
          class _Expr2,
          __enable_if_t<__is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, int> = 0>
inline _LIBCPP_HIDE_FROM_ABI __val_expr<_BinaryOp<__bit_shift_left<typename _Expr1::value_type>, _Expr1, _Expr2> >
operator<<(const _Expr1& __x, const _Expr2& __y) {
  typedef typename _Expr1::value_type value_type;
  typedef _BinaryOp<__bit_shift_left<value_type>, _Expr1, _Expr2> _Op;
  return __val_expr<_Op>(_Op(__bit_shift_left<value_type>(), __x, __y));
}

template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
inline _LIBCPP_HIDE_FROM_ABI
__val_expr< _BinaryOp<__bit_shift_left<typename _Expr::value_type>, _Expr, __scalar_expr<typename _Expr::value_type> > >
operator<<(const _Expr& __x, const typename _Expr::value_type& __y) {
  typedef typename _Expr::value_type value_type;
  typedef _BinaryOp<__bit_shift_left<value_type>, _Expr, __scalar_expr<value_type> > _Op;
  return __val_expr<_Op>(_Op(__bit_shift_left<value_type>(), __x, __scalar_expr<value_type>(__y, __x.size())));
}

template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
inline _LIBCPP_HIDE_FROM_ABI
__val_expr< _BinaryOp<__bit_shift_left<typename _Expr::value_type>, __scalar_expr<typename _Expr::value_type>, _Expr> >
operator<<(const typename _Expr::value_type& __x, const _Expr& __y) {
  typedef typename _Expr::value_type value_type;
  typedef _BinaryOp<__bit_shift_left<value_type>, __scalar_expr<value_type>, _Expr> _Op;
  return __val_expr<_Op>(_Op(__bit_shift_left<value_type>(), __scalar_expr<value_type>(__x, __y.size()), __y));
}

template <class _Expr1,
          class _Expr2,
          __enable_if_t<__is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, int> = 0>
inline _LIBCPP_HIDE_FROM_ABI __val_expr<_BinaryOp<__bit_shift_right<typename _Expr1::value_type>, _Expr1, _Expr2> >
operator>>(const _Expr1& __x, const _Expr2& __y) {
  typedef typename _Expr1::value_type value_type;
  typedef _BinaryOp<__bit_shift_right<value_type>, _Expr1, _Expr2> _Op;
  return __val_expr<_Op>(_Op(__bit_shift_right<value_type>(), __x, __y));
}

template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
inline _LIBCPP_HIDE_FROM_ABI __val_expr<
    _BinaryOp<__bit_shift_right<typename _Expr::value_type>, _Expr, __scalar_expr<typename _Expr::value_type> > >
operator>>(const _Expr& __x, const typename _Expr::value_type& __y) {
  typedef typename _Expr::value_type value_type;
  typedef _BinaryOp<__bit_shift_right<value_type>, _Expr, __scalar_expr<value_type> > _Op;
  return __val_expr<_Op>(_Op(__bit_shift_right<value_type>(), __x, __scalar_expr<value_type>(__y, __x.size())));
}

template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
inline _LIBCPP_HIDE_FROM_ABI
__val_expr< _BinaryOp<__bit_shift_right<typename _Expr::value_type>, __scalar_expr<typename _Expr::value_type>, _Expr> >
operator>>(const typename _Expr::value_type& __x, const _Expr& __y) {
  typedef typename _Expr::value_type value_type;
  typedef _BinaryOp<__bit_shift_right<value_type>, __scalar_expr<value_type>, _Expr> _Op;
  return __val_expr<_Op>(_Op(__bit_shift_right<value_type>(), __scalar_expr<value_type>(__x, __y.size()), __y));
}

template <class _Expr1,
          class _Expr2,
          __enable_if_t<__is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, int> = 0>
inline _LIBCPP_HIDE_FROM_ABI __val_expr<_BinaryOp<logical_and<typename _Expr1::value_type>, _Expr1, _Expr2> >
operator&&(const _Expr1& __x, const _Expr2& __y) {
  typedef typename _Expr1::value_type value_type;
  typedef _BinaryOp<logical_and<value_type>, _Expr1, _Expr2> _Op;
  return __val_expr<_Op>(_Op(logical_and<value_type>(), __x, __y));
}

template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
inline _LIBCPP_HIDE_FROM_ABI
__val_expr<_BinaryOp<logical_and<typename _Expr::value_type>, _Expr, __scalar_expr<typename _Expr::value_type> > >
operator&&(const _Expr& __x, const typename _Expr::value_type& __y) {
  typedef typename _Expr::value_type value_type;
  typedef _BinaryOp<logical_and<value_type>, _Expr, __scalar_expr<value_type> > _Op;
  return __val_expr<_Op>(_Op(logical_and<value_type>(), __x, __scalar_expr<value_type>(__y, __x.size())));
}

template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
inline _LIBCPP_HIDE_FROM_ABI
__val_expr<_BinaryOp<logical_and<typename _Expr::value_type>, __scalar_expr<typename _Expr::value_type>, _Expr> >
operator&&(const typename _Expr::value_type& __x, const _Expr& __y) {
  typedef typename _Expr::value_type value_type;
  typedef _BinaryOp<logical_and<value_type>, __scalar_expr<value_type>, _Expr> _Op;
  return __val_expr<_Op>(_Op(logical_and<value_type>(), __scalar_expr<value_type>(__x, __y.size()), __y));
}

template <class _Expr1,
          class _Expr2,
          __enable_if_t<__is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, int> = 0>
inline _LIBCPP_HIDE_FROM_ABI __val_expr<_BinaryOp<logical_or<typename _Expr1::value_type>, _Expr1, _Expr2> >
operator||(const _Expr1& __x, const _Expr2& __y) {
  typedef typename _Expr1::value_type value_type;
  typedef _BinaryOp<logical_or<value_type>, _Expr1, _Expr2> _Op;
  return __val_expr<_Op>(_Op(logical_or<value_type>(), __x, __y));
}

template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
inline _LIBCPP_HIDE_FROM_ABI
__val_expr<_BinaryOp<logical_or<typename _Expr::value_type>, _Expr, __scalar_expr<typename _Expr::value_type> > >
operator||(const _Expr& __x, const typename _Expr::value_type& __y) {
  typedef typename _Expr::value_type value_type;
  typedef _BinaryOp<logical_or<value_type>, _Expr, __scalar_expr<value_type> > _Op;
  return __val_expr<_Op>(_Op(logical_or<value_type>(), __x, __scalar_expr<value_type>(__y, __x.size())));
}

template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
inline _LIBCPP_HIDE_FROM_ABI
__val_expr<_BinaryOp<logical_or<typename _Expr::value_type>, __scalar_expr<typename _Expr::value_type>, _Expr> >
operator||(const typename _Expr::value_type& __x, const _Expr& __y) {
  typedef typename _Expr::value_type value_type;
  typedef _BinaryOp<logical_or<value_type>, __scalar_expr<value_type>, _Expr> _Op;
  return __val_expr<_Op>(_Op(logical_or<value_type>(), __scalar_expr<value_type>(__x, __y.size()), __y));
}

template <class _Expr1,
          class _Expr2,
          __enable_if_t<__is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, int> = 0>
inline _LIBCPP_HIDE_FROM_ABI __val_expr<_BinaryOp<equal_to<typename _Expr1::value_type>, _Expr1, _Expr2> >
operator==(const _Expr1& __x, const _Expr2& __y) {
  typedef typename _Expr1::value_type value_type;
  typedef _BinaryOp<equal_to<value_type>, _Expr1, _Expr2> _Op;
  return __val_expr<_Op>(_Op(equal_to<value_type>(), __x, __y));
}

template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
inline _LIBCPP_HIDE_FROM_ABI
__val_expr<_BinaryOp<equal_to<typename _Expr::value_type>, _Expr, __scalar_expr<typename _Expr::value_type> > >
operator==(const _Expr& __x, const typename _Expr::value_type& __y) {
  typedef typename _Expr::value_type value_type;
  typedef _BinaryOp<equal_to<value_type>, _Expr, __scalar_expr<value_type> > _Op;
  return __val_expr<_Op>(_Op(equal_to<value_type>(), __x, __scalar_expr<value_type>(__y, __x.size())));
}

template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
inline _LIBCPP_HIDE_FROM_ABI
__val_expr<_BinaryOp<equal_to<typename _Expr::value_type>, __scalar_expr<typename _Expr::value_type>, _Expr> >
operator==(const typename _Expr::value_type& __x, const _Expr& __y) {
  typedef typename _Expr::value_type value_type;
  typedef _BinaryOp<equal_to<value_type>, __scalar_expr<value_type>, _Expr> _Op;
  return __val_expr<_Op>(_Op(equal_to<value_type>(), __scalar_expr<value_type>(__x, __y.size()), __y));
}

template <class _Expr1,
          class _Expr2,
          __enable_if_t<__is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, int> = 0>
inline _LIBCPP_HIDE_FROM_ABI __val_expr<_BinaryOp<not_equal_to<typename _Expr1::value_type>, _Expr1, _Expr2> >
operator!=(const _Expr1& __x, const _Expr2& __y) {
  typedef typename _Expr1::value_type value_type;
  typedef _BinaryOp<not_equal_to<value_type>, _Expr1, _Expr2> _Op;
  return __val_expr<_Op>(_Op(not_equal_to<value_type>(), __x, __y));
}

template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
inline _LIBCPP_HIDE_FROM_ABI
__val_expr<_BinaryOp<not_equal_to<typename _Expr::value_type>, _Expr, __scalar_expr<typename _Expr::value_type> > >
operator!=(const _Expr& __x, const typename _Expr::value_type& __y) {
  typedef typename _Expr::value_type value_type;
  typedef _BinaryOp<not_equal_to<value_type>, _Expr, __scalar_expr<value_type> > _Op;
  return __val_expr<_Op>(_Op(not_equal_to<value_type>(), __x, __scalar_expr<value_type>(__y, __x.size())));
}

template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
inline _LIBCPP_HIDE_FROM_ABI
__val_expr<_BinaryOp<not_equal_to<typename _Expr::value_type>, __scalar_expr<typename _Expr::value_type>, _Expr> >
operator!=(const typename _Expr::value_type& __x, const _Expr& __y) {
  typedef typename _Expr::value_type value_type;
  typedef _BinaryOp<not_equal_to<value_type>, __scalar_expr<value_type>, _Expr> _Op;
  return __val_expr<_Op>(_Op(not_equal_to<value_type>(), __scalar_expr<value_type>(__x, __y.size()), __y));
}

template <class _Expr1,
          class _Expr2,
          __enable_if_t<__is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, int> = 0>
inline _LIBCPP_HIDE_FROM_ABI __val_expr<_BinaryOp<less<typename _Expr1::value_type>, _Expr1, _Expr2> >
operator<(const _Expr1& __x, const _Expr2& __y) {
  typedef typename _Expr1::value_type value_type;
  typedef _BinaryOp<less<value_type>, _Expr1, _Expr2> _Op;
  return __val_expr<_Op>(_Op(less<value_type>(), __x, __y));
}

template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
inline _LIBCPP_HIDE_FROM_ABI
__val_expr<_BinaryOp<less<typename _Expr::value_type>, _Expr, __scalar_expr<typename _Expr::value_type> > >
operator<(const _Expr& __x, const typename _Expr::value_type& __y) {
  typedef typename _Expr::value_type value_type;
  typedef _BinaryOp<less<value_type>, _Expr, __scalar_expr<value_type> > _Op;
  return __val_expr<_Op>(_Op(less<value_type>(), __x, __scalar_expr<value_type>(__y, __x.size())));
}

template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
inline _LIBCPP_HIDE_FROM_ABI
__val_expr<_BinaryOp<less<typename _Expr::value_type>, __scalar_expr<typename _Expr::value_type>, _Expr> >
operator<(const typename _Expr::value_type& __x, const _Expr& __y) {
  typedef typename _Expr::value_type value_type;
  typedef _BinaryOp<less<value_type>, __scalar_expr<value_type>, _Expr> _Op;
  return __val_expr<_Op>(_Op(less<value_type>(), __scalar_expr<value_type>(__x, __y.size()), __y));
}

template <class _Expr1,
          class _Expr2,
          __enable_if_t<__is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, int> = 0>
inline _LIBCPP_HIDE_FROM_ABI __val_expr<_BinaryOp<greater<typename _Expr1::value_type>, _Expr1, _Expr2> >
operator>(const _Expr1& __x, const _Expr2& __y) {
  typedef typename _Expr1::value_type value_type;
  typedef _BinaryOp<greater<value_type>, _Expr1, _Expr2> _Op;
  return __val_expr<_Op>(_Op(greater<value_type>(), __x, __y));
}

template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
inline _LIBCPP_HIDE_FROM_ABI
__val_expr<_BinaryOp<greater<typename _Expr::value_type>, _Expr, __scalar_expr<typename _Expr::value_type> > >
operator>(const _Expr& __x, const typename _Expr::value_type& __y) {
  typedef typename _Expr::value_type value_type;
  typedef _BinaryOp<greater<value_type>, _Expr, __scalar_expr<value_type> > _Op;
  return __val_expr<_Op>(_Op(greater<value_type>(), __x, __scalar_expr<value_type>(__y, __x.size())));
}

template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
inline _LIBCPP_HIDE_FROM_ABI
__val_expr<_BinaryOp<greater<typename _Expr::value_type>, __scalar_expr<typename _Expr::value_type>, _Expr> >
operator>(const typename _Expr::value_type& __x, const _Expr& __y) {
  typedef typename _Expr::value_type value_type;
  typedef _BinaryOp<greater<value_type>, __scalar_expr<value_type>, _Expr> _Op;
  return __val_expr<_Op>(_Op(greater<value_type>(), __scalar_expr<value_type>(__x, __y.size()), __y));
}

template <class _Expr1,
          class _Expr2,
          __enable_if_t<__is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, int> = 0>
inline _LIBCPP_HIDE_FROM_ABI __val_expr<_BinaryOp<less_equal<typename _Expr1::value_type>, _Expr1, _Expr2> >
operator<=(const _Expr1& __x, const _Expr2& __y) {
  typedef typename _Expr1::value_type value_type;
  typedef _BinaryOp<less_equal<value_type>, _Expr1, _Expr2> _Op;
  return __val_expr<_Op>(_Op(less_equal<value_type>(), __x, __y));
}

template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
inline _LIBCPP_HIDE_FROM_ABI
__val_expr<_BinaryOp<less_equal<typename _Expr::value_type>, _Expr, __scalar_expr<typename _Expr::value_type> > >
operator<=(const _Expr& __x, const typename _Expr::value_type& __y) {
  typedef typename _Expr::value_type value_type;
  typedef _BinaryOp<less_equal<value_type>, _Expr, __scalar_expr<value_type> > _Op;
  return __val_expr<_Op>(_Op(less_equal<value_type>(), __x, __scalar_expr<value_type>(__y, __x.size())));
}

template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
inline _LIBCPP_HIDE_FROM_ABI
__val_expr<_BinaryOp<less_equal<typename _Expr::value_type>, __scalar_expr<typename _Expr::value_type>, _Expr> >
operator<=(const typename _Expr::value_type& __x, const _Expr& __y) {
  typedef typename _Expr::value_type value_type;
  typedef _BinaryOp<less_equal<value_type>, __scalar_expr<value_type>, _Expr> _Op;
  return __val_expr<_Op>(_Op(less_equal<value_type>(), __scalar_expr<value_type>(__x, __y.size()), __y));
}

template <class _Expr1,
          class _Expr2,
          __enable_if_t<__is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, int> = 0>
inline _LIBCPP_HIDE_FROM_ABI __val_expr<_BinaryOp<greater_equal<typename _Expr1::value_type>, _Expr1, _Expr2> >
operator>=(const _Expr1& __x, const _Expr2& __y) {
  typedef typename _Expr1::value_type value_type;
  typedef _BinaryOp<greater_equal<value_type>, _Expr1, _Expr2> _Op;
  return __val_expr<_Op>(_Op(greater_equal<value_type>(), __x, __y));
}

template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
inline _LIBCPP_HIDE_FROM_ABI
__val_expr<_BinaryOp<greater_equal<typename _Expr::value_type>, _Expr, __scalar_expr<typename _Expr::value_type> > >
operator>=(const _Expr& __x, const typename _Expr::value_type& __y) {
  typedef typename _Expr::value_type value_type;
  typedef _BinaryOp<greater_equal<value_type>, _Expr, __scalar_expr<value_type> > _Op;
  return __val_expr<_Op>(_Op(greater_equal<value_type>(), __x, __scalar_expr<value_type>(__y, __x.size())));
}

template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
inline _LIBCPP_HIDE_FROM_ABI
__val_expr<_BinaryOp<greater_equal<typename _Expr::value_type>, __scalar_expr<typename _Expr::value_type>, _Expr> >
operator>=(const typename _Expr::value_type& __x, const _Expr& __y) {
  typedef typename _Expr::value_type value_type;
  typedef _BinaryOp<greater_equal<value_type>, __scalar_expr<value_type>, _Expr> _Op;
  return __val_expr<_Op>(_Op(greater_equal<value_type>(), __scalar_expr<value_type>(__x, __y.size()), __y));
}

template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
inline _LIBCPP_HIDE_FROM_ABI __val_expr<_UnaryOp<__abs_expr<typename _Expr::value_type>, _Expr> >
abs(const _Expr& __x) {
  typedef typename _Expr::value_type value_type;
  typedef _UnaryOp<__abs_expr<value_type>, _Expr> _Op;
  return __val_expr<_Op>(_Op(__abs_expr<value_type>(), __x));
}

template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
inline _LIBCPP_HIDE_FROM_ABI __val_expr<_UnaryOp<__acos_expr<typename _Expr::value_type>, _Expr> >
acos(const _Expr& __x) {
  typedef typename _Expr::value_type value_type;
  typedef _UnaryOp<__acos_expr<value_type>, _Expr> _Op;
  return __val_expr<_Op>(_Op(__acos_expr<value_type>(), __x));
}

template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
inline _LIBCPP_HIDE_FROM_ABI __val_expr<_UnaryOp<__asin_expr<typename _Expr::value_type>, _Expr> >
asin(const _Expr& __x) {
  typedef typename _Expr::value_type value_type;
  typedef _UnaryOp<__asin_expr<value_type>, _Expr> _Op;
  return __val_expr<_Op>(_Op(__asin_expr<value_type>(), __x));
}

template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
inline _LIBCPP_HIDE_FROM_ABI __val_expr<_UnaryOp<__atan_expr<typename _Expr::value_type>, _Expr> >
atan(const _Expr& __x) {
  typedef typename _Expr::value_type value_type;
  typedef _UnaryOp<__atan_expr<value_type>, _Expr> _Op;
  return __val_expr<_Op>(_Op(__atan_expr<value_type>(), __x));
}

template <class _Expr1,
          class _Expr2,
          __enable_if_t<__is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, int> = 0>
inline _LIBCPP_HIDE_FROM_ABI __val_expr<_BinaryOp<__atan2_expr<typename _Expr1::value_type>, _Expr1, _Expr2> >
atan2(const _Expr1& __x, const _Expr2& __y) {
  typedef typename _Expr1::value_type value_type;
  typedef _BinaryOp<__atan2_expr<value_type>, _Expr1, _Expr2> _Op;
  return __val_expr<_Op>(_Op(__atan2_expr<value_type>(), __x, __y));
}

template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
inline _LIBCPP_HIDE_FROM_ABI
__val_expr<_BinaryOp<__atan2_expr<typename _Expr::value_type>, _Expr, __scalar_expr<typename _Expr::value_type> > >
atan2(const _Expr& __x, const typename _Expr::value_type& __y) {
  typedef typename _Expr::value_type value_type;
  typedef _BinaryOp<__atan2_expr<value_type>, _Expr, __scalar_expr<value_type> > _Op;
  return __val_expr<_Op>(_Op(__atan2_expr<value_type>(), __x, __scalar_expr<value_type>(__y, __x.size())));
}

template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
inline _LIBCPP_HIDE_FROM_ABI
__val_expr<_BinaryOp<__atan2_expr<typename _Expr::value_type>, __scalar_expr<typename _Expr::value_type>, _Expr> >
atan2(const typename _Expr::value_type& __x, const _Expr& __y) {
  typedef typename _Expr::value_type value_type;
  typedef _BinaryOp<__atan2_expr<value_type>, __scalar_expr<value_type>, _Expr> _Op;
  return __val_expr<_Op>(_Op(__atan2_expr<value_type>(), __scalar_expr<value_type>(__x, __y.size()), __y));
}

template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
inline _LIBCPP_HIDE_FROM_ABI __val_expr<_UnaryOp<__cos_expr<typename _Expr::value_type>, _Expr> >
cos(const _Expr& __x) {
  typedef typename _Expr::value_type value_type;
  typedef _UnaryOp<__cos_expr<value_type>, _Expr> _Op;
  return __val_expr<_Op>(_Op(__cos_expr<value_type>(), __x));
}

template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
inline _LIBCPP_HIDE_FROM_ABI __val_expr<_UnaryOp<__cosh_expr<typename _Expr::value_type>, _Expr> >
cosh(const _Expr& __x) {
  typedef typename _Expr::value_type value_type;
  typedef _UnaryOp<__cosh_expr<value_type>, _Expr> _Op;
  return __val_expr<_Op>(_Op(__cosh_expr<value_type>(), __x));
}

template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
inline _LIBCPP_HIDE_FROM_ABI __val_expr<_UnaryOp<__exp_expr<typename _Expr::value_type>, _Expr> >
exp(const _Expr& __x) {
  typedef typename _Expr::value_type value_type;
  typedef _UnaryOp<__exp_expr<value_type>, _Expr> _Op;
  return __val_expr<_Op>(_Op(__exp_expr<value_type>(), __x));
}

template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
inline _LIBCPP_HIDE_FROM_ABI __val_expr<_UnaryOp<__log_expr<typename _Expr::value_type>, _Expr> >
log(const _Expr& __x) {
  typedef typename _Expr::value_type value_type;
  typedef _UnaryOp<__log_expr<value_type>, _Expr> _Op;
  return __val_expr<_Op>(_Op(__log_expr<value_type>(), __x));
}

template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
inline _LIBCPP_HIDE_FROM_ABI __val_expr<_UnaryOp<__log10_expr<typename _Expr::value_type>, _Expr> >
log10(const _Expr& __x) {
  typedef typename _Expr::value_type value_type;
  typedef _UnaryOp<__log10_expr<value_type>, _Expr> _Op;
  return __val_expr<_Op>(_Op(__log10_expr<value_type>(), __x));
}

template <class _Expr1,
          class _Expr2,
          __enable_if_t<__is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, int> = 0>
inline _LIBCPP_HIDE_FROM_ABI __val_expr<_BinaryOp<__pow_expr<typename _Expr1::value_type>, _Expr1, _Expr2> >
pow(const _Expr1& __x, const _Expr2& __y) {
  typedef typename _Expr1::value_type value_type;
  typedef _BinaryOp<__pow_expr<value_type>, _Expr1, _Expr2> _Op;
  return __val_expr<_Op>(_Op(__pow_expr<value_type>(), __x, __y));
}

template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
inline _LIBCPP_HIDE_FROM_ABI
__val_expr<_BinaryOp<__pow_expr<typename _Expr::value_type>, _Expr, __scalar_expr<typename _Expr::value_type> > >
pow(const _Expr& __x, const typename _Expr::value_type& __y) {
  typedef typename _Expr::value_type value_type;
  typedef _BinaryOp<__pow_expr<value_type>, _Expr, __scalar_expr<value_type> > _Op;
  return __val_expr<_Op>(_Op(__pow_expr<value_type>(), __x, __scalar_expr<value_type>(__y, __x.size())));
}

template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
inline _LIBCPP_HIDE_FROM_ABI
__val_expr<_BinaryOp<__pow_expr<typename _Expr::value_type>, __scalar_expr<typename _Expr::value_type>, _Expr> >
pow(const typename _Expr::value_type& __x, const _Expr& __y) {
  typedef typename _Expr::value_type value_type;
  typedef _BinaryOp<__pow_expr<value_type>, __scalar_expr<value_type>, _Expr> _Op;
  return __val_expr<_Op>(_Op(__pow_expr<value_type>(), __scalar_expr<value_type>(__x, __y.size()), __y));
}

template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
inline _LIBCPP_HIDE_FROM_ABI __val_expr<_UnaryOp<__sin_expr<typename _Expr::value_type>, _Expr> >
sin(const _Expr& __x) {
  typedef typename _Expr::value_type value_type;
  typedef _UnaryOp<__sin_expr<value_type>, _Expr> _Op;
  return __val_expr<_Op>(_Op(__sin_expr<value_type>(), __x));
}

template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
inline _LIBCPP_HIDE_FROM_ABI __val_expr<_UnaryOp<__sinh_expr<typename _Expr::value_type>, _Expr> >
sinh(const _Expr& __x) {
  typedef typename _Expr::value_type value_type;
  typedef _UnaryOp<__sinh_expr<value_type>, _Expr> _Op;
  return __val_expr<_Op>(_Op(__sinh_expr<value_type>(), __x));
}

template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
inline _LIBCPP_HIDE_FROM_ABI __val_expr<_UnaryOp<__sqrt_expr<typename _Expr::value_type>, _Expr> >
sqrt(const _Expr& __x) {
  typedef typename _Expr::value_type value_type;
  typedef _UnaryOp<__sqrt_expr<value_type>, _Expr> _Op;
  return __val_expr<_Op>(_Op(__sqrt_expr<value_type>(), __x));
}

template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
inline _LIBCPP_HIDE_FROM_ABI __val_expr<_UnaryOp<__tan_expr<typename _Expr::value_type>, _Expr> >
tan(const _Expr& __x) {
  typedef typename _Expr::value_type value_type;
  typedef _UnaryOp<__tan_expr<value_type>, _Expr> _Op;
  return __val_expr<_Op>(_Op(__tan_expr<value_type>(), __x));
}

template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
inline _LIBCPP_HIDE_FROM_ABI __val_expr<_UnaryOp<__tanh_expr<typename _Expr::value_type>, _Expr> >
tanh(const _Expr& __x) {
  typedef typename _Expr::value_type value_type;
  typedef _UnaryOp<__tanh_expr<value_type>, _Expr> _Op;
  return __val_expr<_Op>(_Op(__tanh_expr<value_type>(), __x));
}

template <class _Tp>
inline _LIBCPP_HIDE_FROM_ABI _Tp* begin(valarray<_Tp>& __v) {
  return __v.__begin_;
}

template <class _Tp>
inline _LIBCPP_HIDE_FROM_ABI const _Tp* begin(const valarray<_Tp>& __v) {
  return __v.__begin_;
}

template <class _Tp>
inline _LIBCPP_HIDE_FROM_ABI _Tp* end(valarray<_Tp>& __v) {
  return __v.__end_;
}

template <class _Tp>
inline _LIBCPP_HIDE_FROM_ABI const _Tp* end(const valarray<_Tp>& __v) {
  return __v.__end_;
}

_LIBCPP_END_NAMESPACE_STD

_LIBCPP_POP_MACROS

#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
#  include <algorithm>
#  include <concepts>
#  include <cstdlib>
#  include <cstring>
#  include <functional>
#  include <stdexcept>
#  include <type_traits>
#endif

#endif // _LIBCPP_VALARRAY
