// -*- 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

*/

#if __cplusplus < 201103L && defined(_LIBCPP_USE_FROZEN_CXX03_HEADERS)
#  include <__cxx03/valarray>
#else
#  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/exception_guard.h>
#  include <__utility/move.h>
#  include <__utility/swap.h>
#  include <cmath>
#  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 valarray;

class 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) {}

  [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI size_t start() const { return __start_; }
  [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI size_t size() const { return __size_; }
  [[__nodiscard__]] _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 slice_array;
class _LIBCPP_EXPORTED_FROM_ABI gslice;
template <class _Tp>
class gslice_array;
template <class _Tp>
class mask_array;
template <class _Tp>
class 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 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 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_SINCE_LLVM8 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_SINCE_LLVM8 ~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:
  [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI const value_type& operator[](size_t __i) const {
    _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(__i < size(), "valarray::operator[] index out of bounds");
    return __begin_[__i];
  }

  [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI value_type& operator[](size_t __i) {
    _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(__i < size(), "valarray::operator[] index out of bounds");
    return __begin_[__i];
  }

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

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

  [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI value_type sum() const;
  [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI value_type min() const;
  [[__nodiscard__]] _LIBCPP_HIDE_FROM_ABI value_type max() const;

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

private:
  template <class>
  friend class valarray;
  template <class>
  friend class slice_array;
  template <class>
  friend class gslice_array;
  template <class>
  friend class mask_array;
  template <class>
  friend class __mask_expr;
  template <class>
  friend class 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 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

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

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

  [[__nodiscard__]] _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 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 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 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 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);
    auto __guard      = std::__make_exception_guard([&] { __clear(__n); });
    for (size_t __n_left = __n; __n_left; --__n_left, ++__end_)
      ::new ((void*)__end_) value_type();
    __guard.__complete();
  }
}

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);
    auto __guard      = std::__make_exception_guard([&] { __clear(__n); });
    for (size_t __n_left = __n; __n_left; ++__end_, ++__p, --__n_left)
      ::new ((void*)__end_) value_type(*__p);
    __guard.__complete();
  }
}

template <class _Tp>
valarray<_Tp>::valarray(const valarray& __v) : __begin_(nullptr), __end_(nullptr) {
  if (__v.size()) {
    __begin_ = __end_ = allocator<value_type>().allocate(__v.size());
    auto __guard      = std::__make_exception_guard([&] { __clear(__v.size()); });
    for (value_type* __p = __v.__begin_; __p != __v.__end_; ++__end_, ++__p)
      ::new ((void*)__end_) value_type(*__p);
    __guard.__complete();
  }
}

#  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);
    auto __guard      = std::__make_exception_guard([&] { __clear(__n); });
    size_t __n_left   = __n;
    for (const value_type* __p = __il.begin(); __n_left; ++__end_, ++__p, --__n_left)
      ::new ((void*)__end_) value_type(*__p);
    __guard.__complete();
  }
}

#  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);
    auto __guard      = std::__make_exception_guard([&] { __clear(__n); });
    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);
    __guard.__complete();
  }
}

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);
    auto __guard      = std::__make_exception_guard([&] { __clear(__n); });
    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]);
    __guard.__complete();
  }
}

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);
    auto __guard      = std::__make_exception_guard([&] { __clear(__n); });
    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]);
    __guard.__complete();
  }
}

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);
    auto __guard      = std::__make_exception_guard([&] { __clear(__n); });
    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]);
    __guard.__complete();
  }
}

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);
    auto __guard      = std::__make_exception_guard([&] { __clear(__n); });
    for (size_t __n_left = __n; __n_left; --__n_left, ++__end_)
      ::new ((void*)__end_) value_type(__x);
    __guard.__complete();
  }
}

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>
[[__nodiscard__]] 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>
[[__nodiscard__]] 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>
[[__nodiscard__]] 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>
[[__nodiscard__]] 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>
[[__nodiscard__]] 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>
[[__nodiscard__]] 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>
[[__nodiscard__]] 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>
[[__nodiscard__]] 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>
[[__nodiscard__]] 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>
[[__nodiscard__]] 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>
[[__nodiscard__]] 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>
[[__nodiscard__]] 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>
[[__nodiscard__]] 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>
[[__nodiscard__]] 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>
[[__nodiscard__]] 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>
[[__nodiscard__]] 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>
[[__nodiscard__]] 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>
[[__nodiscard__]] 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>
[[__nodiscard__]] 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>
[[__nodiscard__]] 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>
[[__nodiscard__]] inline _LIBCPP_HIDE_FROM_ABI _Tp* begin(valarray<_Tp>& __v) {
  return __v.__begin_;
}

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

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

template <class _Tp>
[[__nodiscard__]] 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 // __cplusplus < 201103L && defined(_LIBCPP_USE_FROZEN_CXX03_HEADERS)

#endif // _LIBCPP_VALARRAY
