xref: /openbsd-src/gnu/llvm/libcxx/include/valarray (revision 4bdff4bed0e3d54e55670334c7d0077db4170f86)
146035553Spatrick// -*- C++ -*-
2*4bdff4beSrobert//===----------------------------------------------------------------------===//
346035553Spatrick//
446035553Spatrick// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
546035553Spatrick// See https://llvm.org/LICENSE.txt for license information.
646035553Spatrick// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
746035553Spatrick//
846035553Spatrick//===----------------------------------------------------------------------===//
946035553Spatrick
1046035553Spatrick#ifndef _LIBCPP_VALARRAY
1146035553Spatrick#define _LIBCPP_VALARRAY
1246035553Spatrick
1346035553Spatrick/*
1446035553Spatrick    valarray synopsis
1546035553Spatrick
1646035553Spatricknamespace std
1746035553Spatrick{
1846035553Spatrick
1946035553Spatricktemplate<class T>
2046035553Spatrickclass valarray
2146035553Spatrick{
2246035553Spatrickpublic:
2346035553Spatrick    typedef T value_type;
2446035553Spatrick
2546035553Spatrick    // construct/destroy:
2646035553Spatrick    valarray();
2746035553Spatrick    explicit valarray(size_t n);
2846035553Spatrick    valarray(const value_type& x, size_t n);
2946035553Spatrick    valarray(const value_type* px, size_t n);
3046035553Spatrick    valarray(const valarray& v);
3146035553Spatrick    valarray(valarray&& v) noexcept;
3246035553Spatrick    valarray(const slice_array<value_type>& sa);
3346035553Spatrick    valarray(const gslice_array<value_type>& ga);
3446035553Spatrick    valarray(const mask_array<value_type>& ma);
3546035553Spatrick    valarray(const indirect_array<value_type>& ia);
3646035553Spatrick    valarray(initializer_list<value_type> il);
3746035553Spatrick    ~valarray();
3846035553Spatrick
3946035553Spatrick    // assignment:
4046035553Spatrick    valarray& operator=(const valarray& v);
4146035553Spatrick    valarray& operator=(valarray&& v) noexcept;
4246035553Spatrick    valarray& operator=(initializer_list<value_type> il);
4346035553Spatrick    valarray& operator=(const value_type& x);
4446035553Spatrick    valarray& operator=(const slice_array<value_type>& sa);
4546035553Spatrick    valarray& operator=(const gslice_array<value_type>& ga);
4646035553Spatrick    valarray& operator=(const mask_array<value_type>& ma);
4746035553Spatrick    valarray& operator=(const indirect_array<value_type>& ia);
4846035553Spatrick
4946035553Spatrick    // element access:
5046035553Spatrick    const value_type& operator[](size_t i) const;
5146035553Spatrick    value_type&       operator[](size_t i);
5246035553Spatrick
5346035553Spatrick    // subset operations:
5446035553Spatrick    valarray                   operator[](slice s) const;
5546035553Spatrick    slice_array<value_type>    operator[](slice s);
5646035553Spatrick    valarray                   operator[](const gslice& gs) const;
5746035553Spatrick    gslice_array<value_type>   operator[](const gslice& gs);
5846035553Spatrick    valarray                   operator[](const valarray<bool>& vb) const;
5946035553Spatrick    mask_array<value_type>     operator[](const valarray<bool>& vb);
6046035553Spatrick    valarray                   operator[](const valarray<size_t>& vs) const;
6146035553Spatrick    indirect_array<value_type> operator[](const valarray<size_t>& vs);
6246035553Spatrick
6346035553Spatrick    // unary operators:
6446035553Spatrick    valarray       operator+() const;
6546035553Spatrick    valarray       operator-() const;
6646035553Spatrick    valarray       operator~() const;
6746035553Spatrick    valarray<bool> operator!() const;
6846035553Spatrick
6946035553Spatrick    // computed assignment:
7046035553Spatrick    valarray& operator*= (const value_type& x);
7146035553Spatrick    valarray& operator/= (const value_type& x);
7246035553Spatrick    valarray& operator%= (const value_type& x);
7346035553Spatrick    valarray& operator+= (const value_type& x);
7446035553Spatrick    valarray& operator-= (const value_type& x);
7546035553Spatrick    valarray& operator^= (const value_type& x);
7646035553Spatrick    valarray& operator&= (const value_type& x);
7746035553Spatrick    valarray& operator|= (const value_type& x);
7846035553Spatrick    valarray& operator<<=(const value_type& x);
7946035553Spatrick    valarray& operator>>=(const value_type& x);
8046035553Spatrick
8146035553Spatrick    valarray& operator*= (const valarray& v);
8246035553Spatrick    valarray& operator/= (const valarray& v);
8346035553Spatrick    valarray& operator%= (const valarray& v);
8446035553Spatrick    valarray& operator+= (const valarray& v);
8546035553Spatrick    valarray& operator-= (const valarray& v);
8646035553Spatrick    valarray& operator^= (const valarray& v);
8746035553Spatrick    valarray& operator|= (const valarray& v);
8846035553Spatrick    valarray& operator&= (const valarray& v);
8946035553Spatrick    valarray& operator<<=(const valarray& v);
9046035553Spatrick    valarray& operator>>=(const valarray& v);
9146035553Spatrick
9246035553Spatrick    // member functions:
9346035553Spatrick    void swap(valarray& v) noexcept;
9446035553Spatrick
9546035553Spatrick    size_t size() const;
9646035553Spatrick
9746035553Spatrick    value_type sum() const;
9846035553Spatrick    value_type min() const;
9946035553Spatrick    value_type max() const;
10046035553Spatrick
10146035553Spatrick    valarray shift (int i) const;
10246035553Spatrick    valarray cshift(int i) const;
10346035553Spatrick    valarray apply(value_type f(value_type)) const;
10446035553Spatrick    valarray apply(value_type f(const value_type&)) const;
10546035553Spatrick    void resize(size_t n, value_type x = value_type());
10646035553Spatrick};
10746035553Spatrick
108*4bdff4beSroberttemplate<class T, size_t cnt> valarray(const T(&)[cnt], size_t) -> valarray<T>;
109*4bdff4beSrobert
11046035553Spatrickclass slice
11146035553Spatrick{
11246035553Spatrickpublic:
11346035553Spatrick    slice();
11446035553Spatrick    slice(size_t start, size_t size, size_t stride);
11546035553Spatrick
11646035553Spatrick    size_t start()  const;
11746035553Spatrick    size_t size()   const;
11846035553Spatrick    size_t stride() const;
11946035553Spatrick};
12046035553Spatrick
12146035553Spatricktemplate <class T>
12246035553Spatrickclass slice_array
12346035553Spatrick{
12446035553Spatrickpublic:
12546035553Spatrick    typedef T value_type;
12646035553Spatrick
12746035553Spatrick    const slice_array& operator=(const slice_array& sa) const;
12846035553Spatrick    void operator=  (const valarray<value_type>& v) const;
12946035553Spatrick    void operator*= (const valarray<value_type>& v) const;
13046035553Spatrick    void operator/= (const valarray<value_type>& v) const;
13146035553Spatrick    void operator%= (const valarray<value_type>& v) const;
13246035553Spatrick    void operator+= (const valarray<value_type>& v) const;
13346035553Spatrick    void operator-= (const valarray<value_type>& v) const;
13446035553Spatrick    void operator^= (const valarray<value_type>& v) const;
13546035553Spatrick    void operator&= (const valarray<value_type>& v) const;
13646035553Spatrick    void operator|= (const valarray<value_type>& v) const;
13746035553Spatrick    void operator<<=(const valarray<value_type>& v) const;
13846035553Spatrick    void operator>>=(const valarray<value_type>& v) const;
13946035553Spatrick
14046035553Spatrick    void operator=(const value_type& x) const;
14176d0caaeSpatrick    void operator=(const valarray<T>& val_arr) const;
14246035553Spatrick
14346035553Spatrick    slice_array() = delete;
14446035553Spatrick};
14546035553Spatrick
14646035553Spatrickclass gslice
14746035553Spatrick{
14846035553Spatrickpublic:
14946035553Spatrick    gslice();
15046035553Spatrick    gslice(size_t start, const valarray<size_t>& size,
15146035553Spatrick                         const valarray<size_t>& stride);
15246035553Spatrick
15346035553Spatrick    size_t           start()  const;
15446035553Spatrick    valarray<size_t> size()   const;
15546035553Spatrick    valarray<size_t> stride() const;
15646035553Spatrick};
15746035553Spatrick
15846035553Spatricktemplate <class T>
15946035553Spatrickclass gslice_array
16046035553Spatrick{
16146035553Spatrickpublic:
16246035553Spatrick    typedef T value_type;
16346035553Spatrick
16446035553Spatrick    void operator=  (const valarray<value_type>& v) const;
16546035553Spatrick    void operator*= (const valarray<value_type>& v) const;
16646035553Spatrick    void operator/= (const valarray<value_type>& v) const;
16746035553Spatrick    void operator%= (const valarray<value_type>& v) const;
16846035553Spatrick    void operator+= (const valarray<value_type>& v) const;
16946035553Spatrick    void operator-= (const valarray<value_type>& v) const;
17046035553Spatrick    void operator^= (const valarray<value_type>& v) const;
17146035553Spatrick    void operator&= (const valarray<value_type>& v) const;
17246035553Spatrick    void operator|= (const valarray<value_type>& v) const;
17346035553Spatrick    void operator<<=(const valarray<value_type>& v) const;
17446035553Spatrick    void operator>>=(const valarray<value_type>& v) const;
17546035553Spatrick
17646035553Spatrick    gslice_array(const gslice_array& ga);
17746035553Spatrick    ~gslice_array();
17846035553Spatrick    const gslice_array& operator=(const gslice_array& ga) const;
17946035553Spatrick    void operator=(const value_type& x) const;
18046035553Spatrick
18146035553Spatrick    gslice_array() = delete;
18246035553Spatrick};
18346035553Spatrick
18446035553Spatricktemplate <class T>
18546035553Spatrickclass mask_array
18646035553Spatrick{
18746035553Spatrickpublic:
18846035553Spatrick    typedef T value_type;
18946035553Spatrick
19046035553Spatrick    void operator=  (const valarray<value_type>& v) const;
19146035553Spatrick    void operator*= (const valarray<value_type>& v) const;
19246035553Spatrick    void operator/= (const valarray<value_type>& v) const;
19346035553Spatrick    void operator%= (const valarray<value_type>& v) const;
19446035553Spatrick    void operator+= (const valarray<value_type>& v) const;
19546035553Spatrick    void operator-= (const valarray<value_type>& v) const;
19646035553Spatrick    void operator^= (const valarray<value_type>& v) const;
19746035553Spatrick    void operator&= (const valarray<value_type>& v) const;
19846035553Spatrick    void operator|= (const valarray<value_type>& v) const;
19946035553Spatrick    void operator<<=(const valarray<value_type>& v) const;
20046035553Spatrick    void operator>>=(const valarray<value_type>& v) const;
20146035553Spatrick
20246035553Spatrick    mask_array(const mask_array& ma);
20346035553Spatrick    ~mask_array();
20446035553Spatrick    const mask_array& operator=(const mask_array& ma) const;
20546035553Spatrick    void operator=(const value_type& x) const;
20646035553Spatrick
20746035553Spatrick    mask_array() = delete;
20846035553Spatrick};
20946035553Spatrick
21046035553Spatricktemplate <class T>
21146035553Spatrickclass indirect_array
21246035553Spatrick{
21346035553Spatrickpublic:
21446035553Spatrick    typedef T value_type;
21546035553Spatrick
21646035553Spatrick    void operator=  (const valarray<value_type>& v) const;
21746035553Spatrick    void operator*= (const valarray<value_type>& v) const;
21846035553Spatrick    void operator/= (const valarray<value_type>& v) const;
21946035553Spatrick    void operator%= (const valarray<value_type>& v) const;
22046035553Spatrick    void operator+= (const valarray<value_type>& v) const;
22146035553Spatrick    void operator-= (const valarray<value_type>& v) const;
22246035553Spatrick    void operator^= (const valarray<value_type>& v) const;
22346035553Spatrick    void operator&= (const valarray<value_type>& v) const;
22446035553Spatrick    void operator|= (const valarray<value_type>& v) const;
22546035553Spatrick    void operator<<=(const valarray<value_type>& v) const;
22646035553Spatrick    void operator>>=(const valarray<value_type>& v) const;
22746035553Spatrick
22846035553Spatrick    indirect_array(const indirect_array& ia);
22946035553Spatrick    ~indirect_array();
23046035553Spatrick    const indirect_array& operator=(const indirect_array& ia) const;
23146035553Spatrick    void operator=(const value_type& x) const;
23246035553Spatrick
23346035553Spatrick    indirect_array() = delete;
23446035553Spatrick};
23546035553Spatrick
23646035553Spatricktemplate<class T> void swap(valarray<T>& x, valarray<T>& y) noexcept;
23746035553Spatrick
23846035553Spatricktemplate<class T> valarray<T> operator* (const valarray<T>& x, const valarray<T>& y);
23946035553Spatricktemplate<class T> valarray<T> operator* (const valarray<T>& x, const T& y);
24046035553Spatricktemplate<class T> valarray<T> operator* (const T& x, const valarray<T>& y);
24146035553Spatrick
24246035553Spatricktemplate<class T> valarray<T> operator/ (const valarray<T>& x, const valarray<T>& y);
24346035553Spatricktemplate<class T> valarray<T> operator/ (const valarray<T>& x, const T& y);
24446035553Spatricktemplate<class T> valarray<T> operator/ (const T& x, const valarray<T>& y);
24546035553Spatrick
24646035553Spatricktemplate<class T> valarray<T> operator% (const valarray<T>& x, const valarray<T>& y);
24746035553Spatricktemplate<class T> valarray<T> operator% (const valarray<T>& x, const T& y);
24846035553Spatricktemplate<class T> valarray<T> operator% (const T& x, const valarray<T>& y);
24946035553Spatrick
25046035553Spatricktemplate<class T> valarray<T> operator+ (const valarray<T>& x, const valarray<T>& y);
25146035553Spatricktemplate<class T> valarray<T> operator+ (const valarray<T>& x, const T& y);
25246035553Spatricktemplate<class T> valarray<T> operator+ (const T& x, const valarray<T>& y);
25346035553Spatrick
25446035553Spatricktemplate<class T> valarray<T> operator- (const valarray<T>& x, const valarray<T>& y);
25546035553Spatricktemplate<class T> valarray<T> operator- (const valarray<T>& x, const T& y);
25646035553Spatricktemplate<class T> valarray<T> operator- (const T& x, const valarray<T>& y);
25746035553Spatrick
25846035553Spatricktemplate<class T> valarray<T> operator^ (const valarray<T>& x, const valarray<T>& y);
25946035553Spatricktemplate<class T> valarray<T> operator^ (const valarray<T>& x, const T& y);
26046035553Spatricktemplate<class T> valarray<T> operator^ (const T& x, const valarray<T>& y);
26146035553Spatrick
26246035553Spatricktemplate<class T> valarray<T> operator& (const valarray<T>& x, const valarray<T>& y);
26346035553Spatricktemplate<class T> valarray<T> operator& (const valarray<T>& x, const T& y);
26446035553Spatricktemplate<class T> valarray<T> operator& (const T& x, const valarray<T>& y);
26546035553Spatrick
26646035553Spatricktemplate<class T> valarray<T> operator| (const valarray<T>& x, const valarray<T>& y);
26746035553Spatricktemplate<class T> valarray<T> operator| (const valarray<T>& x, const T& y);
26846035553Spatricktemplate<class T> valarray<T> operator| (const T& x, const valarray<T>& y);
26946035553Spatrick
27046035553Spatricktemplate<class T> valarray<T> operator<<(const valarray<T>& x, const valarray<T>& y);
27146035553Spatricktemplate<class T> valarray<T> operator<<(const valarray<T>& x, const T& y);
27246035553Spatricktemplate<class T> valarray<T> operator<<(const T& x, const valarray<T>& y);
27346035553Spatrick
27446035553Spatricktemplate<class T> valarray<T> operator>>(const valarray<T>& x, const valarray<T>& y);
27546035553Spatricktemplate<class T> valarray<T> operator>>(const valarray<T>& x, const T& y);
27646035553Spatricktemplate<class T> valarray<T> operator>>(const T& x, const valarray<T>& y);
27746035553Spatrick
27846035553Spatricktemplate<class T> valarray<bool> operator&&(const valarray<T>& x, const valarray<T>& y);
27946035553Spatricktemplate<class T> valarray<bool> operator&&(const valarray<T>& x, const T& y);
28046035553Spatricktemplate<class T> valarray<bool> operator&&(const T& x, const valarray<T>& y);
28146035553Spatrick
28246035553Spatricktemplate<class T> valarray<bool> operator||(const valarray<T>& x, const valarray<T>& y);
28346035553Spatricktemplate<class T> valarray<bool> operator||(const valarray<T>& x, const T& y);
28446035553Spatricktemplate<class T> valarray<bool> operator||(const T& x, const valarray<T>& y);
28546035553Spatrick
28646035553Spatricktemplate<class T> valarray<bool> operator==(const valarray<T>& x, const valarray<T>& y);
28746035553Spatricktemplate<class T> valarray<bool> operator==(const valarray<T>& x, const T& y);
28846035553Spatricktemplate<class T> valarray<bool> operator==(const T& x, const valarray<T>& y);
28946035553Spatrick
29046035553Spatricktemplate<class T> valarray<bool> operator!=(const valarray<T>& x, const valarray<T>& y);
29146035553Spatricktemplate<class T> valarray<bool> operator!=(const valarray<T>& x, const T& y);
29246035553Spatricktemplate<class T> valarray<bool> operator!=(const T& x, const valarray<T>& y);
29346035553Spatrick
29446035553Spatricktemplate<class T> valarray<bool> operator< (const valarray<T>& x, const valarray<T>& y);
29546035553Spatricktemplate<class T> valarray<bool> operator< (const valarray<T>& x, const T& y);
29646035553Spatricktemplate<class T> valarray<bool> operator< (const T& x, const valarray<T>& y);
29746035553Spatrick
29846035553Spatricktemplate<class T> valarray<bool> operator> (const valarray<T>& x, const valarray<T>& y);
29946035553Spatricktemplate<class T> valarray<bool> operator> (const valarray<T>& x, const T& y);
30046035553Spatricktemplate<class T> valarray<bool> operator> (const T& x, const valarray<T>& y);
30146035553Spatrick
30246035553Spatricktemplate<class T> valarray<bool> operator<=(const valarray<T>& x, const valarray<T>& y);
30346035553Spatricktemplate<class T> valarray<bool> operator<=(const valarray<T>& x, const T& y);
30446035553Spatricktemplate<class T> valarray<bool> operator<=(const T& x, const valarray<T>& y);
30546035553Spatrick
30646035553Spatricktemplate<class T> valarray<bool> operator>=(const valarray<T>& x, const valarray<T>& y);
30746035553Spatricktemplate<class T> valarray<bool> operator>=(const valarray<T>& x, const T& y);
30846035553Spatricktemplate<class T> valarray<bool> operator>=(const T& x, const valarray<T>& y);
30946035553Spatrick
31046035553Spatricktemplate<class T> valarray<T> abs (const valarray<T>& x);
31146035553Spatricktemplate<class T> valarray<T> acos (const valarray<T>& x);
31246035553Spatricktemplate<class T> valarray<T> asin (const valarray<T>& x);
31346035553Spatricktemplate<class T> valarray<T> atan (const valarray<T>& x);
31446035553Spatrick
31546035553Spatricktemplate<class T> valarray<T> atan2(const valarray<T>& x, const valarray<T>& y);
31646035553Spatricktemplate<class T> valarray<T> atan2(const valarray<T>& x, const T& y);
31746035553Spatricktemplate<class T> valarray<T> atan2(const T& x, const valarray<T>& y);
31846035553Spatrick
31946035553Spatricktemplate<class T> valarray<T> cos (const valarray<T>& x);
32046035553Spatricktemplate<class T> valarray<T> cosh (const valarray<T>& x);
32146035553Spatricktemplate<class T> valarray<T> exp (const valarray<T>& x);
32246035553Spatricktemplate<class T> valarray<T> log (const valarray<T>& x);
32346035553Spatricktemplate<class T> valarray<T> log10(const valarray<T>& x);
32446035553Spatrick
32546035553Spatricktemplate<class T> valarray<T> pow(const valarray<T>& x, const valarray<T>& y);
32646035553Spatricktemplate<class T> valarray<T> pow(const valarray<T>& x, const T& y);
32746035553Spatricktemplate<class T> valarray<T> pow(const T& x, const valarray<T>& y);
32846035553Spatrick
32946035553Spatricktemplate<class T> valarray<T> sin (const valarray<T>& x);
33046035553Spatricktemplate<class T> valarray<T> sinh (const valarray<T>& x);
33146035553Spatricktemplate<class T> valarray<T> sqrt (const valarray<T>& x);
33246035553Spatricktemplate<class T> valarray<T> tan (const valarray<T>& x);
33346035553Spatricktemplate<class T> valarray<T> tanh (const valarray<T>& x);
33446035553Spatrick
33546035553Spatricktemplate <class T> unspecified1 begin(valarray<T>& v);
33646035553Spatricktemplate <class T> unspecified2 begin(const valarray<T>& v);
33746035553Spatricktemplate <class T> unspecified1 end(valarray<T>& v);
33846035553Spatricktemplate <class T> unspecified2 end(const valarray<T>& v);
33946035553Spatrick
34046035553Spatrick}  // std
34146035553Spatrick
34246035553Spatrick*/
34346035553Spatrick
344*4bdff4beSrobert#include <__algorithm/copy.h>
345*4bdff4beSrobert#include <__algorithm/count.h>
346*4bdff4beSrobert#include <__algorithm/fill.h>
347*4bdff4beSrobert#include <__algorithm/max_element.h>
348*4bdff4beSrobert#include <__algorithm/min.h>
349*4bdff4beSrobert#include <__algorithm/min_element.h>
350*4bdff4beSrobert#include <__algorithm/unwrap_iter.h>
351*4bdff4beSrobert#include <__assert> // all public C++ headers provide the assertion handler
35246035553Spatrick#include <__config>
353*4bdff4beSrobert#include <__functional/operations.h>
354*4bdff4beSrobert#include <__memory/allocator.h>
355*4bdff4beSrobert#include <__memory/uninitialized_algorithms.h>
356*4bdff4beSrobert#include <__type_traits/remove_reference.h>
357*4bdff4beSrobert#include <__utility/move.h>
358*4bdff4beSrobert#include <__utility/swap.h>
35976d0caaeSpatrick#include <cmath>
36076d0caaeSpatrick#include <cstddef>
36146035553Spatrick#include <new>
362*4bdff4beSrobert#include <version>
363*4bdff4beSrobert
364*4bdff4beSrobert// standard-mandated includes
365*4bdff4beSrobert
366*4bdff4beSrobert// [valarray.syn]
367*4bdff4beSrobert#include <initializer_list>
36846035553Spatrick
36946035553Spatrick#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
37046035553Spatrick#  pragma GCC system_header
37146035553Spatrick#endif
37246035553Spatrick
37346035553Spatrick_LIBCPP_PUSH_MACROS
37446035553Spatrick#include <__undef_macros>
37546035553Spatrick
37646035553Spatrick_LIBCPP_BEGIN_NAMESPACE_STD
37746035553Spatrick
37846035553Spatricktemplate<class _Tp> class _LIBCPP_TEMPLATE_VIS valarray;
37946035553Spatrick
38046035553Spatrickclass _LIBCPP_TEMPLATE_VIS slice
38146035553Spatrick{
38246035553Spatrick    size_t __start_;
38346035553Spatrick    size_t __size_;
38446035553Spatrick    size_t __stride_;
38546035553Spatrickpublic:
38646035553Spatrick    _LIBCPP_INLINE_VISIBILITY
38746035553Spatrick    slice()
38846035553Spatrick        : __start_(0),
38946035553Spatrick          __size_(0),
39046035553Spatrick          __stride_(0)
39146035553Spatrick          {}
39246035553Spatrick
39346035553Spatrick    _LIBCPP_INLINE_VISIBILITY
39446035553Spatrick    slice(size_t __start, size_t __size, size_t __stride)
39546035553Spatrick        : __start_(__start),
39646035553Spatrick          __size_(__size),
39746035553Spatrick          __stride_(__stride)
39846035553Spatrick          {}
39946035553Spatrick
40046035553Spatrick    _LIBCPP_INLINE_VISIBILITY size_t start()  const {return __start_;}
40146035553Spatrick    _LIBCPP_INLINE_VISIBILITY size_t size()   const {return __size_;}
40246035553Spatrick    _LIBCPP_INLINE_VISIBILITY size_t stride() const {return __stride_;}
40346035553Spatrick};
40446035553Spatrick
40546035553Spatricktemplate <class _Tp> class _LIBCPP_TEMPLATE_VIS slice_array;
40646035553Spatrickclass _LIBCPP_TYPE_VIS gslice;
40746035553Spatricktemplate <class _Tp> class _LIBCPP_TEMPLATE_VIS gslice_array;
40846035553Spatricktemplate <class _Tp> class _LIBCPP_TEMPLATE_VIS mask_array;
40946035553Spatricktemplate <class _Tp> class _LIBCPP_TEMPLATE_VIS indirect_array;
41046035553Spatrick
41146035553Spatricktemplate <class _Tp>
41246035553Spatrick_LIBCPP_INLINE_VISIBILITY
41346035553Spatrick_Tp*
41446035553Spatrickbegin(valarray<_Tp>& __v);
41546035553Spatrick
41646035553Spatricktemplate <class _Tp>
41746035553Spatrick_LIBCPP_INLINE_VISIBILITY
41846035553Spatrickconst _Tp*
41946035553Spatrickbegin(const valarray<_Tp>& __v);
42046035553Spatrick
42146035553Spatricktemplate <class _Tp>
42246035553Spatrick_LIBCPP_INLINE_VISIBILITY
42346035553Spatrick_Tp*
42446035553Spatrickend(valarray<_Tp>& __v);
42546035553Spatrick
42646035553Spatricktemplate <class _Tp>
42746035553Spatrick_LIBCPP_INLINE_VISIBILITY
42846035553Spatrickconst _Tp*
42946035553Spatrickend(const valarray<_Tp>& __v);
43046035553Spatrick
43146035553Spatricktemplate <class _Op, class _A0>
43246035553Spatrickstruct _UnaryOp
43346035553Spatrick{
43476d0caaeSpatrick    typedef typename _Op::__result_type __result_type;
43576d0caaeSpatrick    typedef typename decay<__result_type>::type value_type;
43646035553Spatrick
43746035553Spatrick    _Op __op_;
43846035553Spatrick    _A0 __a0_;
43946035553Spatrick
44046035553Spatrick    _LIBCPP_INLINE_VISIBILITY
44146035553Spatrick    _UnaryOp(const _Op& __op, const _A0& __a0) : __op_(__op), __a0_(__a0) {}
44246035553Spatrick
44346035553Spatrick    _LIBCPP_INLINE_VISIBILITY
44476d0caaeSpatrick    __result_type operator[](size_t __i) const {return __op_(__a0_[__i]);}
44546035553Spatrick
44646035553Spatrick    _LIBCPP_INLINE_VISIBILITY
44746035553Spatrick    size_t size() const {return __a0_.size();}
44846035553Spatrick};
44946035553Spatrick
45046035553Spatricktemplate <class _Op, class _A0, class _A1>
45146035553Spatrickstruct _BinaryOp
45246035553Spatrick{
45376d0caaeSpatrick    typedef typename _Op::__result_type __result_type;
45476d0caaeSpatrick    typedef typename decay<__result_type>::type value_type;
45546035553Spatrick
45646035553Spatrick    _Op __op_;
45746035553Spatrick    _A0 __a0_;
45846035553Spatrick    _A1 __a1_;
45946035553Spatrick
46046035553Spatrick    _LIBCPP_INLINE_VISIBILITY
46146035553Spatrick    _BinaryOp(const _Op& __op, const _A0& __a0, const _A1& __a1)
46246035553Spatrick        : __op_(__op), __a0_(__a0), __a1_(__a1) {}
46346035553Spatrick
46446035553Spatrick    _LIBCPP_INLINE_VISIBILITY
46576d0caaeSpatrick    __result_type operator[](size_t __i) const {return __op_(__a0_[__i], __a1_[__i]);}
46646035553Spatrick
46746035553Spatrick    _LIBCPP_INLINE_VISIBILITY
46846035553Spatrick    size_t size() const {return __a0_.size();}
46946035553Spatrick};
47046035553Spatrick
47146035553Spatricktemplate <class _Tp>
47246035553Spatrickclass __scalar_expr
47346035553Spatrick{
47446035553Spatrickpublic:
47546035553Spatrick    typedef _Tp        value_type;
47676d0caaeSpatrick    typedef const _Tp& __result_type;
47746035553Spatrickprivate:
47846035553Spatrick    const value_type& __t_;
47946035553Spatrick    size_t __s_;
48046035553Spatrickpublic:
48146035553Spatrick    _LIBCPP_INLINE_VISIBILITY
48246035553Spatrick    explicit __scalar_expr(const value_type& __t, size_t __s) : __t_(__t), __s_(__s) {}
48346035553Spatrick
48446035553Spatrick    _LIBCPP_INLINE_VISIBILITY
48576d0caaeSpatrick    __result_type operator[](size_t) const {return __t_;}
48646035553Spatrick
48746035553Spatrick    _LIBCPP_INLINE_VISIBILITY
48846035553Spatrick    size_t size() const {return __s_;}
48946035553Spatrick};
49046035553Spatrick
49146035553Spatricktemplate <class _Tp>
49276d0caaeSpatrickstruct __unary_plus
49346035553Spatrick{
49476d0caaeSpatrick    typedef _Tp __result_type;
49546035553Spatrick    _LIBCPP_INLINE_VISIBILITY
49646035553Spatrick    _Tp operator()(const _Tp& __x) const
49746035553Spatrick        {return +__x;}
49846035553Spatrick};
49946035553Spatrick
50046035553Spatricktemplate <class _Tp>
50176d0caaeSpatrickstruct __bit_not
50246035553Spatrick{
50376d0caaeSpatrick    typedef _Tp __result_type;
50446035553Spatrick    _LIBCPP_INLINE_VISIBILITY
50546035553Spatrick    _Tp operator()(const _Tp& __x) const
50646035553Spatrick        {return ~__x;}
50746035553Spatrick};
50846035553Spatrick
50946035553Spatricktemplate <class _Tp>
51076d0caaeSpatrickstruct __bit_shift_left
51146035553Spatrick{
51276d0caaeSpatrick    typedef _Tp __result_type;
51346035553Spatrick    _LIBCPP_INLINE_VISIBILITY
51446035553Spatrick    _Tp operator()(const _Tp& __x, const _Tp& __y) const
51546035553Spatrick        {return __x << __y;}
51646035553Spatrick};
51746035553Spatrick
51846035553Spatricktemplate <class _Tp>
51976d0caaeSpatrickstruct __bit_shift_right
52046035553Spatrick{
52176d0caaeSpatrick    typedef _Tp __result_type;
52246035553Spatrick    _LIBCPP_INLINE_VISIBILITY
52346035553Spatrick    _Tp operator()(const _Tp& __x, const _Tp& __y) const
52446035553Spatrick        {return __x >> __y;}
52546035553Spatrick};
52646035553Spatrick
52746035553Spatricktemplate <class _Tp, class _Fp>
52876d0caaeSpatrickstruct __apply_expr
52946035553Spatrick{
53046035553Spatrickprivate:
53146035553Spatrick    _Fp __f_;
53246035553Spatrickpublic:
53376d0caaeSpatrick    typedef _Tp __result_type;
53476d0caaeSpatrick
53546035553Spatrick    _LIBCPP_INLINE_VISIBILITY
53646035553Spatrick    explicit __apply_expr(_Fp __f) : __f_(__f) {}
53746035553Spatrick
53846035553Spatrick    _LIBCPP_INLINE_VISIBILITY
53946035553Spatrick    _Tp operator()(const _Tp& __x) const
54046035553Spatrick        {return __f_(__x);}
54146035553Spatrick};
54246035553Spatrick
54346035553Spatricktemplate <class _Tp>
54476d0caaeSpatrickstruct __abs_expr
54546035553Spatrick{
54676d0caaeSpatrick    typedef _Tp __result_type;
54746035553Spatrick    _LIBCPP_INLINE_VISIBILITY
54846035553Spatrick    _Tp operator()(const _Tp& __x) const
549*4bdff4beSrobert        {return std::abs(__x);}
55046035553Spatrick};
55146035553Spatrick
55246035553Spatricktemplate <class _Tp>
55376d0caaeSpatrickstruct __acos_expr
55446035553Spatrick{
55576d0caaeSpatrick    typedef _Tp __result_type;
55646035553Spatrick    _LIBCPP_INLINE_VISIBILITY
55746035553Spatrick    _Tp operator()(const _Tp& __x) const
558*4bdff4beSrobert        {return std::acos(__x);}
55946035553Spatrick};
56046035553Spatrick
56146035553Spatricktemplate <class _Tp>
56276d0caaeSpatrickstruct __asin_expr
56346035553Spatrick{
56476d0caaeSpatrick    typedef _Tp __result_type;
56546035553Spatrick    _LIBCPP_INLINE_VISIBILITY
56646035553Spatrick    _Tp operator()(const _Tp& __x) const
567*4bdff4beSrobert        {return std::asin(__x);}
56846035553Spatrick};
56946035553Spatrick
57046035553Spatricktemplate <class _Tp>
57176d0caaeSpatrickstruct __atan_expr
57246035553Spatrick{
57376d0caaeSpatrick    typedef _Tp __result_type;
57446035553Spatrick    _LIBCPP_INLINE_VISIBILITY
57546035553Spatrick    _Tp operator()(const _Tp& __x) const
576*4bdff4beSrobert        {return std::atan(__x);}
57746035553Spatrick};
57846035553Spatrick
57946035553Spatricktemplate <class _Tp>
58076d0caaeSpatrickstruct __atan2_expr
58146035553Spatrick{
58276d0caaeSpatrick    typedef _Tp __result_type;
58346035553Spatrick    _LIBCPP_INLINE_VISIBILITY
58446035553Spatrick    _Tp operator()(const _Tp& __x, const _Tp& __y) const
585*4bdff4beSrobert        {return std::atan2(__x, __y);}
58646035553Spatrick};
58746035553Spatrick
58846035553Spatricktemplate <class _Tp>
58976d0caaeSpatrickstruct __cos_expr
59046035553Spatrick{
59176d0caaeSpatrick    typedef _Tp __result_type;
59246035553Spatrick    _LIBCPP_INLINE_VISIBILITY
59346035553Spatrick    _Tp operator()(const _Tp& __x) const
594*4bdff4beSrobert        {return std::cos(__x);}
59546035553Spatrick};
59646035553Spatrick
59746035553Spatricktemplate <class _Tp>
59876d0caaeSpatrickstruct __cosh_expr
59946035553Spatrick{
60076d0caaeSpatrick    typedef _Tp __result_type;
60146035553Spatrick    _LIBCPP_INLINE_VISIBILITY
60246035553Spatrick    _Tp operator()(const _Tp& __x) const
603*4bdff4beSrobert        {return std::cosh(__x);}
60446035553Spatrick};
60546035553Spatrick
60646035553Spatricktemplate <class _Tp>
60776d0caaeSpatrickstruct __exp_expr
60846035553Spatrick{
60976d0caaeSpatrick    typedef _Tp __result_type;
61046035553Spatrick    _LIBCPP_INLINE_VISIBILITY
61146035553Spatrick    _Tp operator()(const _Tp& __x) const
612*4bdff4beSrobert        {return std::exp(__x);}
61346035553Spatrick};
61446035553Spatrick
61546035553Spatricktemplate <class _Tp>
61676d0caaeSpatrickstruct __log_expr
61746035553Spatrick{
61876d0caaeSpatrick    typedef _Tp __result_type;
61946035553Spatrick    _LIBCPP_INLINE_VISIBILITY
62046035553Spatrick    _Tp operator()(const _Tp& __x) const
621*4bdff4beSrobert        {return std::log(__x);}
62246035553Spatrick};
62346035553Spatrick
62446035553Spatricktemplate <class _Tp>
62576d0caaeSpatrickstruct __log10_expr
62646035553Spatrick{
62776d0caaeSpatrick    typedef _Tp __result_type;
62846035553Spatrick    _LIBCPP_INLINE_VISIBILITY
62946035553Spatrick    _Tp operator()(const _Tp& __x) const
630*4bdff4beSrobert        {return std::log10(__x);}
63146035553Spatrick};
63246035553Spatrick
63346035553Spatricktemplate <class _Tp>
63476d0caaeSpatrickstruct __pow_expr
63546035553Spatrick{
63676d0caaeSpatrick    typedef _Tp __result_type;
63746035553Spatrick    _LIBCPP_INLINE_VISIBILITY
63846035553Spatrick    _Tp operator()(const _Tp& __x, const _Tp& __y) const
639*4bdff4beSrobert        {return std::pow(__x, __y);}
64046035553Spatrick};
64146035553Spatrick
64246035553Spatricktemplate <class _Tp>
64376d0caaeSpatrickstruct __sin_expr
64446035553Spatrick{
64576d0caaeSpatrick    typedef _Tp __result_type;
64646035553Spatrick    _LIBCPP_INLINE_VISIBILITY
64746035553Spatrick    _Tp operator()(const _Tp& __x) const
648*4bdff4beSrobert        {return std::sin(__x);}
64946035553Spatrick};
65046035553Spatrick
65146035553Spatricktemplate <class _Tp>
65276d0caaeSpatrickstruct __sinh_expr
65346035553Spatrick{
65476d0caaeSpatrick    typedef _Tp __result_type;
65546035553Spatrick    _LIBCPP_INLINE_VISIBILITY
65646035553Spatrick    _Tp operator()(const _Tp& __x) const
657*4bdff4beSrobert        {return std::sinh(__x);}
65846035553Spatrick};
65946035553Spatrick
66046035553Spatricktemplate <class _Tp>
66176d0caaeSpatrickstruct __sqrt_expr
66246035553Spatrick{
66376d0caaeSpatrick    typedef _Tp __result_type;
66446035553Spatrick    _LIBCPP_INLINE_VISIBILITY
66546035553Spatrick    _Tp operator()(const _Tp& __x) const
666*4bdff4beSrobert        {return std::sqrt(__x);}
66746035553Spatrick};
66846035553Spatrick
66946035553Spatricktemplate <class _Tp>
67076d0caaeSpatrickstruct __tan_expr
67146035553Spatrick{
67276d0caaeSpatrick    typedef _Tp __result_type;
67346035553Spatrick    _LIBCPP_INLINE_VISIBILITY
67446035553Spatrick    _Tp operator()(const _Tp& __x) const
675*4bdff4beSrobert        {return std::tan(__x);}
67646035553Spatrick};
67746035553Spatrick
67846035553Spatricktemplate <class _Tp>
67976d0caaeSpatrickstruct __tanh_expr
68046035553Spatrick{
68176d0caaeSpatrick    typedef _Tp __result_type;
68246035553Spatrick    _LIBCPP_INLINE_VISIBILITY
68346035553Spatrick    _Tp operator()(const _Tp& __x) const
684*4bdff4beSrobert        {return std::tanh(__x);}
68546035553Spatrick};
68646035553Spatrick
68746035553Spatricktemplate <class _ValExpr>
68846035553Spatrickclass __slice_expr
68946035553Spatrick{
690*4bdff4beSrobert    typedef __libcpp_remove_reference_t<_ValExpr>  _RmExpr;
69146035553Spatrickpublic:
69246035553Spatrick    typedef typename _RmExpr::value_type value_type;
69376d0caaeSpatrick    typedef value_type __result_type;
69446035553Spatrick
69546035553Spatrickprivate:
69646035553Spatrick    _ValExpr __expr_;
69746035553Spatrick    size_t __start_;
69846035553Spatrick    size_t __size_;
69946035553Spatrick    size_t __stride_;
70046035553Spatrick
70146035553Spatrick    _LIBCPP_INLINE_VISIBILITY
70246035553Spatrick    __slice_expr(const slice& __sl, const _RmExpr& __e)
70346035553Spatrick        : __expr_(__e),
70446035553Spatrick          __start_(__sl.start()),
70546035553Spatrick          __size_(__sl.size()),
70646035553Spatrick          __stride_(__sl.stride())
70746035553Spatrick        {}
70846035553Spatrickpublic:
70946035553Spatrick
71046035553Spatrick    _LIBCPP_INLINE_VISIBILITY
71176d0caaeSpatrick    __result_type operator[](size_t __i) const
71246035553Spatrick        {return __expr_[__start_ + __i * __stride_];}
71346035553Spatrick
71446035553Spatrick    _LIBCPP_INLINE_VISIBILITY
71546035553Spatrick    size_t size() const {return __size_;}
71646035553Spatrick
71746035553Spatrick    template <class> friend class __val_expr;
71846035553Spatrick    template <class> friend class _LIBCPP_TEMPLATE_VIS valarray;
71946035553Spatrick};
72046035553Spatrick
72146035553Spatricktemplate <class _ValExpr>
72246035553Spatrickclass __mask_expr;
72346035553Spatrick
72446035553Spatricktemplate <class _ValExpr>
72546035553Spatrickclass __indirect_expr;
72646035553Spatrick
72746035553Spatricktemplate <class _ValExpr>
72846035553Spatrickclass __shift_expr
72946035553Spatrick{
730*4bdff4beSrobert    typedef __libcpp_remove_reference_t<_ValExpr>  _RmExpr;
73146035553Spatrickpublic:
73246035553Spatrick    typedef typename _RmExpr::value_type value_type;
73376d0caaeSpatrick    typedef value_type __result_type;
73446035553Spatrick
73546035553Spatrickprivate:
73646035553Spatrick    _ValExpr __expr_;
73746035553Spatrick    size_t __size_;
73846035553Spatrick    ptrdiff_t __ul_;
73946035553Spatrick    ptrdiff_t __sn_;
74046035553Spatrick    ptrdiff_t __n_;
74146035553Spatrick    static const ptrdiff_t _Np = static_cast<ptrdiff_t>(
74246035553Spatrick                                    sizeof(ptrdiff_t) * __CHAR_BIT__ - 1);
74346035553Spatrick
74446035553Spatrick    _LIBCPP_INLINE_VISIBILITY
74546035553Spatrick    __shift_expr(int __n, const _RmExpr& __e)
74646035553Spatrick        : __expr_(__e),
74746035553Spatrick          __size_(__e.size()),
74846035553Spatrick          __n_(__n)
74946035553Spatrick        {
75046035553Spatrick            ptrdiff_t __neg_n = static_cast<ptrdiff_t>(__n_ >> _Np);
75146035553Spatrick            __sn_ = __neg_n | static_cast<ptrdiff_t>(static_cast<size_t>(-__n_) >> _Np);
75246035553Spatrick            __ul_ = ((__size_ - __n_) & ~__neg_n) | ((__n_ + 1) & __neg_n);
75346035553Spatrick        }
75446035553Spatrickpublic:
75546035553Spatrick
75646035553Spatrick    _LIBCPP_INLINE_VISIBILITY
75776d0caaeSpatrick    __result_type operator[](size_t __j) const
75846035553Spatrick        {
75946035553Spatrick            ptrdiff_t __i = static_cast<ptrdiff_t>(__j);
76046035553Spatrick            ptrdiff_t __m = (__sn_ * __i - __ul_) >> _Np;
76146035553Spatrick            return (__expr_[(__i + __n_) & __m] & __m) | (value_type() & ~__m);
76246035553Spatrick        }
76346035553Spatrick
76446035553Spatrick    _LIBCPP_INLINE_VISIBILITY
76546035553Spatrick    size_t size() const {return __size_;}
76646035553Spatrick
76746035553Spatrick    template <class> friend class __val_expr;
76846035553Spatrick};
76946035553Spatrick
77046035553Spatricktemplate <class _ValExpr>
77146035553Spatrickclass __cshift_expr
77246035553Spatrick{
773*4bdff4beSrobert    typedef __libcpp_remove_reference_t<_ValExpr>  _RmExpr;
77446035553Spatrickpublic:
77546035553Spatrick    typedef typename _RmExpr::value_type value_type;
77676d0caaeSpatrick    typedef value_type __result_type;
77746035553Spatrick
77846035553Spatrickprivate:
77946035553Spatrick    _ValExpr __expr_;
78046035553Spatrick    size_t __size_;
78146035553Spatrick    size_t __m_;
78246035553Spatrick    size_t __o1_;
78346035553Spatrick    size_t __o2_;
78446035553Spatrick
78546035553Spatrick    _LIBCPP_INLINE_VISIBILITY
78646035553Spatrick    __cshift_expr(int __n, const _RmExpr& __e)
78746035553Spatrick        : __expr_(__e),
78846035553Spatrick          __size_(__e.size())
78946035553Spatrick        {
79046035553Spatrick            __n %= static_cast<int>(__size_);
79146035553Spatrick            if (__n >= 0)
79246035553Spatrick            {
79346035553Spatrick                __m_ = __size_ - __n;
79446035553Spatrick                __o1_ = __n;
79546035553Spatrick                __o2_ = __n - __size_;
79646035553Spatrick            }
79746035553Spatrick            else
79846035553Spatrick            {
79946035553Spatrick                __m_ = -__n;
80046035553Spatrick                __o1_ = __n + __size_;
80146035553Spatrick                __o2_ = __n;
80246035553Spatrick            }
80346035553Spatrick        }
80446035553Spatrickpublic:
80546035553Spatrick
80646035553Spatrick    _LIBCPP_INLINE_VISIBILITY
80776d0caaeSpatrick    __result_type operator[](size_t __i) const
80846035553Spatrick        {
80946035553Spatrick            if (__i < __m_)
81046035553Spatrick                return __expr_[__i + __o1_];
81146035553Spatrick            return __expr_[__i + __o2_];
81246035553Spatrick        }
81346035553Spatrick
81446035553Spatrick    _LIBCPP_INLINE_VISIBILITY
81546035553Spatrick    size_t size() const {return __size_;}
81646035553Spatrick
81746035553Spatrick    template <class> friend class __val_expr;
81846035553Spatrick};
81946035553Spatrick
82046035553Spatricktemplate<class _ValExpr>
82146035553Spatrickclass __val_expr;
82246035553Spatrick
82346035553Spatricktemplate<class _ValExpr>
82446035553Spatrickstruct __is_val_expr : false_type {};
82546035553Spatrick
82646035553Spatricktemplate<class _ValExpr>
82746035553Spatrickstruct __is_val_expr<__val_expr<_ValExpr> > : true_type {};
82846035553Spatrick
82946035553Spatricktemplate<class _Tp>
83046035553Spatrickstruct __is_val_expr<valarray<_Tp> > : true_type {};
83146035553Spatrick
83246035553Spatricktemplate<class _Tp>
83346035553Spatrickclass _LIBCPP_TEMPLATE_VIS valarray
83446035553Spatrick{
83546035553Spatrickpublic:
83646035553Spatrick    typedef _Tp value_type;
83776d0caaeSpatrick    typedef _Tp __result_type;
83846035553Spatrick
83946035553Spatrickprivate:
84046035553Spatrick    value_type* __begin_;
84146035553Spatrick    value_type* __end_;
84246035553Spatrick
84346035553Spatrickpublic:
84446035553Spatrick    // construct/destroy:
84546035553Spatrick    _LIBCPP_INLINE_VISIBILITY
84676d0caaeSpatrick    valarray() : __begin_(nullptr), __end_(nullptr) {}
84746035553Spatrick    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
84846035553Spatrick    explicit valarray(size_t __n);
84946035553Spatrick    _LIBCPP_INLINE_VISIBILITY
85046035553Spatrick    valarray(const value_type& __x, size_t __n);
85146035553Spatrick    valarray(const value_type* __p, size_t __n);
85246035553Spatrick    valarray(const valarray& __v);
85346035553Spatrick#ifndef _LIBCPP_CXX03_LANG
85446035553Spatrick    _LIBCPP_INLINE_VISIBILITY
85546035553Spatrick    valarray(valarray&& __v) _NOEXCEPT;
85646035553Spatrick    valarray(initializer_list<value_type> __il);
85746035553Spatrick#endif // _LIBCPP_CXX03_LANG
85846035553Spatrick    valarray(const slice_array<value_type>& __sa);
85946035553Spatrick    valarray(const gslice_array<value_type>& __ga);
86046035553Spatrick    valarray(const mask_array<value_type>& __ma);
86146035553Spatrick    valarray(const indirect_array<value_type>& __ia);
86246035553Spatrick    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
86346035553Spatrick    ~valarray();
86446035553Spatrick
86546035553Spatrick    // assignment:
86646035553Spatrick    valarray& operator=(const valarray& __v);
86746035553Spatrick#ifndef _LIBCPP_CXX03_LANG
86846035553Spatrick    _LIBCPP_INLINE_VISIBILITY
86946035553Spatrick    valarray& operator=(valarray&& __v) _NOEXCEPT;
87046035553Spatrick    _LIBCPP_INLINE_VISIBILITY
87146035553Spatrick    valarray& operator=(initializer_list<value_type>);
87246035553Spatrick#endif // _LIBCPP_CXX03_LANG
87346035553Spatrick    _LIBCPP_INLINE_VISIBILITY
87446035553Spatrick    valarray& operator=(const value_type& __x);
87546035553Spatrick    _LIBCPP_INLINE_VISIBILITY
87646035553Spatrick    valarray& operator=(const slice_array<value_type>& __sa);
87746035553Spatrick    _LIBCPP_INLINE_VISIBILITY
87846035553Spatrick    valarray& operator=(const gslice_array<value_type>& __ga);
87946035553Spatrick    _LIBCPP_INLINE_VISIBILITY
88046035553Spatrick    valarray& operator=(const mask_array<value_type>& __ma);
88146035553Spatrick    _LIBCPP_INLINE_VISIBILITY
88246035553Spatrick    valarray& operator=(const indirect_array<value_type>& __ia);
88346035553Spatrick    template <class _ValExpr>
88446035553Spatrick        _LIBCPP_INLINE_VISIBILITY
88546035553Spatrick        valarray& operator=(const __val_expr<_ValExpr>& __v);
88646035553Spatrick
88746035553Spatrick    // element access:
88846035553Spatrick    _LIBCPP_INLINE_VISIBILITY
88946035553Spatrick    const value_type& operator[](size_t __i) const {return __begin_[__i];}
89046035553Spatrick
89146035553Spatrick    _LIBCPP_INLINE_VISIBILITY
89246035553Spatrick    value_type&       operator[](size_t __i)       {return __begin_[__i];}
89346035553Spatrick
89446035553Spatrick    // subset operations:
89546035553Spatrick    _LIBCPP_INLINE_VISIBILITY
89646035553Spatrick    __val_expr<__slice_expr<const valarray&> >    operator[](slice __s) const;
89746035553Spatrick    _LIBCPP_INLINE_VISIBILITY
89846035553Spatrick    slice_array<value_type>                       operator[](slice __s);
89946035553Spatrick    _LIBCPP_INLINE_VISIBILITY
90046035553Spatrick    __val_expr<__indirect_expr<const valarray&> > operator[](const gslice& __gs) const;
90146035553Spatrick    _LIBCPP_INLINE_VISIBILITY
90246035553Spatrick    gslice_array<value_type>   operator[](const gslice& __gs);
90346035553Spatrick#ifndef _LIBCPP_CXX03_LANG
90446035553Spatrick    _LIBCPP_INLINE_VISIBILITY
90546035553Spatrick    __val_expr<__indirect_expr<const valarray&> > operator[](gslice&& __gs) const;
90646035553Spatrick    _LIBCPP_INLINE_VISIBILITY
90746035553Spatrick    gslice_array<value_type>                      operator[](gslice&& __gs);
90846035553Spatrick#endif // _LIBCPP_CXX03_LANG
90946035553Spatrick    _LIBCPP_INLINE_VISIBILITY
91046035553Spatrick    __val_expr<__mask_expr<const valarray&> >     operator[](const valarray<bool>& __vb) const;
91146035553Spatrick    _LIBCPP_INLINE_VISIBILITY
91246035553Spatrick    mask_array<value_type>                        operator[](const valarray<bool>& __vb);
91346035553Spatrick#ifndef _LIBCPP_CXX03_LANG
91446035553Spatrick    _LIBCPP_INLINE_VISIBILITY
91546035553Spatrick    __val_expr<__mask_expr<const valarray&> >     operator[](valarray<bool>&& __vb) const;
91646035553Spatrick    _LIBCPP_INLINE_VISIBILITY
91746035553Spatrick    mask_array<value_type>                        operator[](valarray<bool>&& __vb);
91846035553Spatrick#endif // _LIBCPP_CXX03_LANG
91946035553Spatrick    _LIBCPP_INLINE_VISIBILITY
92046035553Spatrick    __val_expr<__indirect_expr<const valarray&> > operator[](const valarray<size_t>& __vs) const;
92146035553Spatrick    _LIBCPP_INLINE_VISIBILITY
92246035553Spatrick    indirect_array<value_type>                    operator[](const valarray<size_t>& __vs);
92346035553Spatrick#ifndef _LIBCPP_CXX03_LANG
92446035553Spatrick    _LIBCPP_INLINE_VISIBILITY
92546035553Spatrick    __val_expr<__indirect_expr<const valarray&> > operator[](valarray<size_t>&& __vs) const;
92646035553Spatrick    _LIBCPP_INLINE_VISIBILITY
92746035553Spatrick    indirect_array<value_type>                    operator[](valarray<size_t>&& __vs);
92846035553Spatrick#endif // _LIBCPP_CXX03_LANG
92946035553Spatrick
93046035553Spatrick    // unary operators:
931*4bdff4beSrobert    _LIBCPP_INLINE_VISIBILITY
932*4bdff4beSrobert    __val_expr<_UnaryOp<__unary_plus<_Tp>, const valarray&> >   operator+() const;
933*4bdff4beSrobert    _LIBCPP_INLINE_VISIBILITY
934*4bdff4beSrobert    __val_expr<_UnaryOp<negate<_Tp>, const valarray&> >         operator-() const;
935*4bdff4beSrobert    _LIBCPP_INLINE_VISIBILITY
936*4bdff4beSrobert    __val_expr<_UnaryOp<__bit_not<_Tp>, const valarray&> >      operator~() const;
937*4bdff4beSrobert    _LIBCPP_INLINE_VISIBILITY
938*4bdff4beSrobert    __val_expr<_UnaryOp<logical_not<_Tp>, const valarray&> >    operator!() const;
93946035553Spatrick
94046035553Spatrick    // computed assignment:
94146035553Spatrick    _LIBCPP_INLINE_VISIBILITY
94246035553Spatrick    valarray& operator*= (const value_type& __x);
94346035553Spatrick    _LIBCPP_INLINE_VISIBILITY
94446035553Spatrick    valarray& operator/= (const value_type& __x);
94546035553Spatrick    _LIBCPP_INLINE_VISIBILITY
94646035553Spatrick    valarray& operator%= (const value_type& __x);
94746035553Spatrick    _LIBCPP_INLINE_VISIBILITY
94846035553Spatrick    valarray& operator+= (const value_type& __x);
94946035553Spatrick    _LIBCPP_INLINE_VISIBILITY
95046035553Spatrick    valarray& operator-= (const value_type& __x);
95146035553Spatrick    _LIBCPP_INLINE_VISIBILITY
95246035553Spatrick    valarray& operator^= (const value_type& __x);
95346035553Spatrick    _LIBCPP_INLINE_VISIBILITY
95446035553Spatrick    valarray& operator&= (const value_type& __x);
95546035553Spatrick    _LIBCPP_INLINE_VISIBILITY
95646035553Spatrick    valarray& operator|= (const value_type& __x);
95746035553Spatrick    _LIBCPP_INLINE_VISIBILITY
95846035553Spatrick    valarray& operator<<=(const value_type& __x);
95946035553Spatrick    _LIBCPP_INLINE_VISIBILITY
96046035553Spatrick    valarray& operator>>=(const value_type& __x);
96146035553Spatrick
96246035553Spatrick    template <class _Expr>
96346035553Spatrick    typename enable_if
96446035553Spatrick    <
96546035553Spatrick        __is_val_expr<_Expr>::value,
96646035553Spatrick        valarray&
96746035553Spatrick    >::type
96846035553Spatrick    _LIBCPP_INLINE_VISIBILITY
96946035553Spatrick    operator*= (const _Expr& __v);
97046035553Spatrick
97146035553Spatrick    template <class _Expr>
97246035553Spatrick    typename enable_if
97346035553Spatrick    <
97446035553Spatrick        __is_val_expr<_Expr>::value,
97546035553Spatrick        valarray&
97646035553Spatrick    >::type
97746035553Spatrick    _LIBCPP_INLINE_VISIBILITY
97846035553Spatrick    operator/= (const _Expr& __v);
97946035553Spatrick
98046035553Spatrick    template <class _Expr>
98146035553Spatrick    typename enable_if
98246035553Spatrick    <
98346035553Spatrick        __is_val_expr<_Expr>::value,
98446035553Spatrick        valarray&
98546035553Spatrick    >::type
98646035553Spatrick    _LIBCPP_INLINE_VISIBILITY
98746035553Spatrick    operator%= (const _Expr& __v);
98846035553Spatrick
98946035553Spatrick    template <class _Expr>
99046035553Spatrick    typename enable_if
99146035553Spatrick    <
99246035553Spatrick        __is_val_expr<_Expr>::value,
99346035553Spatrick        valarray&
99446035553Spatrick    >::type
99546035553Spatrick    _LIBCPP_INLINE_VISIBILITY
99646035553Spatrick    operator+= (const _Expr& __v);
99746035553Spatrick
99846035553Spatrick    template <class _Expr>
99946035553Spatrick    typename enable_if
100046035553Spatrick    <
100146035553Spatrick        __is_val_expr<_Expr>::value,
100246035553Spatrick        valarray&
100346035553Spatrick    >::type
100446035553Spatrick    _LIBCPP_INLINE_VISIBILITY
100546035553Spatrick    operator-= (const _Expr& __v);
100646035553Spatrick
100746035553Spatrick    template <class _Expr>
100846035553Spatrick    typename enable_if
100946035553Spatrick    <
101046035553Spatrick        __is_val_expr<_Expr>::value,
101146035553Spatrick        valarray&
101246035553Spatrick    >::type
101346035553Spatrick    _LIBCPP_INLINE_VISIBILITY
101446035553Spatrick    operator^= (const _Expr& __v);
101546035553Spatrick
101646035553Spatrick    template <class _Expr>
101746035553Spatrick    typename enable_if
101846035553Spatrick    <
101946035553Spatrick        __is_val_expr<_Expr>::value,
102046035553Spatrick        valarray&
102146035553Spatrick    >::type
102246035553Spatrick    _LIBCPP_INLINE_VISIBILITY
102346035553Spatrick    operator|= (const _Expr& __v);
102446035553Spatrick
102546035553Spatrick    template <class _Expr>
102646035553Spatrick    typename enable_if
102746035553Spatrick    <
102846035553Spatrick        __is_val_expr<_Expr>::value,
102946035553Spatrick        valarray&
103046035553Spatrick    >::type
103146035553Spatrick    _LIBCPP_INLINE_VISIBILITY
103246035553Spatrick    operator&= (const _Expr& __v);
103346035553Spatrick
103446035553Spatrick    template <class _Expr>
103546035553Spatrick    typename enable_if
103646035553Spatrick    <
103746035553Spatrick        __is_val_expr<_Expr>::value,
103846035553Spatrick        valarray&
103946035553Spatrick    >::type
104046035553Spatrick    _LIBCPP_INLINE_VISIBILITY
104146035553Spatrick    operator<<= (const _Expr& __v);
104246035553Spatrick
104346035553Spatrick    template <class _Expr>
104446035553Spatrick    typename enable_if
104546035553Spatrick    <
104646035553Spatrick        __is_val_expr<_Expr>::value,
104746035553Spatrick        valarray&
104846035553Spatrick    >::type
104946035553Spatrick    _LIBCPP_INLINE_VISIBILITY
105046035553Spatrick    operator>>= (const _Expr& __v);
105146035553Spatrick
105246035553Spatrick    // member functions:
105346035553Spatrick    _LIBCPP_INLINE_VISIBILITY
105446035553Spatrick    void swap(valarray& __v) _NOEXCEPT;
105546035553Spatrick
105646035553Spatrick    _LIBCPP_INLINE_VISIBILITY
105746035553Spatrick    size_t size() const {return static_cast<size_t>(__end_ - __begin_);}
105846035553Spatrick
105946035553Spatrick    _LIBCPP_INLINE_VISIBILITY
106046035553Spatrick    value_type sum() const;
106146035553Spatrick    _LIBCPP_INLINE_VISIBILITY
106246035553Spatrick    value_type min() const;
106346035553Spatrick    _LIBCPP_INLINE_VISIBILITY
106446035553Spatrick    value_type max() const;
106546035553Spatrick
106646035553Spatrick    valarray shift (int __i) const;
106746035553Spatrick    valarray cshift(int __i) const;
106846035553Spatrick    valarray apply(value_type __f(value_type)) const;
106946035553Spatrick    valarray apply(value_type __f(const value_type&)) const;
107046035553Spatrick    void     resize(size_t __n, value_type __x = value_type());
107146035553Spatrick
107246035553Spatrickprivate:
107346035553Spatrick    template <class> friend class _LIBCPP_TEMPLATE_VIS valarray;
107446035553Spatrick    template <class> friend class _LIBCPP_TEMPLATE_VIS slice_array;
107546035553Spatrick    template <class> friend class _LIBCPP_TEMPLATE_VIS gslice_array;
107646035553Spatrick    template <class> friend class _LIBCPP_TEMPLATE_VIS mask_array;
107746035553Spatrick    template <class> friend class __mask_expr;
107846035553Spatrick    template <class> friend class _LIBCPP_TEMPLATE_VIS indirect_array;
107946035553Spatrick    template <class> friend class __indirect_expr;
108046035553Spatrick    template <class> friend class __val_expr;
108146035553Spatrick
108246035553Spatrick    template <class _Up>
108346035553Spatrick    friend
108446035553Spatrick    _Up*
108546035553Spatrick    begin(valarray<_Up>& __v);
108646035553Spatrick
108746035553Spatrick    template <class _Up>
108846035553Spatrick    friend
108946035553Spatrick    const _Up*
109046035553Spatrick    begin(const valarray<_Up>& __v);
109146035553Spatrick
109246035553Spatrick    template <class _Up>
109346035553Spatrick    friend
109446035553Spatrick    _Up*
109546035553Spatrick    end(valarray<_Up>& __v);
109646035553Spatrick
109746035553Spatrick    template <class _Up>
109846035553Spatrick    friend
109946035553Spatrick    const _Up*
110046035553Spatrick    end(const valarray<_Up>& __v);
110146035553Spatrick
110246035553Spatrick    _LIBCPP_INLINE_VISIBILITY
110346035553Spatrick    void __clear(size_t __capacity);
110446035553Spatrick    valarray& __assign_range(const value_type* __f, const value_type* __l);
110546035553Spatrick};
110646035553Spatrick
1107*4bdff4beSrobert#if _LIBCPP_STD_VER > 14
1108*4bdff4beSroberttemplate<class _Tp, size_t _Size>
1109*4bdff4beSrobertvalarray(const _Tp(&)[_Size], size_t) -> valarray<_Tp>;
1110*4bdff4beSrobert#endif
1111*4bdff4beSrobert
1112*4bdff4beSrobertextern template _LIBCPP_FUNC_VIS void valarray<size_t>::resize(size_t, size_t);
111346035553Spatrick
111446035553Spatricktemplate <class _Op, class _Tp>
111546035553Spatrickstruct _UnaryOp<_Op, valarray<_Tp> >
111646035553Spatrick{
111776d0caaeSpatrick    typedef typename _Op::__result_type __result_type;
111876d0caaeSpatrick    typedef typename decay<__result_type>::type value_type;
111946035553Spatrick
112046035553Spatrick    _Op __op_;
112146035553Spatrick    const valarray<_Tp>& __a0_;
112246035553Spatrick
112346035553Spatrick    _LIBCPP_INLINE_VISIBILITY
112446035553Spatrick    _UnaryOp(const _Op& __op, const valarray<_Tp>& __a0) : __op_(__op), __a0_(__a0) {}
112546035553Spatrick
112646035553Spatrick    _LIBCPP_INLINE_VISIBILITY
112776d0caaeSpatrick    __result_type operator[](size_t __i) const {return __op_(__a0_[__i]);}
112846035553Spatrick
112946035553Spatrick    _LIBCPP_INLINE_VISIBILITY
113046035553Spatrick    size_t size() const {return __a0_.size();}
113146035553Spatrick};
113246035553Spatrick
113346035553Spatricktemplate <class _Op, class _Tp, class _A1>
113446035553Spatrickstruct _BinaryOp<_Op, valarray<_Tp>, _A1>
113546035553Spatrick{
113676d0caaeSpatrick    typedef typename _Op::__result_type __result_type;
113776d0caaeSpatrick    typedef typename decay<__result_type>::type value_type;
113846035553Spatrick
113946035553Spatrick    _Op __op_;
114046035553Spatrick    const valarray<_Tp>& __a0_;
114146035553Spatrick    _A1 __a1_;
114246035553Spatrick
114346035553Spatrick    _LIBCPP_INLINE_VISIBILITY
114446035553Spatrick    _BinaryOp(const _Op& __op, const valarray<_Tp>& __a0, const _A1& __a1)
114546035553Spatrick        : __op_(__op), __a0_(__a0), __a1_(__a1) {}
114646035553Spatrick
114746035553Spatrick    _LIBCPP_INLINE_VISIBILITY
114876d0caaeSpatrick    __result_type operator[](size_t __i) const {return __op_(__a0_[__i], __a1_[__i]);}
114946035553Spatrick
115046035553Spatrick    _LIBCPP_INLINE_VISIBILITY
115146035553Spatrick    size_t size() const {return __a0_.size();}
115246035553Spatrick};
115346035553Spatrick
115446035553Spatricktemplate <class _Op, class _A0, class _Tp>
115546035553Spatrickstruct _BinaryOp<_Op, _A0, valarray<_Tp> >
115646035553Spatrick{
115776d0caaeSpatrick    typedef typename _Op::__result_type __result_type;
115876d0caaeSpatrick    typedef typename decay<__result_type>::type value_type;
115946035553Spatrick
116046035553Spatrick    _Op __op_;
116146035553Spatrick    _A0 __a0_;
116246035553Spatrick    const valarray<_Tp>& __a1_;
116346035553Spatrick
116446035553Spatrick    _LIBCPP_INLINE_VISIBILITY
116546035553Spatrick    _BinaryOp(const _Op& __op, const _A0& __a0, const valarray<_Tp>& __a1)
116646035553Spatrick        : __op_(__op), __a0_(__a0), __a1_(__a1) {}
116746035553Spatrick
116846035553Spatrick    _LIBCPP_INLINE_VISIBILITY
116976d0caaeSpatrick    __result_type operator[](size_t __i) const {return __op_(__a0_[__i], __a1_[__i]);}
117046035553Spatrick
117146035553Spatrick    _LIBCPP_INLINE_VISIBILITY
117246035553Spatrick    size_t size() const {return __a0_.size();}
117346035553Spatrick};
117446035553Spatrick
117546035553Spatricktemplate <class _Op, class _Tp>
117646035553Spatrickstruct _BinaryOp<_Op, valarray<_Tp>, valarray<_Tp> >
117746035553Spatrick{
117876d0caaeSpatrick    typedef typename _Op::__result_type __result_type;
117976d0caaeSpatrick    typedef typename decay<__result_type>::type value_type;
118046035553Spatrick
118146035553Spatrick    _Op __op_;
118246035553Spatrick    const valarray<_Tp>& __a0_;
118346035553Spatrick    const valarray<_Tp>& __a1_;
118446035553Spatrick
118546035553Spatrick    _LIBCPP_INLINE_VISIBILITY
118646035553Spatrick    _BinaryOp(const _Op& __op, const valarray<_Tp>& __a0, const valarray<_Tp>& __a1)
118746035553Spatrick        : __op_(__op), __a0_(__a0), __a1_(__a1) {}
118846035553Spatrick
118946035553Spatrick    _LIBCPP_INLINE_VISIBILITY
119076d0caaeSpatrick    __result_type operator[](size_t __i) const {return __op_(__a0_[__i], __a1_[__i]);}
119146035553Spatrick
119246035553Spatrick    _LIBCPP_INLINE_VISIBILITY
119346035553Spatrick    size_t size() const {return __a0_.size();}
119446035553Spatrick};
119546035553Spatrick
119646035553Spatrick// slice_array
119746035553Spatrick
119846035553Spatricktemplate <class _Tp>
119946035553Spatrickclass _LIBCPP_TEMPLATE_VIS slice_array
120046035553Spatrick{
120146035553Spatrickpublic:
120246035553Spatrick    typedef _Tp value_type;
120346035553Spatrick
120446035553Spatrickprivate:
120546035553Spatrick    value_type* __vp_;
120646035553Spatrick    size_t __size_;
120746035553Spatrick    size_t __stride_;
120846035553Spatrick
120946035553Spatrickpublic:
121046035553Spatrick    template <class _Expr>
121146035553Spatrick    typename enable_if
121246035553Spatrick    <
121346035553Spatrick        __is_val_expr<_Expr>::value,
121446035553Spatrick        void
121546035553Spatrick    >::type
121646035553Spatrick    _LIBCPP_INLINE_VISIBILITY
121746035553Spatrick    operator=(const _Expr& __v) const;
121846035553Spatrick
121946035553Spatrick    template <class _Expr>
122046035553Spatrick    typename enable_if
122146035553Spatrick    <
122246035553Spatrick        __is_val_expr<_Expr>::value,
122346035553Spatrick        void
122446035553Spatrick    >::type
122546035553Spatrick    _LIBCPP_INLINE_VISIBILITY
122646035553Spatrick    operator*=(const _Expr& __v) const;
122746035553Spatrick
122846035553Spatrick    template <class _Expr>
122946035553Spatrick    typename enable_if
123046035553Spatrick    <
123146035553Spatrick        __is_val_expr<_Expr>::value,
123246035553Spatrick        void
123346035553Spatrick    >::type
123446035553Spatrick    _LIBCPP_INLINE_VISIBILITY
123546035553Spatrick    operator/=(const _Expr& __v) const;
123646035553Spatrick
123746035553Spatrick    template <class _Expr>
123846035553Spatrick    typename enable_if
123946035553Spatrick    <
124046035553Spatrick        __is_val_expr<_Expr>::value,
124146035553Spatrick        void
124246035553Spatrick    >::type
124346035553Spatrick    _LIBCPP_INLINE_VISIBILITY
124446035553Spatrick    operator%=(const _Expr& __v) const;
124546035553Spatrick
124646035553Spatrick    template <class _Expr>
124746035553Spatrick    typename enable_if
124846035553Spatrick    <
124946035553Spatrick        __is_val_expr<_Expr>::value,
125046035553Spatrick        void
125146035553Spatrick    >::type
125246035553Spatrick    _LIBCPP_INLINE_VISIBILITY
125346035553Spatrick    operator+=(const _Expr& __v) const;
125446035553Spatrick
125546035553Spatrick    template <class _Expr>
125646035553Spatrick    typename enable_if
125746035553Spatrick    <
125846035553Spatrick        __is_val_expr<_Expr>::value,
125946035553Spatrick        void
126046035553Spatrick    >::type
126146035553Spatrick    _LIBCPP_INLINE_VISIBILITY
126246035553Spatrick    operator-=(const _Expr& __v) const;
126346035553Spatrick
126446035553Spatrick    template <class _Expr>
126546035553Spatrick    typename enable_if
126646035553Spatrick    <
126746035553Spatrick        __is_val_expr<_Expr>::value,
126846035553Spatrick        void
126946035553Spatrick    >::type
127046035553Spatrick    _LIBCPP_INLINE_VISIBILITY
127146035553Spatrick    operator^=(const _Expr& __v) const;
127246035553Spatrick
127346035553Spatrick    template <class _Expr>
127446035553Spatrick    typename enable_if
127546035553Spatrick    <
127646035553Spatrick        __is_val_expr<_Expr>::value,
127746035553Spatrick        void
127846035553Spatrick    >::type
127946035553Spatrick    _LIBCPP_INLINE_VISIBILITY
128046035553Spatrick    operator&=(const _Expr& __v) const;
128146035553Spatrick
128246035553Spatrick    template <class _Expr>
128346035553Spatrick    typename enable_if
128446035553Spatrick    <
128546035553Spatrick        __is_val_expr<_Expr>::value,
128646035553Spatrick        void
128746035553Spatrick    >::type
128846035553Spatrick    _LIBCPP_INLINE_VISIBILITY
128946035553Spatrick    operator|=(const _Expr& __v) const;
129046035553Spatrick
129146035553Spatrick    template <class _Expr>
129246035553Spatrick    typename enable_if
129346035553Spatrick    <
129446035553Spatrick        __is_val_expr<_Expr>::value,
129546035553Spatrick        void
129646035553Spatrick    >::type
129746035553Spatrick    _LIBCPP_INLINE_VISIBILITY
129846035553Spatrick    operator<<=(const _Expr& __v) const;
129946035553Spatrick
130046035553Spatrick    template <class _Expr>
130146035553Spatrick    typename enable_if
130246035553Spatrick    <
130346035553Spatrick        __is_val_expr<_Expr>::value,
130446035553Spatrick        void
130546035553Spatrick    >::type
130646035553Spatrick    _LIBCPP_INLINE_VISIBILITY
130746035553Spatrick    operator>>=(const _Expr& __v) const;
130846035553Spatrick
130946035553Spatrick    slice_array(slice_array const&) = default;
131046035553Spatrick
131146035553Spatrick    _LIBCPP_INLINE_VISIBILITY
131246035553Spatrick    const slice_array& operator=(const slice_array& __sa) const;
131346035553Spatrick
131446035553Spatrick    _LIBCPP_INLINE_VISIBILITY
131546035553Spatrick    void operator=(const value_type& __x) const;
131646035553Spatrick
131776d0caaeSpatrick    _LIBCPP_INLINE_VISIBILITY
131876d0caaeSpatrick    void operator=(const valarray<value_type>& __va) const;
131976d0caaeSpatrick
132046035553Spatrickprivate:
132146035553Spatrick    _LIBCPP_INLINE_VISIBILITY
132246035553Spatrick    slice_array(const slice& __sl, const valarray<value_type>& __v)
132346035553Spatrick        : __vp_(const_cast<value_type*>(__v.__begin_ + __sl.start())),
132446035553Spatrick          __size_(__sl.size()),
132546035553Spatrick          __stride_(__sl.stride())
132646035553Spatrick        {}
132746035553Spatrick
132846035553Spatrick    template <class> friend class valarray;
132946035553Spatrick    template <class> friend class sliceExpr;
133046035553Spatrick};
133146035553Spatrick
133246035553Spatricktemplate <class _Tp>
133346035553Spatrickinline
133446035553Spatrickconst slice_array<_Tp>&
133546035553Spatrickslice_array<_Tp>::operator=(const slice_array& __sa) const
133646035553Spatrick{
133746035553Spatrick    value_type* __t = __vp_;
133846035553Spatrick    const value_type* __s = __sa.__vp_;
133946035553Spatrick    for (size_t __n = __size_; __n; --__n, __t += __stride_, __s += __sa.__stride_)
134046035553Spatrick        *__t = *__s;
134146035553Spatrick    return *this;
134246035553Spatrick}
134346035553Spatrick
134446035553Spatricktemplate <class _Tp>
134546035553Spatricktemplate <class _Expr>
134646035553Spatrickinline
134746035553Spatricktypename enable_if
134846035553Spatrick<
134946035553Spatrick    __is_val_expr<_Expr>::value,
135046035553Spatrick    void
135146035553Spatrick>::type
135246035553Spatrickslice_array<_Tp>::operator=(const _Expr& __v) const
135346035553Spatrick{
135446035553Spatrick    value_type* __t = __vp_;
135546035553Spatrick    for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
135646035553Spatrick        *__t = __v[__i];
135746035553Spatrick}
135846035553Spatrick
135946035553Spatricktemplate <class _Tp>
136076d0caaeSpatrickinline void
136176d0caaeSpatrickslice_array<_Tp>::operator=(const valarray<value_type>& __va) const
136276d0caaeSpatrick{
136376d0caaeSpatrick    value_type* __t = __vp_;
136476d0caaeSpatrick    for (size_t __i = 0; __i < __va.size(); ++__i, __t += __stride_)
136576d0caaeSpatrick        *__t = __va[__i];
136676d0caaeSpatrick}
136776d0caaeSpatrick
136876d0caaeSpatricktemplate <class _Tp>
136946035553Spatricktemplate <class _Expr>
137046035553Spatrickinline
137146035553Spatricktypename enable_if
137246035553Spatrick<
137346035553Spatrick    __is_val_expr<_Expr>::value,
137446035553Spatrick    void
137546035553Spatrick>::type
137646035553Spatrickslice_array<_Tp>::operator*=(const _Expr& __v) const
137746035553Spatrick{
137846035553Spatrick    value_type* __t = __vp_;
137946035553Spatrick    for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
138046035553Spatrick        *__t *= __v[__i];
138146035553Spatrick}
138246035553Spatrick
138346035553Spatricktemplate <class _Tp>
138446035553Spatricktemplate <class _Expr>
138546035553Spatrickinline
138646035553Spatricktypename enable_if
138746035553Spatrick<
138846035553Spatrick    __is_val_expr<_Expr>::value,
138946035553Spatrick    void
139046035553Spatrick>::type
139146035553Spatrickslice_array<_Tp>::operator/=(const _Expr& __v) const
139246035553Spatrick{
139346035553Spatrick    value_type* __t = __vp_;
139446035553Spatrick    for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
139546035553Spatrick        *__t /= __v[__i];
139646035553Spatrick}
139746035553Spatrick
139846035553Spatricktemplate <class _Tp>
139946035553Spatricktemplate <class _Expr>
140046035553Spatrickinline
140146035553Spatricktypename enable_if
140246035553Spatrick<
140346035553Spatrick    __is_val_expr<_Expr>::value,
140446035553Spatrick    void
140546035553Spatrick>::type
140646035553Spatrickslice_array<_Tp>::operator%=(const _Expr& __v) const
140746035553Spatrick{
140846035553Spatrick    value_type* __t = __vp_;
140946035553Spatrick    for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
141046035553Spatrick        *__t %= __v[__i];
141146035553Spatrick}
141246035553Spatrick
141346035553Spatricktemplate <class _Tp>
141446035553Spatricktemplate <class _Expr>
141546035553Spatrickinline
141646035553Spatricktypename enable_if
141746035553Spatrick<
141846035553Spatrick    __is_val_expr<_Expr>::value,
141946035553Spatrick    void
142046035553Spatrick>::type
142146035553Spatrickslice_array<_Tp>::operator+=(const _Expr& __v) const
142246035553Spatrick{
142346035553Spatrick    value_type* __t = __vp_;
142446035553Spatrick    for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
142546035553Spatrick        *__t += __v[__i];
142646035553Spatrick}
142746035553Spatrick
142846035553Spatricktemplate <class _Tp>
142946035553Spatricktemplate <class _Expr>
143046035553Spatrickinline
143146035553Spatricktypename enable_if
143246035553Spatrick<
143346035553Spatrick    __is_val_expr<_Expr>::value,
143446035553Spatrick    void
143546035553Spatrick>::type
143646035553Spatrickslice_array<_Tp>::operator-=(const _Expr& __v) const
143746035553Spatrick{
143846035553Spatrick    value_type* __t = __vp_;
143946035553Spatrick    for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
144046035553Spatrick        *__t -= __v[__i];
144146035553Spatrick}
144246035553Spatrick
144346035553Spatricktemplate <class _Tp>
144446035553Spatricktemplate <class _Expr>
144546035553Spatrickinline
144646035553Spatricktypename enable_if
144746035553Spatrick<
144846035553Spatrick    __is_val_expr<_Expr>::value,
144946035553Spatrick    void
145046035553Spatrick>::type
145146035553Spatrickslice_array<_Tp>::operator^=(const _Expr& __v) const
145246035553Spatrick{
145346035553Spatrick    value_type* __t = __vp_;
145446035553Spatrick    for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
145546035553Spatrick        *__t ^= __v[__i];
145646035553Spatrick}
145746035553Spatrick
145846035553Spatricktemplate <class _Tp>
145946035553Spatricktemplate <class _Expr>
146046035553Spatrickinline
146146035553Spatricktypename enable_if
146246035553Spatrick<
146346035553Spatrick    __is_val_expr<_Expr>::value,
146446035553Spatrick    void
146546035553Spatrick>::type
146646035553Spatrickslice_array<_Tp>::operator&=(const _Expr& __v) const
146746035553Spatrick{
146846035553Spatrick    value_type* __t = __vp_;
146946035553Spatrick    for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
147046035553Spatrick        *__t &= __v[__i];
147146035553Spatrick}
147246035553Spatrick
147346035553Spatricktemplate <class _Tp>
147446035553Spatricktemplate <class _Expr>
147546035553Spatrickinline
147646035553Spatricktypename enable_if
147746035553Spatrick<
147846035553Spatrick    __is_val_expr<_Expr>::value,
147946035553Spatrick    void
148046035553Spatrick>::type
148146035553Spatrickslice_array<_Tp>::operator|=(const _Expr& __v) const
148246035553Spatrick{
148346035553Spatrick    value_type* __t = __vp_;
148446035553Spatrick    for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
148546035553Spatrick        *__t |= __v[__i];
148646035553Spatrick}
148746035553Spatrick
148846035553Spatricktemplate <class _Tp>
148946035553Spatricktemplate <class _Expr>
149046035553Spatrickinline
149146035553Spatricktypename enable_if
149246035553Spatrick<
149346035553Spatrick    __is_val_expr<_Expr>::value,
149446035553Spatrick    void
149546035553Spatrick>::type
149646035553Spatrickslice_array<_Tp>::operator<<=(const _Expr& __v) const
149746035553Spatrick{
149846035553Spatrick    value_type* __t = __vp_;
149946035553Spatrick    for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
150046035553Spatrick        *__t <<= __v[__i];
150146035553Spatrick}
150246035553Spatrick
150346035553Spatricktemplate <class _Tp>
150446035553Spatricktemplate <class _Expr>
150546035553Spatrickinline
150646035553Spatricktypename enable_if
150746035553Spatrick<
150846035553Spatrick    __is_val_expr<_Expr>::value,
150946035553Spatrick    void
151046035553Spatrick>::type
151146035553Spatrickslice_array<_Tp>::operator>>=(const _Expr& __v) const
151246035553Spatrick{
151346035553Spatrick    value_type* __t = __vp_;
151446035553Spatrick    for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
151546035553Spatrick        *__t >>= __v[__i];
151646035553Spatrick}
151746035553Spatrick
151846035553Spatricktemplate <class _Tp>
151946035553Spatrickinline
152046035553Spatrickvoid
152146035553Spatrickslice_array<_Tp>::operator=(const value_type& __x) const
152246035553Spatrick{
152346035553Spatrick    value_type* __t = __vp_;
152446035553Spatrick    for (size_t __n = __size_; __n; --__n, __t += __stride_)
152546035553Spatrick        *__t = __x;
152646035553Spatrick}
152746035553Spatrick
152846035553Spatrick// gslice
152946035553Spatrick
153046035553Spatrickclass _LIBCPP_TYPE_VIS gslice
153146035553Spatrick{
153246035553Spatrick    valarray<size_t> __size_;
153346035553Spatrick    valarray<size_t> __stride_;
153446035553Spatrick    valarray<size_t> __1d_;
153546035553Spatrick
153646035553Spatrickpublic:
153746035553Spatrick    _LIBCPP_INLINE_VISIBILITY
153846035553Spatrick    gslice() {}
153946035553Spatrick
154046035553Spatrick    _LIBCPP_INLINE_VISIBILITY
154146035553Spatrick    gslice(size_t __start, const valarray<size_t>& __size,
154246035553Spatrick                           const valarray<size_t>& __stride)
154346035553Spatrick        : __size_(__size),
154446035553Spatrick          __stride_(__stride)
154546035553Spatrick        {__init(__start);}
154646035553Spatrick
154746035553Spatrick#ifndef _LIBCPP_CXX03_LANG
154846035553Spatrick
154946035553Spatrick    _LIBCPP_INLINE_VISIBILITY
155046035553Spatrick    gslice(size_t __start, const valarray<size_t>&  __size,
155146035553Spatrick                                 valarray<size_t>&& __stride)
155246035553Spatrick        : __size_(__size),
1553*4bdff4beSrobert          __stride_(std::move(__stride))
155446035553Spatrick        {__init(__start);}
155546035553Spatrick
155646035553Spatrick    _LIBCPP_INLINE_VISIBILITY
155746035553Spatrick    gslice(size_t __start,       valarray<size_t>&& __size,
155846035553Spatrick                           const valarray<size_t>&  __stride)
1559*4bdff4beSrobert        : __size_(std::move(__size)),
156046035553Spatrick          __stride_(__stride)
156146035553Spatrick        {__init(__start);}
156246035553Spatrick
156346035553Spatrick    _LIBCPP_INLINE_VISIBILITY
156446035553Spatrick    gslice(size_t __start,       valarray<size_t>&& __size,
156546035553Spatrick                                 valarray<size_t>&& __stride)
1566*4bdff4beSrobert        : __size_(std::move(__size)),
1567*4bdff4beSrobert          __stride_(std::move(__stride))
156846035553Spatrick        {__init(__start);}
156946035553Spatrick
157046035553Spatrick#endif // _LIBCPP_CXX03_LANG
157146035553Spatrick
157246035553Spatrick    _LIBCPP_INLINE_VISIBILITY
157346035553Spatrick    size_t           start()  const {return __1d_.size() ? __1d_[0] : 0;}
157446035553Spatrick
157546035553Spatrick    _LIBCPP_INLINE_VISIBILITY
157646035553Spatrick    valarray<size_t> size()   const {return __size_;}
157746035553Spatrick
157846035553Spatrick    _LIBCPP_INLINE_VISIBILITY
157946035553Spatrick    valarray<size_t> stride() const {return __stride_;}
158046035553Spatrick
158146035553Spatrickprivate:
158246035553Spatrick    void __init(size_t __start);
158346035553Spatrick
158446035553Spatrick    template <class> friend class gslice_array;
158546035553Spatrick    template <class> friend class valarray;
158646035553Spatrick    template <class> friend class __val_expr;
158746035553Spatrick};
158846035553Spatrick
158946035553Spatrick// gslice_array
159046035553Spatrick
159146035553Spatricktemplate <class _Tp>
159246035553Spatrickclass _LIBCPP_TEMPLATE_VIS gslice_array
159346035553Spatrick{
159446035553Spatrickpublic:
159546035553Spatrick    typedef _Tp value_type;
159646035553Spatrick
159746035553Spatrickprivate:
159846035553Spatrick    value_type*      __vp_;
159946035553Spatrick    valarray<size_t> __1d_;
160046035553Spatrick
160146035553Spatrickpublic:
160246035553Spatrick    template <class _Expr>
160346035553Spatrick    typename enable_if
160446035553Spatrick    <
160546035553Spatrick        __is_val_expr<_Expr>::value,
160646035553Spatrick        void
160746035553Spatrick    >::type
160846035553Spatrick    _LIBCPP_INLINE_VISIBILITY
160946035553Spatrick    operator=(const _Expr& __v) const;
161046035553Spatrick
161146035553Spatrick    template <class _Expr>
161246035553Spatrick    typename enable_if
161346035553Spatrick    <
161446035553Spatrick        __is_val_expr<_Expr>::value,
161546035553Spatrick        void
161646035553Spatrick    >::type
161746035553Spatrick    _LIBCPP_INLINE_VISIBILITY
161846035553Spatrick    operator*=(const _Expr& __v) const;
161946035553Spatrick
162046035553Spatrick    template <class _Expr>
162146035553Spatrick    typename enable_if
162246035553Spatrick    <
162346035553Spatrick        __is_val_expr<_Expr>::value,
162446035553Spatrick        void
162546035553Spatrick    >::type
162646035553Spatrick    _LIBCPP_INLINE_VISIBILITY
162746035553Spatrick    operator/=(const _Expr& __v) const;
162846035553Spatrick
162946035553Spatrick    template <class _Expr>
163046035553Spatrick    typename enable_if
163146035553Spatrick    <
163246035553Spatrick        __is_val_expr<_Expr>::value,
163346035553Spatrick        void
163446035553Spatrick    >::type
163546035553Spatrick    _LIBCPP_INLINE_VISIBILITY
163646035553Spatrick    operator%=(const _Expr& __v) const;
163746035553Spatrick
163846035553Spatrick    template <class _Expr>
163946035553Spatrick    typename enable_if
164046035553Spatrick    <
164146035553Spatrick        __is_val_expr<_Expr>::value,
164246035553Spatrick        void
164346035553Spatrick    >::type
164446035553Spatrick    _LIBCPP_INLINE_VISIBILITY
164546035553Spatrick    operator+=(const _Expr& __v) const;
164646035553Spatrick
164746035553Spatrick    template <class _Expr>
164846035553Spatrick    typename enable_if
164946035553Spatrick    <
165046035553Spatrick        __is_val_expr<_Expr>::value,
165146035553Spatrick        void
165246035553Spatrick    >::type
165346035553Spatrick    _LIBCPP_INLINE_VISIBILITY
165446035553Spatrick    operator-=(const _Expr& __v) const;
165546035553Spatrick
165646035553Spatrick    template <class _Expr>
165746035553Spatrick    typename enable_if
165846035553Spatrick    <
165946035553Spatrick        __is_val_expr<_Expr>::value,
166046035553Spatrick        void
166146035553Spatrick    >::type
166246035553Spatrick    _LIBCPP_INLINE_VISIBILITY
166346035553Spatrick    operator^=(const _Expr& __v) const;
166446035553Spatrick
166546035553Spatrick    template <class _Expr>
166646035553Spatrick    typename enable_if
166746035553Spatrick    <
166846035553Spatrick        __is_val_expr<_Expr>::value,
166946035553Spatrick        void
167046035553Spatrick    >::type
167146035553Spatrick    _LIBCPP_INLINE_VISIBILITY
167246035553Spatrick    operator&=(const _Expr& __v) const;
167346035553Spatrick
167446035553Spatrick    template <class _Expr>
167546035553Spatrick    typename enable_if
167646035553Spatrick    <
167746035553Spatrick        __is_val_expr<_Expr>::value,
167846035553Spatrick        void
167946035553Spatrick    >::type
168046035553Spatrick    _LIBCPP_INLINE_VISIBILITY
168146035553Spatrick    operator|=(const _Expr& __v) const;
168246035553Spatrick
168346035553Spatrick    template <class _Expr>
168446035553Spatrick    typename enable_if
168546035553Spatrick    <
168646035553Spatrick        __is_val_expr<_Expr>::value,
168746035553Spatrick        void
168846035553Spatrick    >::type
168946035553Spatrick    _LIBCPP_INLINE_VISIBILITY
169046035553Spatrick    operator<<=(const _Expr& __v) const;
169146035553Spatrick
169246035553Spatrick    template <class _Expr>
169346035553Spatrick    typename enable_if
169446035553Spatrick    <
169546035553Spatrick        __is_val_expr<_Expr>::value,
169646035553Spatrick        void
169746035553Spatrick    >::type
169846035553Spatrick    _LIBCPP_INLINE_VISIBILITY
169946035553Spatrick    operator>>=(const _Expr& __v) const;
170046035553Spatrick
170146035553Spatrick    _LIBCPP_INLINE_VISIBILITY
170246035553Spatrick    const gslice_array& operator=(const gslice_array& __ga) const;
170346035553Spatrick
170446035553Spatrick    _LIBCPP_INLINE_VISIBILITY
170546035553Spatrick    void operator=(const value_type& __x) const;
170646035553Spatrick
170746035553Spatrick    gslice_array(const gslice_array&)            = default;
170846035553Spatrick
170946035553Spatrickprivate:
171046035553Spatrick    gslice_array(const gslice& __gs, const valarray<value_type>& __v)
171146035553Spatrick        : __vp_(const_cast<value_type*>(__v.__begin_)),
171246035553Spatrick          __1d_(__gs.__1d_)
171346035553Spatrick        {}
171446035553Spatrick
171546035553Spatrick#ifndef _LIBCPP_CXX03_LANG
171646035553Spatrick    gslice_array(gslice&& __gs, const valarray<value_type>& __v)
171746035553Spatrick        : __vp_(const_cast<value_type*>(__v.__begin_)),
1718*4bdff4beSrobert          __1d_(std::move(__gs.__1d_))
171946035553Spatrick        {}
172046035553Spatrick#endif // _LIBCPP_CXX03_LANG
172146035553Spatrick
172246035553Spatrick    template <class> friend class valarray;
172346035553Spatrick};
172446035553Spatrick
172546035553Spatricktemplate <class _Tp>
172646035553Spatricktemplate <class _Expr>
172746035553Spatrickinline
172846035553Spatricktypename enable_if
172946035553Spatrick<
173046035553Spatrick    __is_val_expr<_Expr>::value,
173146035553Spatrick    void
173246035553Spatrick>::type
173346035553Spatrickgslice_array<_Tp>::operator=(const _Expr& __v) const
173446035553Spatrick{
173546035553Spatrick    typedef const size_t* _Ip;
173646035553Spatrick    size_t __j = 0;
173746035553Spatrick    for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
173846035553Spatrick        __vp_[*__i] = __v[__j];
173946035553Spatrick}
174046035553Spatrick
174146035553Spatricktemplate <class _Tp>
174246035553Spatricktemplate <class _Expr>
174346035553Spatrickinline
174446035553Spatricktypename enable_if
174546035553Spatrick<
174646035553Spatrick    __is_val_expr<_Expr>::value,
174746035553Spatrick    void
174846035553Spatrick>::type
174946035553Spatrickgslice_array<_Tp>::operator*=(const _Expr& __v) const
175046035553Spatrick{
175146035553Spatrick    typedef const size_t* _Ip;
175246035553Spatrick    size_t __j = 0;
175346035553Spatrick    for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
175446035553Spatrick        __vp_[*__i] *= __v[__j];
175546035553Spatrick}
175646035553Spatrick
175746035553Spatricktemplate <class _Tp>
175846035553Spatricktemplate <class _Expr>
175946035553Spatrickinline
176046035553Spatricktypename enable_if
176146035553Spatrick<
176246035553Spatrick    __is_val_expr<_Expr>::value,
176346035553Spatrick    void
176446035553Spatrick>::type
176546035553Spatrickgslice_array<_Tp>::operator/=(const _Expr& __v) const
176646035553Spatrick{
176746035553Spatrick    typedef const size_t* _Ip;
176846035553Spatrick    size_t __j = 0;
176946035553Spatrick    for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
177046035553Spatrick        __vp_[*__i] /= __v[__j];
177146035553Spatrick}
177246035553Spatrick
177346035553Spatricktemplate <class _Tp>
177446035553Spatricktemplate <class _Expr>
177546035553Spatrickinline
177646035553Spatricktypename enable_if
177746035553Spatrick<
177846035553Spatrick    __is_val_expr<_Expr>::value,
177946035553Spatrick    void
178046035553Spatrick>::type
178146035553Spatrickgslice_array<_Tp>::operator%=(const _Expr& __v) const
178246035553Spatrick{
178346035553Spatrick    typedef const size_t* _Ip;
178446035553Spatrick    size_t __j = 0;
178546035553Spatrick    for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
178646035553Spatrick        __vp_[*__i] %= __v[__j];
178746035553Spatrick}
178846035553Spatrick
178946035553Spatricktemplate <class _Tp>
179046035553Spatricktemplate <class _Expr>
179146035553Spatrickinline
179246035553Spatricktypename enable_if
179346035553Spatrick<
179446035553Spatrick    __is_val_expr<_Expr>::value,
179546035553Spatrick    void
179646035553Spatrick>::type
179746035553Spatrickgslice_array<_Tp>::operator+=(const _Expr& __v) const
179846035553Spatrick{
179946035553Spatrick    typedef const size_t* _Ip;
180046035553Spatrick    size_t __j = 0;
180146035553Spatrick    for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
180246035553Spatrick        __vp_[*__i] += __v[__j];
180346035553Spatrick}
180446035553Spatrick
180546035553Spatricktemplate <class _Tp>
180646035553Spatricktemplate <class _Expr>
180746035553Spatrickinline
180846035553Spatricktypename enable_if
180946035553Spatrick<
181046035553Spatrick    __is_val_expr<_Expr>::value,
181146035553Spatrick    void
181246035553Spatrick>::type
181346035553Spatrickgslice_array<_Tp>::operator-=(const _Expr& __v) const
181446035553Spatrick{
181546035553Spatrick    typedef const size_t* _Ip;
181646035553Spatrick    size_t __j = 0;
181746035553Spatrick    for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
181846035553Spatrick        __vp_[*__i] -= __v[__j];
181946035553Spatrick}
182046035553Spatrick
182146035553Spatricktemplate <class _Tp>
182246035553Spatricktemplate <class _Expr>
182346035553Spatrickinline
182446035553Spatricktypename enable_if
182546035553Spatrick<
182646035553Spatrick    __is_val_expr<_Expr>::value,
182746035553Spatrick    void
182846035553Spatrick>::type
182946035553Spatrickgslice_array<_Tp>::operator^=(const _Expr& __v) const
183046035553Spatrick{
183146035553Spatrick    typedef const size_t* _Ip;
183246035553Spatrick    size_t __j = 0;
183346035553Spatrick    for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
183446035553Spatrick        __vp_[*__i] ^= __v[__j];
183546035553Spatrick}
183646035553Spatrick
183746035553Spatricktemplate <class _Tp>
183846035553Spatricktemplate <class _Expr>
183946035553Spatrickinline
184046035553Spatricktypename enable_if
184146035553Spatrick<
184246035553Spatrick    __is_val_expr<_Expr>::value,
184346035553Spatrick    void
184446035553Spatrick>::type
184546035553Spatrickgslice_array<_Tp>::operator&=(const _Expr& __v) const
184646035553Spatrick{
184746035553Spatrick    typedef const size_t* _Ip;
184846035553Spatrick    size_t __j = 0;
184946035553Spatrick    for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
185046035553Spatrick        __vp_[*__i] &= __v[__j];
185146035553Spatrick}
185246035553Spatrick
185346035553Spatricktemplate <class _Tp>
185446035553Spatricktemplate <class _Expr>
185546035553Spatrickinline
185646035553Spatricktypename enable_if
185746035553Spatrick<
185846035553Spatrick    __is_val_expr<_Expr>::value,
185946035553Spatrick    void
186046035553Spatrick>::type
186146035553Spatrickgslice_array<_Tp>::operator|=(const _Expr& __v) const
186246035553Spatrick{
186346035553Spatrick    typedef const size_t* _Ip;
186446035553Spatrick    size_t __j = 0;
186546035553Spatrick    for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
186646035553Spatrick        __vp_[*__i] |= __v[__j];
186746035553Spatrick}
186846035553Spatrick
186946035553Spatricktemplate <class _Tp>
187046035553Spatricktemplate <class _Expr>
187146035553Spatrickinline
187246035553Spatricktypename enable_if
187346035553Spatrick<
187446035553Spatrick    __is_val_expr<_Expr>::value,
187546035553Spatrick    void
187646035553Spatrick>::type
187746035553Spatrickgslice_array<_Tp>::operator<<=(const _Expr& __v) const
187846035553Spatrick{
187946035553Spatrick    typedef const size_t* _Ip;
188046035553Spatrick    size_t __j = 0;
188146035553Spatrick    for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
188246035553Spatrick        __vp_[*__i] <<= __v[__j];
188346035553Spatrick}
188446035553Spatrick
188546035553Spatricktemplate <class _Tp>
188646035553Spatricktemplate <class _Expr>
188746035553Spatrickinline
188846035553Spatricktypename enable_if
188946035553Spatrick<
189046035553Spatrick    __is_val_expr<_Expr>::value,
189146035553Spatrick    void
189246035553Spatrick>::type
189346035553Spatrickgslice_array<_Tp>::operator>>=(const _Expr& __v) const
189446035553Spatrick{
189546035553Spatrick    typedef const size_t* _Ip;
189646035553Spatrick    size_t __j = 0;
189746035553Spatrick    for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
189846035553Spatrick        __vp_[*__i] >>= __v[__j];
189946035553Spatrick}
190046035553Spatrick
190146035553Spatricktemplate <class _Tp>
190246035553Spatrickinline
190346035553Spatrickconst gslice_array<_Tp>&
190446035553Spatrickgslice_array<_Tp>::operator=(const gslice_array& __ga) const
190546035553Spatrick{
190646035553Spatrick    typedef const size_t* _Ip;
190746035553Spatrick    const value_type* __s = __ga.__vp_;
190846035553Spatrick    for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_, __j = __ga.__1d_.__begin_;
190946035553Spatrick            __i != __e; ++__i, ++__j)
191046035553Spatrick        __vp_[*__i] = __s[*__j];
191146035553Spatrick    return *this;
191246035553Spatrick}
191346035553Spatrick
191446035553Spatricktemplate <class _Tp>
191546035553Spatrickinline
191646035553Spatrickvoid
191746035553Spatrickgslice_array<_Tp>::operator=(const value_type& __x) const
191846035553Spatrick{
191946035553Spatrick    typedef const size_t* _Ip;
192046035553Spatrick    for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i)
192146035553Spatrick        __vp_[*__i] = __x;
192246035553Spatrick}
192346035553Spatrick
192446035553Spatrick// mask_array
192546035553Spatrick
192646035553Spatricktemplate <class _Tp>
192746035553Spatrickclass _LIBCPP_TEMPLATE_VIS mask_array
192846035553Spatrick{
192946035553Spatrickpublic:
193046035553Spatrick    typedef _Tp value_type;
193146035553Spatrick
193246035553Spatrickprivate:
193346035553Spatrick    value_type*      __vp_;
193446035553Spatrick    valarray<size_t> __1d_;
193546035553Spatrick
193646035553Spatrickpublic:
193746035553Spatrick    template <class _Expr>
193846035553Spatrick    typename enable_if
193946035553Spatrick    <
194046035553Spatrick        __is_val_expr<_Expr>::value,
194146035553Spatrick        void
194246035553Spatrick    >::type
194346035553Spatrick    _LIBCPP_INLINE_VISIBILITY
194446035553Spatrick    operator=(const _Expr& __v) const;
194546035553Spatrick
194646035553Spatrick    template <class _Expr>
194746035553Spatrick    typename enable_if
194846035553Spatrick    <
194946035553Spatrick        __is_val_expr<_Expr>::value,
195046035553Spatrick        void
195146035553Spatrick    >::type
195246035553Spatrick    _LIBCPP_INLINE_VISIBILITY
195346035553Spatrick    operator*=(const _Expr& __v) const;
195446035553Spatrick
195546035553Spatrick    template <class _Expr>
195646035553Spatrick    typename enable_if
195746035553Spatrick    <
195846035553Spatrick        __is_val_expr<_Expr>::value,
195946035553Spatrick        void
196046035553Spatrick    >::type
196146035553Spatrick    _LIBCPP_INLINE_VISIBILITY
196246035553Spatrick    operator/=(const _Expr& __v) const;
196346035553Spatrick
196446035553Spatrick    template <class _Expr>
196546035553Spatrick    typename enable_if
196646035553Spatrick    <
196746035553Spatrick        __is_val_expr<_Expr>::value,
196846035553Spatrick        void
196946035553Spatrick    >::type
197046035553Spatrick    _LIBCPP_INLINE_VISIBILITY
197146035553Spatrick    operator%=(const _Expr& __v) const;
197246035553Spatrick
197346035553Spatrick    template <class _Expr>
197446035553Spatrick    typename enable_if
197546035553Spatrick    <
197646035553Spatrick        __is_val_expr<_Expr>::value,
197746035553Spatrick        void
197846035553Spatrick    >::type
197946035553Spatrick    _LIBCPP_INLINE_VISIBILITY
198046035553Spatrick    operator+=(const _Expr& __v) const;
198146035553Spatrick
198246035553Spatrick    template <class _Expr>
198346035553Spatrick    typename enable_if
198446035553Spatrick    <
198546035553Spatrick        __is_val_expr<_Expr>::value,
198646035553Spatrick        void
198746035553Spatrick    >::type
198846035553Spatrick    _LIBCPP_INLINE_VISIBILITY
198946035553Spatrick    operator-=(const _Expr& __v) const;
199046035553Spatrick
199146035553Spatrick    template <class _Expr>
199246035553Spatrick    typename enable_if
199346035553Spatrick    <
199446035553Spatrick        __is_val_expr<_Expr>::value,
199546035553Spatrick        void
199646035553Spatrick    >::type
199746035553Spatrick    _LIBCPP_INLINE_VISIBILITY
199846035553Spatrick    operator^=(const _Expr& __v) const;
199946035553Spatrick
200046035553Spatrick    template <class _Expr>
200146035553Spatrick    typename enable_if
200246035553Spatrick    <
200346035553Spatrick        __is_val_expr<_Expr>::value,
200446035553Spatrick        void
200546035553Spatrick    >::type
200646035553Spatrick    _LIBCPP_INLINE_VISIBILITY
200746035553Spatrick    operator&=(const _Expr& __v) const;
200846035553Spatrick
200946035553Spatrick    template <class _Expr>
201046035553Spatrick    typename enable_if
201146035553Spatrick    <
201246035553Spatrick        __is_val_expr<_Expr>::value,
201346035553Spatrick        void
201446035553Spatrick    >::type
201546035553Spatrick    _LIBCPP_INLINE_VISIBILITY
201646035553Spatrick    operator|=(const _Expr& __v) const;
201746035553Spatrick
201846035553Spatrick    template <class _Expr>
201946035553Spatrick    typename enable_if
202046035553Spatrick    <
202146035553Spatrick        __is_val_expr<_Expr>::value,
202246035553Spatrick        void
202346035553Spatrick    >::type
202446035553Spatrick    _LIBCPP_INLINE_VISIBILITY
202546035553Spatrick    operator<<=(const _Expr& __v) const;
202646035553Spatrick
202746035553Spatrick    template <class _Expr>
202846035553Spatrick    typename enable_if
202946035553Spatrick    <
203046035553Spatrick        __is_val_expr<_Expr>::value,
203146035553Spatrick        void
203246035553Spatrick    >::type
203346035553Spatrick    _LIBCPP_INLINE_VISIBILITY
203446035553Spatrick    operator>>=(const _Expr& __v) const;
203546035553Spatrick
203646035553Spatrick    mask_array(const mask_array&) = default;
203746035553Spatrick
203846035553Spatrick    _LIBCPP_INLINE_VISIBILITY
203946035553Spatrick    const mask_array& operator=(const mask_array& __ma) const;
204046035553Spatrick
204146035553Spatrick    _LIBCPP_INLINE_VISIBILITY
204246035553Spatrick    void operator=(const value_type& __x) const;
204346035553Spatrick
204446035553Spatrickprivate:
204546035553Spatrick    _LIBCPP_INLINE_VISIBILITY
204646035553Spatrick    mask_array(const valarray<bool>& __vb, const valarray<value_type>& __v)
204746035553Spatrick        : __vp_(const_cast<value_type*>(__v.__begin_)),
204846035553Spatrick          __1d_(static_cast<size_t>(count(__vb.__begin_, __vb.__end_, true)))
204946035553Spatrick          {
205046035553Spatrick              size_t __j = 0;
205146035553Spatrick              for (size_t __i = 0; __i < __vb.size(); ++__i)
205246035553Spatrick                  if (__vb[__i])
205346035553Spatrick                      __1d_[__j++] = __i;
205446035553Spatrick          }
205546035553Spatrick
205646035553Spatrick    template <class> friend class valarray;
205746035553Spatrick};
205846035553Spatrick
205946035553Spatricktemplate <class _Tp>
206046035553Spatricktemplate <class _Expr>
206146035553Spatrickinline
206246035553Spatricktypename enable_if
206346035553Spatrick<
206446035553Spatrick    __is_val_expr<_Expr>::value,
206546035553Spatrick    void
206646035553Spatrick>::type
206746035553Spatrickmask_array<_Tp>::operator=(const _Expr& __v) const
206846035553Spatrick{
206946035553Spatrick    size_t __n = __1d_.size();
207046035553Spatrick    for (size_t __i = 0; __i < __n; ++__i)
207146035553Spatrick        __vp_[__1d_[__i]] = __v[__i];
207246035553Spatrick}
207346035553Spatrick
207446035553Spatricktemplate <class _Tp>
207546035553Spatricktemplate <class _Expr>
207646035553Spatrickinline
207746035553Spatricktypename enable_if
207846035553Spatrick<
207946035553Spatrick    __is_val_expr<_Expr>::value,
208046035553Spatrick    void
208146035553Spatrick>::type
208246035553Spatrickmask_array<_Tp>::operator*=(const _Expr& __v) const
208346035553Spatrick{
208446035553Spatrick    size_t __n = __1d_.size();
208546035553Spatrick    for (size_t __i = 0; __i < __n; ++__i)
208646035553Spatrick        __vp_[__1d_[__i]] *= __v[__i];
208746035553Spatrick}
208846035553Spatrick
208946035553Spatricktemplate <class _Tp>
209046035553Spatricktemplate <class _Expr>
209146035553Spatrickinline
209246035553Spatricktypename enable_if
209346035553Spatrick<
209446035553Spatrick    __is_val_expr<_Expr>::value,
209546035553Spatrick    void
209646035553Spatrick>::type
209746035553Spatrickmask_array<_Tp>::operator/=(const _Expr& __v) const
209846035553Spatrick{
209946035553Spatrick    size_t __n = __1d_.size();
210046035553Spatrick    for (size_t __i = 0; __i < __n; ++__i)
210146035553Spatrick        __vp_[__1d_[__i]] /= __v[__i];
210246035553Spatrick}
210346035553Spatrick
210446035553Spatricktemplate <class _Tp>
210546035553Spatricktemplate <class _Expr>
210646035553Spatrickinline
210746035553Spatricktypename enable_if
210846035553Spatrick<
210946035553Spatrick    __is_val_expr<_Expr>::value,
211046035553Spatrick    void
211146035553Spatrick>::type
211246035553Spatrickmask_array<_Tp>::operator%=(const _Expr& __v) const
211346035553Spatrick{
211446035553Spatrick    size_t __n = __1d_.size();
211546035553Spatrick    for (size_t __i = 0; __i < __n; ++__i)
211646035553Spatrick        __vp_[__1d_[__i]] %= __v[__i];
211746035553Spatrick}
211846035553Spatrick
211946035553Spatricktemplate <class _Tp>
212046035553Spatricktemplate <class _Expr>
212146035553Spatrickinline
212246035553Spatricktypename enable_if
212346035553Spatrick<
212446035553Spatrick    __is_val_expr<_Expr>::value,
212546035553Spatrick    void
212646035553Spatrick>::type
212746035553Spatrickmask_array<_Tp>::operator+=(const _Expr& __v) const
212846035553Spatrick{
212946035553Spatrick    size_t __n = __1d_.size();
213046035553Spatrick    for (size_t __i = 0; __i < __n; ++__i)
213146035553Spatrick        __vp_[__1d_[__i]] += __v[__i];
213246035553Spatrick}
213346035553Spatrick
213446035553Spatricktemplate <class _Tp>
213546035553Spatricktemplate <class _Expr>
213646035553Spatrickinline
213746035553Spatricktypename enable_if
213846035553Spatrick<
213946035553Spatrick    __is_val_expr<_Expr>::value,
214046035553Spatrick    void
214146035553Spatrick>::type
214246035553Spatrickmask_array<_Tp>::operator-=(const _Expr& __v) const
214346035553Spatrick{
214446035553Spatrick    size_t __n = __1d_.size();
214546035553Spatrick    for (size_t __i = 0; __i < __n; ++__i)
214646035553Spatrick        __vp_[__1d_[__i]] -= __v[__i];
214746035553Spatrick}
214846035553Spatrick
214946035553Spatricktemplate <class _Tp>
215046035553Spatricktemplate <class _Expr>
215146035553Spatrickinline
215246035553Spatricktypename enable_if
215346035553Spatrick<
215446035553Spatrick    __is_val_expr<_Expr>::value,
215546035553Spatrick    void
215646035553Spatrick>::type
215746035553Spatrickmask_array<_Tp>::operator^=(const _Expr& __v) const
215846035553Spatrick{
215946035553Spatrick    size_t __n = __1d_.size();
216046035553Spatrick    for (size_t __i = 0; __i < __n; ++__i)
216146035553Spatrick        __vp_[__1d_[__i]] ^= __v[__i];
216246035553Spatrick}
216346035553Spatrick
216446035553Spatricktemplate <class _Tp>
216546035553Spatricktemplate <class _Expr>
216646035553Spatrickinline
216746035553Spatricktypename enable_if
216846035553Spatrick<
216946035553Spatrick    __is_val_expr<_Expr>::value,
217046035553Spatrick    void
217146035553Spatrick>::type
217246035553Spatrickmask_array<_Tp>::operator&=(const _Expr& __v) const
217346035553Spatrick{
217446035553Spatrick    size_t __n = __1d_.size();
217546035553Spatrick    for (size_t __i = 0; __i < __n; ++__i)
217646035553Spatrick        __vp_[__1d_[__i]] &= __v[__i];
217746035553Spatrick}
217846035553Spatrick
217946035553Spatricktemplate <class _Tp>
218046035553Spatricktemplate <class _Expr>
218146035553Spatrickinline
218246035553Spatricktypename enable_if
218346035553Spatrick<
218446035553Spatrick    __is_val_expr<_Expr>::value,
218546035553Spatrick    void
218646035553Spatrick>::type
218746035553Spatrickmask_array<_Tp>::operator|=(const _Expr& __v) const
218846035553Spatrick{
218946035553Spatrick    size_t __n = __1d_.size();
219046035553Spatrick    for (size_t __i = 0; __i < __n; ++__i)
219146035553Spatrick        __vp_[__1d_[__i]] |= __v[__i];
219246035553Spatrick}
219346035553Spatrick
219446035553Spatricktemplate <class _Tp>
219546035553Spatricktemplate <class _Expr>
219646035553Spatrickinline
219746035553Spatricktypename enable_if
219846035553Spatrick<
219946035553Spatrick    __is_val_expr<_Expr>::value,
220046035553Spatrick    void
220146035553Spatrick>::type
220246035553Spatrickmask_array<_Tp>::operator<<=(const _Expr& __v) const
220346035553Spatrick{
220446035553Spatrick    size_t __n = __1d_.size();
220546035553Spatrick    for (size_t __i = 0; __i < __n; ++__i)
220646035553Spatrick        __vp_[__1d_[__i]] <<= __v[__i];
220746035553Spatrick}
220846035553Spatrick
220946035553Spatricktemplate <class _Tp>
221046035553Spatricktemplate <class _Expr>
221146035553Spatrickinline
221246035553Spatricktypename enable_if
221346035553Spatrick<
221446035553Spatrick    __is_val_expr<_Expr>::value,
221546035553Spatrick    void
221646035553Spatrick>::type
221746035553Spatrickmask_array<_Tp>::operator>>=(const _Expr& __v) const
221846035553Spatrick{
221946035553Spatrick    size_t __n = __1d_.size();
222046035553Spatrick    for (size_t __i = 0; __i < __n; ++__i)
222146035553Spatrick        __vp_[__1d_[__i]] >>= __v[__i];
222246035553Spatrick}
222346035553Spatrick
222446035553Spatricktemplate <class _Tp>
222546035553Spatrickinline
222646035553Spatrickconst mask_array<_Tp>&
222746035553Spatrickmask_array<_Tp>::operator=(const mask_array& __ma) const
222846035553Spatrick{
222946035553Spatrick    size_t __n = __1d_.size();
223046035553Spatrick    for (size_t __i = 0; __i < __n; ++__i)
223146035553Spatrick        __vp_[__1d_[__i]] = __ma.__vp_[__1d_[__i]];
223246035553Spatrick    return *this;
223346035553Spatrick}
223446035553Spatrick
223546035553Spatricktemplate <class _Tp>
223646035553Spatrickinline
223746035553Spatrickvoid
223846035553Spatrickmask_array<_Tp>::operator=(const value_type& __x) const
223946035553Spatrick{
224046035553Spatrick    size_t __n = __1d_.size();
224146035553Spatrick    for (size_t __i = 0; __i < __n; ++__i)
224246035553Spatrick        __vp_[__1d_[__i]] = __x;
224346035553Spatrick}
224446035553Spatrick
224546035553Spatricktemplate <class _ValExpr>
224646035553Spatrickclass __mask_expr
224746035553Spatrick{
2248*4bdff4beSrobert    typedef __libcpp_remove_reference_t<_ValExpr>  _RmExpr;
224946035553Spatrickpublic:
225046035553Spatrick    typedef typename _RmExpr::value_type value_type;
225176d0caaeSpatrick    typedef value_type __result_type;
225246035553Spatrick
225346035553Spatrickprivate:
225446035553Spatrick    _ValExpr __expr_;
225546035553Spatrick    valarray<size_t> __1d_;
225646035553Spatrick
225746035553Spatrick    _LIBCPP_INLINE_VISIBILITY
225846035553Spatrick    __mask_expr(const valarray<bool>& __vb, const _RmExpr& __e)
225946035553Spatrick        : __expr_(__e),
226046035553Spatrick          __1d_(static_cast<size_t>(count(__vb.__begin_, __vb.__end_, true)))
226146035553Spatrick          {
226246035553Spatrick              size_t __j = 0;
226346035553Spatrick              for (size_t __i = 0; __i < __vb.size(); ++__i)
226446035553Spatrick                  if (__vb[__i])
226546035553Spatrick                      __1d_[__j++] = __i;
226646035553Spatrick          }
226746035553Spatrick
226846035553Spatrickpublic:
226946035553Spatrick    _LIBCPP_INLINE_VISIBILITY
227076d0caaeSpatrick    __result_type operator[](size_t __i) const
227146035553Spatrick        {return __expr_[__1d_[__i]];}
227246035553Spatrick
227346035553Spatrick    _LIBCPP_INLINE_VISIBILITY
227446035553Spatrick    size_t size() const {return __1d_.size();}
227546035553Spatrick
227646035553Spatrick    template <class> friend class __val_expr;
227746035553Spatrick    template <class> friend class valarray;
227846035553Spatrick};
227946035553Spatrick
228046035553Spatrick// indirect_array
228146035553Spatrick
228246035553Spatricktemplate <class _Tp>
228346035553Spatrickclass _LIBCPP_TEMPLATE_VIS indirect_array
228446035553Spatrick{
228546035553Spatrickpublic:
228646035553Spatrick    typedef _Tp value_type;
228746035553Spatrick
228846035553Spatrickprivate:
228946035553Spatrick    value_type*      __vp_;
229046035553Spatrick    valarray<size_t> __1d_;
229146035553Spatrick
229246035553Spatrickpublic:
229346035553Spatrick    template <class _Expr>
229446035553Spatrick    typename enable_if
229546035553Spatrick    <
229646035553Spatrick        __is_val_expr<_Expr>::value,
229746035553Spatrick        void
229846035553Spatrick    >::type
229946035553Spatrick    _LIBCPP_INLINE_VISIBILITY
230046035553Spatrick    operator=(const _Expr& __v) const;
230146035553Spatrick
230246035553Spatrick    template <class _Expr>
230346035553Spatrick    typename enable_if
230446035553Spatrick    <
230546035553Spatrick        __is_val_expr<_Expr>::value,
230646035553Spatrick        void
230746035553Spatrick    >::type
230846035553Spatrick    _LIBCPP_INLINE_VISIBILITY
230946035553Spatrick    operator*=(const _Expr& __v) const;
231046035553Spatrick
231146035553Spatrick    template <class _Expr>
231246035553Spatrick    typename enable_if
231346035553Spatrick    <
231446035553Spatrick        __is_val_expr<_Expr>::value,
231546035553Spatrick        void
231646035553Spatrick    >::type
231746035553Spatrick    _LIBCPP_INLINE_VISIBILITY
231846035553Spatrick    operator/=(const _Expr& __v) const;
231946035553Spatrick
232046035553Spatrick    template <class _Expr>
232146035553Spatrick    typename enable_if
232246035553Spatrick    <
232346035553Spatrick        __is_val_expr<_Expr>::value,
232446035553Spatrick        void
232546035553Spatrick    >::type
232646035553Spatrick    _LIBCPP_INLINE_VISIBILITY
232746035553Spatrick    operator%=(const _Expr& __v) const;
232846035553Spatrick
232946035553Spatrick    template <class _Expr>
233046035553Spatrick    typename enable_if
233146035553Spatrick    <
233246035553Spatrick        __is_val_expr<_Expr>::value,
233346035553Spatrick        void
233446035553Spatrick    >::type
233546035553Spatrick    _LIBCPP_INLINE_VISIBILITY
233646035553Spatrick    operator+=(const _Expr& __v) const;
233746035553Spatrick
233846035553Spatrick    template <class _Expr>
233946035553Spatrick    typename enable_if
234046035553Spatrick    <
234146035553Spatrick        __is_val_expr<_Expr>::value,
234246035553Spatrick        void
234346035553Spatrick    >::type
234446035553Spatrick    _LIBCPP_INLINE_VISIBILITY
234546035553Spatrick    operator-=(const _Expr& __v) const;
234646035553Spatrick
234746035553Spatrick    template <class _Expr>
234846035553Spatrick    typename enable_if
234946035553Spatrick    <
235046035553Spatrick        __is_val_expr<_Expr>::value,
235146035553Spatrick        void
235246035553Spatrick    >::type
235346035553Spatrick    _LIBCPP_INLINE_VISIBILITY
235446035553Spatrick    operator^=(const _Expr& __v) const;
235546035553Spatrick
235646035553Spatrick    template <class _Expr>
235746035553Spatrick    typename enable_if
235846035553Spatrick    <
235946035553Spatrick        __is_val_expr<_Expr>::value,
236046035553Spatrick        void
236146035553Spatrick    >::type
236246035553Spatrick    _LIBCPP_INLINE_VISIBILITY
236346035553Spatrick    operator&=(const _Expr& __v) const;
236446035553Spatrick
236546035553Spatrick    template <class _Expr>
236646035553Spatrick    typename enable_if
236746035553Spatrick    <
236846035553Spatrick        __is_val_expr<_Expr>::value,
236946035553Spatrick        void
237046035553Spatrick    >::type
237146035553Spatrick    _LIBCPP_INLINE_VISIBILITY
237246035553Spatrick    operator|=(const _Expr& __v) const;
237346035553Spatrick
237446035553Spatrick    template <class _Expr>
237546035553Spatrick    typename enable_if
237646035553Spatrick    <
237746035553Spatrick        __is_val_expr<_Expr>::value,
237846035553Spatrick        void
237946035553Spatrick    >::type
238046035553Spatrick    _LIBCPP_INLINE_VISIBILITY
238146035553Spatrick    operator<<=(const _Expr& __v) const;
238246035553Spatrick
238346035553Spatrick    template <class _Expr>
238446035553Spatrick    typename enable_if
238546035553Spatrick    <
238646035553Spatrick        __is_val_expr<_Expr>::value,
238746035553Spatrick        void
238846035553Spatrick    >::type
238946035553Spatrick    _LIBCPP_INLINE_VISIBILITY
239046035553Spatrick    operator>>=(const _Expr& __v) const;
239146035553Spatrick
239246035553Spatrick    indirect_array(const indirect_array&) = default;
239346035553Spatrick
239446035553Spatrick    _LIBCPP_INLINE_VISIBILITY
239546035553Spatrick    const indirect_array& operator=(const indirect_array& __ia) const;
239646035553Spatrick
239746035553Spatrick    _LIBCPP_INLINE_VISIBILITY
239846035553Spatrick    void operator=(const value_type& __x) const;
239946035553Spatrick
240046035553Spatrickprivate:
240146035553Spatrick     _LIBCPP_INLINE_VISIBILITY
240246035553Spatrick   indirect_array(const valarray<size_t>& __ia, const valarray<value_type>& __v)
240346035553Spatrick        : __vp_(const_cast<value_type*>(__v.__begin_)),
240446035553Spatrick          __1d_(__ia)
240546035553Spatrick        {}
240646035553Spatrick
240746035553Spatrick#ifndef _LIBCPP_CXX03_LANG
240846035553Spatrick
240946035553Spatrick    _LIBCPP_INLINE_VISIBILITY
241046035553Spatrick    indirect_array(valarray<size_t>&& __ia, const valarray<value_type>& __v)
241146035553Spatrick        : __vp_(const_cast<value_type*>(__v.__begin_)),
2412*4bdff4beSrobert          __1d_(std::move(__ia))
241346035553Spatrick        {}
241446035553Spatrick
241546035553Spatrick#endif // _LIBCPP_CXX03_LANG
241646035553Spatrick
241746035553Spatrick    template <class> friend class valarray;
241846035553Spatrick};
241946035553Spatrick
242046035553Spatricktemplate <class _Tp>
242146035553Spatricktemplate <class _Expr>
242246035553Spatrickinline
242346035553Spatricktypename enable_if
242446035553Spatrick<
242546035553Spatrick    __is_val_expr<_Expr>::value,
242646035553Spatrick    void
242746035553Spatrick>::type
242846035553Spatrickindirect_array<_Tp>::operator=(const _Expr& __v) const
242946035553Spatrick{
243046035553Spatrick    size_t __n = __1d_.size();
243146035553Spatrick    for (size_t __i = 0; __i < __n; ++__i)
243246035553Spatrick        __vp_[__1d_[__i]] = __v[__i];
243346035553Spatrick}
243446035553Spatrick
243546035553Spatricktemplate <class _Tp>
243646035553Spatricktemplate <class _Expr>
243746035553Spatrickinline
243846035553Spatricktypename enable_if
243946035553Spatrick<
244046035553Spatrick    __is_val_expr<_Expr>::value,
244146035553Spatrick    void
244246035553Spatrick>::type
244346035553Spatrickindirect_array<_Tp>::operator*=(const _Expr& __v) const
244446035553Spatrick{
244546035553Spatrick    size_t __n = __1d_.size();
244646035553Spatrick    for (size_t __i = 0; __i < __n; ++__i)
244746035553Spatrick        __vp_[__1d_[__i]] *= __v[__i];
244846035553Spatrick}
244946035553Spatrick
245046035553Spatricktemplate <class _Tp>
245146035553Spatricktemplate <class _Expr>
245246035553Spatrickinline
245346035553Spatricktypename enable_if
245446035553Spatrick<
245546035553Spatrick    __is_val_expr<_Expr>::value,
245646035553Spatrick    void
245746035553Spatrick>::type
245846035553Spatrickindirect_array<_Tp>::operator/=(const _Expr& __v) const
245946035553Spatrick{
246046035553Spatrick    size_t __n = __1d_.size();
246146035553Spatrick    for (size_t __i = 0; __i < __n; ++__i)
246246035553Spatrick        __vp_[__1d_[__i]] /= __v[__i];
246346035553Spatrick}
246446035553Spatrick
246546035553Spatricktemplate <class _Tp>
246646035553Spatricktemplate <class _Expr>
246746035553Spatrickinline
246846035553Spatricktypename enable_if
246946035553Spatrick<
247046035553Spatrick    __is_val_expr<_Expr>::value,
247146035553Spatrick    void
247246035553Spatrick>::type
247346035553Spatrickindirect_array<_Tp>::operator%=(const _Expr& __v) const
247446035553Spatrick{
247546035553Spatrick    size_t __n = __1d_.size();
247646035553Spatrick    for (size_t __i = 0; __i < __n; ++__i)
247746035553Spatrick        __vp_[__1d_[__i]] %= __v[__i];
247846035553Spatrick}
247946035553Spatrick
248046035553Spatricktemplate <class _Tp>
248146035553Spatricktemplate <class _Expr>
248246035553Spatrickinline
248346035553Spatricktypename enable_if
248446035553Spatrick<
248546035553Spatrick    __is_val_expr<_Expr>::value,
248646035553Spatrick    void
248746035553Spatrick>::type
248846035553Spatrickindirect_array<_Tp>::operator+=(const _Expr& __v) const
248946035553Spatrick{
249046035553Spatrick    size_t __n = __1d_.size();
249146035553Spatrick    for (size_t __i = 0; __i < __n; ++__i)
249246035553Spatrick        __vp_[__1d_[__i]] += __v[__i];
249346035553Spatrick}
249446035553Spatrick
249546035553Spatricktemplate <class _Tp>
249646035553Spatricktemplate <class _Expr>
249746035553Spatrickinline
249846035553Spatricktypename enable_if
249946035553Spatrick<
250046035553Spatrick    __is_val_expr<_Expr>::value,
250146035553Spatrick    void
250246035553Spatrick>::type
250346035553Spatrickindirect_array<_Tp>::operator-=(const _Expr& __v) const
250446035553Spatrick{
250546035553Spatrick    size_t __n = __1d_.size();
250646035553Spatrick    for (size_t __i = 0; __i < __n; ++__i)
250746035553Spatrick        __vp_[__1d_[__i]] -= __v[__i];
250846035553Spatrick}
250946035553Spatrick
251046035553Spatricktemplate <class _Tp>
251146035553Spatricktemplate <class _Expr>
251246035553Spatrickinline
251346035553Spatricktypename enable_if
251446035553Spatrick<
251546035553Spatrick    __is_val_expr<_Expr>::value,
251646035553Spatrick    void
251746035553Spatrick>::type
251846035553Spatrickindirect_array<_Tp>::operator^=(const _Expr& __v) const
251946035553Spatrick{
252046035553Spatrick    size_t __n = __1d_.size();
252146035553Spatrick    for (size_t __i = 0; __i < __n; ++__i)
252246035553Spatrick        __vp_[__1d_[__i]] ^= __v[__i];
252346035553Spatrick}
252446035553Spatrick
252546035553Spatricktemplate <class _Tp>
252646035553Spatricktemplate <class _Expr>
252746035553Spatrickinline
252846035553Spatricktypename enable_if
252946035553Spatrick<
253046035553Spatrick    __is_val_expr<_Expr>::value,
253146035553Spatrick    void
253246035553Spatrick>::type
253346035553Spatrickindirect_array<_Tp>::operator&=(const _Expr& __v) const
253446035553Spatrick{
253546035553Spatrick    size_t __n = __1d_.size();
253646035553Spatrick    for (size_t __i = 0; __i < __n; ++__i)
253746035553Spatrick        __vp_[__1d_[__i]] &= __v[__i];
253846035553Spatrick}
253946035553Spatrick
254046035553Spatricktemplate <class _Tp>
254146035553Spatricktemplate <class _Expr>
254246035553Spatrickinline
254346035553Spatricktypename enable_if
254446035553Spatrick<
254546035553Spatrick    __is_val_expr<_Expr>::value,
254646035553Spatrick    void
254746035553Spatrick>::type
254846035553Spatrickindirect_array<_Tp>::operator|=(const _Expr& __v) const
254946035553Spatrick{
255046035553Spatrick    size_t __n = __1d_.size();
255146035553Spatrick    for (size_t __i = 0; __i < __n; ++__i)
255246035553Spatrick        __vp_[__1d_[__i]] |= __v[__i];
255346035553Spatrick}
255446035553Spatrick
255546035553Spatricktemplate <class _Tp>
255646035553Spatricktemplate <class _Expr>
255746035553Spatrickinline
255846035553Spatricktypename enable_if
255946035553Spatrick<
256046035553Spatrick    __is_val_expr<_Expr>::value,
256146035553Spatrick    void
256246035553Spatrick>::type
256346035553Spatrickindirect_array<_Tp>::operator<<=(const _Expr& __v) const
256446035553Spatrick{
256546035553Spatrick    size_t __n = __1d_.size();
256646035553Spatrick    for (size_t __i = 0; __i < __n; ++__i)
256746035553Spatrick        __vp_[__1d_[__i]] <<= __v[__i];
256846035553Spatrick}
256946035553Spatrick
257046035553Spatricktemplate <class _Tp>
257146035553Spatricktemplate <class _Expr>
257246035553Spatrickinline
257346035553Spatricktypename enable_if
257446035553Spatrick<
257546035553Spatrick    __is_val_expr<_Expr>::value,
257646035553Spatrick    void
257746035553Spatrick>::type
257846035553Spatrickindirect_array<_Tp>::operator>>=(const _Expr& __v) const
257946035553Spatrick{
258046035553Spatrick    size_t __n = __1d_.size();
258146035553Spatrick    for (size_t __i = 0; __i < __n; ++__i)
258246035553Spatrick        __vp_[__1d_[__i]] >>= __v[__i];
258346035553Spatrick}
258446035553Spatrick
258546035553Spatricktemplate <class _Tp>
258646035553Spatrickinline
258746035553Spatrickconst indirect_array<_Tp>&
258846035553Spatrickindirect_array<_Tp>::operator=(const indirect_array& __ia) const
258946035553Spatrick{
259046035553Spatrick    typedef const size_t* _Ip;
259146035553Spatrick    const value_type* __s = __ia.__vp_;
259246035553Spatrick    for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_, __j = __ia.__1d_.__begin_;
259346035553Spatrick            __i != __e; ++__i, ++__j)
259446035553Spatrick        __vp_[*__i] = __s[*__j];
259546035553Spatrick    return *this;
259646035553Spatrick}
259746035553Spatrick
259846035553Spatricktemplate <class _Tp>
259946035553Spatrickinline
260046035553Spatrickvoid
260146035553Spatrickindirect_array<_Tp>::operator=(const value_type& __x) const
260246035553Spatrick{
260346035553Spatrick    typedef const size_t* _Ip;
260446035553Spatrick    for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i)
260546035553Spatrick        __vp_[*__i] = __x;
260646035553Spatrick}
260746035553Spatrick
260846035553Spatricktemplate <class _ValExpr>
260946035553Spatrickclass __indirect_expr
261046035553Spatrick{
2611*4bdff4beSrobert    typedef __libcpp_remove_reference_t<_ValExpr>  _RmExpr;
261246035553Spatrickpublic:
261346035553Spatrick    typedef typename _RmExpr::value_type value_type;
261476d0caaeSpatrick    typedef value_type __result_type;
261546035553Spatrick
261646035553Spatrickprivate:
261746035553Spatrick    _ValExpr __expr_;
261846035553Spatrick    valarray<size_t> __1d_;
261946035553Spatrick
262046035553Spatrick    _LIBCPP_INLINE_VISIBILITY
262146035553Spatrick    __indirect_expr(const valarray<size_t>& __ia, const _RmExpr& __e)
262246035553Spatrick        : __expr_(__e),
262346035553Spatrick          __1d_(__ia)
262446035553Spatrick          {}
262546035553Spatrick
262646035553Spatrick#ifndef _LIBCPP_CXX03_LANG
262746035553Spatrick
262846035553Spatrick    _LIBCPP_INLINE_VISIBILITY
262946035553Spatrick    __indirect_expr(valarray<size_t>&& __ia, const _RmExpr& __e)
263046035553Spatrick        : __expr_(__e),
2631*4bdff4beSrobert          __1d_(std::move(__ia))
263246035553Spatrick          {}
263346035553Spatrick
263446035553Spatrick#endif // _LIBCPP_CXX03_LANG
263546035553Spatrick
263646035553Spatrickpublic:
263746035553Spatrick    _LIBCPP_INLINE_VISIBILITY
263876d0caaeSpatrick    __result_type operator[](size_t __i) const
263946035553Spatrick        {return __expr_[__1d_[__i]];}
264046035553Spatrick
264146035553Spatrick    _LIBCPP_INLINE_VISIBILITY
264246035553Spatrick    size_t size() const {return __1d_.size();}
264346035553Spatrick
264446035553Spatrick    template <class> friend class __val_expr;
264546035553Spatrick    template <class> friend class _LIBCPP_TEMPLATE_VIS valarray;
264646035553Spatrick};
264746035553Spatrick
264846035553Spatricktemplate<class _ValExpr>
264946035553Spatrickclass __val_expr
265046035553Spatrick{
2651*4bdff4beSrobert    typedef __libcpp_remove_reference_t<_ValExpr>  _RmExpr;
265246035553Spatrick
265346035553Spatrick    _ValExpr __expr_;
265446035553Spatrickpublic:
265546035553Spatrick    typedef typename _RmExpr::value_type value_type;
265676d0caaeSpatrick    typedef typename _RmExpr::__result_type __result_type;
265746035553Spatrick
265846035553Spatrick    _LIBCPP_INLINE_VISIBILITY
265946035553Spatrick    explicit __val_expr(const _RmExpr& __e) : __expr_(__e) {}
266046035553Spatrick
266146035553Spatrick    _LIBCPP_INLINE_VISIBILITY
266276d0caaeSpatrick    __result_type operator[](size_t __i) const
266346035553Spatrick        {return __expr_[__i];}
266446035553Spatrick
266546035553Spatrick    _LIBCPP_INLINE_VISIBILITY
266646035553Spatrick    __val_expr<__slice_expr<_ValExpr> > operator[](slice __s) const
266746035553Spatrick    {
266846035553Spatrick        typedef __slice_expr<_ValExpr> _NewExpr;
266946035553Spatrick        return __val_expr< _NewExpr >(_NewExpr(__s, __expr_));
267046035553Spatrick    }
267146035553Spatrick
267246035553Spatrick    _LIBCPP_INLINE_VISIBILITY
267346035553Spatrick    __val_expr<__indirect_expr<_ValExpr> > operator[](const gslice& __gs) const
267446035553Spatrick    {
267546035553Spatrick        typedef __indirect_expr<_ValExpr> _NewExpr;
267646035553Spatrick        return __val_expr<_NewExpr >(_NewExpr(__gs.__1d_, __expr_));
267746035553Spatrick    }
267846035553Spatrick
267946035553Spatrick    _LIBCPP_INLINE_VISIBILITY
268046035553Spatrick    __val_expr<__mask_expr<_ValExpr> > operator[](const valarray<bool>& __vb) const
268146035553Spatrick    {
268246035553Spatrick        typedef __mask_expr<_ValExpr> _NewExpr;
268346035553Spatrick        return __val_expr< _NewExpr >( _NewExpr(__vb, __expr_));
268446035553Spatrick    }
268546035553Spatrick
268646035553Spatrick    _LIBCPP_INLINE_VISIBILITY
268746035553Spatrick    __val_expr<__indirect_expr<_ValExpr> > operator[](const valarray<size_t>& __vs) const
268846035553Spatrick    {
268946035553Spatrick        typedef __indirect_expr<_ValExpr> _NewExpr;
269046035553Spatrick        return __val_expr< _NewExpr >(_NewExpr(__vs, __expr_));
269146035553Spatrick    }
269246035553Spatrick
269346035553Spatrick    _LIBCPP_INLINE_VISIBILITY
269446035553Spatrick    __val_expr<_UnaryOp<__unary_plus<value_type>, _ValExpr> >
269546035553Spatrick    operator+() const
269646035553Spatrick    {
269746035553Spatrick        typedef _UnaryOp<__unary_plus<value_type>, _ValExpr> _NewExpr;
269846035553Spatrick        return __val_expr<_NewExpr>(_NewExpr(__unary_plus<value_type>(), __expr_));
269946035553Spatrick    }
270046035553Spatrick
270146035553Spatrick    _LIBCPP_INLINE_VISIBILITY
270246035553Spatrick    __val_expr<_UnaryOp<negate<value_type>, _ValExpr> >
270346035553Spatrick    operator-() const
270446035553Spatrick    {
270546035553Spatrick        typedef _UnaryOp<negate<value_type>, _ValExpr> _NewExpr;
270646035553Spatrick        return __val_expr<_NewExpr>(_NewExpr(negate<value_type>(), __expr_));
270746035553Spatrick    }
270846035553Spatrick
270946035553Spatrick    _LIBCPP_INLINE_VISIBILITY
271046035553Spatrick    __val_expr<_UnaryOp<__bit_not<value_type>, _ValExpr> >
271146035553Spatrick    operator~() const
271246035553Spatrick    {
271346035553Spatrick        typedef _UnaryOp<__bit_not<value_type>, _ValExpr> _NewExpr;
271446035553Spatrick        return __val_expr<_NewExpr>(_NewExpr(__bit_not<value_type>(), __expr_));
271546035553Spatrick    }
271646035553Spatrick
271746035553Spatrick    _LIBCPP_INLINE_VISIBILITY
271846035553Spatrick    __val_expr<_UnaryOp<logical_not<value_type>, _ValExpr> >
271946035553Spatrick    operator!() const
272046035553Spatrick    {
272146035553Spatrick        typedef _UnaryOp<logical_not<value_type>, _ValExpr> _NewExpr;
272246035553Spatrick        return __val_expr<_NewExpr>(_NewExpr(logical_not<value_type>(), __expr_));
272346035553Spatrick    }
272446035553Spatrick
272576d0caaeSpatrick    operator valarray<__result_type>() const;
272646035553Spatrick
272746035553Spatrick    _LIBCPP_INLINE_VISIBILITY
272846035553Spatrick    size_t size() const {return __expr_.size();}
272946035553Spatrick
273046035553Spatrick    _LIBCPP_INLINE_VISIBILITY
273176d0caaeSpatrick    __result_type sum() const
273246035553Spatrick    {
273346035553Spatrick        size_t __n = __expr_.size();
273476d0caaeSpatrick        __result_type __r = __n ? __expr_[0] : __result_type();
273546035553Spatrick        for (size_t __i = 1; __i < __n; ++__i)
273646035553Spatrick            __r += __expr_[__i];
273746035553Spatrick        return __r;
273846035553Spatrick    }
273946035553Spatrick
274046035553Spatrick    _LIBCPP_INLINE_VISIBILITY
274176d0caaeSpatrick    __result_type min() const
274246035553Spatrick    {
274346035553Spatrick        size_t __n = size();
274476d0caaeSpatrick        __result_type __r = __n ? (*this)[0] : __result_type();
274546035553Spatrick        for (size_t __i = 1; __i < __n; ++__i)
274646035553Spatrick        {
274776d0caaeSpatrick            __result_type __x = __expr_[__i];
274846035553Spatrick            if (__x < __r)
274946035553Spatrick                __r = __x;
275046035553Spatrick        }
275146035553Spatrick        return __r;
275246035553Spatrick    }
275346035553Spatrick
275446035553Spatrick    _LIBCPP_INLINE_VISIBILITY
275576d0caaeSpatrick    __result_type max() const
275646035553Spatrick    {
275746035553Spatrick        size_t __n = size();
275876d0caaeSpatrick        __result_type __r = __n ? (*this)[0] : __result_type();
275946035553Spatrick        for (size_t __i = 1; __i < __n; ++__i)
276046035553Spatrick        {
276176d0caaeSpatrick            __result_type __x = __expr_[__i];
276246035553Spatrick            if (__r < __x)
276346035553Spatrick                __r = __x;
276446035553Spatrick        }
276546035553Spatrick        return __r;
276646035553Spatrick    }
276746035553Spatrick
276846035553Spatrick    _LIBCPP_INLINE_VISIBILITY
276946035553Spatrick    __val_expr<__shift_expr<_ValExpr> > shift (int __i) const
277046035553Spatrick        {return __val_expr<__shift_expr<_ValExpr> >(__shift_expr<_ValExpr>(__i, __expr_));}
277146035553Spatrick
277246035553Spatrick    _LIBCPP_INLINE_VISIBILITY
277346035553Spatrick    __val_expr<__cshift_expr<_ValExpr> > cshift(int __i) const
277446035553Spatrick        {return __val_expr<__cshift_expr<_ValExpr> >(__cshift_expr<_ValExpr>(__i, __expr_));}
277546035553Spatrick
277646035553Spatrick    _LIBCPP_INLINE_VISIBILITY
277746035553Spatrick    __val_expr<_UnaryOp<__apply_expr<value_type, value_type(*)(value_type)>, _ValExpr> >
277846035553Spatrick    apply(value_type __f(value_type)) const
277946035553Spatrick    {
278046035553Spatrick        typedef __apply_expr<value_type, value_type(*)(value_type)> _Op;
278146035553Spatrick        typedef _UnaryOp<_Op, _ValExpr> _NewExpr;
278246035553Spatrick        return __val_expr<_NewExpr>(_NewExpr(_Op(__f), __expr_));
278346035553Spatrick    }
278446035553Spatrick
278546035553Spatrick    _LIBCPP_INLINE_VISIBILITY
278646035553Spatrick    __val_expr<_UnaryOp<__apply_expr<value_type, value_type(*)(const value_type&)>, _ValExpr> >
278746035553Spatrick    apply(value_type __f(const value_type&)) const
278846035553Spatrick    {
278946035553Spatrick        typedef __apply_expr<value_type, value_type(*)(const value_type&)> _Op;
279046035553Spatrick        typedef _UnaryOp<_Op, _ValExpr> _NewExpr;
279146035553Spatrick        return __val_expr<_NewExpr>(_NewExpr(_Op(__f), __expr_));
279246035553Spatrick    }
279346035553Spatrick};
279446035553Spatrick
279546035553Spatricktemplate<class _ValExpr>
279676d0caaeSpatrick__val_expr<_ValExpr>::operator valarray<__val_expr::__result_type>() const
279746035553Spatrick{
279876d0caaeSpatrick    valarray<__result_type> __r;
279946035553Spatrick    size_t __n = __expr_.size();
280046035553Spatrick    if (__n)
280146035553Spatrick    {
280246035553Spatrick        __r.__begin_ =
280376d0caaeSpatrick            __r.__end_ = allocator<__result_type>().allocate(__n);
280446035553Spatrick        for (size_t __i = 0; __i != __n; ++__r.__end_, ++__i)
280576d0caaeSpatrick            ::new ((void*)__r.__end_) __result_type(__expr_[__i]);
280646035553Spatrick    }
280746035553Spatrick    return __r;
280846035553Spatrick}
280946035553Spatrick
281046035553Spatrick// valarray
281146035553Spatrick
281246035553Spatricktemplate <class _Tp>
281346035553Spatrickinline
281446035553Spatrickvalarray<_Tp>::valarray(size_t __n)
281576d0caaeSpatrick    : __begin_(nullptr),
281676d0caaeSpatrick      __end_(nullptr)
281746035553Spatrick{
281846035553Spatrick    if (__n)
281946035553Spatrick    {
282076d0caaeSpatrick        __begin_ = __end_ = allocator<value_type>().allocate(__n);
282146035553Spatrick#ifndef _LIBCPP_NO_EXCEPTIONS
282246035553Spatrick        try
282346035553Spatrick        {
282446035553Spatrick#endif // _LIBCPP_NO_EXCEPTIONS
282546035553Spatrick            for (size_t __n_left = __n; __n_left; --__n_left, ++__end_)
282676d0caaeSpatrick                ::new ((void*)__end_) value_type();
282746035553Spatrick#ifndef _LIBCPP_NO_EXCEPTIONS
282846035553Spatrick        }
282946035553Spatrick        catch (...)
283046035553Spatrick        {
283146035553Spatrick            __clear(__n);
283246035553Spatrick            throw;
283346035553Spatrick        }
283446035553Spatrick#endif // _LIBCPP_NO_EXCEPTIONS
283546035553Spatrick    }
283646035553Spatrick}
283746035553Spatrick
283846035553Spatricktemplate <class _Tp>
283946035553Spatrickinline
284046035553Spatrickvalarray<_Tp>::valarray(const value_type& __x, size_t __n)
284176d0caaeSpatrick    : __begin_(nullptr),
284276d0caaeSpatrick      __end_(nullptr)
284346035553Spatrick{
284446035553Spatrick    resize(__n, __x);
284546035553Spatrick}
284646035553Spatrick
284746035553Spatricktemplate <class _Tp>
284846035553Spatrickvalarray<_Tp>::valarray(const value_type* __p, size_t __n)
284976d0caaeSpatrick    : __begin_(nullptr),
285076d0caaeSpatrick      __end_(nullptr)
285146035553Spatrick{
285246035553Spatrick    if (__n)
285346035553Spatrick    {
285476d0caaeSpatrick        __begin_ = __end_ = allocator<value_type>().allocate(__n);
285546035553Spatrick#ifndef _LIBCPP_NO_EXCEPTIONS
285646035553Spatrick        try
285746035553Spatrick        {
285846035553Spatrick#endif // _LIBCPP_NO_EXCEPTIONS
285946035553Spatrick            for (size_t __n_left = __n; __n_left; ++__end_, ++__p, --__n_left)
286076d0caaeSpatrick                ::new ((void*)__end_) value_type(*__p);
286146035553Spatrick#ifndef _LIBCPP_NO_EXCEPTIONS
286246035553Spatrick        }
286346035553Spatrick        catch (...)
286446035553Spatrick        {
286546035553Spatrick            __clear(__n);
286646035553Spatrick            throw;
286746035553Spatrick        }
286846035553Spatrick#endif // _LIBCPP_NO_EXCEPTIONS
286946035553Spatrick    }
287046035553Spatrick}
287146035553Spatrick
287246035553Spatricktemplate <class _Tp>
287346035553Spatrickvalarray<_Tp>::valarray(const valarray& __v)
287476d0caaeSpatrick    : __begin_(nullptr),
287576d0caaeSpatrick      __end_(nullptr)
287646035553Spatrick{
287746035553Spatrick    if (__v.size())
287846035553Spatrick    {
287976d0caaeSpatrick        __begin_ = __end_ = allocator<value_type>().allocate(__v.size());
288046035553Spatrick#ifndef _LIBCPP_NO_EXCEPTIONS
288146035553Spatrick        try
288246035553Spatrick        {
288346035553Spatrick#endif // _LIBCPP_NO_EXCEPTIONS
288446035553Spatrick            for (value_type* __p = __v.__begin_; __p != __v.__end_; ++__end_, ++__p)
288576d0caaeSpatrick                ::new ((void*)__end_) value_type(*__p);
288646035553Spatrick#ifndef _LIBCPP_NO_EXCEPTIONS
288746035553Spatrick        }
288846035553Spatrick        catch (...)
288946035553Spatrick        {
289046035553Spatrick            __clear(__v.size());
289146035553Spatrick            throw;
289246035553Spatrick        }
289346035553Spatrick#endif // _LIBCPP_NO_EXCEPTIONS
289446035553Spatrick    }
289546035553Spatrick}
289646035553Spatrick
289746035553Spatrick#ifndef _LIBCPP_CXX03_LANG
289846035553Spatrick
289946035553Spatricktemplate <class _Tp>
290046035553Spatrickinline
290146035553Spatrickvalarray<_Tp>::valarray(valarray&& __v) _NOEXCEPT
290246035553Spatrick    : __begin_(__v.__begin_),
290346035553Spatrick      __end_(__v.__end_)
290446035553Spatrick{
290546035553Spatrick    __v.__begin_ = __v.__end_ = nullptr;
290646035553Spatrick}
290746035553Spatrick
290846035553Spatricktemplate <class _Tp>
290946035553Spatrickvalarray<_Tp>::valarray(initializer_list<value_type> __il)
291076d0caaeSpatrick    : __begin_(nullptr),
291176d0caaeSpatrick      __end_(nullptr)
291246035553Spatrick{
291346035553Spatrick    const size_t __n = __il.size();
291446035553Spatrick    if (__n)
291546035553Spatrick    {
291676d0caaeSpatrick        __begin_ = __end_ = allocator<value_type>().allocate(__n);
291746035553Spatrick#ifndef _LIBCPP_NO_EXCEPTIONS
291846035553Spatrick        try
291946035553Spatrick        {
292046035553Spatrick#endif // _LIBCPP_NO_EXCEPTIONS
292146035553Spatrick            size_t __n_left = __n;
292246035553Spatrick            for (const value_type* __p = __il.begin(); __n_left; ++__end_, ++__p, --__n_left)
292376d0caaeSpatrick                ::new ((void*)__end_) value_type(*__p);
292446035553Spatrick#ifndef _LIBCPP_NO_EXCEPTIONS
292546035553Spatrick        }
292646035553Spatrick        catch (...)
292746035553Spatrick        {
292846035553Spatrick            __clear(__n);
292946035553Spatrick            throw;
293046035553Spatrick        }
293146035553Spatrick#endif // _LIBCPP_NO_EXCEPTIONS
293246035553Spatrick    }
293346035553Spatrick}
293446035553Spatrick
293546035553Spatrick#endif // _LIBCPP_CXX03_LANG
293646035553Spatrick
293746035553Spatricktemplate <class _Tp>
293846035553Spatrickvalarray<_Tp>::valarray(const slice_array<value_type>& __sa)
293976d0caaeSpatrick    : __begin_(nullptr),
294076d0caaeSpatrick      __end_(nullptr)
294146035553Spatrick{
294246035553Spatrick    const size_t __n = __sa.__size_;
294346035553Spatrick    if (__n)
294446035553Spatrick    {
294576d0caaeSpatrick        __begin_ = __end_ = allocator<value_type>().allocate(__n);
294646035553Spatrick#ifndef _LIBCPP_NO_EXCEPTIONS
294746035553Spatrick        try
294846035553Spatrick        {
294946035553Spatrick#endif // _LIBCPP_NO_EXCEPTIONS
295046035553Spatrick            size_t __n_left = __n;
295146035553Spatrick            for (const value_type* __p = __sa.__vp_; __n_left; ++__end_, __p += __sa.__stride_, --__n_left)
295276d0caaeSpatrick                ::new ((void*)__end_) value_type(*__p);
295346035553Spatrick#ifndef _LIBCPP_NO_EXCEPTIONS
295446035553Spatrick        }
295546035553Spatrick        catch (...)
295646035553Spatrick        {
295746035553Spatrick            __clear(__n);
295846035553Spatrick            throw;
295946035553Spatrick        }
296046035553Spatrick#endif // _LIBCPP_NO_EXCEPTIONS
296146035553Spatrick    }
296246035553Spatrick}
296346035553Spatrick
296446035553Spatricktemplate <class _Tp>
296546035553Spatrickvalarray<_Tp>::valarray(const gslice_array<value_type>& __ga)
296676d0caaeSpatrick    : __begin_(nullptr),
296776d0caaeSpatrick      __end_(nullptr)
296846035553Spatrick{
296946035553Spatrick    const size_t __n = __ga.__1d_.size();
297046035553Spatrick    if (__n)
297146035553Spatrick    {
297276d0caaeSpatrick        __begin_ = __end_ = allocator<value_type>().allocate(__n);
297346035553Spatrick#ifndef _LIBCPP_NO_EXCEPTIONS
297446035553Spatrick        try
297546035553Spatrick        {
297646035553Spatrick#endif // _LIBCPP_NO_EXCEPTIONS
297746035553Spatrick            typedef const size_t* _Ip;
297846035553Spatrick            const value_type* __s = __ga.__vp_;
297946035553Spatrick            for (_Ip __i = __ga.__1d_.__begin_, __e = __ga.__1d_.__end_;
298046035553Spatrick                    __i != __e; ++__i, ++__end_)
298176d0caaeSpatrick                ::new ((void*)__end_) value_type(__s[*__i]);
298246035553Spatrick#ifndef _LIBCPP_NO_EXCEPTIONS
298346035553Spatrick        }
298446035553Spatrick        catch (...)
298546035553Spatrick        {
298646035553Spatrick            __clear(__n);
298746035553Spatrick            throw;
298846035553Spatrick        }
298946035553Spatrick#endif // _LIBCPP_NO_EXCEPTIONS
299046035553Spatrick    }
299146035553Spatrick}
299246035553Spatrick
299346035553Spatricktemplate <class _Tp>
299446035553Spatrickvalarray<_Tp>::valarray(const mask_array<value_type>& __ma)
299576d0caaeSpatrick    : __begin_(nullptr),
299676d0caaeSpatrick      __end_(nullptr)
299746035553Spatrick{
299846035553Spatrick    const size_t __n = __ma.__1d_.size();
299946035553Spatrick    if (__n)
300046035553Spatrick    {
300176d0caaeSpatrick        __begin_ = __end_ = allocator<value_type>().allocate(__n);
300246035553Spatrick#ifndef _LIBCPP_NO_EXCEPTIONS
300346035553Spatrick        try
300446035553Spatrick        {
300546035553Spatrick#endif // _LIBCPP_NO_EXCEPTIONS
300646035553Spatrick            typedef const size_t* _Ip;
300746035553Spatrick            const value_type* __s = __ma.__vp_;
300846035553Spatrick            for (_Ip __i = __ma.__1d_.__begin_, __e = __ma.__1d_.__end_;
300946035553Spatrick                    __i != __e; ++__i, ++__end_)
301076d0caaeSpatrick                ::new ((void*)__end_) value_type(__s[*__i]);
301146035553Spatrick#ifndef _LIBCPP_NO_EXCEPTIONS
301246035553Spatrick        }
301346035553Spatrick        catch (...)
301446035553Spatrick        {
301546035553Spatrick            __clear(__n);
301646035553Spatrick            throw;
301746035553Spatrick        }
301846035553Spatrick#endif // _LIBCPP_NO_EXCEPTIONS
301946035553Spatrick    }
302046035553Spatrick}
302146035553Spatrick
302246035553Spatricktemplate <class _Tp>
302346035553Spatrickvalarray<_Tp>::valarray(const indirect_array<value_type>& __ia)
302476d0caaeSpatrick    : __begin_(nullptr),
302576d0caaeSpatrick      __end_(nullptr)
302646035553Spatrick{
302746035553Spatrick    const size_t __n = __ia.__1d_.size();
302846035553Spatrick    if (__n)
302946035553Spatrick    {
303076d0caaeSpatrick        __begin_ = __end_ = allocator<value_type>().allocate(__n);
303146035553Spatrick#ifndef _LIBCPP_NO_EXCEPTIONS
303246035553Spatrick        try
303346035553Spatrick        {
303446035553Spatrick#endif // _LIBCPP_NO_EXCEPTIONS
303546035553Spatrick            typedef const size_t* _Ip;
303646035553Spatrick            const value_type* __s = __ia.__vp_;
303746035553Spatrick            for (_Ip __i = __ia.__1d_.__begin_, __e = __ia.__1d_.__end_;
303846035553Spatrick                    __i != __e; ++__i, ++__end_)
303976d0caaeSpatrick                ::new ((void*)__end_) value_type(__s[*__i]);
304046035553Spatrick#ifndef _LIBCPP_NO_EXCEPTIONS
304146035553Spatrick        }
304246035553Spatrick        catch (...)
304346035553Spatrick        {
304446035553Spatrick            __clear(__n);
304546035553Spatrick            throw;
304646035553Spatrick        }
304746035553Spatrick#endif // _LIBCPP_NO_EXCEPTIONS
304846035553Spatrick    }
304946035553Spatrick}
305046035553Spatrick
305146035553Spatricktemplate <class _Tp>
305246035553Spatrickinline
305346035553Spatrickvalarray<_Tp>::~valarray()
305446035553Spatrick{
305546035553Spatrick    __clear(size());
305646035553Spatrick}
305746035553Spatrick
305846035553Spatricktemplate <class _Tp>
305946035553Spatrickvalarray<_Tp>&
306046035553Spatrickvalarray<_Tp>::__assign_range(const value_type* __f, const value_type* __l)
306146035553Spatrick{
306246035553Spatrick    size_t __n = __l - __f;
306346035553Spatrick    if (size() != __n)
306446035553Spatrick    {
306546035553Spatrick        __clear(size());
306676d0caaeSpatrick        __begin_ = allocator<value_type>().allocate(__n);
306746035553Spatrick        __end_ = __begin_ + __n;
306846035553Spatrick        _VSTD::uninitialized_copy(__f, __l, __begin_);
306946035553Spatrick    } else {
307046035553Spatrick        _VSTD::copy(__f, __l, __begin_);
307146035553Spatrick    }
307246035553Spatrick    return *this;
307346035553Spatrick}
307446035553Spatrick
307546035553Spatricktemplate <class _Tp>
307646035553Spatrickvalarray<_Tp>&
307746035553Spatrickvalarray<_Tp>::operator=(const valarray& __v)
307846035553Spatrick{
3079*4bdff4beSrobert    if (this != _VSTD::addressof(__v))
308046035553Spatrick        return __assign_range(__v.__begin_, __v.__end_);
308146035553Spatrick    return *this;
308246035553Spatrick}
308346035553Spatrick
308446035553Spatrick#ifndef _LIBCPP_CXX03_LANG
308546035553Spatrick
308646035553Spatricktemplate <class _Tp>
308746035553Spatrickinline
308846035553Spatrickvalarray<_Tp>&
308946035553Spatrickvalarray<_Tp>::operator=(valarray&& __v) _NOEXCEPT
309046035553Spatrick{
309146035553Spatrick    __clear(size());
309246035553Spatrick    __begin_ = __v.__begin_;
309346035553Spatrick    __end_ = __v.__end_;
309446035553Spatrick    __v.__begin_ = nullptr;
309546035553Spatrick    __v.__end_ = nullptr;
309646035553Spatrick    return *this;
309746035553Spatrick}
309846035553Spatrick
309946035553Spatricktemplate <class _Tp>
310046035553Spatrickinline
310146035553Spatrickvalarray<_Tp>&
310246035553Spatrickvalarray<_Tp>::operator=(initializer_list<value_type> __il)
310346035553Spatrick{
310446035553Spatrick    return __assign_range(__il.begin(), __il.end());
310546035553Spatrick}
310646035553Spatrick
310746035553Spatrick#endif // _LIBCPP_CXX03_LANG
310846035553Spatrick
310946035553Spatricktemplate <class _Tp>
311046035553Spatrickinline
311146035553Spatrickvalarray<_Tp>&
311246035553Spatrickvalarray<_Tp>::operator=(const value_type& __x)
311346035553Spatrick{
311446035553Spatrick    _VSTD::fill(__begin_, __end_, __x);
311546035553Spatrick    return *this;
311646035553Spatrick}
311746035553Spatrick
311846035553Spatricktemplate <class _Tp>
311946035553Spatrickinline
312046035553Spatrickvalarray<_Tp>&
312146035553Spatrickvalarray<_Tp>::operator=(const slice_array<value_type>& __sa)
312246035553Spatrick{
312346035553Spatrick    value_type* __t = __begin_;
312446035553Spatrick    const value_type* __s = __sa.__vp_;
312546035553Spatrick    for (size_t __n = __sa.__size_; __n; --__n, __s += __sa.__stride_, ++__t)
312646035553Spatrick        *__t = *__s;
312746035553Spatrick    return *this;
312846035553Spatrick}
312946035553Spatrick
313046035553Spatricktemplate <class _Tp>
313146035553Spatrickinline
313246035553Spatrickvalarray<_Tp>&
313346035553Spatrickvalarray<_Tp>::operator=(const gslice_array<value_type>& __ga)
313446035553Spatrick{
313546035553Spatrick    typedef const size_t* _Ip;
313646035553Spatrick    value_type* __t = __begin_;
313746035553Spatrick    const value_type* __s = __ga.__vp_;
313846035553Spatrick    for (_Ip __i = __ga.__1d_.__begin_, __e = __ga.__1d_.__end_;
313946035553Spatrick                    __i != __e; ++__i, ++__t)
314046035553Spatrick        *__t = __s[*__i];
314146035553Spatrick    return *this;
314246035553Spatrick}
314346035553Spatrick
314446035553Spatricktemplate <class _Tp>
314546035553Spatrickinline
314646035553Spatrickvalarray<_Tp>&
314746035553Spatrickvalarray<_Tp>::operator=(const mask_array<value_type>& __ma)
314846035553Spatrick{
314946035553Spatrick    typedef const size_t* _Ip;
315046035553Spatrick    value_type* __t = __begin_;
315146035553Spatrick    const value_type* __s = __ma.__vp_;
315246035553Spatrick    for (_Ip __i = __ma.__1d_.__begin_, __e = __ma.__1d_.__end_;
315346035553Spatrick                    __i != __e; ++__i, ++__t)
315446035553Spatrick        *__t = __s[*__i];
315546035553Spatrick    return *this;
315646035553Spatrick}
315746035553Spatrick
315846035553Spatricktemplate <class _Tp>
315946035553Spatrickinline
316046035553Spatrickvalarray<_Tp>&
316146035553Spatrickvalarray<_Tp>::operator=(const indirect_array<value_type>& __ia)
316246035553Spatrick{
316346035553Spatrick    typedef const size_t* _Ip;
316446035553Spatrick    value_type* __t = __begin_;
316546035553Spatrick    const value_type* __s = __ia.__vp_;
316646035553Spatrick    for (_Ip __i = __ia.__1d_.__begin_, __e = __ia.__1d_.__end_;
316746035553Spatrick                    __i != __e; ++__i, ++__t)
316846035553Spatrick        *__t = __s[*__i];
316946035553Spatrick    return *this;
317046035553Spatrick}
317146035553Spatrick
317246035553Spatricktemplate <class _Tp>
317346035553Spatricktemplate <class _ValExpr>
317446035553Spatrickinline
317546035553Spatrickvalarray<_Tp>&
317646035553Spatrickvalarray<_Tp>::operator=(const __val_expr<_ValExpr>& __v)
317746035553Spatrick{
317846035553Spatrick    size_t __n = __v.size();
317946035553Spatrick    if (size() != __n)
318046035553Spatrick        resize(__n);
318146035553Spatrick    value_type* __t = __begin_;
318246035553Spatrick    for (size_t __i = 0; __i != __n; ++__t, ++__i)
318376d0caaeSpatrick        *__t = __result_type(__v[__i]);
318446035553Spatrick    return *this;
318546035553Spatrick}
318646035553Spatrick
318746035553Spatricktemplate <class _Tp>
318846035553Spatrickinline
318946035553Spatrick__val_expr<__slice_expr<const valarray<_Tp>&> >
319046035553Spatrickvalarray<_Tp>::operator[](slice __s) const
319146035553Spatrick{
319246035553Spatrick    return __val_expr<__slice_expr<const valarray&> >(__slice_expr<const valarray&>(__s, *this));
319346035553Spatrick}
319446035553Spatrick
319546035553Spatricktemplate <class _Tp>
319646035553Spatrickinline
319746035553Spatrickslice_array<_Tp>
319846035553Spatrickvalarray<_Tp>::operator[](slice __s)
319946035553Spatrick{
320046035553Spatrick    return slice_array<value_type>(__s, *this);
320146035553Spatrick}
320246035553Spatrick
320346035553Spatricktemplate <class _Tp>
320446035553Spatrickinline
320546035553Spatrick__val_expr<__indirect_expr<const valarray<_Tp>&> >
320646035553Spatrickvalarray<_Tp>::operator[](const gslice& __gs) const
320746035553Spatrick{
320846035553Spatrick    return __val_expr<__indirect_expr<const valarray&> >(__indirect_expr<const valarray&>(__gs.__1d_, *this));
320946035553Spatrick}
321046035553Spatrick
321146035553Spatricktemplate <class _Tp>
321246035553Spatrickinline
321346035553Spatrickgslice_array<_Tp>
321446035553Spatrickvalarray<_Tp>::operator[](const gslice& __gs)
321546035553Spatrick{
321646035553Spatrick    return gslice_array<value_type>(__gs, *this);
321746035553Spatrick}
321846035553Spatrick
321946035553Spatrick#ifndef _LIBCPP_CXX03_LANG
322046035553Spatrick
322146035553Spatricktemplate <class _Tp>
322246035553Spatrickinline
322346035553Spatrick__val_expr<__indirect_expr<const valarray<_Tp>&> >
322446035553Spatrickvalarray<_Tp>::operator[](gslice&& __gs) const
322546035553Spatrick{
3226*4bdff4beSrobert    return __val_expr<__indirect_expr<const valarray&> >(__indirect_expr<const valarray&>(std::move(__gs.__1d_), *this));
322746035553Spatrick}
322846035553Spatrick
322946035553Spatricktemplate <class _Tp>
323046035553Spatrickinline
323146035553Spatrickgslice_array<_Tp>
323246035553Spatrickvalarray<_Tp>::operator[](gslice&& __gs)
323346035553Spatrick{
3234*4bdff4beSrobert    return gslice_array<value_type>(std::move(__gs), *this);
323546035553Spatrick}
323646035553Spatrick
323746035553Spatrick#endif // _LIBCPP_CXX03_LANG
323846035553Spatrick
323946035553Spatricktemplate <class _Tp>
324046035553Spatrickinline
324146035553Spatrick__val_expr<__mask_expr<const valarray<_Tp>&> >
324246035553Spatrickvalarray<_Tp>::operator[](const valarray<bool>& __vb) const
324346035553Spatrick{
324446035553Spatrick    return __val_expr<__mask_expr<const valarray&> >(__mask_expr<const valarray&>(__vb, *this));
324546035553Spatrick}
324646035553Spatrick
324746035553Spatricktemplate <class _Tp>
324846035553Spatrickinline
324946035553Spatrickmask_array<_Tp>
325046035553Spatrickvalarray<_Tp>::operator[](const valarray<bool>& __vb)
325146035553Spatrick{
325246035553Spatrick    return mask_array<value_type>(__vb, *this);
325346035553Spatrick}
325446035553Spatrick
325546035553Spatrick#ifndef _LIBCPP_CXX03_LANG
325646035553Spatrick
325746035553Spatricktemplate <class _Tp>
325846035553Spatrickinline
325946035553Spatrick__val_expr<__mask_expr<const valarray<_Tp>&> >
326046035553Spatrickvalarray<_Tp>::operator[](valarray<bool>&& __vb) const
326146035553Spatrick{
3262*4bdff4beSrobert    return __val_expr<__mask_expr<const valarray&> >(__mask_expr<const valarray&>(std::move(__vb), *this));
326346035553Spatrick}
326446035553Spatrick
326546035553Spatricktemplate <class _Tp>
326646035553Spatrickinline
326746035553Spatrickmask_array<_Tp>
326846035553Spatrickvalarray<_Tp>::operator[](valarray<bool>&& __vb)
326946035553Spatrick{
3270*4bdff4beSrobert    return mask_array<value_type>(std::move(__vb), *this);
327146035553Spatrick}
327246035553Spatrick
327346035553Spatrick#endif // _LIBCPP_CXX03_LANG
327446035553Spatrick
327546035553Spatricktemplate <class _Tp>
327646035553Spatrickinline
327746035553Spatrick__val_expr<__indirect_expr<const valarray<_Tp>&> >
327846035553Spatrickvalarray<_Tp>::operator[](const valarray<size_t>& __vs) const
327946035553Spatrick{
328046035553Spatrick    return __val_expr<__indirect_expr<const valarray&> >(__indirect_expr<const valarray&>(__vs, *this));
328146035553Spatrick}
328246035553Spatrick
328346035553Spatricktemplate <class _Tp>
328446035553Spatrickinline
328546035553Spatrickindirect_array<_Tp>
328646035553Spatrickvalarray<_Tp>::operator[](const valarray<size_t>& __vs)
328746035553Spatrick{
328846035553Spatrick    return indirect_array<value_type>(__vs, *this);
328946035553Spatrick}
329046035553Spatrick
329146035553Spatrick#ifndef _LIBCPP_CXX03_LANG
329246035553Spatrick
329346035553Spatricktemplate <class _Tp>
329446035553Spatrickinline
329546035553Spatrick__val_expr<__indirect_expr<const valarray<_Tp>&> >
329646035553Spatrickvalarray<_Tp>::operator[](valarray<size_t>&& __vs) const
329746035553Spatrick{
3298*4bdff4beSrobert    return __val_expr<__indirect_expr<const valarray&> >(__indirect_expr<const valarray&>(std::move(__vs), *this));
329946035553Spatrick}
330046035553Spatrick
330146035553Spatricktemplate <class _Tp>
330246035553Spatrickinline
330346035553Spatrickindirect_array<_Tp>
330446035553Spatrickvalarray<_Tp>::operator[](valarray<size_t>&& __vs)
330546035553Spatrick{
3306*4bdff4beSrobert    return indirect_array<value_type>(std::move(__vs), *this);
330746035553Spatrick}
330846035553Spatrick
330946035553Spatrick#endif // _LIBCPP_CXX03_LANG
331046035553Spatrick
331146035553Spatricktemplate <class _Tp>
3312*4bdff4beSrobertinline
3313*4bdff4beSrobert__val_expr<_UnaryOp<__unary_plus<_Tp>, const valarray<_Tp>&> >
331446035553Spatrickvalarray<_Tp>::operator+() const
331546035553Spatrick{
3316*4bdff4beSrobert    using _Op = _UnaryOp<__unary_plus<_Tp>, const valarray<_Tp>&>;
3317*4bdff4beSrobert    return __val_expr<_Op>(_Op(__unary_plus<_Tp>(), *this));
331846035553Spatrick}
331946035553Spatrick
332046035553Spatricktemplate <class _Tp>
3321*4bdff4beSrobertinline
3322*4bdff4beSrobert__val_expr<_UnaryOp<negate<_Tp>, const valarray<_Tp>&> >
332346035553Spatrickvalarray<_Tp>::operator-() const
332446035553Spatrick{
3325*4bdff4beSrobert    using _Op = _UnaryOp<negate<_Tp>, const valarray<_Tp>&>;
3326*4bdff4beSrobert    return __val_expr<_Op>(_Op(negate<_Tp>(), *this));
332746035553Spatrick}
332846035553Spatrick
332946035553Spatricktemplate <class _Tp>
3330*4bdff4beSrobertinline
3331*4bdff4beSrobert__val_expr<_UnaryOp<__bit_not<_Tp>, const valarray<_Tp>&> >
333246035553Spatrickvalarray<_Tp>::operator~() const
333346035553Spatrick{
3334*4bdff4beSrobert    using _Op = _UnaryOp<__bit_not<_Tp>, const valarray<_Tp>&>;
3335*4bdff4beSrobert    return __val_expr<_Op>(_Op(__bit_not<_Tp>(), *this));
333646035553Spatrick}
333746035553Spatrick
333846035553Spatricktemplate <class _Tp>
3339*4bdff4beSrobertinline
3340*4bdff4beSrobert__val_expr<_UnaryOp<logical_not<_Tp>, const valarray<_Tp>&> >
334146035553Spatrickvalarray<_Tp>::operator!() const
334246035553Spatrick{
3343*4bdff4beSrobert    using _Op = _UnaryOp<logical_not<_Tp>, const valarray<_Tp>&>;
3344*4bdff4beSrobert    return __val_expr<_Op>(_Op(logical_not<_Tp>(), *this));
334546035553Spatrick}
334646035553Spatrick
334746035553Spatricktemplate <class _Tp>
334846035553Spatrickinline
334946035553Spatrickvalarray<_Tp>&
335046035553Spatrickvalarray<_Tp>::operator*=(const value_type& __x)
335146035553Spatrick{
335246035553Spatrick    for (value_type* __p = __begin_; __p != __end_; ++__p)
335346035553Spatrick        *__p *= __x;
335446035553Spatrick    return *this;
335546035553Spatrick}
335646035553Spatrick
335746035553Spatricktemplate <class _Tp>
335846035553Spatrickinline
335946035553Spatrickvalarray<_Tp>&
336046035553Spatrickvalarray<_Tp>::operator/=(const value_type& __x)
336146035553Spatrick{
336246035553Spatrick    for (value_type* __p = __begin_; __p != __end_; ++__p)
336346035553Spatrick        *__p /= __x;
336446035553Spatrick    return *this;
336546035553Spatrick}
336646035553Spatrick
336746035553Spatricktemplate <class _Tp>
336846035553Spatrickinline
336946035553Spatrickvalarray<_Tp>&
337046035553Spatrickvalarray<_Tp>::operator%=(const value_type& __x)
337146035553Spatrick{
337246035553Spatrick    for (value_type* __p = __begin_; __p != __end_; ++__p)
337346035553Spatrick        *__p %= __x;
337446035553Spatrick    return *this;
337546035553Spatrick}
337646035553Spatrick
337746035553Spatricktemplate <class _Tp>
337846035553Spatrickinline
337946035553Spatrickvalarray<_Tp>&
338046035553Spatrickvalarray<_Tp>::operator+=(const value_type& __x)
338146035553Spatrick{
338246035553Spatrick    for (value_type* __p = __begin_; __p != __end_; ++__p)
338346035553Spatrick        *__p += __x;
338446035553Spatrick    return *this;
338546035553Spatrick}
338646035553Spatrick
338746035553Spatricktemplate <class _Tp>
338846035553Spatrickinline
338946035553Spatrickvalarray<_Tp>&
339046035553Spatrickvalarray<_Tp>::operator-=(const value_type& __x)
339146035553Spatrick{
339246035553Spatrick    for (value_type* __p = __begin_; __p != __end_; ++__p)
339346035553Spatrick        *__p -= __x;
339446035553Spatrick    return *this;
339546035553Spatrick}
339646035553Spatrick
339746035553Spatricktemplate <class _Tp>
339846035553Spatrickinline
339946035553Spatrickvalarray<_Tp>&
340046035553Spatrickvalarray<_Tp>::operator^=(const value_type& __x)
340146035553Spatrick{
340246035553Spatrick    for (value_type* __p = __begin_; __p != __end_; ++__p)
340346035553Spatrick        *__p ^= __x;
340446035553Spatrick    return *this;
340546035553Spatrick}
340646035553Spatrick
340746035553Spatricktemplate <class _Tp>
340846035553Spatrickinline
340946035553Spatrickvalarray<_Tp>&
341046035553Spatrickvalarray<_Tp>::operator&=(const value_type& __x)
341146035553Spatrick{
341246035553Spatrick    for (value_type* __p = __begin_; __p != __end_; ++__p)
341346035553Spatrick        *__p &= __x;
341446035553Spatrick    return *this;
341546035553Spatrick}
341646035553Spatrick
341746035553Spatricktemplate <class _Tp>
341846035553Spatrickinline
341946035553Spatrickvalarray<_Tp>&
342046035553Spatrickvalarray<_Tp>::operator|=(const value_type& __x)
342146035553Spatrick{
342246035553Spatrick    for (value_type* __p = __begin_; __p != __end_; ++__p)
342346035553Spatrick        *__p |= __x;
342446035553Spatrick    return *this;
342546035553Spatrick}
342646035553Spatrick
342746035553Spatricktemplate <class _Tp>
342846035553Spatrickinline
342946035553Spatrickvalarray<_Tp>&
343046035553Spatrickvalarray<_Tp>::operator<<=(const value_type& __x)
343146035553Spatrick{
343246035553Spatrick    for (value_type* __p = __begin_; __p != __end_; ++__p)
343346035553Spatrick        *__p <<= __x;
343446035553Spatrick    return *this;
343546035553Spatrick}
343646035553Spatrick
343746035553Spatricktemplate <class _Tp>
343846035553Spatrickinline
343946035553Spatrickvalarray<_Tp>&
344046035553Spatrickvalarray<_Tp>::operator>>=(const value_type& __x)
344146035553Spatrick{
344246035553Spatrick    for (value_type* __p = __begin_; __p != __end_; ++__p)
344346035553Spatrick        *__p >>= __x;
344446035553Spatrick    return *this;
344546035553Spatrick}
344646035553Spatrick
344746035553Spatricktemplate <class _Tp>
344846035553Spatricktemplate <class _Expr>
344946035553Spatrickinline
345046035553Spatricktypename enable_if
345146035553Spatrick<
345246035553Spatrick    __is_val_expr<_Expr>::value,
345346035553Spatrick    valarray<_Tp>&
345446035553Spatrick>::type
345546035553Spatrickvalarray<_Tp>::operator*=(const _Expr& __v)
345646035553Spatrick{
345746035553Spatrick    size_t __i = 0;
345846035553Spatrick    for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
345946035553Spatrick        *__t *= __v[__i];
346046035553Spatrick    return *this;
346146035553Spatrick}
346246035553Spatrick
346346035553Spatricktemplate <class _Tp>
346446035553Spatricktemplate <class _Expr>
346546035553Spatrickinline
346646035553Spatricktypename enable_if
346746035553Spatrick<
346846035553Spatrick    __is_val_expr<_Expr>::value,
346946035553Spatrick    valarray<_Tp>&
347046035553Spatrick>::type
347146035553Spatrickvalarray<_Tp>::operator/=(const _Expr& __v)
347246035553Spatrick{
347346035553Spatrick    size_t __i = 0;
347446035553Spatrick    for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
347546035553Spatrick        *__t /= __v[__i];
347646035553Spatrick    return *this;
347746035553Spatrick}
347846035553Spatrick
347946035553Spatricktemplate <class _Tp>
348046035553Spatricktemplate <class _Expr>
348146035553Spatrickinline
348246035553Spatricktypename enable_if
348346035553Spatrick<
348446035553Spatrick    __is_val_expr<_Expr>::value,
348546035553Spatrick    valarray<_Tp>&
348646035553Spatrick>::type
348746035553Spatrickvalarray<_Tp>::operator%=(const _Expr& __v)
348846035553Spatrick{
348946035553Spatrick    size_t __i = 0;
349046035553Spatrick    for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
349146035553Spatrick        *__t %= __v[__i];
349246035553Spatrick    return *this;
349346035553Spatrick}
349446035553Spatrick
349546035553Spatricktemplate <class _Tp>
349646035553Spatricktemplate <class _Expr>
349746035553Spatrickinline
349846035553Spatricktypename enable_if
349946035553Spatrick<
350046035553Spatrick    __is_val_expr<_Expr>::value,
350146035553Spatrick    valarray<_Tp>&
350246035553Spatrick>::type
350346035553Spatrickvalarray<_Tp>::operator+=(const _Expr& __v)
350446035553Spatrick{
350546035553Spatrick    size_t __i = 0;
350646035553Spatrick    for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
350746035553Spatrick        *__t += __v[__i];
350846035553Spatrick    return *this;
350946035553Spatrick}
351046035553Spatrick
351146035553Spatricktemplate <class _Tp>
351246035553Spatricktemplate <class _Expr>
351346035553Spatrickinline
351446035553Spatricktypename enable_if
351546035553Spatrick<
351646035553Spatrick    __is_val_expr<_Expr>::value,
351746035553Spatrick    valarray<_Tp>&
351846035553Spatrick>::type
351946035553Spatrickvalarray<_Tp>::operator-=(const _Expr& __v)
352046035553Spatrick{
352146035553Spatrick    size_t __i = 0;
352246035553Spatrick    for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
352346035553Spatrick        *__t -= __v[__i];
352446035553Spatrick    return *this;
352546035553Spatrick}
352646035553Spatrick
352746035553Spatricktemplate <class _Tp>
352846035553Spatricktemplate <class _Expr>
352946035553Spatrickinline
353046035553Spatricktypename enable_if
353146035553Spatrick<
353246035553Spatrick    __is_val_expr<_Expr>::value,
353346035553Spatrick    valarray<_Tp>&
353446035553Spatrick>::type
353546035553Spatrickvalarray<_Tp>::operator^=(const _Expr& __v)
353646035553Spatrick{
353746035553Spatrick    size_t __i = 0;
353846035553Spatrick    for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
353946035553Spatrick        *__t ^= __v[__i];
354046035553Spatrick    return *this;
354146035553Spatrick}
354246035553Spatrick
354346035553Spatricktemplate <class _Tp>
354446035553Spatricktemplate <class _Expr>
354546035553Spatrickinline
354646035553Spatricktypename enable_if
354746035553Spatrick<
354846035553Spatrick    __is_val_expr<_Expr>::value,
354946035553Spatrick    valarray<_Tp>&
355046035553Spatrick>::type
355146035553Spatrickvalarray<_Tp>::operator|=(const _Expr& __v)
355246035553Spatrick{
355346035553Spatrick    size_t __i = 0;
355446035553Spatrick    for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
355546035553Spatrick        *__t |= __v[__i];
355646035553Spatrick    return *this;
355746035553Spatrick}
355846035553Spatrick
355946035553Spatricktemplate <class _Tp>
356046035553Spatricktemplate <class _Expr>
356146035553Spatrickinline
356246035553Spatricktypename enable_if
356346035553Spatrick<
356446035553Spatrick    __is_val_expr<_Expr>::value,
356546035553Spatrick    valarray<_Tp>&
356646035553Spatrick>::type
356746035553Spatrickvalarray<_Tp>::operator&=(const _Expr& __v)
356846035553Spatrick{
356946035553Spatrick    size_t __i = 0;
357046035553Spatrick    for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
357146035553Spatrick        *__t &= __v[__i];
357246035553Spatrick    return *this;
357346035553Spatrick}
357446035553Spatrick
357546035553Spatricktemplate <class _Tp>
357646035553Spatricktemplate <class _Expr>
357746035553Spatrickinline
357846035553Spatricktypename enable_if
357946035553Spatrick<
358046035553Spatrick    __is_val_expr<_Expr>::value,
358146035553Spatrick    valarray<_Tp>&
358246035553Spatrick>::type
358346035553Spatrickvalarray<_Tp>::operator<<=(const _Expr& __v)
358446035553Spatrick{
358546035553Spatrick    size_t __i = 0;
358646035553Spatrick    for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
358746035553Spatrick        *__t <<= __v[__i];
358846035553Spatrick    return *this;
358946035553Spatrick}
359046035553Spatrick
359146035553Spatricktemplate <class _Tp>
359246035553Spatricktemplate <class _Expr>
359346035553Spatrickinline
359446035553Spatricktypename enable_if
359546035553Spatrick<
359646035553Spatrick    __is_val_expr<_Expr>::value,
359746035553Spatrick    valarray<_Tp>&
359846035553Spatrick>::type
359946035553Spatrickvalarray<_Tp>::operator>>=(const _Expr& __v)
360046035553Spatrick{
360146035553Spatrick    size_t __i = 0;
360246035553Spatrick    for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
360346035553Spatrick        *__t >>= __v[__i];
360446035553Spatrick    return *this;
360546035553Spatrick}
360646035553Spatrick
360746035553Spatricktemplate <class _Tp>
360846035553Spatrickinline
360946035553Spatrickvoid
361046035553Spatrickvalarray<_Tp>::swap(valarray& __v) _NOEXCEPT
361146035553Spatrick{
361246035553Spatrick    _VSTD::swap(__begin_, __v.__begin_);
361346035553Spatrick    _VSTD::swap(__end_, __v.__end_);
361446035553Spatrick}
361546035553Spatrick
361646035553Spatricktemplate <class _Tp>
361746035553Spatrickinline
361846035553Spatrick_Tp
361946035553Spatrickvalarray<_Tp>::sum() const
362046035553Spatrick{
362146035553Spatrick    if (__begin_ == __end_)
362246035553Spatrick        return value_type();
362346035553Spatrick    const value_type* __p = __begin_;
362446035553Spatrick    _Tp __r = *__p;
362546035553Spatrick    for (++__p; __p != __end_; ++__p)
362646035553Spatrick        __r += *__p;
362746035553Spatrick    return __r;
362846035553Spatrick}
362946035553Spatrick
363046035553Spatricktemplate <class _Tp>
363146035553Spatrickinline
363246035553Spatrick_Tp
363346035553Spatrickvalarray<_Tp>::min() const
363446035553Spatrick{
363546035553Spatrick    if (__begin_ == __end_)
363646035553Spatrick        return value_type();
363746035553Spatrick    return *_VSTD::min_element(__begin_, __end_);
363846035553Spatrick}
363946035553Spatrick
364046035553Spatricktemplate <class _Tp>
364146035553Spatrickinline
364246035553Spatrick_Tp
364346035553Spatrickvalarray<_Tp>::max() const
364446035553Spatrick{
364546035553Spatrick    if (__begin_ == __end_)
364646035553Spatrick        return value_type();
364746035553Spatrick    return *_VSTD::max_element(__begin_, __end_);
364846035553Spatrick}
364946035553Spatrick
365046035553Spatricktemplate <class _Tp>
365146035553Spatrickvalarray<_Tp>
365246035553Spatrickvalarray<_Tp>::shift(int __i) const
365346035553Spatrick{
365446035553Spatrick    valarray<value_type> __r;
365546035553Spatrick    size_t __n = size();
365646035553Spatrick    if (__n)
365746035553Spatrick    {
365876d0caaeSpatrick        __r.__begin_ = __r.__end_ = allocator<value_type>().allocate(__n);
365946035553Spatrick        const value_type* __sb;
366046035553Spatrick        value_type* __tb;
366146035553Spatrick        value_type* __te;
366246035553Spatrick        if (__i >= 0)
366346035553Spatrick        {
366446035553Spatrick            __i = _VSTD::min(__i, static_cast<int>(__n));
366546035553Spatrick            __sb = __begin_ + __i;
366646035553Spatrick            __tb = __r.__begin_;
366746035553Spatrick            __te = __r.__begin_ + (__n - __i);
366846035553Spatrick        }
366946035553Spatrick        else
367046035553Spatrick        {
367146035553Spatrick            __i = _VSTD::min(-__i, static_cast<int>(__n));
367246035553Spatrick            __sb = __begin_;
367346035553Spatrick            __tb = __r.__begin_ + __i;
367446035553Spatrick            __te = __r.__begin_ + __n;
367546035553Spatrick        }
367646035553Spatrick        for (; __r.__end_ != __tb; ++__r.__end_)
367776d0caaeSpatrick            ::new ((void*)__r.__end_) value_type();
367846035553Spatrick        for (; __r.__end_ != __te; ++__r.__end_, ++__sb)
367976d0caaeSpatrick            ::new ((void*)__r.__end_) value_type(*__sb);
368046035553Spatrick        for (__te = __r.__begin_ + __n; __r.__end_ != __te; ++__r.__end_)
368176d0caaeSpatrick            ::new ((void*)__r.__end_) value_type();
368246035553Spatrick    }
368346035553Spatrick    return __r;
368446035553Spatrick}
368546035553Spatrick
368646035553Spatricktemplate <class _Tp>
368746035553Spatrickvalarray<_Tp>
368846035553Spatrickvalarray<_Tp>::cshift(int __i) const
368946035553Spatrick{
369046035553Spatrick    valarray<value_type> __r;
369146035553Spatrick    size_t __n = size();
369246035553Spatrick    if (__n)
369346035553Spatrick    {
369476d0caaeSpatrick        __r.__begin_ = __r.__end_ = allocator<value_type>().allocate(__n);
369546035553Spatrick        __i %= static_cast<int>(__n);
369646035553Spatrick        const value_type* __m = __i >= 0 ? __begin_ + __i : __end_ + __i;
369746035553Spatrick        for (const value_type* __s = __m; __s != __end_; ++__r.__end_, ++__s)
369876d0caaeSpatrick            ::new ((void*)__r.__end_) value_type(*__s);
369946035553Spatrick        for (const value_type* __s = __begin_; __s != __m; ++__r.__end_, ++__s)
370076d0caaeSpatrick            ::new ((void*)__r.__end_) value_type(*__s);
370146035553Spatrick    }
370246035553Spatrick    return __r;
370346035553Spatrick}
370446035553Spatrick
370546035553Spatricktemplate <class _Tp>
370646035553Spatrickvalarray<_Tp>
370746035553Spatrickvalarray<_Tp>::apply(value_type __f(value_type)) const
370846035553Spatrick{
370946035553Spatrick    valarray<value_type> __r;
371046035553Spatrick    size_t __n = size();
371146035553Spatrick    if (__n)
371246035553Spatrick    {
371376d0caaeSpatrick        __r.__begin_ = __r.__end_ = allocator<value_type>().allocate(__n);
371446035553Spatrick        for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n)
371576d0caaeSpatrick            ::new ((void*)__r.__end_) value_type(__f(*__p));
371646035553Spatrick    }
371746035553Spatrick    return __r;
371846035553Spatrick}
371946035553Spatrick
372046035553Spatricktemplate <class _Tp>
372146035553Spatrickvalarray<_Tp>
372246035553Spatrickvalarray<_Tp>::apply(value_type __f(const value_type&)) const
372346035553Spatrick{
372446035553Spatrick    valarray<value_type> __r;
372546035553Spatrick    size_t __n = size();
372646035553Spatrick    if (__n)
372746035553Spatrick    {
372876d0caaeSpatrick        __r.__begin_ = __r.__end_ = allocator<value_type>().allocate(__n);
372946035553Spatrick        for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n)
373076d0caaeSpatrick            ::new ((void*)__r.__end_) value_type(__f(*__p));
373146035553Spatrick    }
373246035553Spatrick    return __r;
373346035553Spatrick}
373446035553Spatrick
373546035553Spatricktemplate <class _Tp>
373646035553Spatrickinline
373746035553Spatrickvoid valarray<_Tp>::__clear(size_t __capacity)
373846035553Spatrick{
373946035553Spatrick  if (__begin_ != nullptr)
374046035553Spatrick  {
374146035553Spatrick    while (__end_ != __begin_)
374246035553Spatrick      (--__end_)->~value_type();
374376d0caaeSpatrick    allocator<value_type>().deallocate(__begin_, __capacity);
374446035553Spatrick    __begin_ = __end_ = nullptr;
374546035553Spatrick  }
374646035553Spatrick}
374746035553Spatrick
374846035553Spatricktemplate <class _Tp>
374946035553Spatrickvoid
375046035553Spatrickvalarray<_Tp>::resize(size_t __n, value_type __x)
375146035553Spatrick{
375246035553Spatrick    __clear(size());
375346035553Spatrick    if (__n)
375446035553Spatrick    {
375576d0caaeSpatrick        __begin_ = __end_ = allocator<value_type>().allocate(__n);
375646035553Spatrick#ifndef _LIBCPP_NO_EXCEPTIONS
375746035553Spatrick        try
375846035553Spatrick        {
375946035553Spatrick#endif // _LIBCPP_NO_EXCEPTIONS
376046035553Spatrick            for (size_t __n_left = __n; __n_left; --__n_left, ++__end_)
376176d0caaeSpatrick                ::new ((void*)__end_) value_type(__x);
376246035553Spatrick#ifndef _LIBCPP_NO_EXCEPTIONS
376346035553Spatrick        }
376446035553Spatrick        catch (...)
376546035553Spatrick        {
376646035553Spatrick            __clear(__n);
376746035553Spatrick            throw;
376846035553Spatrick        }
376946035553Spatrick#endif // _LIBCPP_NO_EXCEPTIONS
377046035553Spatrick    }
377146035553Spatrick}
377246035553Spatrick
377346035553Spatricktemplate<class _Tp>
377446035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
377546035553Spatrickvoid
377646035553Spatrickswap(valarray<_Tp>& __x, valarray<_Tp>& __y) _NOEXCEPT
377746035553Spatrick{
377846035553Spatrick    __x.swap(__y);
377946035553Spatrick}
378046035553Spatrick
378146035553Spatricktemplate<class _Expr1, class _Expr2>
378246035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
378346035553Spatricktypename enable_if
378446035553Spatrick<
378546035553Spatrick    __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
378646035553Spatrick    __val_expr<_BinaryOp<multiplies<typename _Expr1::value_type>, _Expr1, _Expr2> >
378746035553Spatrick>::type
378846035553Spatrickoperator*(const _Expr1& __x, const _Expr2& __y)
378946035553Spatrick{
379046035553Spatrick    typedef typename _Expr1::value_type value_type;
379146035553Spatrick    typedef _BinaryOp<multiplies<value_type>, _Expr1, _Expr2> _Op;
379246035553Spatrick    return __val_expr<_Op>(_Op(multiplies<value_type>(), __x, __y));
379346035553Spatrick}
379446035553Spatrick
379546035553Spatricktemplate<class _Expr>
379646035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
379746035553Spatricktypename enable_if
379846035553Spatrick<
379946035553Spatrick    __is_val_expr<_Expr>::value,
380046035553Spatrick    __val_expr<_BinaryOp<multiplies<typename _Expr::value_type>,
380146035553Spatrick               _Expr, __scalar_expr<typename _Expr::value_type> > >
380246035553Spatrick>::type
380346035553Spatrickoperator*(const _Expr& __x, const typename _Expr::value_type& __y)
380446035553Spatrick{
380546035553Spatrick    typedef typename _Expr::value_type value_type;
380646035553Spatrick    typedef _BinaryOp<multiplies<value_type>, _Expr, __scalar_expr<value_type> > _Op;
380746035553Spatrick    return __val_expr<_Op>(_Op(multiplies<value_type>(),
380846035553Spatrick                           __x, __scalar_expr<value_type>(__y, __x.size())));
380946035553Spatrick}
381046035553Spatrick
381146035553Spatricktemplate<class _Expr>
381246035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
381346035553Spatricktypename enable_if
381446035553Spatrick<
381546035553Spatrick    __is_val_expr<_Expr>::value,
381646035553Spatrick    __val_expr<_BinaryOp<multiplies<typename _Expr::value_type>,
381746035553Spatrick               __scalar_expr<typename _Expr::value_type>, _Expr> >
381846035553Spatrick>::type
381946035553Spatrickoperator*(const typename _Expr::value_type& __x, const _Expr& __y)
382046035553Spatrick{
382146035553Spatrick    typedef typename _Expr::value_type value_type;
382246035553Spatrick    typedef _BinaryOp<multiplies<value_type>, __scalar_expr<value_type>, _Expr> _Op;
382346035553Spatrick    return __val_expr<_Op>(_Op(multiplies<value_type>(),
382446035553Spatrick                           __scalar_expr<value_type>(__x, __y.size()), __y));
382546035553Spatrick}
382646035553Spatrick
382746035553Spatricktemplate<class _Expr1, class _Expr2>
382846035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
382946035553Spatricktypename enable_if
383046035553Spatrick<
383146035553Spatrick    __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
383246035553Spatrick    __val_expr<_BinaryOp<divides<typename _Expr1::value_type>, _Expr1, _Expr2> >
383346035553Spatrick>::type
383446035553Spatrickoperator/(const _Expr1& __x, const _Expr2& __y)
383546035553Spatrick{
383646035553Spatrick    typedef typename _Expr1::value_type value_type;
383746035553Spatrick    typedef _BinaryOp<divides<value_type>, _Expr1, _Expr2> _Op;
383846035553Spatrick    return __val_expr<_Op>(_Op(divides<value_type>(), __x, __y));
383946035553Spatrick}
384046035553Spatrick
384146035553Spatricktemplate<class _Expr>
384246035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
384346035553Spatricktypename enable_if
384446035553Spatrick<
384546035553Spatrick    __is_val_expr<_Expr>::value,
384646035553Spatrick    __val_expr<_BinaryOp<divides<typename _Expr::value_type>,
384746035553Spatrick               _Expr, __scalar_expr<typename _Expr::value_type> > >
384846035553Spatrick>::type
384946035553Spatrickoperator/(const _Expr& __x, const typename _Expr::value_type& __y)
385046035553Spatrick{
385146035553Spatrick    typedef typename _Expr::value_type value_type;
385246035553Spatrick    typedef _BinaryOp<divides<value_type>, _Expr, __scalar_expr<value_type> > _Op;
385346035553Spatrick    return __val_expr<_Op>(_Op(divides<value_type>(),
385446035553Spatrick                           __x, __scalar_expr<value_type>(__y, __x.size())));
385546035553Spatrick}
385646035553Spatrick
385746035553Spatricktemplate<class _Expr>
385846035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
385946035553Spatricktypename enable_if
386046035553Spatrick<
386146035553Spatrick    __is_val_expr<_Expr>::value,
386246035553Spatrick    __val_expr<_BinaryOp<divides<typename _Expr::value_type>,
386346035553Spatrick               __scalar_expr<typename _Expr::value_type>, _Expr> >
386446035553Spatrick>::type
386546035553Spatrickoperator/(const typename _Expr::value_type& __x, const _Expr& __y)
386646035553Spatrick{
386746035553Spatrick    typedef typename _Expr::value_type value_type;
386846035553Spatrick    typedef _BinaryOp<divides<value_type>, __scalar_expr<value_type>, _Expr> _Op;
386946035553Spatrick    return __val_expr<_Op>(_Op(divides<value_type>(),
387046035553Spatrick                           __scalar_expr<value_type>(__x, __y.size()), __y));
387146035553Spatrick}
387246035553Spatrick
387346035553Spatricktemplate<class _Expr1, class _Expr2>
387446035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
387546035553Spatricktypename enable_if
387646035553Spatrick<
387746035553Spatrick    __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
387846035553Spatrick    __val_expr<_BinaryOp<modulus<typename _Expr1::value_type>, _Expr1, _Expr2> >
387946035553Spatrick>::type
388046035553Spatrickoperator%(const _Expr1& __x, const _Expr2& __y)
388146035553Spatrick{
388246035553Spatrick    typedef typename _Expr1::value_type value_type;
388346035553Spatrick    typedef _BinaryOp<modulus<value_type>, _Expr1, _Expr2> _Op;
388446035553Spatrick    return __val_expr<_Op>(_Op(modulus<value_type>(), __x, __y));
388546035553Spatrick}
388646035553Spatrick
388746035553Spatricktemplate<class _Expr>
388846035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
388946035553Spatricktypename enable_if
389046035553Spatrick<
389146035553Spatrick    __is_val_expr<_Expr>::value,
389246035553Spatrick    __val_expr<_BinaryOp<modulus<typename _Expr::value_type>,
389346035553Spatrick               _Expr, __scalar_expr<typename _Expr::value_type> > >
389446035553Spatrick>::type
389546035553Spatrickoperator%(const _Expr& __x, const typename _Expr::value_type& __y)
389646035553Spatrick{
389746035553Spatrick    typedef typename _Expr::value_type value_type;
389846035553Spatrick    typedef _BinaryOp<modulus<value_type>, _Expr, __scalar_expr<value_type> > _Op;
389946035553Spatrick    return __val_expr<_Op>(_Op(modulus<value_type>(),
390046035553Spatrick                           __x, __scalar_expr<value_type>(__y, __x.size())));
390146035553Spatrick}
390246035553Spatrick
390346035553Spatricktemplate<class _Expr>
390446035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
390546035553Spatricktypename enable_if
390646035553Spatrick<
390746035553Spatrick    __is_val_expr<_Expr>::value,
390846035553Spatrick    __val_expr<_BinaryOp<modulus<typename _Expr::value_type>,
390946035553Spatrick               __scalar_expr<typename _Expr::value_type>, _Expr> >
391046035553Spatrick>::type
391146035553Spatrickoperator%(const typename _Expr::value_type& __x, const _Expr& __y)
391246035553Spatrick{
391346035553Spatrick    typedef typename _Expr::value_type value_type;
391446035553Spatrick    typedef _BinaryOp<modulus<value_type>, __scalar_expr<value_type>, _Expr> _Op;
391546035553Spatrick    return __val_expr<_Op>(_Op(modulus<value_type>(),
391646035553Spatrick                           __scalar_expr<value_type>(__x, __y.size()), __y));
391746035553Spatrick}
391846035553Spatrick
391946035553Spatricktemplate<class _Expr1, class _Expr2>
392046035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
392146035553Spatricktypename enable_if
392246035553Spatrick<
392346035553Spatrick    __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
392446035553Spatrick    __val_expr<_BinaryOp<plus<typename _Expr1::value_type>, _Expr1, _Expr2> >
392546035553Spatrick>::type
392646035553Spatrickoperator+(const _Expr1& __x, const _Expr2& __y)
392746035553Spatrick{
392846035553Spatrick    typedef typename _Expr1::value_type value_type;
392946035553Spatrick    typedef _BinaryOp<plus<value_type>, _Expr1, _Expr2> _Op;
393046035553Spatrick    return __val_expr<_Op>(_Op(plus<value_type>(), __x, __y));
393146035553Spatrick}
393246035553Spatrick
393346035553Spatricktemplate<class _Expr>
393446035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
393546035553Spatricktypename enable_if
393646035553Spatrick<
393746035553Spatrick    __is_val_expr<_Expr>::value,
393846035553Spatrick    __val_expr<_BinaryOp<plus<typename _Expr::value_type>,
393946035553Spatrick               _Expr, __scalar_expr<typename _Expr::value_type> > >
394046035553Spatrick>::type
394146035553Spatrickoperator+(const _Expr& __x, const typename _Expr::value_type& __y)
394246035553Spatrick{
394346035553Spatrick    typedef typename _Expr::value_type value_type;
394446035553Spatrick    typedef _BinaryOp<plus<value_type>, _Expr, __scalar_expr<value_type> > _Op;
394546035553Spatrick    return __val_expr<_Op>(_Op(plus<value_type>(),
394646035553Spatrick                           __x, __scalar_expr<value_type>(__y, __x.size())));
394746035553Spatrick}
394846035553Spatrick
394946035553Spatricktemplate<class _Expr>
395046035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
395146035553Spatricktypename enable_if
395246035553Spatrick<
395346035553Spatrick    __is_val_expr<_Expr>::value,
395446035553Spatrick    __val_expr<_BinaryOp<plus<typename _Expr::value_type>,
395546035553Spatrick               __scalar_expr<typename _Expr::value_type>, _Expr> >
395646035553Spatrick>::type
395746035553Spatrickoperator+(const typename _Expr::value_type& __x, const _Expr& __y)
395846035553Spatrick{
395946035553Spatrick    typedef typename _Expr::value_type value_type;
396046035553Spatrick    typedef _BinaryOp<plus<value_type>, __scalar_expr<value_type>, _Expr> _Op;
396146035553Spatrick    return __val_expr<_Op>(_Op(plus<value_type>(),
396246035553Spatrick                           __scalar_expr<value_type>(__x, __y.size()), __y));
396346035553Spatrick}
396446035553Spatrick
396546035553Spatricktemplate<class _Expr1, class _Expr2>
396646035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
396746035553Spatricktypename enable_if
396846035553Spatrick<
396946035553Spatrick    __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
397046035553Spatrick    __val_expr<_BinaryOp<minus<typename _Expr1::value_type>, _Expr1, _Expr2> >
397146035553Spatrick>::type
397246035553Spatrickoperator-(const _Expr1& __x, const _Expr2& __y)
397346035553Spatrick{
397446035553Spatrick    typedef typename _Expr1::value_type value_type;
397546035553Spatrick    typedef _BinaryOp<minus<value_type>, _Expr1, _Expr2> _Op;
397646035553Spatrick    return __val_expr<_Op>(_Op(minus<value_type>(), __x, __y));
397746035553Spatrick}
397846035553Spatrick
397946035553Spatricktemplate<class _Expr>
398046035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
398146035553Spatricktypename enable_if
398246035553Spatrick<
398346035553Spatrick    __is_val_expr<_Expr>::value,
398446035553Spatrick    __val_expr<_BinaryOp<minus<typename _Expr::value_type>,
398546035553Spatrick               _Expr, __scalar_expr<typename _Expr::value_type> > >
398646035553Spatrick>::type
398746035553Spatrickoperator-(const _Expr& __x, const typename _Expr::value_type& __y)
398846035553Spatrick{
398946035553Spatrick    typedef typename _Expr::value_type value_type;
399046035553Spatrick    typedef _BinaryOp<minus<value_type>, _Expr, __scalar_expr<value_type> > _Op;
399146035553Spatrick    return __val_expr<_Op>(_Op(minus<value_type>(),
399246035553Spatrick                           __x, __scalar_expr<value_type>(__y, __x.size())));
399346035553Spatrick}
399446035553Spatrick
399546035553Spatricktemplate<class _Expr>
399646035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
399746035553Spatricktypename enable_if
399846035553Spatrick<
399946035553Spatrick    __is_val_expr<_Expr>::value,
400046035553Spatrick    __val_expr<_BinaryOp<minus<typename _Expr::value_type>,
400146035553Spatrick               __scalar_expr<typename _Expr::value_type>, _Expr> >
400246035553Spatrick>::type
400346035553Spatrickoperator-(const typename _Expr::value_type& __x, const _Expr& __y)
400446035553Spatrick{
400546035553Spatrick    typedef typename _Expr::value_type value_type;
400646035553Spatrick    typedef _BinaryOp<minus<value_type>, __scalar_expr<value_type>, _Expr> _Op;
400746035553Spatrick    return __val_expr<_Op>(_Op(minus<value_type>(),
400846035553Spatrick                           __scalar_expr<value_type>(__x, __y.size()), __y));
400946035553Spatrick}
401046035553Spatrick
401146035553Spatricktemplate<class _Expr1, class _Expr2>
401246035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
401346035553Spatricktypename enable_if
401446035553Spatrick<
401546035553Spatrick    __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
401646035553Spatrick    __val_expr<_BinaryOp<bit_xor<typename _Expr1::value_type>, _Expr1, _Expr2> >
401746035553Spatrick>::type
401846035553Spatrickoperator^(const _Expr1& __x, const _Expr2& __y)
401946035553Spatrick{
402046035553Spatrick    typedef typename _Expr1::value_type value_type;
402146035553Spatrick    typedef _BinaryOp<bit_xor<value_type>, _Expr1, _Expr2> _Op;
402246035553Spatrick    return __val_expr<_Op>(_Op(bit_xor<value_type>(), __x, __y));
402346035553Spatrick}
402446035553Spatrick
402546035553Spatricktemplate<class _Expr>
402646035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
402746035553Spatricktypename enable_if
402846035553Spatrick<
402946035553Spatrick    __is_val_expr<_Expr>::value,
403046035553Spatrick    __val_expr<_BinaryOp<bit_xor<typename _Expr::value_type>,
403146035553Spatrick               _Expr, __scalar_expr<typename _Expr::value_type> > >
403246035553Spatrick>::type
403346035553Spatrickoperator^(const _Expr& __x, const typename _Expr::value_type& __y)
403446035553Spatrick{
403546035553Spatrick    typedef typename _Expr::value_type value_type;
403646035553Spatrick    typedef _BinaryOp<bit_xor<value_type>, _Expr, __scalar_expr<value_type> > _Op;
403746035553Spatrick    return __val_expr<_Op>(_Op(bit_xor<value_type>(),
403846035553Spatrick                           __x, __scalar_expr<value_type>(__y, __x.size())));
403946035553Spatrick}
404046035553Spatrick
404146035553Spatricktemplate<class _Expr>
404246035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
404346035553Spatricktypename enable_if
404446035553Spatrick<
404546035553Spatrick    __is_val_expr<_Expr>::value,
404646035553Spatrick    __val_expr<_BinaryOp<bit_xor<typename _Expr::value_type>,
404746035553Spatrick               __scalar_expr<typename _Expr::value_type>, _Expr> >
404846035553Spatrick>::type
404946035553Spatrickoperator^(const typename _Expr::value_type& __x, const _Expr& __y)
405046035553Spatrick{
405146035553Spatrick    typedef typename _Expr::value_type value_type;
405246035553Spatrick    typedef _BinaryOp<bit_xor<value_type>, __scalar_expr<value_type>, _Expr> _Op;
405346035553Spatrick    return __val_expr<_Op>(_Op(bit_xor<value_type>(),
405446035553Spatrick                           __scalar_expr<value_type>(__x, __y.size()), __y));
405546035553Spatrick}
405646035553Spatrick
405746035553Spatricktemplate<class _Expr1, class _Expr2>
405846035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
405946035553Spatricktypename enable_if
406046035553Spatrick<
406146035553Spatrick    __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
406246035553Spatrick    __val_expr<_BinaryOp<bit_and<typename _Expr1::value_type>, _Expr1, _Expr2> >
406346035553Spatrick>::type
406446035553Spatrickoperator&(const _Expr1& __x, const _Expr2& __y)
406546035553Spatrick{
406646035553Spatrick    typedef typename _Expr1::value_type value_type;
406746035553Spatrick    typedef _BinaryOp<bit_and<value_type>, _Expr1, _Expr2> _Op;
406846035553Spatrick    return __val_expr<_Op>(_Op(bit_and<value_type>(), __x, __y));
406946035553Spatrick}
407046035553Spatrick
407146035553Spatricktemplate<class _Expr>
407246035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
407346035553Spatricktypename enable_if
407446035553Spatrick<
407546035553Spatrick    __is_val_expr<_Expr>::value,
407646035553Spatrick    __val_expr<_BinaryOp<bit_and<typename _Expr::value_type>,
407746035553Spatrick               _Expr, __scalar_expr<typename _Expr::value_type> > >
407846035553Spatrick>::type
407946035553Spatrickoperator&(const _Expr& __x, const typename _Expr::value_type& __y)
408046035553Spatrick{
408146035553Spatrick    typedef typename _Expr::value_type value_type;
408246035553Spatrick    typedef _BinaryOp<bit_and<value_type>, _Expr, __scalar_expr<value_type> > _Op;
408346035553Spatrick    return __val_expr<_Op>(_Op(bit_and<value_type>(),
408446035553Spatrick                           __x, __scalar_expr<value_type>(__y, __x.size())));
408546035553Spatrick}
408646035553Spatrick
408746035553Spatricktemplate<class _Expr>
408846035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
408946035553Spatricktypename enable_if
409046035553Spatrick<
409146035553Spatrick    __is_val_expr<_Expr>::value,
409246035553Spatrick    __val_expr<_BinaryOp<bit_and<typename _Expr::value_type>,
409346035553Spatrick               __scalar_expr<typename _Expr::value_type>, _Expr> >
409446035553Spatrick>::type
409546035553Spatrickoperator&(const typename _Expr::value_type& __x, const _Expr& __y)
409646035553Spatrick{
409746035553Spatrick    typedef typename _Expr::value_type value_type;
409846035553Spatrick    typedef _BinaryOp<bit_and<value_type>, __scalar_expr<value_type>, _Expr> _Op;
409946035553Spatrick    return __val_expr<_Op>(_Op(bit_and<value_type>(),
410046035553Spatrick                           __scalar_expr<value_type>(__x, __y.size()), __y));
410146035553Spatrick}
410246035553Spatrick
410346035553Spatricktemplate<class _Expr1, class _Expr2>
410446035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
410546035553Spatricktypename enable_if
410646035553Spatrick<
410746035553Spatrick    __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
410846035553Spatrick    __val_expr<_BinaryOp<bit_or<typename _Expr1::value_type>, _Expr1, _Expr2> >
410946035553Spatrick>::type
411046035553Spatrickoperator|(const _Expr1& __x, const _Expr2& __y)
411146035553Spatrick{
411246035553Spatrick    typedef typename _Expr1::value_type value_type;
411346035553Spatrick    typedef _BinaryOp<bit_or<value_type>, _Expr1, _Expr2> _Op;
411446035553Spatrick    return __val_expr<_Op>(_Op(bit_or<value_type>(), __x, __y));
411546035553Spatrick}
411646035553Spatrick
411746035553Spatricktemplate<class _Expr>
411846035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
411946035553Spatricktypename enable_if
412046035553Spatrick<
412146035553Spatrick    __is_val_expr<_Expr>::value,
412246035553Spatrick    __val_expr<_BinaryOp<bit_or<typename _Expr::value_type>,
412346035553Spatrick               _Expr, __scalar_expr<typename _Expr::value_type> > >
412446035553Spatrick>::type
412546035553Spatrickoperator|(const _Expr& __x, const typename _Expr::value_type& __y)
412646035553Spatrick{
412746035553Spatrick    typedef typename _Expr::value_type value_type;
412846035553Spatrick    typedef _BinaryOp<bit_or<value_type>, _Expr, __scalar_expr<value_type> > _Op;
412946035553Spatrick    return __val_expr<_Op>(_Op(bit_or<value_type>(),
413046035553Spatrick                           __x, __scalar_expr<value_type>(__y, __x.size())));
413146035553Spatrick}
413246035553Spatrick
413346035553Spatricktemplate<class _Expr>
413446035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
413546035553Spatricktypename enable_if
413646035553Spatrick<
413746035553Spatrick    __is_val_expr<_Expr>::value,
413846035553Spatrick    __val_expr<_BinaryOp<bit_or<typename _Expr::value_type>,
413946035553Spatrick               __scalar_expr<typename _Expr::value_type>, _Expr> >
414046035553Spatrick>::type
414146035553Spatrickoperator|(const typename _Expr::value_type& __x, const _Expr& __y)
414246035553Spatrick{
414346035553Spatrick    typedef typename _Expr::value_type value_type;
414446035553Spatrick    typedef _BinaryOp<bit_or<value_type>, __scalar_expr<value_type>, _Expr> _Op;
414546035553Spatrick    return __val_expr<_Op>(_Op(bit_or<value_type>(),
414646035553Spatrick                           __scalar_expr<value_type>(__x, __y.size()), __y));
414746035553Spatrick}
414846035553Spatrick
414946035553Spatricktemplate<class _Expr1, class _Expr2>
415046035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
415146035553Spatricktypename enable_if
415246035553Spatrick<
415346035553Spatrick    __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
415446035553Spatrick    __val_expr<_BinaryOp<__bit_shift_left<typename _Expr1::value_type>, _Expr1, _Expr2> >
415546035553Spatrick>::type
415646035553Spatrickoperator<<(const _Expr1& __x, const _Expr2& __y)
415746035553Spatrick{
415846035553Spatrick    typedef typename _Expr1::value_type value_type;
415946035553Spatrick    typedef _BinaryOp<__bit_shift_left<value_type>, _Expr1, _Expr2> _Op;
416046035553Spatrick    return __val_expr<_Op>(_Op(__bit_shift_left<value_type>(), __x, __y));
416146035553Spatrick}
416246035553Spatrick
416346035553Spatricktemplate<class _Expr>
416446035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
416546035553Spatricktypename enable_if
416646035553Spatrick<
416746035553Spatrick    __is_val_expr<_Expr>::value,
416846035553Spatrick    __val_expr<_BinaryOp<__bit_shift_left<typename _Expr::value_type>,
416946035553Spatrick               _Expr, __scalar_expr<typename _Expr::value_type> > >
417046035553Spatrick>::type
417146035553Spatrickoperator<<(const _Expr& __x, const typename _Expr::value_type& __y)
417246035553Spatrick{
417346035553Spatrick    typedef typename _Expr::value_type value_type;
417446035553Spatrick    typedef _BinaryOp<__bit_shift_left<value_type>, _Expr, __scalar_expr<value_type> > _Op;
417546035553Spatrick    return __val_expr<_Op>(_Op(__bit_shift_left<value_type>(),
417646035553Spatrick                           __x, __scalar_expr<value_type>(__y, __x.size())));
417746035553Spatrick}
417846035553Spatrick
417946035553Spatricktemplate<class _Expr>
418046035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
418146035553Spatricktypename enable_if
418246035553Spatrick<
418346035553Spatrick    __is_val_expr<_Expr>::value,
418446035553Spatrick    __val_expr<_BinaryOp<__bit_shift_left<typename _Expr::value_type>,
418546035553Spatrick               __scalar_expr<typename _Expr::value_type>, _Expr> >
418646035553Spatrick>::type
418746035553Spatrickoperator<<(const typename _Expr::value_type& __x, const _Expr& __y)
418846035553Spatrick{
418946035553Spatrick    typedef typename _Expr::value_type value_type;
419046035553Spatrick    typedef _BinaryOp<__bit_shift_left<value_type>, __scalar_expr<value_type>, _Expr> _Op;
419146035553Spatrick    return __val_expr<_Op>(_Op(__bit_shift_left<value_type>(),
419246035553Spatrick                           __scalar_expr<value_type>(__x, __y.size()), __y));
419346035553Spatrick}
419446035553Spatrick
419546035553Spatricktemplate<class _Expr1, class _Expr2>
419646035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
419746035553Spatricktypename enable_if
419846035553Spatrick<
419946035553Spatrick    __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
420046035553Spatrick    __val_expr<_BinaryOp<__bit_shift_right<typename _Expr1::value_type>, _Expr1, _Expr2> >
420146035553Spatrick>::type
420246035553Spatrickoperator>>(const _Expr1& __x, const _Expr2& __y)
420346035553Spatrick{
420446035553Spatrick    typedef typename _Expr1::value_type value_type;
420546035553Spatrick    typedef _BinaryOp<__bit_shift_right<value_type>, _Expr1, _Expr2> _Op;
420646035553Spatrick    return __val_expr<_Op>(_Op(__bit_shift_right<value_type>(), __x, __y));
420746035553Spatrick}
420846035553Spatrick
420946035553Spatricktemplate<class _Expr>
421046035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
421146035553Spatricktypename enable_if
421246035553Spatrick<
421346035553Spatrick    __is_val_expr<_Expr>::value,
421446035553Spatrick    __val_expr<_BinaryOp<__bit_shift_right<typename _Expr::value_type>,
421546035553Spatrick               _Expr, __scalar_expr<typename _Expr::value_type> > >
421646035553Spatrick>::type
421746035553Spatrickoperator>>(const _Expr& __x, const typename _Expr::value_type& __y)
421846035553Spatrick{
421946035553Spatrick    typedef typename _Expr::value_type value_type;
422046035553Spatrick    typedef _BinaryOp<__bit_shift_right<value_type>, _Expr, __scalar_expr<value_type> > _Op;
422146035553Spatrick    return __val_expr<_Op>(_Op(__bit_shift_right<value_type>(),
422246035553Spatrick                           __x, __scalar_expr<value_type>(__y, __x.size())));
422346035553Spatrick}
422446035553Spatrick
422546035553Spatricktemplate<class _Expr>
422646035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
422746035553Spatricktypename enable_if
422846035553Spatrick<
422946035553Spatrick    __is_val_expr<_Expr>::value,
423046035553Spatrick    __val_expr<_BinaryOp<__bit_shift_right<typename _Expr::value_type>,
423146035553Spatrick               __scalar_expr<typename _Expr::value_type>, _Expr> >
423246035553Spatrick>::type
423346035553Spatrickoperator>>(const typename _Expr::value_type& __x, const _Expr& __y)
423446035553Spatrick{
423546035553Spatrick    typedef typename _Expr::value_type value_type;
423646035553Spatrick    typedef _BinaryOp<__bit_shift_right<value_type>, __scalar_expr<value_type>, _Expr> _Op;
423746035553Spatrick    return __val_expr<_Op>(_Op(__bit_shift_right<value_type>(),
423846035553Spatrick                           __scalar_expr<value_type>(__x, __y.size()), __y));
423946035553Spatrick}
424046035553Spatrick
424146035553Spatricktemplate<class _Expr1, class _Expr2>
424246035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
424346035553Spatricktypename enable_if
424446035553Spatrick<
424546035553Spatrick    __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
424646035553Spatrick    __val_expr<_BinaryOp<logical_and<typename _Expr1::value_type>, _Expr1, _Expr2> >
424746035553Spatrick>::type
424846035553Spatrickoperator&&(const _Expr1& __x, const _Expr2& __y)
424946035553Spatrick{
425046035553Spatrick    typedef typename _Expr1::value_type value_type;
425146035553Spatrick    typedef _BinaryOp<logical_and<value_type>, _Expr1, _Expr2> _Op;
425246035553Spatrick    return __val_expr<_Op>(_Op(logical_and<value_type>(), __x, __y));
425346035553Spatrick}
425446035553Spatrick
425546035553Spatricktemplate<class _Expr>
425646035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
425746035553Spatricktypename enable_if
425846035553Spatrick<
425946035553Spatrick    __is_val_expr<_Expr>::value,
426046035553Spatrick    __val_expr<_BinaryOp<logical_and<typename _Expr::value_type>,
426146035553Spatrick               _Expr, __scalar_expr<typename _Expr::value_type> > >
426246035553Spatrick>::type
426346035553Spatrickoperator&&(const _Expr& __x, const typename _Expr::value_type& __y)
426446035553Spatrick{
426546035553Spatrick    typedef typename _Expr::value_type value_type;
426646035553Spatrick    typedef _BinaryOp<logical_and<value_type>, _Expr, __scalar_expr<value_type> > _Op;
426746035553Spatrick    return __val_expr<_Op>(_Op(logical_and<value_type>(),
426846035553Spatrick                           __x, __scalar_expr<value_type>(__y, __x.size())));
426946035553Spatrick}
427046035553Spatrick
427146035553Spatricktemplate<class _Expr>
427246035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
427346035553Spatricktypename enable_if
427446035553Spatrick<
427546035553Spatrick    __is_val_expr<_Expr>::value,
427646035553Spatrick    __val_expr<_BinaryOp<logical_and<typename _Expr::value_type>,
427746035553Spatrick               __scalar_expr<typename _Expr::value_type>, _Expr> >
427846035553Spatrick>::type
427946035553Spatrickoperator&&(const typename _Expr::value_type& __x, const _Expr& __y)
428046035553Spatrick{
428146035553Spatrick    typedef typename _Expr::value_type value_type;
428246035553Spatrick    typedef _BinaryOp<logical_and<value_type>, __scalar_expr<value_type>, _Expr> _Op;
428346035553Spatrick    return __val_expr<_Op>(_Op(logical_and<value_type>(),
428446035553Spatrick                           __scalar_expr<value_type>(__x, __y.size()), __y));
428546035553Spatrick}
428646035553Spatrick
428746035553Spatricktemplate<class _Expr1, class _Expr2>
428846035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
428946035553Spatricktypename enable_if
429046035553Spatrick<
429146035553Spatrick    __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
429246035553Spatrick    __val_expr<_BinaryOp<logical_or<typename _Expr1::value_type>, _Expr1, _Expr2> >
429346035553Spatrick>::type
429446035553Spatrickoperator||(const _Expr1& __x, const _Expr2& __y)
429546035553Spatrick{
429646035553Spatrick    typedef typename _Expr1::value_type value_type;
429746035553Spatrick    typedef _BinaryOp<logical_or<value_type>, _Expr1, _Expr2> _Op;
429846035553Spatrick    return __val_expr<_Op>(_Op(logical_or<value_type>(), __x, __y));
429946035553Spatrick}
430046035553Spatrick
430146035553Spatricktemplate<class _Expr>
430246035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
430346035553Spatricktypename enable_if
430446035553Spatrick<
430546035553Spatrick    __is_val_expr<_Expr>::value,
430646035553Spatrick    __val_expr<_BinaryOp<logical_or<typename _Expr::value_type>,
430746035553Spatrick               _Expr, __scalar_expr<typename _Expr::value_type> > >
430846035553Spatrick>::type
430946035553Spatrickoperator||(const _Expr& __x, const typename _Expr::value_type& __y)
431046035553Spatrick{
431146035553Spatrick    typedef typename _Expr::value_type value_type;
431246035553Spatrick    typedef _BinaryOp<logical_or<value_type>, _Expr, __scalar_expr<value_type> > _Op;
431346035553Spatrick    return __val_expr<_Op>(_Op(logical_or<value_type>(),
431446035553Spatrick                           __x, __scalar_expr<value_type>(__y, __x.size())));
431546035553Spatrick}
431646035553Spatrick
431746035553Spatricktemplate<class _Expr>
431846035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
431946035553Spatricktypename enable_if
432046035553Spatrick<
432146035553Spatrick    __is_val_expr<_Expr>::value,
432246035553Spatrick    __val_expr<_BinaryOp<logical_or<typename _Expr::value_type>,
432346035553Spatrick               __scalar_expr<typename _Expr::value_type>, _Expr> >
432446035553Spatrick>::type
432546035553Spatrickoperator||(const typename _Expr::value_type& __x, const _Expr& __y)
432646035553Spatrick{
432746035553Spatrick    typedef typename _Expr::value_type value_type;
432846035553Spatrick    typedef _BinaryOp<logical_or<value_type>, __scalar_expr<value_type>, _Expr> _Op;
432946035553Spatrick    return __val_expr<_Op>(_Op(logical_or<value_type>(),
433046035553Spatrick                           __scalar_expr<value_type>(__x, __y.size()), __y));
433146035553Spatrick}
433246035553Spatrick
433346035553Spatricktemplate<class _Expr1, class _Expr2>
433446035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
433546035553Spatricktypename enable_if
433646035553Spatrick<
433746035553Spatrick    __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
433846035553Spatrick    __val_expr<_BinaryOp<equal_to<typename _Expr1::value_type>, _Expr1, _Expr2> >
433946035553Spatrick>::type
434046035553Spatrickoperator==(const _Expr1& __x, const _Expr2& __y)
434146035553Spatrick{
434246035553Spatrick    typedef typename _Expr1::value_type value_type;
434346035553Spatrick    typedef _BinaryOp<equal_to<value_type>, _Expr1, _Expr2> _Op;
434446035553Spatrick    return __val_expr<_Op>(_Op(equal_to<value_type>(), __x, __y));
434546035553Spatrick}
434646035553Spatrick
434746035553Spatricktemplate<class _Expr>
434846035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
434946035553Spatricktypename enable_if
435046035553Spatrick<
435146035553Spatrick    __is_val_expr<_Expr>::value,
435246035553Spatrick    __val_expr<_BinaryOp<equal_to<typename _Expr::value_type>,
435346035553Spatrick               _Expr, __scalar_expr<typename _Expr::value_type> > >
435446035553Spatrick>::type
435546035553Spatrickoperator==(const _Expr& __x, const typename _Expr::value_type& __y)
435646035553Spatrick{
435746035553Spatrick    typedef typename _Expr::value_type value_type;
435846035553Spatrick    typedef _BinaryOp<equal_to<value_type>, _Expr, __scalar_expr<value_type> > _Op;
435946035553Spatrick    return __val_expr<_Op>(_Op(equal_to<value_type>(),
436046035553Spatrick                           __x, __scalar_expr<value_type>(__y, __x.size())));
436146035553Spatrick}
436246035553Spatrick
436346035553Spatricktemplate<class _Expr>
436446035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
436546035553Spatricktypename enable_if
436646035553Spatrick<
436746035553Spatrick    __is_val_expr<_Expr>::value,
436846035553Spatrick    __val_expr<_BinaryOp<equal_to<typename _Expr::value_type>,
436946035553Spatrick               __scalar_expr<typename _Expr::value_type>, _Expr> >
437046035553Spatrick>::type
437146035553Spatrickoperator==(const typename _Expr::value_type& __x, const _Expr& __y)
437246035553Spatrick{
437346035553Spatrick    typedef typename _Expr::value_type value_type;
437446035553Spatrick    typedef _BinaryOp<equal_to<value_type>, __scalar_expr<value_type>, _Expr> _Op;
437546035553Spatrick    return __val_expr<_Op>(_Op(equal_to<value_type>(),
437646035553Spatrick                           __scalar_expr<value_type>(__x, __y.size()), __y));
437746035553Spatrick}
437846035553Spatrick
437946035553Spatricktemplate<class _Expr1, class _Expr2>
438046035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
438146035553Spatricktypename enable_if
438246035553Spatrick<
438346035553Spatrick    __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
438446035553Spatrick    __val_expr<_BinaryOp<not_equal_to<typename _Expr1::value_type>, _Expr1, _Expr2> >
438546035553Spatrick>::type
438646035553Spatrickoperator!=(const _Expr1& __x, const _Expr2& __y)
438746035553Spatrick{
438846035553Spatrick    typedef typename _Expr1::value_type value_type;
438946035553Spatrick    typedef _BinaryOp<not_equal_to<value_type>, _Expr1, _Expr2> _Op;
439046035553Spatrick    return __val_expr<_Op>(_Op(not_equal_to<value_type>(), __x, __y));
439146035553Spatrick}
439246035553Spatrick
439346035553Spatricktemplate<class _Expr>
439446035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
439546035553Spatricktypename enable_if
439646035553Spatrick<
439746035553Spatrick    __is_val_expr<_Expr>::value,
439846035553Spatrick    __val_expr<_BinaryOp<not_equal_to<typename _Expr::value_type>,
439946035553Spatrick               _Expr, __scalar_expr<typename _Expr::value_type> > >
440046035553Spatrick>::type
440146035553Spatrickoperator!=(const _Expr& __x, const typename _Expr::value_type& __y)
440246035553Spatrick{
440346035553Spatrick    typedef typename _Expr::value_type value_type;
440446035553Spatrick    typedef _BinaryOp<not_equal_to<value_type>, _Expr, __scalar_expr<value_type> > _Op;
440546035553Spatrick    return __val_expr<_Op>(_Op(not_equal_to<value_type>(),
440646035553Spatrick                           __x, __scalar_expr<value_type>(__y, __x.size())));
440746035553Spatrick}
440846035553Spatrick
440946035553Spatricktemplate<class _Expr>
441046035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
441146035553Spatricktypename enable_if
441246035553Spatrick<
441346035553Spatrick    __is_val_expr<_Expr>::value,
441446035553Spatrick    __val_expr<_BinaryOp<not_equal_to<typename _Expr::value_type>,
441546035553Spatrick               __scalar_expr<typename _Expr::value_type>, _Expr> >
441646035553Spatrick>::type
441746035553Spatrickoperator!=(const typename _Expr::value_type& __x, const _Expr& __y)
441846035553Spatrick{
441946035553Spatrick    typedef typename _Expr::value_type value_type;
442046035553Spatrick    typedef _BinaryOp<not_equal_to<value_type>, __scalar_expr<value_type>, _Expr> _Op;
442146035553Spatrick    return __val_expr<_Op>(_Op(not_equal_to<value_type>(),
442246035553Spatrick                           __scalar_expr<value_type>(__x, __y.size()), __y));
442346035553Spatrick}
442446035553Spatrick
442546035553Spatricktemplate<class _Expr1, class _Expr2>
442646035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
442746035553Spatricktypename enable_if
442846035553Spatrick<
442946035553Spatrick    __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
443046035553Spatrick    __val_expr<_BinaryOp<less<typename _Expr1::value_type>, _Expr1, _Expr2> >
443146035553Spatrick>::type
443246035553Spatrickoperator<(const _Expr1& __x, const _Expr2& __y)
443346035553Spatrick{
443446035553Spatrick    typedef typename _Expr1::value_type value_type;
443546035553Spatrick    typedef _BinaryOp<less<value_type>, _Expr1, _Expr2> _Op;
443646035553Spatrick    return __val_expr<_Op>(_Op(less<value_type>(), __x, __y));
443746035553Spatrick}
443846035553Spatrick
443946035553Spatricktemplate<class _Expr>
444046035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
444146035553Spatricktypename enable_if
444246035553Spatrick<
444346035553Spatrick    __is_val_expr<_Expr>::value,
444446035553Spatrick    __val_expr<_BinaryOp<less<typename _Expr::value_type>,
444546035553Spatrick               _Expr, __scalar_expr<typename _Expr::value_type> > >
444646035553Spatrick>::type
444746035553Spatrickoperator<(const _Expr& __x, const typename _Expr::value_type& __y)
444846035553Spatrick{
444946035553Spatrick    typedef typename _Expr::value_type value_type;
445046035553Spatrick    typedef _BinaryOp<less<value_type>, _Expr, __scalar_expr<value_type> > _Op;
445146035553Spatrick    return __val_expr<_Op>(_Op(less<value_type>(),
445246035553Spatrick                           __x, __scalar_expr<value_type>(__y, __x.size())));
445346035553Spatrick}
445446035553Spatrick
445546035553Spatricktemplate<class _Expr>
445646035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
445746035553Spatricktypename enable_if
445846035553Spatrick<
445946035553Spatrick    __is_val_expr<_Expr>::value,
446046035553Spatrick    __val_expr<_BinaryOp<less<typename _Expr::value_type>,
446146035553Spatrick               __scalar_expr<typename _Expr::value_type>, _Expr> >
446246035553Spatrick>::type
446346035553Spatrickoperator<(const typename _Expr::value_type& __x, const _Expr& __y)
446446035553Spatrick{
446546035553Spatrick    typedef typename _Expr::value_type value_type;
446646035553Spatrick    typedef _BinaryOp<less<value_type>, __scalar_expr<value_type>, _Expr> _Op;
446746035553Spatrick    return __val_expr<_Op>(_Op(less<value_type>(),
446846035553Spatrick                           __scalar_expr<value_type>(__x, __y.size()), __y));
446946035553Spatrick}
447046035553Spatrick
447146035553Spatricktemplate<class _Expr1, class _Expr2>
447246035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
447346035553Spatricktypename enable_if
447446035553Spatrick<
447546035553Spatrick    __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
447646035553Spatrick    __val_expr<_BinaryOp<greater<typename _Expr1::value_type>, _Expr1, _Expr2> >
447746035553Spatrick>::type
447846035553Spatrickoperator>(const _Expr1& __x, const _Expr2& __y)
447946035553Spatrick{
448046035553Spatrick    typedef typename _Expr1::value_type value_type;
448146035553Spatrick    typedef _BinaryOp<greater<value_type>, _Expr1, _Expr2> _Op;
448246035553Spatrick    return __val_expr<_Op>(_Op(greater<value_type>(), __x, __y));
448346035553Spatrick}
448446035553Spatrick
448546035553Spatricktemplate<class _Expr>
448646035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
448746035553Spatricktypename enable_if
448846035553Spatrick<
448946035553Spatrick    __is_val_expr<_Expr>::value,
449046035553Spatrick    __val_expr<_BinaryOp<greater<typename _Expr::value_type>,
449146035553Spatrick               _Expr, __scalar_expr<typename _Expr::value_type> > >
449246035553Spatrick>::type
449346035553Spatrickoperator>(const _Expr& __x, const typename _Expr::value_type& __y)
449446035553Spatrick{
449546035553Spatrick    typedef typename _Expr::value_type value_type;
449646035553Spatrick    typedef _BinaryOp<greater<value_type>, _Expr, __scalar_expr<value_type> > _Op;
449746035553Spatrick    return __val_expr<_Op>(_Op(greater<value_type>(),
449846035553Spatrick                           __x, __scalar_expr<value_type>(__y, __x.size())));
449946035553Spatrick}
450046035553Spatrick
450146035553Spatricktemplate<class _Expr>
450246035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
450346035553Spatricktypename enable_if
450446035553Spatrick<
450546035553Spatrick    __is_val_expr<_Expr>::value,
450646035553Spatrick    __val_expr<_BinaryOp<greater<typename _Expr::value_type>,
450746035553Spatrick               __scalar_expr<typename _Expr::value_type>, _Expr> >
450846035553Spatrick>::type
450946035553Spatrickoperator>(const typename _Expr::value_type& __x, const _Expr& __y)
451046035553Spatrick{
451146035553Spatrick    typedef typename _Expr::value_type value_type;
451246035553Spatrick    typedef _BinaryOp<greater<value_type>, __scalar_expr<value_type>, _Expr> _Op;
451346035553Spatrick    return __val_expr<_Op>(_Op(greater<value_type>(),
451446035553Spatrick                           __scalar_expr<value_type>(__x, __y.size()), __y));
451546035553Spatrick}
451646035553Spatrick
451746035553Spatricktemplate<class _Expr1, class _Expr2>
451846035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
451946035553Spatricktypename enable_if
452046035553Spatrick<
452146035553Spatrick    __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
452246035553Spatrick    __val_expr<_BinaryOp<less_equal<typename _Expr1::value_type>, _Expr1, _Expr2> >
452346035553Spatrick>::type
452446035553Spatrickoperator<=(const _Expr1& __x, const _Expr2& __y)
452546035553Spatrick{
452646035553Spatrick    typedef typename _Expr1::value_type value_type;
452746035553Spatrick    typedef _BinaryOp<less_equal<value_type>, _Expr1, _Expr2> _Op;
452846035553Spatrick    return __val_expr<_Op>(_Op(less_equal<value_type>(), __x, __y));
452946035553Spatrick}
453046035553Spatrick
453146035553Spatricktemplate<class _Expr>
453246035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
453346035553Spatricktypename enable_if
453446035553Spatrick<
453546035553Spatrick    __is_val_expr<_Expr>::value,
453646035553Spatrick    __val_expr<_BinaryOp<less_equal<typename _Expr::value_type>,
453746035553Spatrick               _Expr, __scalar_expr<typename _Expr::value_type> > >
453846035553Spatrick>::type
453946035553Spatrickoperator<=(const _Expr& __x, const typename _Expr::value_type& __y)
454046035553Spatrick{
454146035553Spatrick    typedef typename _Expr::value_type value_type;
454246035553Spatrick    typedef _BinaryOp<less_equal<value_type>, _Expr, __scalar_expr<value_type> > _Op;
454346035553Spatrick    return __val_expr<_Op>(_Op(less_equal<value_type>(),
454446035553Spatrick                           __x, __scalar_expr<value_type>(__y, __x.size())));
454546035553Spatrick}
454646035553Spatrick
454746035553Spatricktemplate<class _Expr>
454846035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
454946035553Spatricktypename enable_if
455046035553Spatrick<
455146035553Spatrick    __is_val_expr<_Expr>::value,
455246035553Spatrick    __val_expr<_BinaryOp<less_equal<typename _Expr::value_type>,
455346035553Spatrick               __scalar_expr<typename _Expr::value_type>, _Expr> >
455446035553Spatrick>::type
455546035553Spatrickoperator<=(const typename _Expr::value_type& __x, const _Expr& __y)
455646035553Spatrick{
455746035553Spatrick    typedef typename _Expr::value_type value_type;
455846035553Spatrick    typedef _BinaryOp<less_equal<value_type>, __scalar_expr<value_type>, _Expr> _Op;
455946035553Spatrick    return __val_expr<_Op>(_Op(less_equal<value_type>(),
456046035553Spatrick                           __scalar_expr<value_type>(__x, __y.size()), __y));
456146035553Spatrick}
456246035553Spatrick
456346035553Spatricktemplate<class _Expr1, class _Expr2>
456446035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
456546035553Spatricktypename enable_if
456646035553Spatrick<
456746035553Spatrick    __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
456846035553Spatrick    __val_expr<_BinaryOp<greater_equal<typename _Expr1::value_type>, _Expr1, _Expr2> >
456946035553Spatrick>::type
457046035553Spatrickoperator>=(const _Expr1& __x, const _Expr2& __y)
457146035553Spatrick{
457246035553Spatrick    typedef typename _Expr1::value_type value_type;
457346035553Spatrick    typedef _BinaryOp<greater_equal<value_type>, _Expr1, _Expr2> _Op;
457446035553Spatrick    return __val_expr<_Op>(_Op(greater_equal<value_type>(), __x, __y));
457546035553Spatrick}
457646035553Spatrick
457746035553Spatricktemplate<class _Expr>
457846035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
457946035553Spatricktypename enable_if
458046035553Spatrick<
458146035553Spatrick    __is_val_expr<_Expr>::value,
458246035553Spatrick    __val_expr<_BinaryOp<greater_equal<typename _Expr::value_type>,
458346035553Spatrick               _Expr, __scalar_expr<typename _Expr::value_type> > >
458446035553Spatrick>::type
458546035553Spatrickoperator>=(const _Expr& __x, const typename _Expr::value_type& __y)
458646035553Spatrick{
458746035553Spatrick    typedef typename _Expr::value_type value_type;
458846035553Spatrick    typedef _BinaryOp<greater_equal<value_type>, _Expr, __scalar_expr<value_type> > _Op;
458946035553Spatrick    return __val_expr<_Op>(_Op(greater_equal<value_type>(),
459046035553Spatrick                           __x, __scalar_expr<value_type>(__y, __x.size())));
459146035553Spatrick}
459246035553Spatrick
459346035553Spatricktemplate<class _Expr>
459446035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
459546035553Spatricktypename enable_if
459646035553Spatrick<
459746035553Spatrick    __is_val_expr<_Expr>::value,
459846035553Spatrick    __val_expr<_BinaryOp<greater_equal<typename _Expr::value_type>,
459946035553Spatrick               __scalar_expr<typename _Expr::value_type>, _Expr> >
460046035553Spatrick>::type
460146035553Spatrickoperator>=(const typename _Expr::value_type& __x, const _Expr& __y)
460246035553Spatrick{
460346035553Spatrick    typedef typename _Expr::value_type value_type;
460446035553Spatrick    typedef _BinaryOp<greater_equal<value_type>, __scalar_expr<value_type>, _Expr> _Op;
460546035553Spatrick    return __val_expr<_Op>(_Op(greater_equal<value_type>(),
460646035553Spatrick                           __scalar_expr<value_type>(__x, __y.size()), __y));
460746035553Spatrick}
460846035553Spatrick
460946035553Spatricktemplate<class _Expr>
461046035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
461146035553Spatricktypename enable_if
461246035553Spatrick<
461346035553Spatrick    __is_val_expr<_Expr>::value,
461446035553Spatrick    __val_expr<_UnaryOp<__abs_expr<typename _Expr::value_type>, _Expr> >
461546035553Spatrick>::type
461646035553Spatrickabs(const _Expr& __x)
461746035553Spatrick{
461846035553Spatrick    typedef typename _Expr::value_type value_type;
461946035553Spatrick    typedef _UnaryOp<__abs_expr<value_type>, _Expr> _Op;
462046035553Spatrick    return __val_expr<_Op>(_Op(__abs_expr<value_type>(), __x));
462146035553Spatrick}
462246035553Spatrick
462346035553Spatricktemplate<class _Expr>
462446035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
462546035553Spatricktypename enable_if
462646035553Spatrick<
462746035553Spatrick    __is_val_expr<_Expr>::value,
462846035553Spatrick    __val_expr<_UnaryOp<__acos_expr<typename _Expr::value_type>, _Expr> >
462946035553Spatrick>::type
463046035553Spatrickacos(const _Expr& __x)
463146035553Spatrick{
463246035553Spatrick    typedef typename _Expr::value_type value_type;
463346035553Spatrick    typedef _UnaryOp<__acos_expr<value_type>, _Expr> _Op;
463446035553Spatrick    return __val_expr<_Op>(_Op(__acos_expr<value_type>(), __x));
463546035553Spatrick}
463646035553Spatrick
463746035553Spatricktemplate<class _Expr>
463846035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
463946035553Spatricktypename enable_if
464046035553Spatrick<
464146035553Spatrick    __is_val_expr<_Expr>::value,
464246035553Spatrick    __val_expr<_UnaryOp<__asin_expr<typename _Expr::value_type>, _Expr> >
464346035553Spatrick>::type
464446035553Spatrickasin(const _Expr& __x)
464546035553Spatrick{
464646035553Spatrick    typedef typename _Expr::value_type value_type;
464746035553Spatrick    typedef _UnaryOp<__asin_expr<value_type>, _Expr> _Op;
464846035553Spatrick    return __val_expr<_Op>(_Op(__asin_expr<value_type>(), __x));
464946035553Spatrick}
465046035553Spatrick
465146035553Spatricktemplate<class _Expr>
465246035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
465346035553Spatricktypename enable_if
465446035553Spatrick<
465546035553Spatrick    __is_val_expr<_Expr>::value,
465646035553Spatrick    __val_expr<_UnaryOp<__atan_expr<typename _Expr::value_type>, _Expr> >
465746035553Spatrick>::type
465846035553Spatrickatan(const _Expr& __x)
465946035553Spatrick{
466046035553Spatrick    typedef typename _Expr::value_type value_type;
466146035553Spatrick    typedef _UnaryOp<__atan_expr<value_type>, _Expr> _Op;
466246035553Spatrick    return __val_expr<_Op>(_Op(__atan_expr<value_type>(), __x));
466346035553Spatrick}
466446035553Spatrick
466546035553Spatricktemplate<class _Expr1, class _Expr2>
466646035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
466746035553Spatricktypename enable_if
466846035553Spatrick<
466946035553Spatrick    __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
467046035553Spatrick    __val_expr<_BinaryOp<__atan2_expr<typename _Expr1::value_type>, _Expr1, _Expr2> >
467146035553Spatrick>::type
467246035553Spatrickatan2(const _Expr1& __x, const _Expr2& __y)
467346035553Spatrick{
467446035553Spatrick    typedef typename _Expr1::value_type value_type;
467546035553Spatrick    typedef _BinaryOp<__atan2_expr<value_type>, _Expr1, _Expr2> _Op;
467646035553Spatrick    return __val_expr<_Op>(_Op(__atan2_expr<value_type>(), __x, __y));
467746035553Spatrick}
467846035553Spatrick
467946035553Spatricktemplate<class _Expr>
468046035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
468146035553Spatricktypename enable_if
468246035553Spatrick<
468346035553Spatrick    __is_val_expr<_Expr>::value,
468446035553Spatrick    __val_expr<_BinaryOp<__atan2_expr<typename _Expr::value_type>,
468546035553Spatrick               _Expr, __scalar_expr<typename _Expr::value_type> > >
468646035553Spatrick>::type
468746035553Spatrickatan2(const _Expr& __x, const typename _Expr::value_type& __y)
468846035553Spatrick{
468946035553Spatrick    typedef typename _Expr::value_type value_type;
469046035553Spatrick    typedef _BinaryOp<__atan2_expr<value_type>, _Expr, __scalar_expr<value_type> > _Op;
469146035553Spatrick    return __val_expr<_Op>(_Op(__atan2_expr<value_type>(),
469246035553Spatrick                           __x, __scalar_expr<value_type>(__y, __x.size())));
469346035553Spatrick}
469446035553Spatrick
469546035553Spatricktemplate<class _Expr>
469646035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
469746035553Spatricktypename enable_if
469846035553Spatrick<
469946035553Spatrick    __is_val_expr<_Expr>::value,
470046035553Spatrick    __val_expr<_BinaryOp<__atan2_expr<typename _Expr::value_type>,
470146035553Spatrick               __scalar_expr<typename _Expr::value_type>, _Expr> >
470246035553Spatrick>::type
470346035553Spatrickatan2(const typename _Expr::value_type& __x, const _Expr& __y)
470446035553Spatrick{
470546035553Spatrick    typedef typename _Expr::value_type value_type;
470646035553Spatrick    typedef _BinaryOp<__atan2_expr<value_type>, __scalar_expr<value_type>, _Expr> _Op;
470746035553Spatrick    return __val_expr<_Op>(_Op(__atan2_expr<value_type>(),
470846035553Spatrick                           __scalar_expr<value_type>(__x, __y.size()), __y));
470946035553Spatrick}
471046035553Spatrick
471146035553Spatricktemplate<class _Expr>
471246035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
471346035553Spatricktypename enable_if
471446035553Spatrick<
471546035553Spatrick    __is_val_expr<_Expr>::value,
471646035553Spatrick    __val_expr<_UnaryOp<__cos_expr<typename _Expr::value_type>, _Expr> >
471746035553Spatrick>::type
471846035553Spatrickcos(const _Expr& __x)
471946035553Spatrick{
472046035553Spatrick    typedef typename _Expr::value_type value_type;
472146035553Spatrick    typedef _UnaryOp<__cos_expr<value_type>, _Expr> _Op;
472246035553Spatrick    return __val_expr<_Op>(_Op(__cos_expr<value_type>(), __x));
472346035553Spatrick}
472446035553Spatrick
472546035553Spatricktemplate<class _Expr>
472646035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
472746035553Spatricktypename enable_if
472846035553Spatrick<
472946035553Spatrick    __is_val_expr<_Expr>::value,
473046035553Spatrick    __val_expr<_UnaryOp<__cosh_expr<typename _Expr::value_type>, _Expr> >
473146035553Spatrick>::type
473246035553Spatrickcosh(const _Expr& __x)
473346035553Spatrick{
473446035553Spatrick    typedef typename _Expr::value_type value_type;
473546035553Spatrick    typedef _UnaryOp<__cosh_expr<value_type>, _Expr> _Op;
473646035553Spatrick    return __val_expr<_Op>(_Op(__cosh_expr<value_type>(), __x));
473746035553Spatrick}
473846035553Spatrick
473946035553Spatricktemplate<class _Expr>
474046035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
474146035553Spatricktypename enable_if
474246035553Spatrick<
474346035553Spatrick    __is_val_expr<_Expr>::value,
474446035553Spatrick    __val_expr<_UnaryOp<__exp_expr<typename _Expr::value_type>, _Expr> >
474546035553Spatrick>::type
474646035553Spatrickexp(const _Expr& __x)
474746035553Spatrick{
474846035553Spatrick    typedef typename _Expr::value_type value_type;
474946035553Spatrick    typedef _UnaryOp<__exp_expr<value_type>, _Expr> _Op;
475046035553Spatrick    return __val_expr<_Op>(_Op(__exp_expr<value_type>(), __x));
475146035553Spatrick}
475246035553Spatrick
475346035553Spatricktemplate<class _Expr>
475446035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
475546035553Spatricktypename enable_if
475646035553Spatrick<
475746035553Spatrick    __is_val_expr<_Expr>::value,
475846035553Spatrick    __val_expr<_UnaryOp<__log_expr<typename _Expr::value_type>, _Expr> >
475946035553Spatrick>::type
476046035553Spatricklog(const _Expr& __x)
476146035553Spatrick{
476246035553Spatrick    typedef typename _Expr::value_type value_type;
476346035553Spatrick    typedef _UnaryOp<__log_expr<value_type>, _Expr> _Op;
476446035553Spatrick    return __val_expr<_Op>(_Op(__log_expr<value_type>(), __x));
476546035553Spatrick}
476646035553Spatrick
476746035553Spatricktemplate<class _Expr>
476846035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
476946035553Spatricktypename enable_if
477046035553Spatrick<
477146035553Spatrick    __is_val_expr<_Expr>::value,
477246035553Spatrick    __val_expr<_UnaryOp<__log10_expr<typename _Expr::value_type>, _Expr> >
477346035553Spatrick>::type
477446035553Spatricklog10(const _Expr& __x)
477546035553Spatrick{
477646035553Spatrick    typedef typename _Expr::value_type value_type;
477746035553Spatrick    typedef _UnaryOp<__log10_expr<value_type>, _Expr> _Op;
477846035553Spatrick    return __val_expr<_Op>(_Op(__log10_expr<value_type>(), __x));
477946035553Spatrick}
478046035553Spatrick
478146035553Spatricktemplate<class _Expr1, class _Expr2>
478246035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
478346035553Spatricktypename enable_if
478446035553Spatrick<
478546035553Spatrick    __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
478646035553Spatrick    __val_expr<_BinaryOp<__pow_expr<typename _Expr1::value_type>, _Expr1, _Expr2> >
478746035553Spatrick>::type
478846035553Spatrickpow(const _Expr1& __x, const _Expr2& __y)
478946035553Spatrick{
479046035553Spatrick    typedef typename _Expr1::value_type value_type;
479146035553Spatrick    typedef _BinaryOp<__pow_expr<value_type>, _Expr1, _Expr2> _Op;
479246035553Spatrick    return __val_expr<_Op>(_Op(__pow_expr<value_type>(), __x, __y));
479346035553Spatrick}
479446035553Spatrick
479546035553Spatricktemplate<class _Expr>
479646035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
479746035553Spatricktypename enable_if
479846035553Spatrick<
479946035553Spatrick    __is_val_expr<_Expr>::value,
480046035553Spatrick    __val_expr<_BinaryOp<__pow_expr<typename _Expr::value_type>,
480146035553Spatrick               _Expr, __scalar_expr<typename _Expr::value_type> > >
480246035553Spatrick>::type
480346035553Spatrickpow(const _Expr& __x, const typename _Expr::value_type& __y)
480446035553Spatrick{
480546035553Spatrick    typedef typename _Expr::value_type value_type;
480646035553Spatrick    typedef _BinaryOp<__pow_expr<value_type>, _Expr, __scalar_expr<value_type> > _Op;
480746035553Spatrick    return __val_expr<_Op>(_Op(__pow_expr<value_type>(),
480846035553Spatrick                           __x, __scalar_expr<value_type>(__y, __x.size())));
480946035553Spatrick}
481046035553Spatrick
481146035553Spatricktemplate<class _Expr>
481246035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
481346035553Spatricktypename enable_if
481446035553Spatrick<
481546035553Spatrick    __is_val_expr<_Expr>::value,
481646035553Spatrick    __val_expr<_BinaryOp<__pow_expr<typename _Expr::value_type>,
481746035553Spatrick               __scalar_expr<typename _Expr::value_type>, _Expr> >
481846035553Spatrick>::type
481946035553Spatrickpow(const typename _Expr::value_type& __x, const _Expr& __y)
482046035553Spatrick{
482146035553Spatrick    typedef typename _Expr::value_type value_type;
482246035553Spatrick    typedef _BinaryOp<__pow_expr<value_type>, __scalar_expr<value_type>, _Expr> _Op;
482346035553Spatrick    return __val_expr<_Op>(_Op(__pow_expr<value_type>(),
482446035553Spatrick                           __scalar_expr<value_type>(__x, __y.size()), __y));
482546035553Spatrick}
482646035553Spatrick
482746035553Spatricktemplate<class _Expr>
482846035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
482946035553Spatricktypename enable_if
483046035553Spatrick<
483146035553Spatrick    __is_val_expr<_Expr>::value,
483246035553Spatrick    __val_expr<_UnaryOp<__sin_expr<typename _Expr::value_type>, _Expr> >
483346035553Spatrick>::type
483446035553Spatricksin(const _Expr& __x)
483546035553Spatrick{
483646035553Spatrick    typedef typename _Expr::value_type value_type;
483746035553Spatrick    typedef _UnaryOp<__sin_expr<value_type>, _Expr> _Op;
483846035553Spatrick    return __val_expr<_Op>(_Op(__sin_expr<value_type>(), __x));
483946035553Spatrick}
484046035553Spatrick
484146035553Spatricktemplate<class _Expr>
484246035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
484346035553Spatricktypename enable_if
484446035553Spatrick<
484546035553Spatrick    __is_val_expr<_Expr>::value,
484646035553Spatrick    __val_expr<_UnaryOp<__sinh_expr<typename _Expr::value_type>, _Expr> >
484746035553Spatrick>::type
484846035553Spatricksinh(const _Expr& __x)
484946035553Spatrick{
485046035553Spatrick    typedef typename _Expr::value_type value_type;
485146035553Spatrick    typedef _UnaryOp<__sinh_expr<value_type>, _Expr> _Op;
485246035553Spatrick    return __val_expr<_Op>(_Op(__sinh_expr<value_type>(), __x));
485346035553Spatrick}
485446035553Spatrick
485546035553Spatricktemplate<class _Expr>
485646035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
485746035553Spatricktypename enable_if
485846035553Spatrick<
485946035553Spatrick    __is_val_expr<_Expr>::value,
486046035553Spatrick    __val_expr<_UnaryOp<__sqrt_expr<typename _Expr::value_type>, _Expr> >
486146035553Spatrick>::type
486246035553Spatricksqrt(const _Expr& __x)
486346035553Spatrick{
486446035553Spatrick    typedef typename _Expr::value_type value_type;
486546035553Spatrick    typedef _UnaryOp<__sqrt_expr<value_type>, _Expr> _Op;
486646035553Spatrick    return __val_expr<_Op>(_Op(__sqrt_expr<value_type>(), __x));
486746035553Spatrick}
486846035553Spatrick
486946035553Spatricktemplate<class _Expr>
487046035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
487146035553Spatricktypename enable_if
487246035553Spatrick<
487346035553Spatrick    __is_val_expr<_Expr>::value,
487446035553Spatrick    __val_expr<_UnaryOp<__tan_expr<typename _Expr::value_type>, _Expr> >
487546035553Spatrick>::type
487646035553Spatricktan(const _Expr& __x)
487746035553Spatrick{
487846035553Spatrick    typedef typename _Expr::value_type value_type;
487946035553Spatrick    typedef _UnaryOp<__tan_expr<value_type>, _Expr> _Op;
488046035553Spatrick    return __val_expr<_Op>(_Op(__tan_expr<value_type>(), __x));
488146035553Spatrick}
488246035553Spatrick
488346035553Spatricktemplate<class _Expr>
488446035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
488546035553Spatricktypename enable_if
488646035553Spatrick<
488746035553Spatrick    __is_val_expr<_Expr>::value,
488846035553Spatrick    __val_expr<_UnaryOp<__tanh_expr<typename _Expr::value_type>, _Expr> >
488946035553Spatrick>::type
489046035553Spatricktanh(const _Expr& __x)
489146035553Spatrick{
489246035553Spatrick    typedef typename _Expr::value_type value_type;
489346035553Spatrick    typedef _UnaryOp<__tanh_expr<value_type>, _Expr> _Op;
489446035553Spatrick    return __val_expr<_Op>(_Op(__tanh_expr<value_type>(), __x));
489546035553Spatrick}
489646035553Spatrick
489746035553Spatricktemplate <class _Tp>
489846035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
489946035553Spatrick_Tp*
490046035553Spatrickbegin(valarray<_Tp>& __v)
490146035553Spatrick{
490246035553Spatrick    return __v.__begin_;
490346035553Spatrick}
490446035553Spatrick
490546035553Spatricktemplate <class _Tp>
490646035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
490746035553Spatrickconst _Tp*
490846035553Spatrickbegin(const valarray<_Tp>& __v)
490946035553Spatrick{
491046035553Spatrick    return __v.__begin_;
491146035553Spatrick}
491246035553Spatrick
491346035553Spatricktemplate <class _Tp>
491446035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
491546035553Spatrick_Tp*
491646035553Spatrickend(valarray<_Tp>& __v)
491746035553Spatrick{
491846035553Spatrick    return __v.__end_;
491946035553Spatrick}
492046035553Spatrick
492146035553Spatricktemplate <class _Tp>
492246035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
492346035553Spatrickconst _Tp*
492446035553Spatrickend(const valarray<_Tp>& __v)
492546035553Spatrick{
492646035553Spatrick    return __v.__end_;
492746035553Spatrick}
492846035553Spatrick
492946035553Spatrick_LIBCPP_END_NAMESPACE_STD
493046035553Spatrick
493146035553Spatrick_LIBCPP_POP_MACROS
493246035553Spatrick
4933*4bdff4beSrobert#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
4934*4bdff4beSrobert#  include <algorithm>
4935*4bdff4beSrobert#  include <concepts>
4936*4bdff4beSrobert#  include <cstring>
4937*4bdff4beSrobert#  include <functional>
4938*4bdff4beSrobert#endif
4939*4bdff4beSrobert
494046035553Spatrick#endif // _LIBCPP_VALARRAY
4941