xref: /llvm-project/libcxx/include/__cxx03/valarray (revision ce7771902dc50d900de639d499a60486b83f70e0)
1e78f53d1SNikolas Klauser// -*- C++ -*-
2e78f53d1SNikolas Klauser//===----------------------------------------------------------------------===//
3e78f53d1SNikolas Klauser//
4e78f53d1SNikolas Klauser// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5e78f53d1SNikolas Klauser// See https://llvm.org/LICENSE.txt for license information.
6e78f53d1SNikolas Klauser// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7e78f53d1SNikolas Klauser//
8e78f53d1SNikolas Klauser//===----------------------------------------------------------------------===//
9e78f53d1SNikolas Klauser
10*ce777190SNikolas Klauser#ifndef _LIBCPP___CXX03_VALARRAY
11*ce777190SNikolas Klauser#define _LIBCPP___CXX03_VALARRAY
12e78f53d1SNikolas Klauser
13e78f53d1SNikolas Klauser/*
14e78f53d1SNikolas Klauser    valarray synopsis
15e78f53d1SNikolas Klauser
16e78f53d1SNikolas Klausernamespace std
17e78f53d1SNikolas Klauser{
18e78f53d1SNikolas Klauser
19e78f53d1SNikolas Klausertemplate<class T>
20e78f53d1SNikolas Klauserclass valarray
21e78f53d1SNikolas Klauser{
22e78f53d1SNikolas Klauserpublic:
23e78f53d1SNikolas Klauser    typedef T value_type;
24e78f53d1SNikolas Klauser
25e78f53d1SNikolas Klauser    // construct/destroy:
26e78f53d1SNikolas Klauser    valarray();
27e78f53d1SNikolas Klauser    explicit valarray(size_t n);
28e78f53d1SNikolas Klauser    valarray(const value_type& x, size_t n);
29e78f53d1SNikolas Klauser    valarray(const value_type* px, size_t n);
30e78f53d1SNikolas Klauser    valarray(const valarray& v);
31e78f53d1SNikolas Klauser    valarray(valarray&& v) noexcept;
32e78f53d1SNikolas Klauser    valarray(const slice_array<value_type>& sa);
33e78f53d1SNikolas Klauser    valarray(const gslice_array<value_type>& ga);
34e78f53d1SNikolas Klauser    valarray(const mask_array<value_type>& ma);
35e78f53d1SNikolas Klauser    valarray(const indirect_array<value_type>& ia);
36e78f53d1SNikolas Klauser    valarray(initializer_list<value_type> il);
37e78f53d1SNikolas Klauser    ~valarray();
38e78f53d1SNikolas Klauser
39e78f53d1SNikolas Klauser    // assignment:
40e78f53d1SNikolas Klauser    valarray& operator=(const valarray& v);
41e78f53d1SNikolas Klauser    valarray& operator=(valarray&& v) noexcept;
42e78f53d1SNikolas Klauser    valarray& operator=(initializer_list<value_type> il);
43e78f53d1SNikolas Klauser    valarray& operator=(const value_type& x);
44e78f53d1SNikolas Klauser    valarray& operator=(const slice_array<value_type>& sa);
45e78f53d1SNikolas Klauser    valarray& operator=(const gslice_array<value_type>& ga);
46e78f53d1SNikolas Klauser    valarray& operator=(const mask_array<value_type>& ma);
47e78f53d1SNikolas Klauser    valarray& operator=(const indirect_array<value_type>& ia);
48e78f53d1SNikolas Klauser
49e78f53d1SNikolas Klauser    // element access:
50e78f53d1SNikolas Klauser    const value_type& operator[](size_t i) const;
51e78f53d1SNikolas Klauser    value_type&       operator[](size_t i);
52e78f53d1SNikolas Klauser
53e78f53d1SNikolas Klauser    // subset operations:
54e78f53d1SNikolas Klauser    valarray                   operator[](slice s) const;
55e78f53d1SNikolas Klauser    slice_array<value_type>    operator[](slice s);
56e78f53d1SNikolas Klauser    valarray                   operator[](const gslice& gs) const;
57e78f53d1SNikolas Klauser    gslice_array<value_type>   operator[](const gslice& gs);
58e78f53d1SNikolas Klauser    valarray                   operator[](const valarray<bool>& vb) const;
59e78f53d1SNikolas Klauser    mask_array<value_type>     operator[](const valarray<bool>& vb);
60e78f53d1SNikolas Klauser    valarray                   operator[](const valarray<size_t>& vs) const;
61e78f53d1SNikolas Klauser    indirect_array<value_type> operator[](const valarray<size_t>& vs);
62e78f53d1SNikolas Klauser
63e78f53d1SNikolas Klauser    // unary operators:
64e78f53d1SNikolas Klauser    valarray       operator+() const;
65e78f53d1SNikolas Klauser    valarray       operator-() const;
66e78f53d1SNikolas Klauser    valarray       operator~() const;
67e78f53d1SNikolas Klauser    valarray<bool> operator!() const;
68e78f53d1SNikolas Klauser
69e78f53d1SNikolas Klauser    // computed assignment:
70e78f53d1SNikolas Klauser    valarray& operator*= (const value_type& x);
71e78f53d1SNikolas Klauser    valarray& operator/= (const value_type& x);
72e78f53d1SNikolas Klauser    valarray& operator%= (const value_type& x);
73e78f53d1SNikolas Klauser    valarray& operator+= (const value_type& x);
74e78f53d1SNikolas Klauser    valarray& operator-= (const value_type& x);
75e78f53d1SNikolas Klauser    valarray& operator^= (const value_type& x);
76e78f53d1SNikolas Klauser    valarray& operator&= (const value_type& x);
77e78f53d1SNikolas Klauser    valarray& operator|= (const value_type& x);
78e78f53d1SNikolas Klauser    valarray& operator<<=(const value_type& x);
79e78f53d1SNikolas Klauser    valarray& operator>>=(const value_type& x);
80e78f53d1SNikolas Klauser
81e78f53d1SNikolas Klauser    valarray& operator*= (const valarray& v);
82e78f53d1SNikolas Klauser    valarray& operator/= (const valarray& v);
83e78f53d1SNikolas Klauser    valarray& operator%= (const valarray& v);
84e78f53d1SNikolas Klauser    valarray& operator+= (const valarray& v);
85e78f53d1SNikolas Klauser    valarray& operator-= (const valarray& v);
86e78f53d1SNikolas Klauser    valarray& operator^= (const valarray& v);
87e78f53d1SNikolas Klauser    valarray& operator|= (const valarray& v);
88e78f53d1SNikolas Klauser    valarray& operator&= (const valarray& v);
89e78f53d1SNikolas Klauser    valarray& operator<<=(const valarray& v);
90e78f53d1SNikolas Klauser    valarray& operator>>=(const valarray& v);
91e78f53d1SNikolas Klauser
92e78f53d1SNikolas Klauser    // member functions:
93e78f53d1SNikolas Klauser    void swap(valarray& v) noexcept;
94e78f53d1SNikolas Klauser
95e78f53d1SNikolas Klauser    size_t size() const;
96e78f53d1SNikolas Klauser
97e78f53d1SNikolas Klauser    value_type sum() const;
98e78f53d1SNikolas Klauser    value_type min() const;
99e78f53d1SNikolas Klauser    value_type max() const;
100e78f53d1SNikolas Klauser
101e78f53d1SNikolas Klauser    valarray shift (int i) const;
102e78f53d1SNikolas Klauser    valarray cshift(int i) const;
103e78f53d1SNikolas Klauser    valarray apply(value_type f(value_type)) const;
104e78f53d1SNikolas Klauser    valarray apply(value_type f(const value_type&)) const;
105e78f53d1SNikolas Klauser    void resize(size_t n, value_type x = value_type());
106e78f53d1SNikolas Klauser};
107e78f53d1SNikolas Klauser
108e78f53d1SNikolas Klausertemplate<class T, size_t cnt> valarray(const T(&)[cnt], size_t) -> valarray<T>;
109e78f53d1SNikolas Klauser
110e78f53d1SNikolas Klauserclass slice
111e78f53d1SNikolas Klauser{
112e78f53d1SNikolas Klauserpublic:
113e78f53d1SNikolas Klauser    slice();
114e78f53d1SNikolas Klauser    slice(size_t start, size_t size, size_t stride);
115e78f53d1SNikolas Klauser
116e78f53d1SNikolas Klauser    size_t start()  const;
117e78f53d1SNikolas Klauser    size_t size()   const;
118e78f53d1SNikolas Klauser    size_t stride() const;
119e78f53d1SNikolas Klauser
120e78f53d1SNikolas Klauser    friend bool operator==(const slice& x, const slice& y); // since C++20
121e78f53d1SNikolas Klauser};
122e78f53d1SNikolas Klauser
123e78f53d1SNikolas Klausertemplate <class T>
124e78f53d1SNikolas Klauserclass slice_array
125e78f53d1SNikolas Klauser{
126e78f53d1SNikolas Klauserpublic:
127e78f53d1SNikolas Klauser    typedef T value_type;
128e78f53d1SNikolas Klauser
129e78f53d1SNikolas Klauser    const slice_array& operator=(const slice_array& sa) const;
130e78f53d1SNikolas Klauser    void operator=  (const valarray<value_type>& v) const;
131e78f53d1SNikolas Klauser    void operator*= (const valarray<value_type>& v) const;
132e78f53d1SNikolas Klauser    void operator/= (const valarray<value_type>& v) const;
133e78f53d1SNikolas Klauser    void operator%= (const valarray<value_type>& v) const;
134e78f53d1SNikolas Klauser    void operator+= (const valarray<value_type>& v) const;
135e78f53d1SNikolas Klauser    void operator-= (const valarray<value_type>& v) const;
136e78f53d1SNikolas Klauser    void operator^= (const valarray<value_type>& v) const;
137e78f53d1SNikolas Klauser    void operator&= (const valarray<value_type>& v) const;
138e78f53d1SNikolas Klauser    void operator|= (const valarray<value_type>& v) const;
139e78f53d1SNikolas Klauser    void operator<<=(const valarray<value_type>& v) const;
140e78f53d1SNikolas Klauser    void operator>>=(const valarray<value_type>& v) const;
141e78f53d1SNikolas Klauser
142e78f53d1SNikolas Klauser    void operator=(const value_type& x) const;
143e78f53d1SNikolas Klauser    void operator=(const valarray<T>& val_arr) const;
144e78f53d1SNikolas Klauser
145e78f53d1SNikolas Klauser    slice_array() = delete;
146e78f53d1SNikolas Klauser};
147e78f53d1SNikolas Klauser
148e78f53d1SNikolas Klauserclass gslice
149e78f53d1SNikolas Klauser{
150e78f53d1SNikolas Klauserpublic:
151e78f53d1SNikolas Klauser    gslice();
152e78f53d1SNikolas Klauser    gslice(size_t start, const valarray<size_t>& size,
153e78f53d1SNikolas Klauser                         const valarray<size_t>& stride);
154e78f53d1SNikolas Klauser
155e78f53d1SNikolas Klauser    size_t           start()  const;
156e78f53d1SNikolas Klauser    valarray<size_t> size()   const;
157e78f53d1SNikolas Klauser    valarray<size_t> stride() const;
158e78f53d1SNikolas Klauser};
159e78f53d1SNikolas Klauser
160e78f53d1SNikolas Klausertemplate <class T>
161e78f53d1SNikolas Klauserclass gslice_array
162e78f53d1SNikolas Klauser{
163e78f53d1SNikolas Klauserpublic:
164e78f53d1SNikolas Klauser    typedef T value_type;
165e78f53d1SNikolas Klauser
166e78f53d1SNikolas Klauser    void operator=  (const valarray<value_type>& v) const;
167e78f53d1SNikolas Klauser    void operator*= (const valarray<value_type>& v) const;
168e78f53d1SNikolas Klauser    void operator/= (const valarray<value_type>& v) const;
169e78f53d1SNikolas Klauser    void operator%= (const valarray<value_type>& v) const;
170e78f53d1SNikolas Klauser    void operator+= (const valarray<value_type>& v) const;
171e78f53d1SNikolas Klauser    void operator-= (const valarray<value_type>& v) const;
172e78f53d1SNikolas Klauser    void operator^= (const valarray<value_type>& v) const;
173e78f53d1SNikolas Klauser    void operator&= (const valarray<value_type>& v) const;
174e78f53d1SNikolas Klauser    void operator|= (const valarray<value_type>& v) const;
175e78f53d1SNikolas Klauser    void operator<<=(const valarray<value_type>& v) const;
176e78f53d1SNikolas Klauser    void operator>>=(const valarray<value_type>& v) const;
177e78f53d1SNikolas Klauser
178e78f53d1SNikolas Klauser    gslice_array(const gslice_array& ga);
179e78f53d1SNikolas Klauser    ~gslice_array();
180e78f53d1SNikolas Klauser    const gslice_array& operator=(const gslice_array& ga) const;
181e78f53d1SNikolas Klauser    void operator=(const value_type& x) const;
182e78f53d1SNikolas Klauser
183e78f53d1SNikolas Klauser    gslice_array() = delete;
184e78f53d1SNikolas Klauser};
185e78f53d1SNikolas Klauser
186e78f53d1SNikolas Klausertemplate <class T>
187e78f53d1SNikolas Klauserclass mask_array
188e78f53d1SNikolas Klauser{
189e78f53d1SNikolas Klauserpublic:
190e78f53d1SNikolas Klauser    typedef T value_type;
191e78f53d1SNikolas Klauser
192e78f53d1SNikolas Klauser    void operator=  (const valarray<value_type>& v) const;
193e78f53d1SNikolas Klauser    void operator*= (const valarray<value_type>& v) const;
194e78f53d1SNikolas Klauser    void operator/= (const valarray<value_type>& v) const;
195e78f53d1SNikolas Klauser    void operator%= (const valarray<value_type>& v) const;
196e78f53d1SNikolas Klauser    void operator+= (const valarray<value_type>& v) const;
197e78f53d1SNikolas Klauser    void operator-= (const valarray<value_type>& v) const;
198e78f53d1SNikolas Klauser    void operator^= (const valarray<value_type>& v) const;
199e78f53d1SNikolas Klauser    void operator&= (const valarray<value_type>& v) const;
200e78f53d1SNikolas Klauser    void operator|= (const valarray<value_type>& v) const;
201e78f53d1SNikolas Klauser    void operator<<=(const valarray<value_type>& v) const;
202e78f53d1SNikolas Klauser    void operator>>=(const valarray<value_type>& v) const;
203e78f53d1SNikolas Klauser
204e78f53d1SNikolas Klauser    mask_array(const mask_array& ma);
205e78f53d1SNikolas Klauser    ~mask_array();
206e78f53d1SNikolas Klauser    const mask_array& operator=(const mask_array& ma) const;
207e78f53d1SNikolas Klauser    void operator=(const value_type& x) const;
208e78f53d1SNikolas Klauser
209e78f53d1SNikolas Klauser    mask_array() = delete;
210e78f53d1SNikolas Klauser};
211e78f53d1SNikolas Klauser
212e78f53d1SNikolas Klausertemplate <class T>
213e78f53d1SNikolas Klauserclass indirect_array
214e78f53d1SNikolas Klauser{
215e78f53d1SNikolas Klauserpublic:
216e78f53d1SNikolas Klauser    typedef T value_type;
217e78f53d1SNikolas Klauser
218e78f53d1SNikolas Klauser    void operator=  (const valarray<value_type>& v) const;
219e78f53d1SNikolas Klauser    void operator*= (const valarray<value_type>& v) const;
220e78f53d1SNikolas Klauser    void operator/= (const valarray<value_type>& v) const;
221e78f53d1SNikolas Klauser    void operator%= (const valarray<value_type>& v) const;
222e78f53d1SNikolas Klauser    void operator+= (const valarray<value_type>& v) const;
223e78f53d1SNikolas Klauser    void operator-= (const valarray<value_type>& v) const;
224e78f53d1SNikolas Klauser    void operator^= (const valarray<value_type>& v) const;
225e78f53d1SNikolas Klauser    void operator&= (const valarray<value_type>& v) const;
226e78f53d1SNikolas Klauser    void operator|= (const valarray<value_type>& v) const;
227e78f53d1SNikolas Klauser    void operator<<=(const valarray<value_type>& v) const;
228e78f53d1SNikolas Klauser    void operator>>=(const valarray<value_type>& v) const;
229e78f53d1SNikolas Klauser
230e78f53d1SNikolas Klauser    indirect_array(const indirect_array& ia);
231e78f53d1SNikolas Klauser    ~indirect_array();
232e78f53d1SNikolas Klauser    const indirect_array& operator=(const indirect_array& ia) const;
233e78f53d1SNikolas Klauser    void operator=(const value_type& x) const;
234e78f53d1SNikolas Klauser
235e78f53d1SNikolas Klauser    indirect_array() = delete;
236e78f53d1SNikolas Klauser};
237e78f53d1SNikolas Klauser
238e78f53d1SNikolas Klausertemplate<class T> void swap(valarray<T>& x, valarray<T>& y) noexcept;
239e78f53d1SNikolas Klauser
240e78f53d1SNikolas Klausertemplate<class T> valarray<T> operator* (const valarray<T>& x, const valarray<T>& y);
241e78f53d1SNikolas Klausertemplate<class T> valarray<T> operator* (const valarray<T>& x, const T& y);
242e78f53d1SNikolas Klausertemplate<class T> valarray<T> operator* (const T& x, const valarray<T>& y);
243e78f53d1SNikolas Klauser
244e78f53d1SNikolas Klausertemplate<class T> valarray<T> operator/ (const valarray<T>& x, const valarray<T>& y);
245e78f53d1SNikolas Klausertemplate<class T> valarray<T> operator/ (const valarray<T>& x, const T& y);
246e78f53d1SNikolas Klausertemplate<class T> valarray<T> operator/ (const T& x, const valarray<T>& y);
247e78f53d1SNikolas Klauser
248e78f53d1SNikolas Klausertemplate<class T> valarray<T> operator% (const valarray<T>& x, const valarray<T>& y);
249e78f53d1SNikolas Klausertemplate<class T> valarray<T> operator% (const valarray<T>& x, const T& y);
250e78f53d1SNikolas Klausertemplate<class T> valarray<T> operator% (const T& x, const valarray<T>& y);
251e78f53d1SNikolas Klauser
252e78f53d1SNikolas Klausertemplate<class T> valarray<T> operator+ (const valarray<T>& x, const valarray<T>& y);
253e78f53d1SNikolas Klausertemplate<class T> valarray<T> operator+ (const valarray<T>& x, const T& y);
254e78f53d1SNikolas Klausertemplate<class T> valarray<T> operator+ (const T& x, const valarray<T>& y);
255e78f53d1SNikolas Klauser
256e78f53d1SNikolas Klausertemplate<class T> valarray<T> operator- (const valarray<T>& x, const valarray<T>& y);
257e78f53d1SNikolas Klausertemplate<class T> valarray<T> operator- (const valarray<T>& x, const T& y);
258e78f53d1SNikolas Klausertemplate<class T> valarray<T> operator- (const T& x, const valarray<T>& y);
259e78f53d1SNikolas Klauser
260e78f53d1SNikolas Klausertemplate<class T> valarray<T> operator^ (const valarray<T>& x, const valarray<T>& y);
261e78f53d1SNikolas Klausertemplate<class T> valarray<T> operator^ (const valarray<T>& x, const T& y);
262e78f53d1SNikolas Klausertemplate<class T> valarray<T> operator^ (const T& x, const valarray<T>& y);
263e78f53d1SNikolas Klauser
264e78f53d1SNikolas Klausertemplate<class T> valarray<T> operator& (const valarray<T>& x, const valarray<T>& y);
265e78f53d1SNikolas Klausertemplate<class T> valarray<T> operator& (const valarray<T>& x, const T& y);
266e78f53d1SNikolas Klausertemplate<class T> valarray<T> operator& (const T& x, const valarray<T>& y);
267e78f53d1SNikolas Klauser
268e78f53d1SNikolas Klausertemplate<class T> valarray<T> operator| (const valarray<T>& x, const valarray<T>& y);
269e78f53d1SNikolas Klausertemplate<class T> valarray<T> operator| (const valarray<T>& x, const T& y);
270e78f53d1SNikolas Klausertemplate<class T> valarray<T> operator| (const T& x, const valarray<T>& y);
271e78f53d1SNikolas Klauser
272e78f53d1SNikolas Klausertemplate<class T> valarray<T> operator<<(const valarray<T>& x, const valarray<T>& y);
273e78f53d1SNikolas Klausertemplate<class T> valarray<T> operator<<(const valarray<T>& x, const T& y);
274e78f53d1SNikolas Klausertemplate<class T> valarray<T> operator<<(const T& x, const valarray<T>& y);
275e78f53d1SNikolas Klauser
276e78f53d1SNikolas Klausertemplate<class T> valarray<T> operator>>(const valarray<T>& x, const valarray<T>& y);
277e78f53d1SNikolas Klausertemplate<class T> valarray<T> operator>>(const valarray<T>& x, const T& y);
278e78f53d1SNikolas Klausertemplate<class T> valarray<T> operator>>(const T& x, const valarray<T>& y);
279e78f53d1SNikolas Klauser
280e78f53d1SNikolas Klausertemplate<class T> valarray<bool> operator&&(const valarray<T>& x, const valarray<T>& y);
281e78f53d1SNikolas Klausertemplate<class T> valarray<bool> operator&&(const valarray<T>& x, const T& y);
282e78f53d1SNikolas Klausertemplate<class T> valarray<bool> operator&&(const T& x, const valarray<T>& y);
283e78f53d1SNikolas Klauser
284e78f53d1SNikolas Klausertemplate<class T> valarray<bool> operator||(const valarray<T>& x, const valarray<T>& y);
285e78f53d1SNikolas Klausertemplate<class T> valarray<bool> operator||(const valarray<T>& x, const T& y);
286e78f53d1SNikolas Klausertemplate<class T> valarray<bool> operator||(const T& x, const valarray<T>& y);
287e78f53d1SNikolas Klauser
288e78f53d1SNikolas Klausertemplate<class T> valarray<bool> operator==(const valarray<T>& x, const valarray<T>& y);
289e78f53d1SNikolas Klausertemplate<class T> valarray<bool> operator==(const valarray<T>& x, const T& y);
290e78f53d1SNikolas Klausertemplate<class T> valarray<bool> operator==(const T& x, const valarray<T>& y);
291e78f53d1SNikolas Klauser
292e78f53d1SNikolas Klausertemplate<class T> valarray<bool> operator!=(const valarray<T>& x, const valarray<T>& y);
293e78f53d1SNikolas Klausertemplate<class T> valarray<bool> operator!=(const valarray<T>& x, const T& y);
294e78f53d1SNikolas Klausertemplate<class T> valarray<bool> operator!=(const T& x, const valarray<T>& y);
295e78f53d1SNikolas Klauser
296e78f53d1SNikolas Klausertemplate<class T> valarray<bool> operator< (const valarray<T>& x, const valarray<T>& y);
297e78f53d1SNikolas Klausertemplate<class T> valarray<bool> operator< (const valarray<T>& x, const T& y);
298e78f53d1SNikolas Klausertemplate<class T> valarray<bool> operator< (const T& x, const valarray<T>& y);
299e78f53d1SNikolas Klauser
300e78f53d1SNikolas Klausertemplate<class T> valarray<bool> operator> (const valarray<T>& x, const valarray<T>& y);
301e78f53d1SNikolas Klausertemplate<class T> valarray<bool> operator> (const valarray<T>& x, const T& y);
302e78f53d1SNikolas Klausertemplate<class T> valarray<bool> operator> (const T& x, const valarray<T>& y);
303e78f53d1SNikolas Klauser
304e78f53d1SNikolas Klausertemplate<class T> valarray<bool> operator<=(const valarray<T>& x, const valarray<T>& y);
305e78f53d1SNikolas Klausertemplate<class T> valarray<bool> operator<=(const valarray<T>& x, const T& y);
306e78f53d1SNikolas Klausertemplate<class T> valarray<bool> operator<=(const T& x, const valarray<T>& y);
307e78f53d1SNikolas Klauser
308e78f53d1SNikolas Klausertemplate<class T> valarray<bool> operator>=(const valarray<T>& x, const valarray<T>& y);
309e78f53d1SNikolas Klausertemplate<class T> valarray<bool> operator>=(const valarray<T>& x, const T& y);
310e78f53d1SNikolas Klausertemplate<class T> valarray<bool> operator>=(const T& x, const valarray<T>& y);
311e78f53d1SNikolas Klauser
312e78f53d1SNikolas Klausertemplate<class T> valarray<T> abs (const valarray<T>& x);
313e78f53d1SNikolas Klausertemplate<class T> valarray<T> acos (const valarray<T>& x);
314e78f53d1SNikolas Klausertemplate<class T> valarray<T> asin (const valarray<T>& x);
315e78f53d1SNikolas Klausertemplate<class T> valarray<T> atan (const valarray<T>& x);
316e78f53d1SNikolas Klauser
317e78f53d1SNikolas Klausertemplate<class T> valarray<T> atan2(const valarray<T>& x, const valarray<T>& y);
318e78f53d1SNikolas Klausertemplate<class T> valarray<T> atan2(const valarray<T>& x, const T& y);
319e78f53d1SNikolas Klausertemplate<class T> valarray<T> atan2(const T& x, const valarray<T>& y);
320e78f53d1SNikolas Klauser
321e78f53d1SNikolas Klausertemplate<class T> valarray<T> cos (const valarray<T>& x);
322e78f53d1SNikolas Klausertemplate<class T> valarray<T> cosh (const valarray<T>& x);
323e78f53d1SNikolas Klausertemplate<class T> valarray<T> exp (const valarray<T>& x);
324e78f53d1SNikolas Klausertemplate<class T> valarray<T> log (const valarray<T>& x);
325e78f53d1SNikolas Klausertemplate<class T> valarray<T> log10(const valarray<T>& x);
326e78f53d1SNikolas Klauser
327e78f53d1SNikolas Klausertemplate<class T> valarray<T> pow(const valarray<T>& x, const valarray<T>& y);
328e78f53d1SNikolas Klausertemplate<class T> valarray<T> pow(const valarray<T>& x, const T& y);
329e78f53d1SNikolas Klausertemplate<class T> valarray<T> pow(const T& x, const valarray<T>& y);
330e78f53d1SNikolas Klauser
331e78f53d1SNikolas Klausertemplate<class T> valarray<T> sin (const valarray<T>& x);
332e78f53d1SNikolas Klausertemplate<class T> valarray<T> sinh (const valarray<T>& x);
333e78f53d1SNikolas Klausertemplate<class T> valarray<T> sqrt (const valarray<T>& x);
334e78f53d1SNikolas Klausertemplate<class T> valarray<T> tan (const valarray<T>& x);
335e78f53d1SNikolas Klausertemplate<class T> valarray<T> tanh (const valarray<T>& x);
336e78f53d1SNikolas Klauser
337e78f53d1SNikolas Klausertemplate <class T> unspecified1 begin(valarray<T>& v);
338e78f53d1SNikolas Klausertemplate <class T> unspecified2 begin(const valarray<T>& v);
339e78f53d1SNikolas Klausertemplate <class T> unspecified1 end(valarray<T>& v);
340e78f53d1SNikolas Klausertemplate <class T> unspecified2 end(const valarray<T>& v);
341e78f53d1SNikolas Klauser
342e78f53d1SNikolas Klauser}  // std
343e78f53d1SNikolas Klauser
344e78f53d1SNikolas Klauser*/
345e78f53d1SNikolas Klauser
34673fbae83SNikolas Klauser#include <__cxx03/__algorithm/copy.h>
34773fbae83SNikolas Klauser#include <__cxx03/__algorithm/count.h>
34873fbae83SNikolas Klauser#include <__cxx03/__algorithm/fill.h>
34973fbae83SNikolas Klauser#include <__cxx03/__algorithm/max_element.h>
35073fbae83SNikolas Klauser#include <__cxx03/__algorithm/min.h>
35173fbae83SNikolas Klauser#include <__cxx03/__algorithm/min_element.h>
35273fbae83SNikolas Klauser#include <__cxx03/__algorithm/unwrap_iter.h>
35373fbae83SNikolas Klauser#include <__cxx03/__assert>
35473fbae83SNikolas Klauser#include <__cxx03/__config>
35573fbae83SNikolas Klauser#include <__cxx03/__functional/operations.h>
35673fbae83SNikolas Klauser#include <__cxx03/__memory/addressof.h>
35773fbae83SNikolas Klauser#include <__cxx03/__memory/allocator.h>
35873fbae83SNikolas Klauser#include <__cxx03/__memory/uninitialized_algorithms.h>
35973fbae83SNikolas Klauser#include <__cxx03/__type_traits/decay.h>
36073fbae83SNikolas Klauser#include <__cxx03/__type_traits/remove_reference.h>
36173fbae83SNikolas Klauser#include <__cxx03/__utility/move.h>
36273fbae83SNikolas Klauser#include <__cxx03/__utility/swap.h>
36373fbae83SNikolas Klauser#include <__cxx03/cmath>
36473fbae83SNikolas Klauser#include <__cxx03/cstddef>
36573fbae83SNikolas Klauser#include <__cxx03/new>
36673fbae83SNikolas Klauser#include <__cxx03/version>
367e78f53d1SNikolas Klauser
368e78f53d1SNikolas Klauser// standard-mandated includes
369e78f53d1SNikolas Klauser
370e78f53d1SNikolas Klauser// [valarray.syn]
37173fbae83SNikolas Klauser#include <__cxx03/initializer_list>
372e78f53d1SNikolas Klauser
373e78f53d1SNikolas Klauser#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
374e78f53d1SNikolas Klauser#  pragma GCC system_header
375e78f53d1SNikolas Klauser#endif
376e78f53d1SNikolas Klauser
377e78f53d1SNikolas Klauser_LIBCPP_PUSH_MACROS
37873fbae83SNikolas Klauser#include <__cxx03/__undef_macros>
379e78f53d1SNikolas Klauser
380e78f53d1SNikolas Klauser_LIBCPP_BEGIN_NAMESPACE_STD
381e78f53d1SNikolas Klauser
382e78f53d1SNikolas Klausertemplate <class _Tp>
383e78f53d1SNikolas Klauserclass _LIBCPP_TEMPLATE_VIS valarray;
384e78f53d1SNikolas Klauser
385e78f53d1SNikolas Klauserclass _LIBCPP_TEMPLATE_VIS slice {
386e78f53d1SNikolas Klauser  size_t __start_;
387e78f53d1SNikolas Klauser  size_t __size_;
388e78f53d1SNikolas Klauser  size_t __stride_;
389e78f53d1SNikolas Klauser
390e78f53d1SNikolas Klauserpublic:
391e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI slice() : __start_(0), __size_(0), __stride_(0) {}
392e78f53d1SNikolas Klauser
393e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI slice(size_t __start, size_t __size, size_t __stride)
394e78f53d1SNikolas Klauser      : __start_(__start), __size_(__size), __stride_(__stride) {}
395e78f53d1SNikolas Klauser
396e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI size_t start() const { return __start_; }
397e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI size_t size() const { return __size_; }
398e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI size_t stride() const { return __stride_; }
399e78f53d1SNikolas Klauser
400e78f53d1SNikolas Klauser#if _LIBCPP_STD_VER >= 20
401e78f53d1SNikolas Klauser
402e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI friend bool operator==(const slice& __x, const slice& __y) {
403e78f53d1SNikolas Klauser    return __x.start() == __y.start() && __x.size() == __y.size() && __x.stride() == __y.stride();
404e78f53d1SNikolas Klauser  }
405e78f53d1SNikolas Klauser
406e78f53d1SNikolas Klauser#endif
407e78f53d1SNikolas Klauser};
408e78f53d1SNikolas Klauser
409e78f53d1SNikolas Klausertemplate <class _Tp>
410e78f53d1SNikolas Klauserclass _LIBCPP_TEMPLATE_VIS slice_array;
411e78f53d1SNikolas Klauserclass _LIBCPP_EXPORTED_FROM_ABI gslice;
412e78f53d1SNikolas Klausertemplate <class _Tp>
413e78f53d1SNikolas Klauserclass _LIBCPP_TEMPLATE_VIS gslice_array;
414e78f53d1SNikolas Klausertemplate <class _Tp>
415e78f53d1SNikolas Klauserclass _LIBCPP_TEMPLATE_VIS mask_array;
416e78f53d1SNikolas Klausertemplate <class _Tp>
417e78f53d1SNikolas Klauserclass _LIBCPP_TEMPLATE_VIS indirect_array;
418e78f53d1SNikolas Klauser
419e78f53d1SNikolas Klausertemplate <class _Tp>
420e78f53d1SNikolas Klauser_LIBCPP_HIDE_FROM_ABI _Tp* begin(valarray<_Tp>& __v);
421e78f53d1SNikolas Klauser
422e78f53d1SNikolas Klausertemplate <class _Tp>
423e78f53d1SNikolas Klauser_LIBCPP_HIDE_FROM_ABI const _Tp* begin(const valarray<_Tp>& __v);
424e78f53d1SNikolas Klauser
425e78f53d1SNikolas Klausertemplate <class _Tp>
426e78f53d1SNikolas Klauser_LIBCPP_HIDE_FROM_ABI _Tp* end(valarray<_Tp>& __v);
427e78f53d1SNikolas Klauser
428e78f53d1SNikolas Klausertemplate <class _Tp>
429e78f53d1SNikolas Klauser_LIBCPP_HIDE_FROM_ABI const _Tp* end(const valarray<_Tp>& __v);
430e78f53d1SNikolas Klauser
431e78f53d1SNikolas Klausertemplate <class _Op, class _A0>
432e78f53d1SNikolas Klauserstruct _UnaryOp {
433e78f53d1SNikolas Klauser  typedef typename _Op::__result_type __result_type;
434e78f53d1SNikolas Klauser  using value_type = __decay_t<__result_type>;
435e78f53d1SNikolas Klauser
436e78f53d1SNikolas Klauser  _Op __op_;
437e78f53d1SNikolas Klauser  _A0 __a0_;
438e78f53d1SNikolas Klauser
439e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI _UnaryOp(const _Op& __op, const _A0& __a0) : __op_(__op), __a0_(__a0) {}
440e78f53d1SNikolas Klauser
441e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI __result_type operator[](size_t __i) const { return __op_(__a0_[__i]); }
442e78f53d1SNikolas Klauser
443e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI size_t size() const { return __a0_.size(); }
444e78f53d1SNikolas Klauser};
445e78f53d1SNikolas Klauser
446e78f53d1SNikolas Klausertemplate <class _Op, class _A0, class _A1>
447e78f53d1SNikolas Klauserstruct _BinaryOp {
448e78f53d1SNikolas Klauser  typedef typename _Op::__result_type __result_type;
449e78f53d1SNikolas Klauser  using value_type = __decay_t<__result_type>;
450e78f53d1SNikolas Klauser
451e78f53d1SNikolas Klauser  _Op __op_;
452e78f53d1SNikolas Klauser  _A0 __a0_;
453e78f53d1SNikolas Klauser  _A1 __a1_;
454e78f53d1SNikolas Klauser
455e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI _BinaryOp(const _Op& __op, const _A0& __a0, const _A1& __a1)
456e78f53d1SNikolas Klauser      : __op_(__op), __a0_(__a0), __a1_(__a1) {}
457e78f53d1SNikolas Klauser
458e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI __result_type operator[](size_t __i) const { return __op_(__a0_[__i], __a1_[__i]); }
459e78f53d1SNikolas Klauser
460e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI size_t size() const { return __a0_.size(); }
461e78f53d1SNikolas Klauser};
462e78f53d1SNikolas Klauser
463e78f53d1SNikolas Klausertemplate <class _Tp>
464e78f53d1SNikolas Klauserclass __scalar_expr {
465e78f53d1SNikolas Klauserpublic:
466e78f53d1SNikolas Klauser  typedef _Tp value_type;
467e78f53d1SNikolas Klauser  typedef const _Tp& __result_type;
468e78f53d1SNikolas Klauser
469e78f53d1SNikolas Klauserprivate:
470e78f53d1SNikolas Klauser  const value_type& __t_;
471e78f53d1SNikolas Klauser  size_t __s_;
472e78f53d1SNikolas Klauser
473e78f53d1SNikolas Klauserpublic:
474e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI explicit __scalar_expr(const value_type& __t, size_t __s) : __t_(__t), __s_(__s) {}
475e78f53d1SNikolas Klauser
476e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI __result_type operator[](size_t) const { return __t_; }
477e78f53d1SNikolas Klauser
478e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI size_t size() const { return __s_; }
479e78f53d1SNikolas Klauser};
480e78f53d1SNikolas Klauser
481e78f53d1SNikolas Klausertemplate <class _Tp>
482e78f53d1SNikolas Klauserstruct __unary_plus {
483e78f53d1SNikolas Klauser  typedef _Tp __result_type;
484e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI _Tp operator()(const _Tp& __x) const { return +__x; }
485e78f53d1SNikolas Klauser};
486e78f53d1SNikolas Klauser
487e78f53d1SNikolas Klausertemplate <class _Tp>
488e78f53d1SNikolas Klauserstruct __bit_not {
489e78f53d1SNikolas Klauser  typedef _Tp __result_type;
490e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI _Tp operator()(const _Tp& __x) const { return ~__x; }
491e78f53d1SNikolas Klauser};
492e78f53d1SNikolas Klauser
493e78f53d1SNikolas Klausertemplate <class _Tp>
494e78f53d1SNikolas Klauserstruct __bit_shift_left {
495e78f53d1SNikolas Klauser  typedef _Tp __result_type;
496e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI _Tp operator()(const _Tp& __x, const _Tp& __y) const { return __x << __y; }
497e78f53d1SNikolas Klauser};
498e78f53d1SNikolas Klauser
499e78f53d1SNikolas Klausertemplate <class _Tp>
500e78f53d1SNikolas Klauserstruct __bit_shift_right {
501e78f53d1SNikolas Klauser  typedef _Tp __result_type;
502e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI _Tp operator()(const _Tp& __x, const _Tp& __y) const { return __x >> __y; }
503e78f53d1SNikolas Klauser};
504e78f53d1SNikolas Klauser
505e78f53d1SNikolas Klausertemplate <class _Tp, class _Fp>
506e78f53d1SNikolas Klauserstruct __apply_expr {
507e78f53d1SNikolas Klauserprivate:
508e78f53d1SNikolas Klauser  _Fp __f_;
509e78f53d1SNikolas Klauser
510e78f53d1SNikolas Klauserpublic:
511e78f53d1SNikolas Klauser  typedef _Tp __result_type;
512e78f53d1SNikolas Klauser
513e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI explicit __apply_expr(_Fp __f) : __f_(__f) {}
514e78f53d1SNikolas Klauser
515e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI _Tp operator()(const _Tp& __x) const { return __f_(__x); }
516e78f53d1SNikolas Klauser};
517e78f53d1SNikolas Klauser
518e78f53d1SNikolas Klausertemplate <class _Tp>
519e78f53d1SNikolas Klauserstruct __abs_expr {
520e78f53d1SNikolas Klauser  typedef _Tp __result_type;
521e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI _Tp operator()(const _Tp& __x) const { return std::abs(__x); }
522e78f53d1SNikolas Klauser};
523e78f53d1SNikolas Klauser
524e78f53d1SNikolas Klausertemplate <class _Tp>
525e78f53d1SNikolas Klauserstruct __acos_expr {
526e78f53d1SNikolas Klauser  typedef _Tp __result_type;
527e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI _Tp operator()(const _Tp& __x) const { return std::acos(__x); }
528e78f53d1SNikolas Klauser};
529e78f53d1SNikolas Klauser
530e78f53d1SNikolas Klausertemplate <class _Tp>
531e78f53d1SNikolas Klauserstruct __asin_expr {
532e78f53d1SNikolas Klauser  typedef _Tp __result_type;
533e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI _Tp operator()(const _Tp& __x) const { return std::asin(__x); }
534e78f53d1SNikolas Klauser};
535e78f53d1SNikolas Klauser
536e78f53d1SNikolas Klausertemplate <class _Tp>
537e78f53d1SNikolas Klauserstruct __atan_expr {
538e78f53d1SNikolas Klauser  typedef _Tp __result_type;
539e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI _Tp operator()(const _Tp& __x) const { return std::atan(__x); }
540e78f53d1SNikolas Klauser};
541e78f53d1SNikolas Klauser
542e78f53d1SNikolas Klausertemplate <class _Tp>
543e78f53d1SNikolas Klauserstruct __atan2_expr {
544e78f53d1SNikolas Klauser  typedef _Tp __result_type;
545e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI _Tp operator()(const _Tp& __x, const _Tp& __y) const { return std::atan2(__x, __y); }
546e78f53d1SNikolas Klauser};
547e78f53d1SNikolas Klauser
548e78f53d1SNikolas Klausertemplate <class _Tp>
549e78f53d1SNikolas Klauserstruct __cos_expr {
550e78f53d1SNikolas Klauser  typedef _Tp __result_type;
551e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI _Tp operator()(const _Tp& __x) const { return std::cos(__x); }
552e78f53d1SNikolas Klauser};
553e78f53d1SNikolas Klauser
554e78f53d1SNikolas Klausertemplate <class _Tp>
555e78f53d1SNikolas Klauserstruct __cosh_expr {
556e78f53d1SNikolas Klauser  typedef _Tp __result_type;
557e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI _Tp operator()(const _Tp& __x) const { return std::cosh(__x); }
558e78f53d1SNikolas Klauser};
559e78f53d1SNikolas Klauser
560e78f53d1SNikolas Klausertemplate <class _Tp>
561e78f53d1SNikolas Klauserstruct __exp_expr {
562e78f53d1SNikolas Klauser  typedef _Tp __result_type;
563e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI _Tp operator()(const _Tp& __x) const { return std::exp(__x); }
564e78f53d1SNikolas Klauser};
565e78f53d1SNikolas Klauser
566e78f53d1SNikolas Klausertemplate <class _Tp>
567e78f53d1SNikolas Klauserstruct __log_expr {
568e78f53d1SNikolas Klauser  typedef _Tp __result_type;
569e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI _Tp operator()(const _Tp& __x) const { return std::log(__x); }
570e78f53d1SNikolas Klauser};
571e78f53d1SNikolas Klauser
572e78f53d1SNikolas Klausertemplate <class _Tp>
573e78f53d1SNikolas Klauserstruct __log10_expr {
574e78f53d1SNikolas Klauser  typedef _Tp __result_type;
575e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI _Tp operator()(const _Tp& __x) const { return std::log10(__x); }
576e78f53d1SNikolas Klauser};
577e78f53d1SNikolas Klauser
578e78f53d1SNikolas Klausertemplate <class _Tp>
579e78f53d1SNikolas Klauserstruct __pow_expr {
580e78f53d1SNikolas Klauser  typedef _Tp __result_type;
581e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI _Tp operator()(const _Tp& __x, const _Tp& __y) const { return std::pow(__x, __y); }
582e78f53d1SNikolas Klauser};
583e78f53d1SNikolas Klauser
584e78f53d1SNikolas Klausertemplate <class _Tp>
585e78f53d1SNikolas Klauserstruct __sin_expr {
586e78f53d1SNikolas Klauser  typedef _Tp __result_type;
587e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI _Tp operator()(const _Tp& __x) const { return std::sin(__x); }
588e78f53d1SNikolas Klauser};
589e78f53d1SNikolas Klauser
590e78f53d1SNikolas Klausertemplate <class _Tp>
591e78f53d1SNikolas Klauserstruct __sinh_expr {
592e78f53d1SNikolas Klauser  typedef _Tp __result_type;
593e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI _Tp operator()(const _Tp& __x) const { return std::sinh(__x); }
594e78f53d1SNikolas Klauser};
595e78f53d1SNikolas Klauser
596e78f53d1SNikolas Klausertemplate <class _Tp>
597e78f53d1SNikolas Klauserstruct __sqrt_expr {
598e78f53d1SNikolas Klauser  typedef _Tp __result_type;
599e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI _Tp operator()(const _Tp& __x) const { return std::sqrt(__x); }
600e78f53d1SNikolas Klauser};
601e78f53d1SNikolas Klauser
602e78f53d1SNikolas Klausertemplate <class _Tp>
603e78f53d1SNikolas Klauserstruct __tan_expr {
604e78f53d1SNikolas Klauser  typedef _Tp __result_type;
605e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI _Tp operator()(const _Tp& __x) const { return std::tan(__x); }
606e78f53d1SNikolas Klauser};
607e78f53d1SNikolas Klauser
608e78f53d1SNikolas Klausertemplate <class _Tp>
609e78f53d1SNikolas Klauserstruct __tanh_expr {
610e78f53d1SNikolas Klauser  typedef _Tp __result_type;
611e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI _Tp operator()(const _Tp& __x) const { return std::tanh(__x); }
612e78f53d1SNikolas Klauser};
613e78f53d1SNikolas Klauser
614e78f53d1SNikolas Klausertemplate <class _ValExpr>
615e78f53d1SNikolas Klauserclass __slice_expr {
616e78f53d1SNikolas Klauser  typedef __libcpp_remove_reference_t<_ValExpr> _RmExpr;
617e78f53d1SNikolas Klauser
618e78f53d1SNikolas Klauserpublic:
619e78f53d1SNikolas Klauser  typedef typename _RmExpr::value_type value_type;
620e78f53d1SNikolas Klauser  typedef value_type __result_type;
621e78f53d1SNikolas Klauser
622e78f53d1SNikolas Klauserprivate:
623e78f53d1SNikolas Klauser  _ValExpr __expr_;
624e78f53d1SNikolas Klauser  size_t __start_;
625e78f53d1SNikolas Klauser  size_t __size_;
626e78f53d1SNikolas Klauser  size_t __stride_;
627e78f53d1SNikolas Klauser
628e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI __slice_expr(const slice& __sl, const _RmExpr& __e)
629e78f53d1SNikolas Klauser      : __expr_(__e), __start_(__sl.start()), __size_(__sl.size()), __stride_(__sl.stride()) {}
630e78f53d1SNikolas Klauser
631e78f53d1SNikolas Klauserpublic:
632e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI __result_type operator[](size_t __i) const { return __expr_[__start_ + __i * __stride_]; }
633e78f53d1SNikolas Klauser
634e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI size_t size() const { return __size_; }
635e78f53d1SNikolas Klauser
636e78f53d1SNikolas Klauser  template <class>
637e78f53d1SNikolas Klauser  friend class __val_expr;
638e78f53d1SNikolas Klauser  template <class>
639e78f53d1SNikolas Klauser  friend class _LIBCPP_TEMPLATE_VIS valarray;
640e78f53d1SNikolas Klauser};
641e78f53d1SNikolas Klauser
642e78f53d1SNikolas Klausertemplate <class _ValExpr>
643e78f53d1SNikolas Klauserclass __mask_expr;
644e78f53d1SNikolas Klauser
645e78f53d1SNikolas Klausertemplate <class _ValExpr>
646e78f53d1SNikolas Klauserclass __indirect_expr;
647e78f53d1SNikolas Klauser
648e78f53d1SNikolas Klausertemplate <class _ValExpr>
649e78f53d1SNikolas Klauserclass __shift_expr {
650e78f53d1SNikolas Klauser  typedef __libcpp_remove_reference_t<_ValExpr> _RmExpr;
651e78f53d1SNikolas Klauser
652e78f53d1SNikolas Klauserpublic:
653e78f53d1SNikolas Klauser  typedef typename _RmExpr::value_type value_type;
654e78f53d1SNikolas Klauser  typedef value_type __result_type;
655e78f53d1SNikolas Klauser
656e78f53d1SNikolas Klauserprivate:
657e78f53d1SNikolas Klauser  _ValExpr __expr_;
658e78f53d1SNikolas Klauser  size_t __size_;
659e78f53d1SNikolas Klauser  ptrdiff_t __ul_;
660e78f53d1SNikolas Klauser  ptrdiff_t __sn_;
661e78f53d1SNikolas Klauser  ptrdiff_t __n_;
662e78f53d1SNikolas Klauser  static const ptrdiff_t _Np = static_cast<ptrdiff_t>(sizeof(ptrdiff_t) * __CHAR_BIT__ - 1);
663e78f53d1SNikolas Klauser
664e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI __shift_expr(int __n, const _RmExpr& __e) : __expr_(__e), __size_(__e.size()), __n_(__n) {
665e78f53d1SNikolas Klauser    ptrdiff_t __neg_n = static_cast<ptrdiff_t>(__n_ >> _Np);
666e78f53d1SNikolas Klauser    __sn_             = __neg_n | static_cast<ptrdiff_t>(static_cast<size_t>(-__n_) >> _Np);
667e78f53d1SNikolas Klauser    __ul_             = ((__size_ - __n_) & ~__neg_n) | ((__n_ + 1) & __neg_n);
668e78f53d1SNikolas Klauser  }
669e78f53d1SNikolas Klauser
670e78f53d1SNikolas Klauserpublic:
671e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI __result_type operator[](size_t __j) const {
672e78f53d1SNikolas Klauser    ptrdiff_t __i = static_cast<ptrdiff_t>(__j);
673e78f53d1SNikolas Klauser    ptrdiff_t __m = (__sn_ * __i - __ul_) >> _Np;
674e78f53d1SNikolas Klauser    return (__expr_[(__i + __n_) & __m] & __m) | (value_type() & ~__m);
675e78f53d1SNikolas Klauser  }
676e78f53d1SNikolas Klauser
677e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI size_t size() const { return __size_; }
678e78f53d1SNikolas Klauser
679e78f53d1SNikolas Klauser  template <class>
680e78f53d1SNikolas Klauser  friend class __val_expr;
681e78f53d1SNikolas Klauser};
682e78f53d1SNikolas Klauser
683e78f53d1SNikolas Klausertemplate <class _ValExpr>
684e78f53d1SNikolas Klauserclass __cshift_expr {
685e78f53d1SNikolas Klauser  typedef __libcpp_remove_reference_t<_ValExpr> _RmExpr;
686e78f53d1SNikolas Klauser
687e78f53d1SNikolas Klauserpublic:
688e78f53d1SNikolas Klauser  typedef typename _RmExpr::value_type value_type;
689e78f53d1SNikolas Klauser  typedef value_type __result_type;
690e78f53d1SNikolas Klauser
691e78f53d1SNikolas Klauserprivate:
692e78f53d1SNikolas Klauser  _ValExpr __expr_;
693e78f53d1SNikolas Klauser  size_t __size_;
694e78f53d1SNikolas Klauser  size_t __m_;
695e78f53d1SNikolas Klauser  size_t __o1_;
696e78f53d1SNikolas Klauser  size_t __o2_;
697e78f53d1SNikolas Klauser
698e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI __cshift_expr(int __n, const _RmExpr& __e) : __expr_(__e), __size_(__e.size()) {
699e78f53d1SNikolas Klauser    __n %= static_cast<int>(__size_);
700e78f53d1SNikolas Klauser    if (__n >= 0) {
701e78f53d1SNikolas Klauser      __m_  = __size_ - __n;
702e78f53d1SNikolas Klauser      __o1_ = __n;
703e78f53d1SNikolas Klauser      __o2_ = __n - __size_;
704e78f53d1SNikolas Klauser    } else {
705e78f53d1SNikolas Klauser      __m_  = -__n;
706e78f53d1SNikolas Klauser      __o1_ = __n + __size_;
707e78f53d1SNikolas Klauser      __o2_ = __n;
708e78f53d1SNikolas Klauser    }
709e78f53d1SNikolas Klauser  }
710e78f53d1SNikolas Klauser
711e78f53d1SNikolas Klauserpublic:
712e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI __result_type operator[](size_t __i) const {
713e78f53d1SNikolas Klauser    if (__i < __m_)
714e78f53d1SNikolas Klauser      return __expr_[__i + __o1_];
715e78f53d1SNikolas Klauser    return __expr_[__i + __o2_];
716e78f53d1SNikolas Klauser  }
717e78f53d1SNikolas Klauser
718e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI size_t size() const { return __size_; }
719e78f53d1SNikolas Klauser
720e78f53d1SNikolas Klauser  template <class>
721e78f53d1SNikolas Klauser  friend class __val_expr;
722e78f53d1SNikolas Klauser};
723e78f53d1SNikolas Klauser
724e78f53d1SNikolas Klausertemplate <class _ValExpr>
725e78f53d1SNikolas Klauserclass __val_expr;
726e78f53d1SNikolas Klauser
727e78f53d1SNikolas Klausertemplate <class _ValExpr>
728e78f53d1SNikolas Klauserstruct __is_val_expr : false_type {};
729e78f53d1SNikolas Klauser
730e78f53d1SNikolas Klausertemplate <class _ValExpr>
731e78f53d1SNikolas Klauserstruct __is_val_expr<__val_expr<_ValExpr> > : true_type {};
732e78f53d1SNikolas Klauser
733e78f53d1SNikolas Klausertemplate <class _Tp>
734e78f53d1SNikolas Klauserstruct __is_val_expr<valarray<_Tp> > : true_type {};
735e78f53d1SNikolas Klauser
736e78f53d1SNikolas Klausertemplate <class _Tp>
737e78f53d1SNikolas Klauserstruct __is_val_expr<slice_array<_Tp> > : true_type {};
738e78f53d1SNikolas Klauser
739e78f53d1SNikolas Klausertemplate <class _Tp>
740e78f53d1SNikolas Klauserstruct __is_val_expr<gslice_array<_Tp> > : true_type {};
741e78f53d1SNikolas Klauser
742e78f53d1SNikolas Klausertemplate <class _Tp>
743e78f53d1SNikolas Klauserstruct __is_val_expr<mask_array<_Tp> > : true_type {};
744e78f53d1SNikolas Klauser
745e78f53d1SNikolas Klausertemplate <class _Tp>
746e78f53d1SNikolas Klauserstruct __is_val_expr<indirect_array<_Tp> > : true_type {};
747e78f53d1SNikolas Klauser
748e78f53d1SNikolas Klauser// The functions using a __val_expr access the elements by their index.
749e78f53d1SNikolas Klauser// valarray and the libc++ lazy proxies have an operator[]. The
750e78f53d1SNikolas Klauser// Standard proxy array's don't have this operator, instead they have a
751e78f53d1SNikolas Klauser// implementation specific accessor
752e78f53d1SNikolas Klauser//   __get(size_t)
753e78f53d1SNikolas Klauser//
754e78f53d1SNikolas Klauser// The functions use the non-member function
755e78f53d1SNikolas Klauser//   __get(__val_expr, size_t)
756e78f53d1SNikolas Klauser//
757e78f53d1SNikolas Klauser// If the __val_expr is a specialization of __val_expr_use_member_functions it
758e78f53d1SNikolas Klauser// uses the __val_expr's member function
759e78f53d1SNikolas Klauser//   __get(size_t)
760e78f53d1SNikolas Klauser// else it uses the __val_expr's member function
761e78f53d1SNikolas Klauser//   operator[](size_t)
762e78f53d1SNikolas Klausertemplate <class _ValExpr>
763e78f53d1SNikolas Klauserstruct __val_expr_use_member_functions;
764e78f53d1SNikolas Klauser
765e78f53d1SNikolas Klausertemplate <class>
766e78f53d1SNikolas Klauserstruct __val_expr_use_member_functions : false_type {};
767e78f53d1SNikolas Klauser
768e78f53d1SNikolas Klausertemplate <class _Tp>
769e78f53d1SNikolas Klauserstruct __val_expr_use_member_functions<slice_array<_Tp> > : true_type {};
770e78f53d1SNikolas Klauser
771e78f53d1SNikolas Klausertemplate <class _Tp>
772e78f53d1SNikolas Klauserstruct __val_expr_use_member_functions<gslice_array<_Tp> > : true_type {};
773e78f53d1SNikolas Klauser
774e78f53d1SNikolas Klausertemplate <class _Tp>
775e78f53d1SNikolas Klauserstruct __val_expr_use_member_functions<mask_array<_Tp> > : true_type {};
776e78f53d1SNikolas Klauser
777e78f53d1SNikolas Klausertemplate <class _Tp>
778e78f53d1SNikolas Klauserstruct __val_expr_use_member_functions<indirect_array<_Tp> > : true_type {};
779e78f53d1SNikolas Klauser
780e78f53d1SNikolas Klausertemplate <class _Tp>
781e78f53d1SNikolas Klauserclass _LIBCPP_TEMPLATE_VIS valarray {
782e78f53d1SNikolas Klauserpublic:
783e78f53d1SNikolas Klauser  typedef _Tp value_type;
784e78f53d1SNikolas Klauser  typedef _Tp __result_type;
785e78f53d1SNikolas Klauser
786e78f53d1SNikolas Klauserprivate:
787e78f53d1SNikolas Klauser  value_type* __begin_;
788e78f53d1SNikolas Klauser  value_type* __end_;
789e78f53d1SNikolas Klauser
790e78f53d1SNikolas Klauserpublic:
791e78f53d1SNikolas Klauser  // construct/destroy:
792e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI valarray() : __begin_(nullptr), __end_(nullptr) {}
793e78f53d1SNikolas Klauser  inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 explicit valarray(size_t __n);
794e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI valarray(const value_type& __x, size_t __n);
795e78f53d1SNikolas Klauser  valarray(const value_type* __p, size_t __n);
796e78f53d1SNikolas Klauser  valarray(const valarray& __v);
797e78f53d1SNikolas Klauser#ifndef _LIBCPP_CXX03_LANG
798e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI valarray(valarray&& __v) _NOEXCEPT;
799e78f53d1SNikolas Klauser  valarray(initializer_list<value_type> __il);
800e78f53d1SNikolas Klauser#endif // _LIBCPP_CXX03_LANG
801e78f53d1SNikolas Klauser  valarray(const slice_array<value_type>& __sa);
802e78f53d1SNikolas Klauser  valarray(const gslice_array<value_type>& __ga);
803e78f53d1SNikolas Klauser  valarray(const mask_array<value_type>& __ma);
804e78f53d1SNikolas Klauser  valarray(const indirect_array<value_type>& __ia);
805e78f53d1SNikolas Klauser  inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1 ~valarray();
806e78f53d1SNikolas Klauser
807e78f53d1SNikolas Klauser  // assignment:
808e78f53d1SNikolas Klauser  valarray& operator=(const valarray& __v);
809e78f53d1SNikolas Klauser#ifndef _LIBCPP_CXX03_LANG
810e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI valarray& operator=(valarray&& __v) _NOEXCEPT;
811e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI valarray& operator=(initializer_list<value_type>);
812e78f53d1SNikolas Klauser#endif // _LIBCPP_CXX03_LANG
813e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI valarray& operator=(const value_type& __x);
814e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI valarray& operator=(const slice_array<value_type>& __sa);
815e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI valarray& operator=(const gslice_array<value_type>& __ga);
816e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI valarray& operator=(const mask_array<value_type>& __ma);
817e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI valarray& operator=(const indirect_array<value_type>& __ia);
818e78f53d1SNikolas Klauser  template <class _ValExpr>
819e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI valarray& operator=(const __val_expr<_ValExpr>& __v);
820e78f53d1SNikolas Klauser
821e78f53d1SNikolas Klauser  // element access:
822e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI const value_type& operator[](size_t __i) const { return __begin_[__i]; }
823e78f53d1SNikolas Klauser
824e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI value_type& operator[](size_t __i) { return __begin_[__i]; }
825e78f53d1SNikolas Klauser
826e78f53d1SNikolas Klauser  // subset operations:
827e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI __val_expr<__slice_expr<const valarray&> > operator[](slice __s) const;
828e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI slice_array<value_type> operator[](slice __s);
829e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI __val_expr<__indirect_expr<const valarray&> > operator[](const gslice& __gs) const;
830e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI gslice_array<value_type> operator[](const gslice& __gs);
831e78f53d1SNikolas Klauser#ifndef _LIBCPP_CXX03_LANG
832e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI __val_expr<__indirect_expr<const valarray&> > operator[](gslice&& __gs) const;
833e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI gslice_array<value_type> operator[](gslice&& __gs);
834e78f53d1SNikolas Klauser#endif // _LIBCPP_CXX03_LANG
835e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI __val_expr<__mask_expr<const valarray&> > operator[](const valarray<bool>& __vb) const;
836e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI mask_array<value_type> operator[](const valarray<bool>& __vb);
837e78f53d1SNikolas Klauser#ifndef _LIBCPP_CXX03_LANG
838e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI __val_expr<__mask_expr<const valarray&> > operator[](valarray<bool>&& __vb) const;
839e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI mask_array<value_type> operator[](valarray<bool>&& __vb);
840e78f53d1SNikolas Klauser#endif // _LIBCPP_CXX03_LANG
841e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI __val_expr<__indirect_expr<const valarray&> > operator[](const valarray<size_t>& __vs) const;
842e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI indirect_array<value_type> operator[](const valarray<size_t>& __vs);
843e78f53d1SNikolas Klauser#ifndef _LIBCPP_CXX03_LANG
844e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI __val_expr<__indirect_expr<const valarray&> > operator[](valarray<size_t>&& __vs) const;
845e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI indirect_array<value_type> operator[](valarray<size_t>&& __vs);
846e78f53d1SNikolas Klauser#endif // _LIBCPP_CXX03_LANG
847e78f53d1SNikolas Klauser
848e78f53d1SNikolas Klauser  // unary operators:
849e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI __val_expr<_UnaryOp<__unary_plus<_Tp>, const valarray&> > operator+() const;
850e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI __val_expr<_UnaryOp<negate<_Tp>, const valarray&> > operator-() const;
851e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI __val_expr<_UnaryOp<__bit_not<_Tp>, const valarray&> > operator~() const;
852e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI __val_expr<_UnaryOp<logical_not<_Tp>, const valarray&> > operator!() const;
853e78f53d1SNikolas Klauser
854e78f53d1SNikolas Klauser  // computed assignment:
855e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI valarray& operator*=(const value_type& __x);
856e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI valarray& operator/=(const value_type& __x);
857e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI valarray& operator%=(const value_type& __x);
858e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI valarray& operator+=(const value_type& __x);
859e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI valarray& operator-=(const value_type& __x);
860e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI valarray& operator^=(const value_type& __x);
861e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI valarray& operator&=(const value_type& __x);
862e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI valarray& operator|=(const value_type& __x);
863e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI valarray& operator<<=(const value_type& __x);
864e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI valarray& operator>>=(const value_type& __x);
865e78f53d1SNikolas Klauser
866e78f53d1SNikolas Klauser  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
867e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI valarray& operator*=(const _Expr& __v);
868e78f53d1SNikolas Klauser
869e78f53d1SNikolas Klauser  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
870e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI valarray& operator/=(const _Expr& __v);
871e78f53d1SNikolas Klauser
872e78f53d1SNikolas Klauser  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
873e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI valarray& operator%=(const _Expr& __v);
874e78f53d1SNikolas Klauser
875e78f53d1SNikolas Klauser  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
876e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI valarray& operator+=(const _Expr& __v);
877e78f53d1SNikolas Klauser
878e78f53d1SNikolas Klauser  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
879e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI valarray& operator-=(const _Expr& __v);
880e78f53d1SNikolas Klauser
881e78f53d1SNikolas Klauser  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
882e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI valarray& operator^=(const _Expr& __v);
883e78f53d1SNikolas Klauser
884e78f53d1SNikolas Klauser  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
885e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI valarray& operator|=(const _Expr& __v);
886e78f53d1SNikolas Klauser
887e78f53d1SNikolas Klauser  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
888e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI valarray& operator&=(const _Expr& __v);
889e78f53d1SNikolas Klauser
890e78f53d1SNikolas Klauser  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
891e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI valarray& operator<<=(const _Expr& __v);
892e78f53d1SNikolas Klauser
893e78f53d1SNikolas Klauser  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
894e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI valarray& operator>>=(const _Expr& __v);
895e78f53d1SNikolas Klauser
896e78f53d1SNikolas Klauser  // member functions:
897e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI void swap(valarray& __v) _NOEXCEPT;
898e78f53d1SNikolas Klauser
899e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI size_t size() const { return static_cast<size_t>(__end_ - __begin_); }
900e78f53d1SNikolas Klauser
901e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI value_type sum() const;
902e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI value_type min() const;
903e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI value_type max() const;
904e78f53d1SNikolas Klauser
905e78f53d1SNikolas Klauser  valarray shift(int __i) const;
906e78f53d1SNikolas Klauser  valarray cshift(int __i) const;
907e78f53d1SNikolas Klauser  valarray apply(value_type __f(value_type)) const;
908e78f53d1SNikolas Klauser  valarray apply(value_type __f(const value_type&)) const;
909e78f53d1SNikolas Klauser  void resize(size_t __n, value_type __x = value_type());
910e78f53d1SNikolas Klauser
911e78f53d1SNikolas Klauserprivate:
912e78f53d1SNikolas Klauser  template <class>
913e78f53d1SNikolas Klauser  friend class _LIBCPP_TEMPLATE_VIS valarray;
914e78f53d1SNikolas Klauser  template <class>
915e78f53d1SNikolas Klauser  friend class _LIBCPP_TEMPLATE_VIS slice_array;
916e78f53d1SNikolas Klauser  template <class>
917e78f53d1SNikolas Klauser  friend class _LIBCPP_TEMPLATE_VIS gslice_array;
918e78f53d1SNikolas Klauser  template <class>
919e78f53d1SNikolas Klauser  friend class _LIBCPP_TEMPLATE_VIS mask_array;
920e78f53d1SNikolas Klauser  template <class>
921e78f53d1SNikolas Klauser  friend class __mask_expr;
922e78f53d1SNikolas Klauser  template <class>
923e78f53d1SNikolas Klauser  friend class _LIBCPP_TEMPLATE_VIS indirect_array;
924e78f53d1SNikolas Klauser  template <class>
925e78f53d1SNikolas Klauser  friend class __indirect_expr;
926e78f53d1SNikolas Klauser  template <class>
927e78f53d1SNikolas Klauser  friend class __val_expr;
928e78f53d1SNikolas Klauser
929e78f53d1SNikolas Klauser  template <class _Up>
930e78f53d1SNikolas Klauser  friend _Up* begin(valarray<_Up>& __v);
931e78f53d1SNikolas Klauser
932e78f53d1SNikolas Klauser  template <class _Up>
933e78f53d1SNikolas Klauser  friend const _Up* begin(const valarray<_Up>& __v);
934e78f53d1SNikolas Klauser
935e78f53d1SNikolas Klauser  template <class _Up>
936e78f53d1SNikolas Klauser  friend _Up* end(valarray<_Up>& __v);
937e78f53d1SNikolas Klauser
938e78f53d1SNikolas Klauser  template <class _Up>
939e78f53d1SNikolas Klauser  friend const _Up* end(const valarray<_Up>& __v);
940e78f53d1SNikolas Klauser
941e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI void __clear(size_t __capacity);
942e78f53d1SNikolas Klauser  valarray& __assign_range(const value_type* __f, const value_type* __l);
943e78f53d1SNikolas Klauser};
944e78f53d1SNikolas Klauser
945e78f53d1SNikolas Klauser#if _LIBCPP_STD_VER >= 17
946e78f53d1SNikolas Klausertemplate <class _Tp, size_t _Size>
947e78f53d1SNikolas Klauservalarray(const _Tp (&)[_Size], size_t) -> valarray<_Tp>;
948e78f53d1SNikolas Klauser#endif
949e78f53d1SNikolas Klauser
950e78f53d1SNikolas Klausertemplate <class _Expr,
951e78f53d1SNikolas Klauser          __enable_if_t<__is_val_expr<_Expr>::value && __val_expr_use_member_functions<_Expr>::value, int> = 0>
952e78f53d1SNikolas Klauser_LIBCPP_HIDE_FROM_ABI typename _Expr::value_type __get(const _Expr& __v, size_t __i) {
953e78f53d1SNikolas Klauser  return __v.__get(__i);
954e78f53d1SNikolas Klauser}
955e78f53d1SNikolas Klauser
956e78f53d1SNikolas Klausertemplate <class _Expr,
957e78f53d1SNikolas Klauser          __enable_if_t<__is_val_expr<_Expr>::value && !__val_expr_use_member_functions<_Expr>::value, int> = 0>
958e78f53d1SNikolas Klauser_LIBCPP_HIDE_FROM_ABI typename _Expr::value_type __get(const _Expr& __v, size_t __i) {
959e78f53d1SNikolas Klauser  return __v[__i];
960e78f53d1SNikolas Klauser}
961e78f53d1SNikolas Klauser
962e78f53d1SNikolas Klauserextern template _LIBCPP_EXPORTED_FROM_ABI void valarray<size_t>::resize(size_t, size_t);
963e78f53d1SNikolas Klauser
964e78f53d1SNikolas Klausertemplate <class _Op, class _Tp>
965e78f53d1SNikolas Klauserstruct _UnaryOp<_Op, valarray<_Tp> > {
966e78f53d1SNikolas Klauser  typedef typename _Op::__result_type __result_type;
967e78f53d1SNikolas Klauser  using value_type = __decay_t<__result_type>;
968e78f53d1SNikolas Klauser
969e78f53d1SNikolas Klauser  _Op __op_;
970e78f53d1SNikolas Klauser  const valarray<_Tp>& __a0_;
971e78f53d1SNikolas Klauser
972e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI _UnaryOp(const _Op& __op, const valarray<_Tp>& __a0) : __op_(__op), __a0_(__a0) {}
973e78f53d1SNikolas Klauser
974e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI __result_type operator[](size_t __i) const { return __op_(__a0_[__i]); }
975e78f53d1SNikolas Klauser
976e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI size_t size() const { return __a0_.size(); }
977e78f53d1SNikolas Klauser};
978e78f53d1SNikolas Klauser
979e78f53d1SNikolas Klausertemplate <class _Op, class _Tp, class _A1>
980e78f53d1SNikolas Klauserstruct _BinaryOp<_Op, valarray<_Tp>, _A1> {
981e78f53d1SNikolas Klauser  typedef typename _Op::__result_type __result_type;
982e78f53d1SNikolas Klauser  using value_type = __decay_t<__result_type>;
983e78f53d1SNikolas Klauser
984e78f53d1SNikolas Klauser  _Op __op_;
985e78f53d1SNikolas Klauser  const valarray<_Tp>& __a0_;
986e78f53d1SNikolas Klauser  _A1 __a1_;
987e78f53d1SNikolas Klauser
988e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI _BinaryOp(const _Op& __op, const valarray<_Tp>& __a0, const _A1& __a1)
989e78f53d1SNikolas Klauser      : __op_(__op), __a0_(__a0), __a1_(__a1) {}
990e78f53d1SNikolas Klauser
991e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI __result_type operator[](size_t __i) const { return __op_(__a0_[__i], __a1_[__i]); }
992e78f53d1SNikolas Klauser
993e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI size_t size() const { return __a0_.size(); }
994e78f53d1SNikolas Klauser};
995e78f53d1SNikolas Klauser
996e78f53d1SNikolas Klausertemplate <class _Op, class _A0, class _Tp>
997e78f53d1SNikolas Klauserstruct _BinaryOp<_Op, _A0, valarray<_Tp> > {
998e78f53d1SNikolas Klauser  typedef typename _Op::__result_type __result_type;
999e78f53d1SNikolas Klauser  using value_type = __decay_t<__result_type>;
1000e78f53d1SNikolas Klauser
1001e78f53d1SNikolas Klauser  _Op __op_;
1002e78f53d1SNikolas Klauser  _A0 __a0_;
1003e78f53d1SNikolas Klauser  const valarray<_Tp>& __a1_;
1004e78f53d1SNikolas Klauser
1005e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI _BinaryOp(const _Op& __op, const _A0& __a0, const valarray<_Tp>& __a1)
1006e78f53d1SNikolas Klauser      : __op_(__op), __a0_(__a0), __a1_(__a1) {}
1007e78f53d1SNikolas Klauser
1008e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI __result_type operator[](size_t __i) const { return __op_(__a0_[__i], __a1_[__i]); }
1009e78f53d1SNikolas Klauser
1010e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI size_t size() const { return __a0_.size(); }
1011e78f53d1SNikolas Klauser};
1012e78f53d1SNikolas Klauser
1013e78f53d1SNikolas Klausertemplate <class _Op, class _Tp>
1014e78f53d1SNikolas Klauserstruct _BinaryOp<_Op, valarray<_Tp>, valarray<_Tp> > {
1015e78f53d1SNikolas Klauser  typedef typename _Op::__result_type __result_type;
1016e78f53d1SNikolas Klauser  using value_type = __decay_t<__result_type>;
1017e78f53d1SNikolas Klauser
1018e78f53d1SNikolas Klauser  _Op __op_;
1019e78f53d1SNikolas Klauser  const valarray<_Tp>& __a0_;
1020e78f53d1SNikolas Klauser  const valarray<_Tp>& __a1_;
1021e78f53d1SNikolas Klauser
1022e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI _BinaryOp(const _Op& __op, const valarray<_Tp>& __a0, const valarray<_Tp>& __a1)
1023e78f53d1SNikolas Klauser      : __op_(__op), __a0_(__a0), __a1_(__a1) {}
1024e78f53d1SNikolas Klauser
1025e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI __result_type operator[](size_t __i) const { return __op_(__a0_[__i], __a1_[__i]); }
1026e78f53d1SNikolas Klauser
1027e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI size_t size() const { return __a0_.size(); }
1028e78f53d1SNikolas Klauser};
1029e78f53d1SNikolas Klauser
1030e78f53d1SNikolas Klauser// slice_array
1031e78f53d1SNikolas Klauser
1032e78f53d1SNikolas Klausertemplate <class _Tp>
1033e78f53d1SNikolas Klauserclass _LIBCPP_TEMPLATE_VIS slice_array {
1034e78f53d1SNikolas Klauserpublic:
1035e78f53d1SNikolas Klauser  typedef _Tp value_type;
1036e78f53d1SNikolas Klauser
1037e78f53d1SNikolas Klauserprivate:
1038e78f53d1SNikolas Klauser  value_type* __vp_;
1039e78f53d1SNikolas Klauser  size_t __size_;
1040e78f53d1SNikolas Klauser  size_t __stride_;
1041e78f53d1SNikolas Klauser
1042e78f53d1SNikolas Klauserpublic:
1043e78f53d1SNikolas Klauser  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1044e78f53d1SNikolas Klauser  void _LIBCPP_HIDE_FROM_ABI operator=(const _Expr& __v) const;
1045e78f53d1SNikolas Klauser
1046e78f53d1SNikolas Klauser  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1047e78f53d1SNikolas Klauser  void _LIBCPP_HIDE_FROM_ABI operator*=(const _Expr& __v) const;
1048e78f53d1SNikolas Klauser
1049e78f53d1SNikolas Klauser  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1050e78f53d1SNikolas Klauser  void _LIBCPP_HIDE_FROM_ABI operator/=(const _Expr& __v) const;
1051e78f53d1SNikolas Klauser
1052e78f53d1SNikolas Klauser  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1053e78f53d1SNikolas Klauser  void _LIBCPP_HIDE_FROM_ABI operator%=(const _Expr& __v) const;
1054e78f53d1SNikolas Klauser
1055e78f53d1SNikolas Klauser  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1056e78f53d1SNikolas Klauser  void _LIBCPP_HIDE_FROM_ABI operator+=(const _Expr& __v) const;
1057e78f53d1SNikolas Klauser
1058e78f53d1SNikolas Klauser  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1059e78f53d1SNikolas Klauser  void _LIBCPP_HIDE_FROM_ABI operator-=(const _Expr& __v) const;
1060e78f53d1SNikolas Klauser
1061e78f53d1SNikolas Klauser  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1062e78f53d1SNikolas Klauser  void _LIBCPP_HIDE_FROM_ABI operator^=(const _Expr& __v) const;
1063e78f53d1SNikolas Klauser
1064e78f53d1SNikolas Klauser  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1065e78f53d1SNikolas Klauser  void _LIBCPP_HIDE_FROM_ABI operator&=(const _Expr& __v) const;
1066e78f53d1SNikolas Klauser
1067e78f53d1SNikolas Klauser  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1068e78f53d1SNikolas Klauser  void _LIBCPP_HIDE_FROM_ABI operator|=(const _Expr& __v) const;
1069e78f53d1SNikolas Klauser
1070e78f53d1SNikolas Klauser  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1071e78f53d1SNikolas Klauser  void _LIBCPP_HIDE_FROM_ABI operator<<=(const _Expr& __v) const;
1072e78f53d1SNikolas Klauser
1073e78f53d1SNikolas Klauser  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1074e78f53d1SNikolas Klauser  void _LIBCPP_HIDE_FROM_ABI operator>>=(const _Expr& __v) const;
1075e78f53d1SNikolas Klauser
1076e78f53d1SNikolas Klauser  slice_array(slice_array const&) = default;
1077e78f53d1SNikolas Klauser
1078e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI const slice_array& operator=(const slice_array& __sa) const;
1079e78f53d1SNikolas Klauser
1080e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI void operator=(const value_type& __x) const;
1081e78f53d1SNikolas Klauser
1082e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI void operator=(const valarray<value_type>& __va) const;
1083e78f53d1SNikolas Klauser
1084e78f53d1SNikolas Klauser  // Behaves like __val_expr::operator[], which returns by value.
1085e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI value_type __get(size_t __i) const {
1086e78f53d1SNikolas Klauser    _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(__i < __size_, "slice_array.__get() index out of bounds");
1087e78f53d1SNikolas Klauser    return __vp_[__i * __stride_];
1088e78f53d1SNikolas Klauser  }
1089e78f53d1SNikolas Klauser
1090e78f53d1SNikolas Klauserprivate:
1091e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI slice_array(const slice& __sl, const valarray<value_type>& __v)
1092e78f53d1SNikolas Klauser      : __vp_(const_cast<value_type*>(__v.__begin_ + __sl.start())), __size_(__sl.size()), __stride_(__sl.stride()) {}
1093e78f53d1SNikolas Klauser
1094e78f53d1SNikolas Klauser  template <class>
1095e78f53d1SNikolas Klauser  friend class valarray;
1096e78f53d1SNikolas Klauser};
1097e78f53d1SNikolas Klauser
1098e78f53d1SNikolas Klausertemplate <class _Tp>
1099e78f53d1SNikolas Klauserinline const slice_array<_Tp>& slice_array<_Tp>::operator=(const slice_array& __sa) const {
1100e78f53d1SNikolas Klauser  value_type* __t       = __vp_;
1101e78f53d1SNikolas Klauser  const value_type* __s = __sa.__vp_;
1102e78f53d1SNikolas Klauser  for (size_t __n = __size_; __n; --__n, __t += __stride_, __s += __sa.__stride_)
1103e78f53d1SNikolas Klauser    *__t = *__s;
1104e78f53d1SNikolas Klauser  return *this;
1105e78f53d1SNikolas Klauser}
1106e78f53d1SNikolas Klauser
1107e78f53d1SNikolas Klausertemplate <class _Tp>
1108e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1109e78f53d1SNikolas Klauserinline void slice_array<_Tp>::operator=(const _Expr& __v) const {
1110e78f53d1SNikolas Klauser  value_type* __t = __vp_;
1111e78f53d1SNikolas Klauser  for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1112e78f53d1SNikolas Klauser    *__t = __v[__i];
1113e78f53d1SNikolas Klauser}
1114e78f53d1SNikolas Klauser
1115e78f53d1SNikolas Klausertemplate <class _Tp>
1116e78f53d1SNikolas Klauserinline void slice_array<_Tp>::operator=(const valarray<value_type>& __va) const {
1117e78f53d1SNikolas Klauser  value_type* __t = __vp_;
1118e78f53d1SNikolas Klauser  for (size_t __i = 0; __i < __va.size(); ++__i, __t += __stride_)
1119e78f53d1SNikolas Klauser    *__t = __va[__i];
1120e78f53d1SNikolas Klauser}
1121e78f53d1SNikolas Klauser
1122e78f53d1SNikolas Klausertemplate <class _Tp>
1123e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1124e78f53d1SNikolas Klauserinline void slice_array<_Tp>::operator*=(const _Expr& __v) const {
1125e78f53d1SNikolas Klauser  value_type* __t = __vp_;
1126e78f53d1SNikolas Klauser  for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1127e78f53d1SNikolas Klauser    *__t *= __v[__i];
1128e78f53d1SNikolas Klauser}
1129e78f53d1SNikolas Klauser
1130e78f53d1SNikolas Klausertemplate <class _Tp>
1131e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1132e78f53d1SNikolas Klauserinline void slice_array<_Tp>::operator/=(const _Expr& __v) const {
1133e78f53d1SNikolas Klauser  value_type* __t = __vp_;
1134e78f53d1SNikolas Klauser  for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1135e78f53d1SNikolas Klauser    *__t /= __v[__i];
1136e78f53d1SNikolas Klauser}
1137e78f53d1SNikolas Klauser
1138e78f53d1SNikolas Klausertemplate <class _Tp>
1139e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1140e78f53d1SNikolas Klauserinline void slice_array<_Tp>::operator%=(const _Expr& __v) const {
1141e78f53d1SNikolas Klauser  value_type* __t = __vp_;
1142e78f53d1SNikolas Klauser  for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1143e78f53d1SNikolas Klauser    *__t %= __v[__i];
1144e78f53d1SNikolas Klauser}
1145e78f53d1SNikolas Klauser
1146e78f53d1SNikolas Klausertemplate <class _Tp>
1147e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1148e78f53d1SNikolas Klauserinline void slice_array<_Tp>::operator+=(const _Expr& __v) const {
1149e78f53d1SNikolas Klauser  value_type* __t = __vp_;
1150e78f53d1SNikolas Klauser  for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1151e78f53d1SNikolas Klauser    *__t += __v[__i];
1152e78f53d1SNikolas Klauser}
1153e78f53d1SNikolas Klauser
1154e78f53d1SNikolas Klausertemplate <class _Tp>
1155e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1156e78f53d1SNikolas Klauserinline void slice_array<_Tp>::operator-=(const _Expr& __v) const {
1157e78f53d1SNikolas Klauser  value_type* __t = __vp_;
1158e78f53d1SNikolas Klauser  for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1159e78f53d1SNikolas Klauser    *__t -= __v[__i];
1160e78f53d1SNikolas Klauser}
1161e78f53d1SNikolas Klauser
1162e78f53d1SNikolas Klausertemplate <class _Tp>
1163e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1164e78f53d1SNikolas Klauserinline void slice_array<_Tp>::operator^=(const _Expr& __v) const {
1165e78f53d1SNikolas Klauser  value_type* __t = __vp_;
1166e78f53d1SNikolas Klauser  for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1167e78f53d1SNikolas Klauser    *__t ^= __v[__i];
1168e78f53d1SNikolas Klauser}
1169e78f53d1SNikolas Klauser
1170e78f53d1SNikolas Klausertemplate <class _Tp>
1171e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1172e78f53d1SNikolas Klauserinline void slice_array<_Tp>::operator&=(const _Expr& __v) const {
1173e78f53d1SNikolas Klauser  value_type* __t = __vp_;
1174e78f53d1SNikolas Klauser  for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1175e78f53d1SNikolas Klauser    *__t &= __v[__i];
1176e78f53d1SNikolas Klauser}
1177e78f53d1SNikolas Klauser
1178e78f53d1SNikolas Klausertemplate <class _Tp>
1179e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1180e78f53d1SNikolas Klauserinline void slice_array<_Tp>::operator|=(const _Expr& __v) const {
1181e78f53d1SNikolas Klauser  value_type* __t = __vp_;
1182e78f53d1SNikolas Klauser  for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1183e78f53d1SNikolas Klauser    *__t |= __v[__i];
1184e78f53d1SNikolas Klauser}
1185e78f53d1SNikolas Klauser
1186e78f53d1SNikolas Klausertemplate <class _Tp>
1187e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1188e78f53d1SNikolas Klauserinline void slice_array<_Tp>::operator<<=(const _Expr& __v) const {
1189e78f53d1SNikolas Klauser  value_type* __t = __vp_;
1190e78f53d1SNikolas Klauser  for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1191e78f53d1SNikolas Klauser    *__t <<= __v[__i];
1192e78f53d1SNikolas Klauser}
1193e78f53d1SNikolas Klauser
1194e78f53d1SNikolas Klausertemplate <class _Tp>
1195e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1196e78f53d1SNikolas Klauserinline void slice_array<_Tp>::operator>>=(const _Expr& __v) const {
1197e78f53d1SNikolas Klauser  value_type* __t = __vp_;
1198e78f53d1SNikolas Klauser  for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
1199e78f53d1SNikolas Klauser    *__t >>= __v[__i];
1200e78f53d1SNikolas Klauser}
1201e78f53d1SNikolas Klauser
1202e78f53d1SNikolas Klausertemplate <class _Tp>
1203e78f53d1SNikolas Klauserinline void slice_array<_Tp>::operator=(const value_type& __x) const {
1204e78f53d1SNikolas Klauser  value_type* __t = __vp_;
1205e78f53d1SNikolas Klauser  for (size_t __n = __size_; __n; --__n, __t += __stride_)
1206e78f53d1SNikolas Klauser    *__t = __x;
1207e78f53d1SNikolas Klauser}
1208e78f53d1SNikolas Klauser
1209e78f53d1SNikolas Klauser// gslice
1210e78f53d1SNikolas Klauser
1211e78f53d1SNikolas Klauserclass _LIBCPP_EXPORTED_FROM_ABI gslice {
1212e78f53d1SNikolas Klauser  valarray<size_t> __size_;
1213e78f53d1SNikolas Klauser  valarray<size_t> __stride_;
1214e78f53d1SNikolas Klauser  valarray<size_t> __1d_;
1215e78f53d1SNikolas Klauser
1216e78f53d1SNikolas Klauserpublic:
1217e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI gslice() {}
1218e78f53d1SNikolas Klauser
1219e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI gslice(size_t __start, const valarray<size_t>& __size, const valarray<size_t>& __stride)
1220e78f53d1SNikolas Klauser      : __size_(__size), __stride_(__stride) {
1221e78f53d1SNikolas Klauser    __init(__start);
1222e78f53d1SNikolas Klauser  }
1223e78f53d1SNikolas Klauser
1224e78f53d1SNikolas Klauser#ifndef _LIBCPP_CXX03_LANG
1225e78f53d1SNikolas Klauser
1226e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI gslice(size_t __start, const valarray<size_t>& __size, valarray<size_t>&& __stride)
1227e78f53d1SNikolas Klauser      : __size_(__size), __stride_(std::move(__stride)) {
1228e78f53d1SNikolas Klauser    __init(__start);
1229e78f53d1SNikolas Klauser  }
1230e78f53d1SNikolas Klauser
1231e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI gslice(size_t __start, valarray<size_t>&& __size, const valarray<size_t>& __stride)
1232e78f53d1SNikolas Klauser      : __size_(std::move(__size)), __stride_(__stride) {
1233e78f53d1SNikolas Klauser    __init(__start);
1234e78f53d1SNikolas Klauser  }
1235e78f53d1SNikolas Klauser
1236e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI gslice(size_t __start, valarray<size_t>&& __size, valarray<size_t>&& __stride)
1237e78f53d1SNikolas Klauser      : __size_(std::move(__size)), __stride_(std::move(__stride)) {
1238e78f53d1SNikolas Klauser    __init(__start);
1239e78f53d1SNikolas Klauser  }
1240e78f53d1SNikolas Klauser
1241e78f53d1SNikolas Klauser#endif // _LIBCPP_CXX03_LANG
1242e78f53d1SNikolas Klauser
1243e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI size_t start() const { return __1d_.size() ? __1d_[0] : 0; }
1244e78f53d1SNikolas Klauser
1245e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI valarray<size_t> size() const { return __size_; }
1246e78f53d1SNikolas Klauser
1247e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI valarray<size_t> stride() const { return __stride_; }
1248e78f53d1SNikolas Klauser
1249e78f53d1SNikolas Klauserprivate:
1250e78f53d1SNikolas Klauser  void __init(size_t __start);
1251e78f53d1SNikolas Klauser
1252e78f53d1SNikolas Klauser  template <class>
1253e78f53d1SNikolas Klauser  friend class gslice_array;
1254e78f53d1SNikolas Klauser  template <class>
1255e78f53d1SNikolas Klauser  friend class valarray;
1256e78f53d1SNikolas Klauser  template <class>
1257e78f53d1SNikolas Klauser  friend class __val_expr;
1258e78f53d1SNikolas Klauser};
1259e78f53d1SNikolas Klauser
1260e78f53d1SNikolas Klauser// gslice_array
1261e78f53d1SNikolas Klauser
1262e78f53d1SNikolas Klausertemplate <class _Tp>
1263e78f53d1SNikolas Klauserclass _LIBCPP_TEMPLATE_VIS gslice_array {
1264e78f53d1SNikolas Klauserpublic:
1265e78f53d1SNikolas Klauser  typedef _Tp value_type;
1266e78f53d1SNikolas Klauser
1267e78f53d1SNikolas Klauserprivate:
1268e78f53d1SNikolas Klauser  value_type* __vp_;
1269e78f53d1SNikolas Klauser  valarray<size_t> __1d_;
1270e78f53d1SNikolas Klauser
1271e78f53d1SNikolas Klauserpublic:
1272e78f53d1SNikolas Klauser  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1273e78f53d1SNikolas Klauser  void _LIBCPP_HIDE_FROM_ABI operator=(const _Expr& __v) const;
1274e78f53d1SNikolas Klauser
1275e78f53d1SNikolas Klauser  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1276e78f53d1SNikolas Klauser  void _LIBCPP_HIDE_FROM_ABI operator*=(const _Expr& __v) const;
1277e78f53d1SNikolas Klauser
1278e78f53d1SNikolas Klauser  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1279e78f53d1SNikolas Klauser  void _LIBCPP_HIDE_FROM_ABI operator/=(const _Expr& __v) const;
1280e78f53d1SNikolas Klauser
1281e78f53d1SNikolas Klauser  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1282e78f53d1SNikolas Klauser  void _LIBCPP_HIDE_FROM_ABI operator%=(const _Expr& __v) const;
1283e78f53d1SNikolas Klauser
1284e78f53d1SNikolas Klauser  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1285e78f53d1SNikolas Klauser  void _LIBCPP_HIDE_FROM_ABI operator+=(const _Expr& __v) const;
1286e78f53d1SNikolas Klauser
1287e78f53d1SNikolas Klauser  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1288e78f53d1SNikolas Klauser  void _LIBCPP_HIDE_FROM_ABI operator-=(const _Expr& __v) const;
1289e78f53d1SNikolas Klauser
1290e78f53d1SNikolas Klauser  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1291e78f53d1SNikolas Klauser  void _LIBCPP_HIDE_FROM_ABI operator^=(const _Expr& __v) const;
1292e78f53d1SNikolas Klauser
1293e78f53d1SNikolas Klauser  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1294e78f53d1SNikolas Klauser  void _LIBCPP_HIDE_FROM_ABI operator&=(const _Expr& __v) const;
1295e78f53d1SNikolas Klauser
1296e78f53d1SNikolas Klauser  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1297e78f53d1SNikolas Klauser  void _LIBCPP_HIDE_FROM_ABI operator|=(const _Expr& __v) const;
1298e78f53d1SNikolas Klauser
1299e78f53d1SNikolas Klauser  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1300e78f53d1SNikolas Klauser  void _LIBCPP_HIDE_FROM_ABI operator<<=(const _Expr& __v) const;
1301e78f53d1SNikolas Klauser
1302e78f53d1SNikolas Klauser  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1303e78f53d1SNikolas Klauser  void _LIBCPP_HIDE_FROM_ABI operator>>=(const _Expr& __v) const;
1304e78f53d1SNikolas Klauser
1305e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI const gslice_array& operator=(const gslice_array& __ga) const;
1306e78f53d1SNikolas Klauser
1307e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI void operator=(const value_type& __x) const;
1308e78f53d1SNikolas Klauser
1309e78f53d1SNikolas Klauser  gslice_array(const gslice_array&) = default;
1310e78f53d1SNikolas Klauser
1311e78f53d1SNikolas Klauser  // Behaves like __val_expr::operator[], which returns by value.
1312e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI value_type __get(size_t __i) const {
1313e78f53d1SNikolas Klauser    _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(__i < __1d_.size(), "gslice_array.__get() index out of bounds");
1314e78f53d1SNikolas Klauser    return __vp_[__1d_[__i]];
1315e78f53d1SNikolas Klauser  }
1316e78f53d1SNikolas Klauser
1317e78f53d1SNikolas Klauserprivate:
1318e78f53d1SNikolas Klauser  gslice_array(const gslice& __gs, const valarray<value_type>& __v)
1319e78f53d1SNikolas Klauser      : __vp_(const_cast<value_type*>(__v.__begin_)), __1d_(__gs.__1d_) {}
1320e78f53d1SNikolas Klauser
1321e78f53d1SNikolas Klauser#ifndef _LIBCPP_CXX03_LANG
1322e78f53d1SNikolas Klauser  gslice_array(gslice&& __gs, const valarray<value_type>& __v)
1323e78f53d1SNikolas Klauser      : __vp_(const_cast<value_type*>(__v.__begin_)), __1d_(std::move(__gs.__1d_)) {}
1324e78f53d1SNikolas Klauser#endif // _LIBCPP_CXX03_LANG
1325e78f53d1SNikolas Klauser
1326e78f53d1SNikolas Klauser  template <class>
1327e78f53d1SNikolas Klauser  friend class valarray;
1328e78f53d1SNikolas Klauser};
1329e78f53d1SNikolas Klauser
1330e78f53d1SNikolas Klausertemplate <class _Tp>
1331e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1332e78f53d1SNikolas Klauserinline void gslice_array<_Tp>::operator=(const _Expr& __v) const {
1333e78f53d1SNikolas Klauser  typedef const size_t* _Ip;
1334e78f53d1SNikolas Klauser  size_t __j = 0;
1335e78f53d1SNikolas Klauser  for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1336e78f53d1SNikolas Klauser    __vp_[*__i] = __v[__j];
1337e78f53d1SNikolas Klauser}
1338e78f53d1SNikolas Klauser
1339e78f53d1SNikolas Klausertemplate <class _Tp>
1340e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1341e78f53d1SNikolas Klauserinline void gslice_array<_Tp>::operator*=(const _Expr& __v) const {
1342e78f53d1SNikolas Klauser  typedef const size_t* _Ip;
1343e78f53d1SNikolas Klauser  size_t __j = 0;
1344e78f53d1SNikolas Klauser  for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1345e78f53d1SNikolas Klauser    __vp_[*__i] *= __v[__j];
1346e78f53d1SNikolas Klauser}
1347e78f53d1SNikolas Klauser
1348e78f53d1SNikolas Klausertemplate <class _Tp>
1349e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1350e78f53d1SNikolas Klauserinline void gslice_array<_Tp>::operator/=(const _Expr& __v) const {
1351e78f53d1SNikolas Klauser  typedef const size_t* _Ip;
1352e78f53d1SNikolas Klauser  size_t __j = 0;
1353e78f53d1SNikolas Klauser  for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1354e78f53d1SNikolas Klauser    __vp_[*__i] /= __v[__j];
1355e78f53d1SNikolas Klauser}
1356e78f53d1SNikolas Klauser
1357e78f53d1SNikolas Klausertemplate <class _Tp>
1358e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1359e78f53d1SNikolas Klauserinline void gslice_array<_Tp>::operator%=(const _Expr& __v) const {
1360e78f53d1SNikolas Klauser  typedef const size_t* _Ip;
1361e78f53d1SNikolas Klauser  size_t __j = 0;
1362e78f53d1SNikolas Klauser  for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1363e78f53d1SNikolas Klauser    __vp_[*__i] %= __v[__j];
1364e78f53d1SNikolas Klauser}
1365e78f53d1SNikolas Klauser
1366e78f53d1SNikolas Klausertemplate <class _Tp>
1367e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1368e78f53d1SNikolas Klauserinline void gslice_array<_Tp>::operator+=(const _Expr& __v) const {
1369e78f53d1SNikolas Klauser  typedef const size_t* _Ip;
1370e78f53d1SNikolas Klauser  size_t __j = 0;
1371e78f53d1SNikolas Klauser  for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1372e78f53d1SNikolas Klauser    __vp_[*__i] += __v[__j];
1373e78f53d1SNikolas Klauser}
1374e78f53d1SNikolas Klauser
1375e78f53d1SNikolas Klausertemplate <class _Tp>
1376e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1377e78f53d1SNikolas Klauserinline void gslice_array<_Tp>::operator-=(const _Expr& __v) const {
1378e78f53d1SNikolas Klauser  typedef const size_t* _Ip;
1379e78f53d1SNikolas Klauser  size_t __j = 0;
1380e78f53d1SNikolas Klauser  for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1381e78f53d1SNikolas Klauser    __vp_[*__i] -= __v[__j];
1382e78f53d1SNikolas Klauser}
1383e78f53d1SNikolas Klauser
1384e78f53d1SNikolas Klausertemplate <class _Tp>
1385e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1386e78f53d1SNikolas Klauserinline void gslice_array<_Tp>::operator^=(const _Expr& __v) const {
1387e78f53d1SNikolas Klauser  typedef const size_t* _Ip;
1388e78f53d1SNikolas Klauser  size_t __j = 0;
1389e78f53d1SNikolas Klauser  for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1390e78f53d1SNikolas Klauser    __vp_[*__i] ^= __v[__j];
1391e78f53d1SNikolas Klauser}
1392e78f53d1SNikolas Klauser
1393e78f53d1SNikolas Klausertemplate <class _Tp>
1394e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1395e78f53d1SNikolas Klauserinline void gslice_array<_Tp>::operator&=(const _Expr& __v) const {
1396e78f53d1SNikolas Klauser  typedef const size_t* _Ip;
1397e78f53d1SNikolas Klauser  size_t __j = 0;
1398e78f53d1SNikolas Klauser  for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1399e78f53d1SNikolas Klauser    __vp_[*__i] &= __v[__j];
1400e78f53d1SNikolas Klauser}
1401e78f53d1SNikolas Klauser
1402e78f53d1SNikolas Klausertemplate <class _Tp>
1403e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1404e78f53d1SNikolas Klauserinline void gslice_array<_Tp>::operator|=(const _Expr& __v) const {
1405e78f53d1SNikolas Klauser  typedef const size_t* _Ip;
1406e78f53d1SNikolas Klauser  size_t __j = 0;
1407e78f53d1SNikolas Klauser  for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1408e78f53d1SNikolas Klauser    __vp_[*__i] |= __v[__j];
1409e78f53d1SNikolas Klauser}
1410e78f53d1SNikolas Klauser
1411e78f53d1SNikolas Klausertemplate <class _Tp>
1412e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1413e78f53d1SNikolas Klauserinline void gslice_array<_Tp>::operator<<=(const _Expr& __v) const {
1414e78f53d1SNikolas Klauser  typedef const size_t* _Ip;
1415e78f53d1SNikolas Klauser  size_t __j = 0;
1416e78f53d1SNikolas Klauser  for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1417e78f53d1SNikolas Klauser    __vp_[*__i] <<= __v[__j];
1418e78f53d1SNikolas Klauser}
1419e78f53d1SNikolas Klauser
1420e78f53d1SNikolas Klausertemplate <class _Tp>
1421e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1422e78f53d1SNikolas Klauserinline void gslice_array<_Tp>::operator>>=(const _Expr& __v) const {
1423e78f53d1SNikolas Klauser  typedef const size_t* _Ip;
1424e78f53d1SNikolas Klauser  size_t __j = 0;
1425e78f53d1SNikolas Klauser  for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
1426e78f53d1SNikolas Klauser    __vp_[*__i] >>= __v[__j];
1427e78f53d1SNikolas Klauser}
1428e78f53d1SNikolas Klauser
1429e78f53d1SNikolas Klausertemplate <class _Tp>
1430e78f53d1SNikolas Klauserinline const gslice_array<_Tp>& gslice_array<_Tp>::operator=(const gslice_array& __ga) const {
1431e78f53d1SNikolas Klauser  typedef const size_t* _Ip;
1432e78f53d1SNikolas Klauser  const value_type* __s = __ga.__vp_;
1433e78f53d1SNikolas Klauser  for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_, __j = __ga.__1d_.__begin_; __i != __e; ++__i, ++__j)
1434e78f53d1SNikolas Klauser    __vp_[*__i] = __s[*__j];
1435e78f53d1SNikolas Klauser  return *this;
1436e78f53d1SNikolas Klauser}
1437e78f53d1SNikolas Klauser
1438e78f53d1SNikolas Klausertemplate <class _Tp>
1439e78f53d1SNikolas Klauserinline void gslice_array<_Tp>::operator=(const value_type& __x) const {
1440e78f53d1SNikolas Klauser  typedef const size_t* _Ip;
1441e78f53d1SNikolas Klauser  for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i)
1442e78f53d1SNikolas Klauser    __vp_[*__i] = __x;
1443e78f53d1SNikolas Klauser}
1444e78f53d1SNikolas Klauser
1445e78f53d1SNikolas Klauser// mask_array
1446e78f53d1SNikolas Klauser
1447e78f53d1SNikolas Klausertemplate <class _Tp>
1448e78f53d1SNikolas Klauserclass _LIBCPP_TEMPLATE_VIS mask_array {
1449e78f53d1SNikolas Klauserpublic:
1450e78f53d1SNikolas Klauser  typedef _Tp value_type;
1451e78f53d1SNikolas Klauser
1452e78f53d1SNikolas Klauserprivate:
1453e78f53d1SNikolas Klauser  value_type* __vp_;
1454e78f53d1SNikolas Klauser  valarray<size_t> __1d_;
1455e78f53d1SNikolas Klauser
1456e78f53d1SNikolas Klauserpublic:
1457e78f53d1SNikolas Klauser  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1458e78f53d1SNikolas Klauser  void _LIBCPP_HIDE_FROM_ABI operator=(const _Expr& __v) const;
1459e78f53d1SNikolas Klauser
1460e78f53d1SNikolas Klauser  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1461e78f53d1SNikolas Klauser  void _LIBCPP_HIDE_FROM_ABI operator*=(const _Expr& __v) const;
1462e78f53d1SNikolas Klauser
1463e78f53d1SNikolas Klauser  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1464e78f53d1SNikolas Klauser  void _LIBCPP_HIDE_FROM_ABI operator/=(const _Expr& __v) const;
1465e78f53d1SNikolas Klauser
1466e78f53d1SNikolas Klauser  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1467e78f53d1SNikolas Klauser  void _LIBCPP_HIDE_FROM_ABI operator%=(const _Expr& __v) const;
1468e78f53d1SNikolas Klauser
1469e78f53d1SNikolas Klauser  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1470e78f53d1SNikolas Klauser  void _LIBCPP_HIDE_FROM_ABI operator+=(const _Expr& __v) const;
1471e78f53d1SNikolas Klauser
1472e78f53d1SNikolas Klauser  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1473e78f53d1SNikolas Klauser  void _LIBCPP_HIDE_FROM_ABI operator-=(const _Expr& __v) const;
1474e78f53d1SNikolas Klauser
1475e78f53d1SNikolas Klauser  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1476e78f53d1SNikolas Klauser  void _LIBCPP_HIDE_FROM_ABI operator^=(const _Expr& __v) const;
1477e78f53d1SNikolas Klauser
1478e78f53d1SNikolas Klauser  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1479e78f53d1SNikolas Klauser  void _LIBCPP_HIDE_FROM_ABI operator&=(const _Expr& __v) const;
1480e78f53d1SNikolas Klauser
1481e78f53d1SNikolas Klauser  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1482e78f53d1SNikolas Klauser  void _LIBCPP_HIDE_FROM_ABI operator|=(const _Expr& __v) const;
1483e78f53d1SNikolas Klauser
1484e78f53d1SNikolas Klauser  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1485e78f53d1SNikolas Klauser  void _LIBCPP_HIDE_FROM_ABI operator<<=(const _Expr& __v) const;
1486e78f53d1SNikolas Klauser
1487e78f53d1SNikolas Klauser  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1488e78f53d1SNikolas Klauser  void _LIBCPP_HIDE_FROM_ABI operator>>=(const _Expr& __v) const;
1489e78f53d1SNikolas Klauser
1490e78f53d1SNikolas Klauser  mask_array(const mask_array&) = default;
1491e78f53d1SNikolas Klauser
1492e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI const mask_array& operator=(const mask_array& __ma) const;
1493e78f53d1SNikolas Klauser
1494e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI void operator=(const value_type& __x) const;
1495e78f53d1SNikolas Klauser
1496e78f53d1SNikolas Klauser  // Behaves like __val_expr::operator[], which returns by value.
1497e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI value_type __get(size_t __i) const {
1498e78f53d1SNikolas Klauser    _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(__i < __1d_.size(), "mask_array.__get() index out of bounds");
1499e78f53d1SNikolas Klauser    return __vp_[__1d_[__i]];
1500e78f53d1SNikolas Klauser  }
1501e78f53d1SNikolas Klauser
1502e78f53d1SNikolas Klauserprivate:
1503e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI mask_array(const valarray<bool>& __vb, const valarray<value_type>& __v)
1504e78f53d1SNikolas Klauser      : __vp_(const_cast<value_type*>(__v.__begin_)),
1505e78f53d1SNikolas Klauser        __1d_(static_cast<size_t>(count(__vb.__begin_, __vb.__end_, true))) {
1506e78f53d1SNikolas Klauser    size_t __j = 0;
1507e78f53d1SNikolas Klauser    for (size_t __i = 0; __i < __vb.size(); ++__i)
1508e78f53d1SNikolas Klauser      if (__vb[__i])
1509e78f53d1SNikolas Klauser        __1d_[__j++] = __i;
1510e78f53d1SNikolas Klauser  }
1511e78f53d1SNikolas Klauser
1512e78f53d1SNikolas Klauser  template <class>
1513e78f53d1SNikolas Klauser  friend class valarray;
1514e78f53d1SNikolas Klauser};
1515e78f53d1SNikolas Klauser
1516e78f53d1SNikolas Klausertemplate <class _Tp>
1517e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1518e78f53d1SNikolas Klauserinline void mask_array<_Tp>::operator=(const _Expr& __v) const {
1519e78f53d1SNikolas Klauser  size_t __n = __1d_.size();
1520e78f53d1SNikolas Klauser  for (size_t __i = 0; __i < __n; ++__i)
1521e78f53d1SNikolas Klauser    __vp_[__1d_[__i]] = __v[__i];
1522e78f53d1SNikolas Klauser}
1523e78f53d1SNikolas Klauser
1524e78f53d1SNikolas Klausertemplate <class _Tp>
1525e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1526e78f53d1SNikolas Klauserinline void mask_array<_Tp>::operator*=(const _Expr& __v) const {
1527e78f53d1SNikolas Klauser  size_t __n = __1d_.size();
1528e78f53d1SNikolas Klauser  for (size_t __i = 0; __i < __n; ++__i)
1529e78f53d1SNikolas Klauser    __vp_[__1d_[__i]] *= __v[__i];
1530e78f53d1SNikolas Klauser}
1531e78f53d1SNikolas Klauser
1532e78f53d1SNikolas Klausertemplate <class _Tp>
1533e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1534e78f53d1SNikolas Klauserinline void mask_array<_Tp>::operator/=(const _Expr& __v) const {
1535e78f53d1SNikolas Klauser  size_t __n = __1d_.size();
1536e78f53d1SNikolas Klauser  for (size_t __i = 0; __i < __n; ++__i)
1537e78f53d1SNikolas Klauser    __vp_[__1d_[__i]] /= __v[__i];
1538e78f53d1SNikolas Klauser}
1539e78f53d1SNikolas Klauser
1540e78f53d1SNikolas Klausertemplate <class _Tp>
1541e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1542e78f53d1SNikolas Klauserinline void mask_array<_Tp>::operator%=(const _Expr& __v) const {
1543e78f53d1SNikolas Klauser  size_t __n = __1d_.size();
1544e78f53d1SNikolas Klauser  for (size_t __i = 0; __i < __n; ++__i)
1545e78f53d1SNikolas Klauser    __vp_[__1d_[__i]] %= __v[__i];
1546e78f53d1SNikolas Klauser}
1547e78f53d1SNikolas Klauser
1548e78f53d1SNikolas Klausertemplate <class _Tp>
1549e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1550e78f53d1SNikolas Klauserinline void mask_array<_Tp>::operator+=(const _Expr& __v) const {
1551e78f53d1SNikolas Klauser  size_t __n = __1d_.size();
1552e78f53d1SNikolas Klauser  for (size_t __i = 0; __i < __n; ++__i)
1553e78f53d1SNikolas Klauser    __vp_[__1d_[__i]] += __v[__i];
1554e78f53d1SNikolas Klauser}
1555e78f53d1SNikolas Klauser
1556e78f53d1SNikolas Klausertemplate <class _Tp>
1557e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1558e78f53d1SNikolas Klauserinline void mask_array<_Tp>::operator-=(const _Expr& __v) const {
1559e78f53d1SNikolas Klauser  size_t __n = __1d_.size();
1560e78f53d1SNikolas Klauser  for (size_t __i = 0; __i < __n; ++__i)
1561e78f53d1SNikolas Klauser    __vp_[__1d_[__i]] -= __v[__i];
1562e78f53d1SNikolas Klauser}
1563e78f53d1SNikolas Klauser
1564e78f53d1SNikolas Klausertemplate <class _Tp>
1565e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1566e78f53d1SNikolas Klauserinline void mask_array<_Tp>::operator^=(const _Expr& __v) const {
1567e78f53d1SNikolas Klauser  size_t __n = __1d_.size();
1568e78f53d1SNikolas Klauser  for (size_t __i = 0; __i < __n; ++__i)
1569e78f53d1SNikolas Klauser    __vp_[__1d_[__i]] ^= __v[__i];
1570e78f53d1SNikolas Klauser}
1571e78f53d1SNikolas Klauser
1572e78f53d1SNikolas Klausertemplate <class _Tp>
1573e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1574e78f53d1SNikolas Klauserinline void mask_array<_Tp>::operator&=(const _Expr& __v) const {
1575e78f53d1SNikolas Klauser  size_t __n = __1d_.size();
1576e78f53d1SNikolas Klauser  for (size_t __i = 0; __i < __n; ++__i)
1577e78f53d1SNikolas Klauser    __vp_[__1d_[__i]] &= __v[__i];
1578e78f53d1SNikolas Klauser}
1579e78f53d1SNikolas Klauser
1580e78f53d1SNikolas Klausertemplate <class _Tp>
1581e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1582e78f53d1SNikolas Klauserinline void mask_array<_Tp>::operator|=(const _Expr& __v) const {
1583e78f53d1SNikolas Klauser  size_t __n = __1d_.size();
1584e78f53d1SNikolas Klauser  for (size_t __i = 0; __i < __n; ++__i)
1585e78f53d1SNikolas Klauser    __vp_[__1d_[__i]] |= __v[__i];
1586e78f53d1SNikolas Klauser}
1587e78f53d1SNikolas Klauser
1588e78f53d1SNikolas Klausertemplate <class _Tp>
1589e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1590e78f53d1SNikolas Klauserinline void mask_array<_Tp>::operator<<=(const _Expr& __v) const {
1591e78f53d1SNikolas Klauser  size_t __n = __1d_.size();
1592e78f53d1SNikolas Klauser  for (size_t __i = 0; __i < __n; ++__i)
1593e78f53d1SNikolas Klauser    __vp_[__1d_[__i]] <<= __v[__i];
1594e78f53d1SNikolas Klauser}
1595e78f53d1SNikolas Klauser
1596e78f53d1SNikolas Klausertemplate <class _Tp>
1597e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1598e78f53d1SNikolas Klauserinline void mask_array<_Tp>::operator>>=(const _Expr& __v) const {
1599e78f53d1SNikolas Klauser  size_t __n = __1d_.size();
1600e78f53d1SNikolas Klauser  for (size_t __i = 0; __i < __n; ++__i)
1601e78f53d1SNikolas Klauser    __vp_[__1d_[__i]] >>= __v[__i];
1602e78f53d1SNikolas Klauser}
1603e78f53d1SNikolas Klauser
1604e78f53d1SNikolas Klausertemplate <class _Tp>
1605e78f53d1SNikolas Klauserinline const mask_array<_Tp>& mask_array<_Tp>::operator=(const mask_array& __ma) const {
1606e78f53d1SNikolas Klauser  size_t __n = __1d_.size();
1607e78f53d1SNikolas Klauser  for (size_t __i = 0; __i < __n; ++__i)
1608e78f53d1SNikolas Klauser    __vp_[__1d_[__i]] = __ma.__vp_[__1d_[__i]];
1609e78f53d1SNikolas Klauser  return *this;
1610e78f53d1SNikolas Klauser}
1611e78f53d1SNikolas Klauser
1612e78f53d1SNikolas Klausertemplate <class _Tp>
1613e78f53d1SNikolas Klauserinline void mask_array<_Tp>::operator=(const value_type& __x) const {
1614e78f53d1SNikolas Klauser  size_t __n = __1d_.size();
1615e78f53d1SNikolas Klauser  for (size_t __i = 0; __i < __n; ++__i)
1616e78f53d1SNikolas Klauser    __vp_[__1d_[__i]] = __x;
1617e78f53d1SNikolas Klauser}
1618e78f53d1SNikolas Klauser
1619e78f53d1SNikolas Klausertemplate <class _ValExpr>
1620e78f53d1SNikolas Klauserclass __mask_expr {
1621e78f53d1SNikolas Klauser  typedef __libcpp_remove_reference_t<_ValExpr> _RmExpr;
1622e78f53d1SNikolas Klauser
1623e78f53d1SNikolas Klauserpublic:
1624e78f53d1SNikolas Klauser  typedef typename _RmExpr::value_type value_type;
1625e78f53d1SNikolas Klauser  typedef value_type __result_type;
1626e78f53d1SNikolas Klauser
1627e78f53d1SNikolas Klauserprivate:
1628e78f53d1SNikolas Klauser  _ValExpr __expr_;
1629e78f53d1SNikolas Klauser  valarray<size_t> __1d_;
1630e78f53d1SNikolas Klauser
1631e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI __mask_expr(const valarray<bool>& __vb, const _RmExpr& __e)
1632e78f53d1SNikolas Klauser      : __expr_(__e), __1d_(static_cast<size_t>(count(__vb.__begin_, __vb.__end_, true))) {
1633e78f53d1SNikolas Klauser    size_t __j = 0;
1634e78f53d1SNikolas Klauser    for (size_t __i = 0; __i < __vb.size(); ++__i)
1635e78f53d1SNikolas Klauser      if (__vb[__i])
1636e78f53d1SNikolas Klauser        __1d_[__j++] = __i;
1637e78f53d1SNikolas Klauser  }
1638e78f53d1SNikolas Klauser
1639e78f53d1SNikolas Klauserpublic:
1640e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI __result_type operator[](size_t __i) const { return __expr_[__1d_[__i]]; }
1641e78f53d1SNikolas Klauser
1642e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI size_t size() const { return __1d_.size(); }
1643e78f53d1SNikolas Klauser
1644e78f53d1SNikolas Klauser  template <class>
1645e78f53d1SNikolas Klauser  friend class __val_expr;
1646e78f53d1SNikolas Klauser  template <class>
1647e78f53d1SNikolas Klauser  friend class valarray;
1648e78f53d1SNikolas Klauser};
1649e78f53d1SNikolas Klauser
1650e78f53d1SNikolas Klauser// indirect_array
1651e78f53d1SNikolas Klauser
1652e78f53d1SNikolas Klausertemplate <class _Tp>
1653e78f53d1SNikolas Klauserclass _LIBCPP_TEMPLATE_VIS indirect_array {
1654e78f53d1SNikolas Klauserpublic:
1655e78f53d1SNikolas Klauser  typedef _Tp value_type;
1656e78f53d1SNikolas Klauser
1657e78f53d1SNikolas Klauserprivate:
1658e78f53d1SNikolas Klauser  value_type* __vp_;
1659e78f53d1SNikolas Klauser  valarray<size_t> __1d_;
1660e78f53d1SNikolas Klauser
1661e78f53d1SNikolas Klauserpublic:
1662e78f53d1SNikolas Klauser  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1663e78f53d1SNikolas Klauser  void _LIBCPP_HIDE_FROM_ABI operator=(const _Expr& __v) const;
1664e78f53d1SNikolas Klauser
1665e78f53d1SNikolas Klauser  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1666e78f53d1SNikolas Klauser  void _LIBCPP_HIDE_FROM_ABI operator*=(const _Expr& __v) const;
1667e78f53d1SNikolas Klauser
1668e78f53d1SNikolas Klauser  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1669e78f53d1SNikolas Klauser  void _LIBCPP_HIDE_FROM_ABI operator/=(const _Expr& __v) const;
1670e78f53d1SNikolas Klauser
1671e78f53d1SNikolas Klauser  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1672e78f53d1SNikolas Klauser  void _LIBCPP_HIDE_FROM_ABI operator%=(const _Expr& __v) const;
1673e78f53d1SNikolas Klauser
1674e78f53d1SNikolas Klauser  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1675e78f53d1SNikolas Klauser  void _LIBCPP_HIDE_FROM_ABI operator+=(const _Expr& __v) const;
1676e78f53d1SNikolas Klauser
1677e78f53d1SNikolas Klauser  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1678e78f53d1SNikolas Klauser  void _LIBCPP_HIDE_FROM_ABI operator-=(const _Expr& __v) const;
1679e78f53d1SNikolas Klauser
1680e78f53d1SNikolas Klauser  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1681e78f53d1SNikolas Klauser  void _LIBCPP_HIDE_FROM_ABI operator^=(const _Expr& __v) const;
1682e78f53d1SNikolas Klauser
1683e78f53d1SNikolas Klauser  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1684e78f53d1SNikolas Klauser  void _LIBCPP_HIDE_FROM_ABI operator&=(const _Expr& __v) const;
1685e78f53d1SNikolas Klauser
1686e78f53d1SNikolas Klauser  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1687e78f53d1SNikolas Klauser  void _LIBCPP_HIDE_FROM_ABI operator|=(const _Expr& __v) const;
1688e78f53d1SNikolas Klauser
1689e78f53d1SNikolas Klauser  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1690e78f53d1SNikolas Klauser  void _LIBCPP_HIDE_FROM_ABI operator<<=(const _Expr& __v) const;
1691e78f53d1SNikolas Klauser
1692e78f53d1SNikolas Klauser  template <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
1693e78f53d1SNikolas Klauser  void _LIBCPP_HIDE_FROM_ABI operator>>=(const _Expr& __v) const;
1694e78f53d1SNikolas Klauser
1695e78f53d1SNikolas Klauser  indirect_array(const indirect_array&) = default;
1696e78f53d1SNikolas Klauser
1697e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI const indirect_array& operator=(const indirect_array& __ia) const;
1698e78f53d1SNikolas Klauser
1699e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI void operator=(const value_type& __x) const;
1700e78f53d1SNikolas Klauser
1701e78f53d1SNikolas Klauser  // Behaves like __val_expr::operator[], which returns by value.
1702e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI value_type __get(size_t __i) const {
1703e78f53d1SNikolas Klauser    _LIBCPP_ASSERT_VALID_ELEMENT_ACCESS(__i < __1d_.size(), "indirect_array.__get() index out of bounds");
1704e78f53d1SNikolas Klauser    return __vp_[__1d_[__i]];
1705e78f53d1SNikolas Klauser  }
1706e78f53d1SNikolas Klauser
1707e78f53d1SNikolas Klauserprivate:
1708e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI indirect_array(const valarray<size_t>& __ia, const valarray<value_type>& __v)
1709e78f53d1SNikolas Klauser      : __vp_(const_cast<value_type*>(__v.__begin_)), __1d_(__ia) {}
1710e78f53d1SNikolas Klauser
1711e78f53d1SNikolas Klauser#ifndef _LIBCPP_CXX03_LANG
1712e78f53d1SNikolas Klauser
1713e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI indirect_array(valarray<size_t>&& __ia, const valarray<value_type>& __v)
1714e78f53d1SNikolas Klauser      : __vp_(const_cast<value_type*>(__v.__begin_)), __1d_(std::move(__ia)) {}
1715e78f53d1SNikolas Klauser
1716e78f53d1SNikolas Klauser#endif // _LIBCPP_CXX03_LANG
1717e78f53d1SNikolas Klauser
1718e78f53d1SNikolas Klauser  template <class>
1719e78f53d1SNikolas Klauser  friend class valarray;
1720e78f53d1SNikolas Klauser};
1721e78f53d1SNikolas Klauser
1722e78f53d1SNikolas Klausertemplate <class _Tp>
1723e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1724e78f53d1SNikolas Klauserinline void indirect_array<_Tp>::operator=(const _Expr& __v) const {
1725e78f53d1SNikolas Klauser  size_t __n = __1d_.size();
1726e78f53d1SNikolas Klauser  for (size_t __i = 0; __i < __n; ++__i)
1727e78f53d1SNikolas Klauser    __vp_[__1d_[__i]] = __v[__i];
1728e78f53d1SNikolas Klauser}
1729e78f53d1SNikolas Klauser
1730e78f53d1SNikolas Klausertemplate <class _Tp>
1731e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1732e78f53d1SNikolas Klauserinline void indirect_array<_Tp>::operator*=(const _Expr& __v) const {
1733e78f53d1SNikolas Klauser  size_t __n = __1d_.size();
1734e78f53d1SNikolas Klauser  for (size_t __i = 0; __i < __n; ++__i)
1735e78f53d1SNikolas Klauser    __vp_[__1d_[__i]] *= __v[__i];
1736e78f53d1SNikolas Klauser}
1737e78f53d1SNikolas Klauser
1738e78f53d1SNikolas Klausertemplate <class _Tp>
1739e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1740e78f53d1SNikolas Klauserinline void indirect_array<_Tp>::operator/=(const _Expr& __v) const {
1741e78f53d1SNikolas Klauser  size_t __n = __1d_.size();
1742e78f53d1SNikolas Klauser  for (size_t __i = 0; __i < __n; ++__i)
1743e78f53d1SNikolas Klauser    __vp_[__1d_[__i]] /= __v[__i];
1744e78f53d1SNikolas Klauser}
1745e78f53d1SNikolas Klauser
1746e78f53d1SNikolas Klausertemplate <class _Tp>
1747e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1748e78f53d1SNikolas Klauserinline void indirect_array<_Tp>::operator%=(const _Expr& __v) const {
1749e78f53d1SNikolas Klauser  size_t __n = __1d_.size();
1750e78f53d1SNikolas Klauser  for (size_t __i = 0; __i < __n; ++__i)
1751e78f53d1SNikolas Klauser    __vp_[__1d_[__i]] %= __v[__i];
1752e78f53d1SNikolas Klauser}
1753e78f53d1SNikolas Klauser
1754e78f53d1SNikolas Klausertemplate <class _Tp>
1755e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1756e78f53d1SNikolas Klauserinline void indirect_array<_Tp>::operator+=(const _Expr& __v) const {
1757e78f53d1SNikolas Klauser  size_t __n = __1d_.size();
1758e78f53d1SNikolas Klauser  for (size_t __i = 0; __i < __n; ++__i)
1759e78f53d1SNikolas Klauser    __vp_[__1d_[__i]] += __v[__i];
1760e78f53d1SNikolas Klauser}
1761e78f53d1SNikolas Klauser
1762e78f53d1SNikolas Klausertemplate <class _Tp>
1763e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1764e78f53d1SNikolas Klauserinline void indirect_array<_Tp>::operator-=(const _Expr& __v) const {
1765e78f53d1SNikolas Klauser  size_t __n = __1d_.size();
1766e78f53d1SNikolas Klauser  for (size_t __i = 0; __i < __n; ++__i)
1767e78f53d1SNikolas Klauser    __vp_[__1d_[__i]] -= __v[__i];
1768e78f53d1SNikolas Klauser}
1769e78f53d1SNikolas Klauser
1770e78f53d1SNikolas Klausertemplate <class _Tp>
1771e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1772e78f53d1SNikolas Klauserinline void indirect_array<_Tp>::operator^=(const _Expr& __v) const {
1773e78f53d1SNikolas Klauser  size_t __n = __1d_.size();
1774e78f53d1SNikolas Klauser  for (size_t __i = 0; __i < __n; ++__i)
1775e78f53d1SNikolas Klauser    __vp_[__1d_[__i]] ^= __v[__i];
1776e78f53d1SNikolas Klauser}
1777e78f53d1SNikolas Klauser
1778e78f53d1SNikolas Klausertemplate <class _Tp>
1779e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1780e78f53d1SNikolas Klauserinline void indirect_array<_Tp>::operator&=(const _Expr& __v) const {
1781e78f53d1SNikolas Klauser  size_t __n = __1d_.size();
1782e78f53d1SNikolas Klauser  for (size_t __i = 0; __i < __n; ++__i)
1783e78f53d1SNikolas Klauser    __vp_[__1d_[__i]] &= __v[__i];
1784e78f53d1SNikolas Klauser}
1785e78f53d1SNikolas Klauser
1786e78f53d1SNikolas Klausertemplate <class _Tp>
1787e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1788e78f53d1SNikolas Klauserinline void indirect_array<_Tp>::operator|=(const _Expr& __v) const {
1789e78f53d1SNikolas Klauser  size_t __n = __1d_.size();
1790e78f53d1SNikolas Klauser  for (size_t __i = 0; __i < __n; ++__i)
1791e78f53d1SNikolas Klauser    __vp_[__1d_[__i]] |= __v[__i];
1792e78f53d1SNikolas Klauser}
1793e78f53d1SNikolas Klauser
1794e78f53d1SNikolas Klausertemplate <class _Tp>
1795e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1796e78f53d1SNikolas Klauserinline void indirect_array<_Tp>::operator<<=(const _Expr& __v) const {
1797e78f53d1SNikolas Klauser  size_t __n = __1d_.size();
1798e78f53d1SNikolas Klauser  for (size_t __i = 0; __i < __n; ++__i)
1799e78f53d1SNikolas Klauser    __vp_[__1d_[__i]] <<= __v[__i];
1800e78f53d1SNikolas Klauser}
1801e78f53d1SNikolas Klauser
1802e78f53d1SNikolas Klausertemplate <class _Tp>
1803e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
1804e78f53d1SNikolas Klauserinline void indirect_array<_Tp>::operator>>=(const _Expr& __v) const {
1805e78f53d1SNikolas Klauser  size_t __n = __1d_.size();
1806e78f53d1SNikolas Klauser  for (size_t __i = 0; __i < __n; ++__i)
1807e78f53d1SNikolas Klauser    __vp_[__1d_[__i]] >>= __v[__i];
1808e78f53d1SNikolas Klauser}
1809e78f53d1SNikolas Klauser
1810e78f53d1SNikolas Klausertemplate <class _Tp>
1811e78f53d1SNikolas Klauserinline const indirect_array<_Tp>& indirect_array<_Tp>::operator=(const indirect_array& __ia) const {
1812e78f53d1SNikolas Klauser  typedef const size_t* _Ip;
1813e78f53d1SNikolas Klauser  const value_type* __s = __ia.__vp_;
1814e78f53d1SNikolas Klauser  for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_, __j = __ia.__1d_.__begin_; __i != __e; ++__i, ++__j)
1815e78f53d1SNikolas Klauser    __vp_[*__i] = __s[*__j];
1816e78f53d1SNikolas Klauser  return *this;
1817e78f53d1SNikolas Klauser}
1818e78f53d1SNikolas Klauser
1819e78f53d1SNikolas Klausertemplate <class _Tp>
1820e78f53d1SNikolas Klauserinline void indirect_array<_Tp>::operator=(const value_type& __x) const {
1821e78f53d1SNikolas Klauser  typedef const size_t* _Ip;
1822e78f53d1SNikolas Klauser  for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i)
1823e78f53d1SNikolas Klauser    __vp_[*__i] = __x;
1824e78f53d1SNikolas Klauser}
1825e78f53d1SNikolas Klauser
1826e78f53d1SNikolas Klausertemplate <class _ValExpr>
1827e78f53d1SNikolas Klauserclass __indirect_expr {
1828e78f53d1SNikolas Klauser  typedef __libcpp_remove_reference_t<_ValExpr> _RmExpr;
1829e78f53d1SNikolas Klauser
1830e78f53d1SNikolas Klauserpublic:
1831e78f53d1SNikolas Klauser  typedef typename _RmExpr::value_type value_type;
1832e78f53d1SNikolas Klauser  typedef value_type __result_type;
1833e78f53d1SNikolas Klauser
1834e78f53d1SNikolas Klauserprivate:
1835e78f53d1SNikolas Klauser  _ValExpr __expr_;
1836e78f53d1SNikolas Klauser  valarray<size_t> __1d_;
1837e78f53d1SNikolas Klauser
1838e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI __indirect_expr(const valarray<size_t>& __ia, const _RmExpr& __e) : __expr_(__e), __1d_(__ia) {}
1839e78f53d1SNikolas Klauser
1840e78f53d1SNikolas Klauser#ifndef _LIBCPP_CXX03_LANG
1841e78f53d1SNikolas Klauser
1842e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI __indirect_expr(valarray<size_t>&& __ia, const _RmExpr& __e)
1843e78f53d1SNikolas Klauser      : __expr_(__e), __1d_(std::move(__ia)) {}
1844e78f53d1SNikolas Klauser
1845e78f53d1SNikolas Klauser#endif // _LIBCPP_CXX03_LANG
1846e78f53d1SNikolas Klauser
1847e78f53d1SNikolas Klauserpublic:
1848e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI __result_type operator[](size_t __i) const { return __expr_[__1d_[__i]]; }
1849e78f53d1SNikolas Klauser
1850e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI size_t size() const { return __1d_.size(); }
1851e78f53d1SNikolas Klauser
1852e78f53d1SNikolas Klauser  template <class>
1853e78f53d1SNikolas Klauser  friend class __val_expr;
1854e78f53d1SNikolas Klauser  template <class>
1855e78f53d1SNikolas Klauser  friend class _LIBCPP_TEMPLATE_VIS valarray;
1856e78f53d1SNikolas Klauser};
1857e78f53d1SNikolas Klauser
1858e78f53d1SNikolas Klausertemplate <class _ValExpr>
1859e78f53d1SNikolas Klauserclass __val_expr {
1860e78f53d1SNikolas Klauser  typedef __libcpp_remove_reference_t<_ValExpr> _RmExpr;
1861e78f53d1SNikolas Klauser
1862e78f53d1SNikolas Klauser  _ValExpr __expr_;
1863e78f53d1SNikolas Klauser
1864e78f53d1SNikolas Klauserpublic:
1865e78f53d1SNikolas Klauser  typedef typename _RmExpr::value_type value_type;
1866e78f53d1SNikolas Klauser  typedef typename _RmExpr::__result_type __result_type;
1867e78f53d1SNikolas Klauser
1868e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI explicit __val_expr(const _RmExpr& __e) : __expr_(__e) {}
1869e78f53d1SNikolas Klauser
1870e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI __result_type operator[](size_t __i) const { return __expr_[__i]; }
1871e78f53d1SNikolas Klauser
1872e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI __val_expr<__slice_expr<_ValExpr> > operator[](slice __s) const {
1873e78f53d1SNikolas Klauser    typedef __slice_expr<_ValExpr> _NewExpr;
1874e78f53d1SNikolas Klauser    return __val_expr< _NewExpr >(_NewExpr(__s, __expr_));
1875e78f53d1SNikolas Klauser  }
1876e78f53d1SNikolas Klauser
1877e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI __val_expr<__indirect_expr<_ValExpr> > operator[](const gslice& __gs) const {
1878e78f53d1SNikolas Klauser    typedef __indirect_expr<_ValExpr> _NewExpr;
1879e78f53d1SNikolas Klauser    return __val_expr<_NewExpr >(_NewExpr(__gs.__1d_, __expr_));
1880e78f53d1SNikolas Klauser  }
1881e78f53d1SNikolas Klauser
1882e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI __val_expr<__mask_expr<_ValExpr> > operator[](const valarray<bool>& __vb) const {
1883e78f53d1SNikolas Klauser    typedef __mask_expr<_ValExpr> _NewExpr;
1884e78f53d1SNikolas Klauser    return __val_expr< _NewExpr >(_NewExpr(__vb, __expr_));
1885e78f53d1SNikolas Klauser  }
1886e78f53d1SNikolas Klauser
1887e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI __val_expr<__indirect_expr<_ValExpr> > operator[](const valarray<size_t>& __vs) const {
1888e78f53d1SNikolas Klauser    typedef __indirect_expr<_ValExpr> _NewExpr;
1889e78f53d1SNikolas Klauser    return __val_expr< _NewExpr >(_NewExpr(__vs, __expr_));
1890e78f53d1SNikolas Klauser  }
1891e78f53d1SNikolas Klauser
1892e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI __val_expr<_UnaryOp<__unary_plus<value_type>, _ValExpr> > operator+() const {
1893e78f53d1SNikolas Klauser    typedef _UnaryOp<__unary_plus<value_type>, _ValExpr> _NewExpr;
1894e78f53d1SNikolas Klauser    return __val_expr<_NewExpr>(_NewExpr(__unary_plus<value_type>(), __expr_));
1895e78f53d1SNikolas Klauser  }
1896e78f53d1SNikolas Klauser
1897e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI __val_expr<_UnaryOp<negate<value_type>, _ValExpr> > operator-() const {
1898e78f53d1SNikolas Klauser    typedef _UnaryOp<negate<value_type>, _ValExpr> _NewExpr;
1899e78f53d1SNikolas Klauser    return __val_expr<_NewExpr>(_NewExpr(negate<value_type>(), __expr_));
1900e78f53d1SNikolas Klauser  }
1901e78f53d1SNikolas Klauser
1902e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI __val_expr<_UnaryOp<__bit_not<value_type>, _ValExpr> > operator~() const {
1903e78f53d1SNikolas Klauser    typedef _UnaryOp<__bit_not<value_type>, _ValExpr> _NewExpr;
1904e78f53d1SNikolas Klauser    return __val_expr<_NewExpr>(_NewExpr(__bit_not<value_type>(), __expr_));
1905e78f53d1SNikolas Klauser  }
1906e78f53d1SNikolas Klauser
1907e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI __val_expr<_UnaryOp<logical_not<value_type>, _ValExpr> > operator!() const {
1908e78f53d1SNikolas Klauser    typedef _UnaryOp<logical_not<value_type>, _ValExpr> _NewExpr;
1909e78f53d1SNikolas Klauser    return __val_expr<_NewExpr>(_NewExpr(logical_not<value_type>(), __expr_));
1910e78f53d1SNikolas Klauser  }
1911e78f53d1SNikolas Klauser
1912e78f53d1SNikolas Klauser  operator valarray<__result_type>() const;
1913e78f53d1SNikolas Klauser
1914e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI size_t size() const { return __expr_.size(); }
1915e78f53d1SNikolas Klauser
1916e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI __result_type sum() const {
1917e78f53d1SNikolas Klauser    size_t __n        = __expr_.size();
1918e78f53d1SNikolas Klauser    __result_type __r = __n ? __expr_[0] : __result_type();
1919e78f53d1SNikolas Klauser    for (size_t __i = 1; __i < __n; ++__i)
1920e78f53d1SNikolas Klauser      __r += __expr_[__i];
1921e78f53d1SNikolas Klauser    return __r;
1922e78f53d1SNikolas Klauser  }
1923e78f53d1SNikolas Klauser
1924e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI __result_type min() const {
1925e78f53d1SNikolas Klauser    size_t __n        = size();
1926e78f53d1SNikolas Klauser    __result_type __r = __n ? (*this)[0] : __result_type();
1927e78f53d1SNikolas Klauser    for (size_t __i = 1; __i < __n; ++__i) {
1928e78f53d1SNikolas Klauser      __result_type __x = __expr_[__i];
1929e78f53d1SNikolas Klauser      if (__x < __r)
1930e78f53d1SNikolas Klauser        __r = __x;
1931e78f53d1SNikolas Klauser    }
1932e78f53d1SNikolas Klauser    return __r;
1933e78f53d1SNikolas Klauser  }
1934e78f53d1SNikolas Klauser
1935e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI __result_type max() const {
1936e78f53d1SNikolas Klauser    size_t __n        = size();
1937e78f53d1SNikolas Klauser    __result_type __r = __n ? (*this)[0] : __result_type();
1938e78f53d1SNikolas Klauser    for (size_t __i = 1; __i < __n; ++__i) {
1939e78f53d1SNikolas Klauser      __result_type __x = __expr_[__i];
1940e78f53d1SNikolas Klauser      if (__r < __x)
1941e78f53d1SNikolas Klauser        __r = __x;
1942e78f53d1SNikolas Klauser    }
1943e78f53d1SNikolas Klauser    return __r;
1944e78f53d1SNikolas Klauser  }
1945e78f53d1SNikolas Klauser
1946e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI __val_expr<__shift_expr<_ValExpr> > shift(int __i) const {
1947e78f53d1SNikolas Klauser    return __val_expr<__shift_expr<_ValExpr> >(__shift_expr<_ValExpr>(__i, __expr_));
1948e78f53d1SNikolas Klauser  }
1949e78f53d1SNikolas Klauser
1950e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI __val_expr<__cshift_expr<_ValExpr> > cshift(int __i) const {
1951e78f53d1SNikolas Klauser    return __val_expr<__cshift_expr<_ValExpr> >(__cshift_expr<_ValExpr>(__i, __expr_));
1952e78f53d1SNikolas Klauser  }
1953e78f53d1SNikolas Klauser
1954e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI __val_expr<_UnaryOp<__apply_expr<value_type, value_type (*)(value_type)>, _ValExpr> >
1955e78f53d1SNikolas Klauser  apply(value_type __f(value_type)) const {
1956e78f53d1SNikolas Klauser    typedef __apply_expr<value_type, value_type (*)(value_type)> _Op;
1957e78f53d1SNikolas Klauser    typedef _UnaryOp<_Op, _ValExpr> _NewExpr;
1958e78f53d1SNikolas Klauser    return __val_expr<_NewExpr>(_NewExpr(_Op(__f), __expr_));
1959e78f53d1SNikolas Klauser  }
1960e78f53d1SNikolas Klauser
1961e78f53d1SNikolas Klauser  _LIBCPP_HIDE_FROM_ABI __val_expr<_UnaryOp<__apply_expr<value_type, value_type (*)(const value_type&)>, _ValExpr> >
1962e78f53d1SNikolas Klauser  apply(value_type __f(const value_type&)) const {
1963e78f53d1SNikolas Klauser    typedef __apply_expr<value_type, value_type (*)(const value_type&)> _Op;
1964e78f53d1SNikolas Klauser    typedef _UnaryOp<_Op, _ValExpr> _NewExpr;
1965e78f53d1SNikolas Klauser    return __val_expr<_NewExpr>(_NewExpr(_Op(__f), __expr_));
1966e78f53d1SNikolas Klauser  }
1967e78f53d1SNikolas Klauser};
1968e78f53d1SNikolas Klauser
1969e78f53d1SNikolas Klausertemplate <class _ValExpr>
1970e78f53d1SNikolas Klauser__val_expr<_ValExpr>::operator valarray<__val_expr::__result_type>() const {
1971e78f53d1SNikolas Klauser  valarray<__result_type> __r;
1972e78f53d1SNikolas Klauser  size_t __n = __expr_.size();
1973e78f53d1SNikolas Klauser  if (__n) {
1974e78f53d1SNikolas Klauser    __r.__begin_ = __r.__end_ = allocator<__result_type>().allocate(__n);
1975e78f53d1SNikolas Klauser    for (size_t __i = 0; __i != __n; ++__r.__end_, ++__i)
1976e78f53d1SNikolas Klauser      ::new ((void*)__r.__end_) __result_type(__expr_[__i]);
1977e78f53d1SNikolas Klauser  }
1978e78f53d1SNikolas Klauser  return __r;
1979e78f53d1SNikolas Klauser}
1980e78f53d1SNikolas Klauser
1981e78f53d1SNikolas Klauser// valarray
1982e78f53d1SNikolas Klauser
1983e78f53d1SNikolas Klausertemplate <class _Tp>
1984e78f53d1SNikolas Klauserinline valarray<_Tp>::valarray(size_t __n) : __begin_(nullptr), __end_(nullptr) {
1985e78f53d1SNikolas Klauser  if (__n) {
1986e78f53d1SNikolas Klauser    __begin_ = __end_ = allocator<value_type>().allocate(__n);
1987e78f53d1SNikolas Klauser#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
1988e78f53d1SNikolas Klauser    try {
1989e78f53d1SNikolas Klauser#endif // _LIBCPP_HAS_NO_EXCEPTIONS
1990e78f53d1SNikolas Klauser      for (size_t __n_left = __n; __n_left; --__n_left, ++__end_)
1991e78f53d1SNikolas Klauser        ::new ((void*)__end_) value_type();
1992e78f53d1SNikolas Klauser#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
1993e78f53d1SNikolas Klauser    } catch (...) {
1994e78f53d1SNikolas Klauser      __clear(__n);
1995e78f53d1SNikolas Klauser      throw;
1996e78f53d1SNikolas Klauser    }
1997e78f53d1SNikolas Klauser#endif // _LIBCPP_HAS_NO_EXCEPTIONS
1998e78f53d1SNikolas Klauser  }
1999e78f53d1SNikolas Klauser}
2000e78f53d1SNikolas Klauser
2001e78f53d1SNikolas Klausertemplate <class _Tp>
2002e78f53d1SNikolas Klauserinline valarray<_Tp>::valarray(const value_type& __x, size_t __n) : __begin_(nullptr), __end_(nullptr) {
2003e78f53d1SNikolas Klauser  resize(__n, __x);
2004e78f53d1SNikolas Klauser}
2005e78f53d1SNikolas Klauser
2006e78f53d1SNikolas Klausertemplate <class _Tp>
2007e78f53d1SNikolas Klauservalarray<_Tp>::valarray(const value_type* __p, size_t __n) : __begin_(nullptr), __end_(nullptr) {
2008e78f53d1SNikolas Klauser  if (__n) {
2009e78f53d1SNikolas Klauser    __begin_ = __end_ = allocator<value_type>().allocate(__n);
2010e78f53d1SNikolas Klauser#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
2011e78f53d1SNikolas Klauser    try {
2012e78f53d1SNikolas Klauser#endif // _LIBCPP_HAS_NO_EXCEPTIONS
2013e78f53d1SNikolas Klauser      for (size_t __n_left = __n; __n_left; ++__end_, ++__p, --__n_left)
2014e78f53d1SNikolas Klauser        ::new ((void*)__end_) value_type(*__p);
2015e78f53d1SNikolas Klauser#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
2016e78f53d1SNikolas Klauser    } catch (...) {
2017e78f53d1SNikolas Klauser      __clear(__n);
2018e78f53d1SNikolas Klauser      throw;
2019e78f53d1SNikolas Klauser    }
2020e78f53d1SNikolas Klauser#endif // _LIBCPP_HAS_NO_EXCEPTIONS
2021e78f53d1SNikolas Klauser  }
2022e78f53d1SNikolas Klauser}
2023e78f53d1SNikolas Klauser
2024e78f53d1SNikolas Klausertemplate <class _Tp>
2025e78f53d1SNikolas Klauservalarray<_Tp>::valarray(const valarray& __v) : __begin_(nullptr), __end_(nullptr) {
2026e78f53d1SNikolas Klauser  if (__v.size()) {
2027e78f53d1SNikolas Klauser    __begin_ = __end_ = allocator<value_type>().allocate(__v.size());
2028e78f53d1SNikolas Klauser#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
2029e78f53d1SNikolas Klauser    try {
2030e78f53d1SNikolas Klauser#endif // _LIBCPP_HAS_NO_EXCEPTIONS
2031e78f53d1SNikolas Klauser      for (value_type* __p = __v.__begin_; __p != __v.__end_; ++__end_, ++__p)
2032e78f53d1SNikolas Klauser        ::new ((void*)__end_) value_type(*__p);
2033e78f53d1SNikolas Klauser#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
2034e78f53d1SNikolas Klauser    } catch (...) {
2035e78f53d1SNikolas Klauser      __clear(__v.size());
2036e78f53d1SNikolas Klauser      throw;
2037e78f53d1SNikolas Klauser    }
2038e78f53d1SNikolas Klauser#endif // _LIBCPP_HAS_NO_EXCEPTIONS
2039e78f53d1SNikolas Klauser  }
2040e78f53d1SNikolas Klauser}
2041e78f53d1SNikolas Klauser
2042e78f53d1SNikolas Klauser#ifndef _LIBCPP_CXX03_LANG
2043e78f53d1SNikolas Klauser
2044e78f53d1SNikolas Klausertemplate <class _Tp>
2045e78f53d1SNikolas Klauserinline valarray<_Tp>::valarray(valarray&& __v) _NOEXCEPT : __begin_(__v.__begin_), __end_(__v.__end_) {
2046e78f53d1SNikolas Klauser  __v.__begin_ = __v.__end_ = nullptr;
2047e78f53d1SNikolas Klauser}
2048e78f53d1SNikolas Klauser
2049e78f53d1SNikolas Klausertemplate <class _Tp>
2050e78f53d1SNikolas Klauservalarray<_Tp>::valarray(initializer_list<value_type> __il) : __begin_(nullptr), __end_(nullptr) {
2051e78f53d1SNikolas Klauser  const size_t __n = __il.size();
2052e78f53d1SNikolas Klauser  if (__n) {
2053e78f53d1SNikolas Klauser    __begin_ = __end_ = allocator<value_type>().allocate(__n);
2054e78f53d1SNikolas Klauser#  ifndef _LIBCPP_HAS_NO_EXCEPTIONS
2055e78f53d1SNikolas Klauser    try {
2056e78f53d1SNikolas Klauser#  endif // _LIBCPP_HAS_NO_EXCEPTIONS
2057e78f53d1SNikolas Klauser      size_t __n_left = __n;
2058e78f53d1SNikolas Klauser      for (const value_type* __p = __il.begin(); __n_left; ++__end_, ++__p, --__n_left)
2059e78f53d1SNikolas Klauser        ::new ((void*)__end_) value_type(*__p);
2060e78f53d1SNikolas Klauser#  ifndef _LIBCPP_HAS_NO_EXCEPTIONS
2061e78f53d1SNikolas Klauser    } catch (...) {
2062e78f53d1SNikolas Klauser      __clear(__n);
2063e78f53d1SNikolas Klauser      throw;
2064e78f53d1SNikolas Klauser    }
2065e78f53d1SNikolas Klauser#  endif // _LIBCPP_HAS_NO_EXCEPTIONS
2066e78f53d1SNikolas Klauser  }
2067e78f53d1SNikolas Klauser}
2068e78f53d1SNikolas Klauser
2069e78f53d1SNikolas Klauser#endif // _LIBCPP_CXX03_LANG
2070e78f53d1SNikolas Klauser
2071e78f53d1SNikolas Klausertemplate <class _Tp>
2072e78f53d1SNikolas Klauservalarray<_Tp>::valarray(const slice_array<value_type>& __sa) : __begin_(nullptr), __end_(nullptr) {
2073e78f53d1SNikolas Klauser  const size_t __n = __sa.__size_;
2074e78f53d1SNikolas Klauser  if (__n) {
2075e78f53d1SNikolas Klauser    __begin_ = __end_ = allocator<value_type>().allocate(__n);
2076e78f53d1SNikolas Klauser#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
2077e78f53d1SNikolas Klauser    try {
2078e78f53d1SNikolas Klauser#endif // _LIBCPP_HAS_NO_EXCEPTIONS
2079e78f53d1SNikolas Klauser      size_t __n_left = __n;
2080e78f53d1SNikolas Klauser      for (const value_type* __p = __sa.__vp_; __n_left; ++__end_, __p += __sa.__stride_, --__n_left)
2081e78f53d1SNikolas Klauser        ::new ((void*)__end_) value_type(*__p);
2082e78f53d1SNikolas Klauser#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
2083e78f53d1SNikolas Klauser    } catch (...) {
2084e78f53d1SNikolas Klauser      __clear(__n);
2085e78f53d1SNikolas Klauser      throw;
2086e78f53d1SNikolas Klauser    }
2087e78f53d1SNikolas Klauser#endif // _LIBCPP_HAS_NO_EXCEPTIONS
2088e78f53d1SNikolas Klauser  }
2089e78f53d1SNikolas Klauser}
2090e78f53d1SNikolas Klauser
2091e78f53d1SNikolas Klausertemplate <class _Tp>
2092e78f53d1SNikolas Klauservalarray<_Tp>::valarray(const gslice_array<value_type>& __ga) : __begin_(nullptr), __end_(nullptr) {
2093e78f53d1SNikolas Klauser  const size_t __n = __ga.__1d_.size();
2094e78f53d1SNikolas Klauser  if (__n) {
2095e78f53d1SNikolas Klauser    __begin_ = __end_ = allocator<value_type>().allocate(__n);
2096e78f53d1SNikolas Klauser#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
2097e78f53d1SNikolas Klauser    try {
2098e78f53d1SNikolas Klauser#endif // _LIBCPP_HAS_NO_EXCEPTIONS
2099e78f53d1SNikolas Klauser      typedef const size_t* _Ip;
2100e78f53d1SNikolas Klauser      const value_type* __s = __ga.__vp_;
2101e78f53d1SNikolas Klauser      for (_Ip __i = __ga.__1d_.__begin_, __e = __ga.__1d_.__end_; __i != __e; ++__i, ++__end_)
2102e78f53d1SNikolas Klauser        ::new ((void*)__end_) value_type(__s[*__i]);
2103e78f53d1SNikolas Klauser#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
2104e78f53d1SNikolas Klauser    } catch (...) {
2105e78f53d1SNikolas Klauser      __clear(__n);
2106e78f53d1SNikolas Klauser      throw;
2107e78f53d1SNikolas Klauser    }
2108e78f53d1SNikolas Klauser#endif // _LIBCPP_HAS_NO_EXCEPTIONS
2109e78f53d1SNikolas Klauser  }
2110e78f53d1SNikolas Klauser}
2111e78f53d1SNikolas Klauser
2112e78f53d1SNikolas Klausertemplate <class _Tp>
2113e78f53d1SNikolas Klauservalarray<_Tp>::valarray(const mask_array<value_type>& __ma) : __begin_(nullptr), __end_(nullptr) {
2114e78f53d1SNikolas Klauser  const size_t __n = __ma.__1d_.size();
2115e78f53d1SNikolas Klauser  if (__n) {
2116e78f53d1SNikolas Klauser    __begin_ = __end_ = allocator<value_type>().allocate(__n);
2117e78f53d1SNikolas Klauser#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
2118e78f53d1SNikolas Klauser    try {
2119e78f53d1SNikolas Klauser#endif // _LIBCPP_HAS_NO_EXCEPTIONS
2120e78f53d1SNikolas Klauser      typedef const size_t* _Ip;
2121e78f53d1SNikolas Klauser      const value_type* __s = __ma.__vp_;
2122e78f53d1SNikolas Klauser      for (_Ip __i = __ma.__1d_.__begin_, __e = __ma.__1d_.__end_; __i != __e; ++__i, ++__end_)
2123e78f53d1SNikolas Klauser        ::new ((void*)__end_) value_type(__s[*__i]);
2124e78f53d1SNikolas Klauser#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
2125e78f53d1SNikolas Klauser    } catch (...) {
2126e78f53d1SNikolas Klauser      __clear(__n);
2127e78f53d1SNikolas Klauser      throw;
2128e78f53d1SNikolas Klauser    }
2129e78f53d1SNikolas Klauser#endif // _LIBCPP_HAS_NO_EXCEPTIONS
2130e78f53d1SNikolas Klauser  }
2131e78f53d1SNikolas Klauser}
2132e78f53d1SNikolas Klauser
2133e78f53d1SNikolas Klausertemplate <class _Tp>
2134e78f53d1SNikolas Klauservalarray<_Tp>::valarray(const indirect_array<value_type>& __ia) : __begin_(nullptr), __end_(nullptr) {
2135e78f53d1SNikolas Klauser  const size_t __n = __ia.__1d_.size();
2136e78f53d1SNikolas Klauser  if (__n) {
2137e78f53d1SNikolas Klauser    __begin_ = __end_ = allocator<value_type>().allocate(__n);
2138e78f53d1SNikolas Klauser#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
2139e78f53d1SNikolas Klauser    try {
2140e78f53d1SNikolas Klauser#endif // _LIBCPP_HAS_NO_EXCEPTIONS
2141e78f53d1SNikolas Klauser      typedef const size_t* _Ip;
2142e78f53d1SNikolas Klauser      const value_type* __s = __ia.__vp_;
2143e78f53d1SNikolas Klauser      for (_Ip __i = __ia.__1d_.__begin_, __e = __ia.__1d_.__end_; __i != __e; ++__i, ++__end_)
2144e78f53d1SNikolas Klauser        ::new ((void*)__end_) value_type(__s[*__i]);
2145e78f53d1SNikolas Klauser#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
2146e78f53d1SNikolas Klauser    } catch (...) {
2147e78f53d1SNikolas Klauser      __clear(__n);
2148e78f53d1SNikolas Klauser      throw;
2149e78f53d1SNikolas Klauser    }
2150e78f53d1SNikolas Klauser#endif // _LIBCPP_HAS_NO_EXCEPTIONS
2151e78f53d1SNikolas Klauser  }
2152e78f53d1SNikolas Klauser}
2153e78f53d1SNikolas Klauser
2154e78f53d1SNikolas Klausertemplate <class _Tp>
2155e78f53d1SNikolas Klauserinline valarray<_Tp>::~valarray() {
2156e78f53d1SNikolas Klauser  __clear(size());
2157e78f53d1SNikolas Klauser}
2158e78f53d1SNikolas Klauser
2159e78f53d1SNikolas Klausertemplate <class _Tp>
2160e78f53d1SNikolas Klauservalarray<_Tp>& valarray<_Tp>::__assign_range(const value_type* __f, const value_type* __l) {
2161e78f53d1SNikolas Klauser  size_t __n = __l - __f;
2162e78f53d1SNikolas Klauser  if (size() != __n) {
2163e78f53d1SNikolas Klauser    __clear(size());
2164e78f53d1SNikolas Klauser    __begin_ = allocator<value_type>().allocate(__n);
2165e78f53d1SNikolas Klauser    __end_   = __begin_ + __n;
2166e78f53d1SNikolas Klauser    std::uninitialized_copy(__f, __l, __begin_);
2167e78f53d1SNikolas Klauser  } else {
2168e78f53d1SNikolas Klauser    std::copy(__f, __l, __begin_);
2169e78f53d1SNikolas Klauser  }
2170e78f53d1SNikolas Klauser  return *this;
2171e78f53d1SNikolas Klauser}
2172e78f53d1SNikolas Klauser
2173e78f53d1SNikolas Klausertemplate <class _Tp>
2174e78f53d1SNikolas Klauservalarray<_Tp>& valarray<_Tp>::operator=(const valarray& __v) {
2175e78f53d1SNikolas Klauser  if (this != std::addressof(__v))
2176e78f53d1SNikolas Klauser    return __assign_range(__v.__begin_, __v.__end_);
2177e78f53d1SNikolas Klauser  return *this;
2178e78f53d1SNikolas Klauser}
2179e78f53d1SNikolas Klauser
2180e78f53d1SNikolas Klauser#ifndef _LIBCPP_CXX03_LANG
2181e78f53d1SNikolas Klauser
2182e78f53d1SNikolas Klausertemplate <class _Tp>
2183e78f53d1SNikolas Klauserinline valarray<_Tp>& valarray<_Tp>::operator=(valarray&& __v) _NOEXCEPT {
2184e78f53d1SNikolas Klauser  __clear(size());
2185e78f53d1SNikolas Klauser  __begin_     = __v.__begin_;
2186e78f53d1SNikolas Klauser  __end_       = __v.__end_;
2187e78f53d1SNikolas Klauser  __v.__begin_ = nullptr;
2188e78f53d1SNikolas Klauser  __v.__end_   = nullptr;
2189e78f53d1SNikolas Klauser  return *this;
2190e78f53d1SNikolas Klauser}
2191e78f53d1SNikolas Klauser
2192e78f53d1SNikolas Klausertemplate <class _Tp>
2193e78f53d1SNikolas Klauserinline valarray<_Tp>& valarray<_Tp>::operator=(initializer_list<value_type> __il) {
2194e78f53d1SNikolas Klauser  return __assign_range(__il.begin(), __il.end());
2195e78f53d1SNikolas Klauser}
2196e78f53d1SNikolas Klauser
2197e78f53d1SNikolas Klauser#endif // _LIBCPP_CXX03_LANG
2198e78f53d1SNikolas Klauser
2199e78f53d1SNikolas Klausertemplate <class _Tp>
2200e78f53d1SNikolas Klauserinline valarray<_Tp>& valarray<_Tp>::operator=(const value_type& __x) {
2201e78f53d1SNikolas Klauser  std::fill(__begin_, __end_, __x);
2202e78f53d1SNikolas Klauser  return *this;
2203e78f53d1SNikolas Klauser}
2204e78f53d1SNikolas Klauser
2205e78f53d1SNikolas Klausertemplate <class _Tp>
2206e78f53d1SNikolas Klauserinline valarray<_Tp>& valarray<_Tp>::operator=(const slice_array<value_type>& __sa) {
2207e78f53d1SNikolas Klauser  value_type* __t       = __begin_;
2208e78f53d1SNikolas Klauser  const value_type* __s = __sa.__vp_;
2209e78f53d1SNikolas Klauser  for (size_t __n = __sa.__size_; __n; --__n, __s += __sa.__stride_, ++__t)
2210e78f53d1SNikolas Klauser    *__t = *__s;
2211e78f53d1SNikolas Klauser  return *this;
2212e78f53d1SNikolas Klauser}
2213e78f53d1SNikolas Klauser
2214e78f53d1SNikolas Klausertemplate <class _Tp>
2215e78f53d1SNikolas Klauserinline valarray<_Tp>& valarray<_Tp>::operator=(const gslice_array<value_type>& __ga) {
2216e78f53d1SNikolas Klauser  typedef const size_t* _Ip;
2217e78f53d1SNikolas Klauser  value_type* __t       = __begin_;
2218e78f53d1SNikolas Klauser  const value_type* __s = __ga.__vp_;
2219e78f53d1SNikolas Klauser  for (_Ip __i = __ga.__1d_.__begin_, __e = __ga.__1d_.__end_; __i != __e; ++__i, ++__t)
2220e78f53d1SNikolas Klauser    *__t = __s[*__i];
2221e78f53d1SNikolas Klauser  return *this;
2222e78f53d1SNikolas Klauser}
2223e78f53d1SNikolas Klauser
2224e78f53d1SNikolas Klausertemplate <class _Tp>
2225e78f53d1SNikolas Klauserinline valarray<_Tp>& valarray<_Tp>::operator=(const mask_array<value_type>& __ma) {
2226e78f53d1SNikolas Klauser  typedef const size_t* _Ip;
2227e78f53d1SNikolas Klauser  value_type* __t       = __begin_;
2228e78f53d1SNikolas Klauser  const value_type* __s = __ma.__vp_;
2229e78f53d1SNikolas Klauser  for (_Ip __i = __ma.__1d_.__begin_, __e = __ma.__1d_.__end_; __i != __e; ++__i, ++__t)
2230e78f53d1SNikolas Klauser    *__t = __s[*__i];
2231e78f53d1SNikolas Klauser  return *this;
2232e78f53d1SNikolas Klauser}
2233e78f53d1SNikolas Klauser
2234e78f53d1SNikolas Klausertemplate <class _Tp>
2235e78f53d1SNikolas Klauserinline valarray<_Tp>& valarray<_Tp>::operator=(const indirect_array<value_type>& __ia) {
2236e78f53d1SNikolas Klauser  typedef const size_t* _Ip;
2237e78f53d1SNikolas Klauser  value_type* __t       = __begin_;
2238e78f53d1SNikolas Klauser  const value_type* __s = __ia.__vp_;
2239e78f53d1SNikolas Klauser  for (_Ip __i = __ia.__1d_.__begin_, __e = __ia.__1d_.__end_; __i != __e; ++__i, ++__t)
2240e78f53d1SNikolas Klauser    *__t = __s[*__i];
2241e78f53d1SNikolas Klauser  return *this;
2242e78f53d1SNikolas Klauser}
2243e78f53d1SNikolas Klauser
2244e78f53d1SNikolas Klausertemplate <class _Tp>
2245e78f53d1SNikolas Klausertemplate <class _ValExpr>
2246e78f53d1SNikolas Klauserinline valarray<_Tp>& valarray<_Tp>::operator=(const __val_expr<_ValExpr>& __v) {
2247e78f53d1SNikolas Klauser  size_t __n = __v.size();
2248e78f53d1SNikolas Klauser  if (size() != __n)
2249e78f53d1SNikolas Klauser    resize(__n);
2250e78f53d1SNikolas Klauser  value_type* __t = __begin_;
2251e78f53d1SNikolas Klauser  for (size_t __i = 0; __i != __n; ++__t, ++__i)
2252e78f53d1SNikolas Klauser    *__t = __result_type(__v[__i]);
2253e78f53d1SNikolas Klauser  return *this;
2254e78f53d1SNikolas Klauser}
2255e78f53d1SNikolas Klauser
2256e78f53d1SNikolas Klausertemplate <class _Tp>
2257e78f53d1SNikolas Klauserinline __val_expr<__slice_expr<const valarray<_Tp>&> > valarray<_Tp>::operator[](slice __s) const {
2258e78f53d1SNikolas Klauser  return __val_expr<__slice_expr<const valarray&> >(__slice_expr<const valarray&>(__s, *this));
2259e78f53d1SNikolas Klauser}
2260e78f53d1SNikolas Klauser
2261e78f53d1SNikolas Klausertemplate <class _Tp>
2262e78f53d1SNikolas Klauserinline slice_array<_Tp> valarray<_Tp>::operator[](slice __s) {
2263e78f53d1SNikolas Klauser  return slice_array<value_type>(__s, *this);
2264e78f53d1SNikolas Klauser}
2265e78f53d1SNikolas Klauser
2266e78f53d1SNikolas Klausertemplate <class _Tp>
2267e78f53d1SNikolas Klauserinline __val_expr<__indirect_expr<const valarray<_Tp>&> > valarray<_Tp>::operator[](const gslice& __gs) const {
2268e78f53d1SNikolas Klauser  return __val_expr<__indirect_expr<const valarray&> >(__indirect_expr<const valarray&>(__gs.__1d_, *this));
2269e78f53d1SNikolas Klauser}
2270e78f53d1SNikolas Klauser
2271e78f53d1SNikolas Klausertemplate <class _Tp>
2272e78f53d1SNikolas Klauserinline gslice_array<_Tp> valarray<_Tp>::operator[](const gslice& __gs) {
2273e78f53d1SNikolas Klauser  return gslice_array<value_type>(__gs, *this);
2274e78f53d1SNikolas Klauser}
2275e78f53d1SNikolas Klauser
2276e78f53d1SNikolas Klauser#ifndef _LIBCPP_CXX03_LANG
2277e78f53d1SNikolas Klauser
2278e78f53d1SNikolas Klausertemplate <class _Tp>
2279e78f53d1SNikolas Klauserinline __val_expr<__indirect_expr<const valarray<_Tp>&> > valarray<_Tp>::operator[](gslice&& __gs) const {
2280e78f53d1SNikolas Klauser  return __val_expr<__indirect_expr<const valarray&> >(__indirect_expr<const valarray&>(std::move(__gs.__1d_), *this));
2281e78f53d1SNikolas Klauser}
2282e78f53d1SNikolas Klauser
2283e78f53d1SNikolas Klausertemplate <class _Tp>
2284e78f53d1SNikolas Klauserinline gslice_array<_Tp> valarray<_Tp>::operator[](gslice&& __gs) {
2285e78f53d1SNikolas Klauser  return gslice_array<value_type>(std::move(__gs), *this);
2286e78f53d1SNikolas Klauser}
2287e78f53d1SNikolas Klauser
2288e78f53d1SNikolas Klauser#endif // _LIBCPP_CXX03_LANG
2289e78f53d1SNikolas Klauser
2290e78f53d1SNikolas Klausertemplate <class _Tp>
2291e78f53d1SNikolas Klauserinline __val_expr<__mask_expr<const valarray<_Tp>&> > valarray<_Tp>::operator[](const valarray<bool>& __vb) const {
2292e78f53d1SNikolas Klauser  return __val_expr<__mask_expr<const valarray&> >(__mask_expr<const valarray&>(__vb, *this));
2293e78f53d1SNikolas Klauser}
2294e78f53d1SNikolas Klauser
2295e78f53d1SNikolas Klausertemplate <class _Tp>
2296e78f53d1SNikolas Klauserinline mask_array<_Tp> valarray<_Tp>::operator[](const valarray<bool>& __vb) {
2297e78f53d1SNikolas Klauser  return mask_array<value_type>(__vb, *this);
2298e78f53d1SNikolas Klauser}
2299e78f53d1SNikolas Klauser
2300e78f53d1SNikolas Klauser#ifndef _LIBCPP_CXX03_LANG
2301e78f53d1SNikolas Klauser
2302e78f53d1SNikolas Klausertemplate <class _Tp>
2303e78f53d1SNikolas Klauserinline __val_expr<__mask_expr<const valarray<_Tp>&> > valarray<_Tp>::operator[](valarray<bool>&& __vb) const {
2304e78f53d1SNikolas Klauser  return __val_expr<__mask_expr<const valarray&> >(__mask_expr<const valarray&>(std::move(__vb), *this));
2305e78f53d1SNikolas Klauser}
2306e78f53d1SNikolas Klauser
2307e78f53d1SNikolas Klausertemplate <class _Tp>
2308e78f53d1SNikolas Klauserinline mask_array<_Tp> valarray<_Tp>::operator[](valarray<bool>&& __vb) {
2309e78f53d1SNikolas Klauser  return mask_array<value_type>(std::move(__vb), *this);
2310e78f53d1SNikolas Klauser}
2311e78f53d1SNikolas Klauser
2312e78f53d1SNikolas Klauser#endif // _LIBCPP_CXX03_LANG
2313e78f53d1SNikolas Klauser
2314e78f53d1SNikolas Klausertemplate <class _Tp>
2315e78f53d1SNikolas Klauserinline __val_expr<__indirect_expr<const valarray<_Tp>&> >
2316e78f53d1SNikolas Klauservalarray<_Tp>::operator[](const valarray<size_t>& __vs) const {
2317e78f53d1SNikolas Klauser  return __val_expr<__indirect_expr<const valarray&> >(__indirect_expr<const valarray&>(__vs, *this));
2318e78f53d1SNikolas Klauser}
2319e78f53d1SNikolas Klauser
2320e78f53d1SNikolas Klausertemplate <class _Tp>
2321e78f53d1SNikolas Klauserinline indirect_array<_Tp> valarray<_Tp>::operator[](const valarray<size_t>& __vs) {
2322e78f53d1SNikolas Klauser  return indirect_array<value_type>(__vs, *this);
2323e78f53d1SNikolas Klauser}
2324e78f53d1SNikolas Klauser
2325e78f53d1SNikolas Klauser#ifndef _LIBCPP_CXX03_LANG
2326e78f53d1SNikolas Klauser
2327e78f53d1SNikolas Klausertemplate <class _Tp>
2328e78f53d1SNikolas Klauserinline __val_expr<__indirect_expr<const valarray<_Tp>&> > valarray<_Tp>::operator[](valarray<size_t>&& __vs) const {
2329e78f53d1SNikolas Klauser  return __val_expr<__indirect_expr<const valarray&> >(__indirect_expr<const valarray&>(std::move(__vs), *this));
2330e78f53d1SNikolas Klauser}
2331e78f53d1SNikolas Klauser
2332e78f53d1SNikolas Klausertemplate <class _Tp>
2333e78f53d1SNikolas Klauserinline indirect_array<_Tp> valarray<_Tp>::operator[](valarray<size_t>&& __vs) {
2334e78f53d1SNikolas Klauser  return indirect_array<value_type>(std::move(__vs), *this);
2335e78f53d1SNikolas Klauser}
2336e78f53d1SNikolas Klauser
2337e78f53d1SNikolas Klauser#endif // _LIBCPP_CXX03_LANG
2338e78f53d1SNikolas Klauser
2339e78f53d1SNikolas Klausertemplate <class _Tp>
2340e78f53d1SNikolas Klauserinline __val_expr<_UnaryOp<__unary_plus<_Tp>, const valarray<_Tp>&> > valarray<_Tp>::operator+() const {
2341e78f53d1SNikolas Klauser  using _Op = _UnaryOp<__unary_plus<_Tp>, const valarray<_Tp>&>;
2342e78f53d1SNikolas Klauser  return __val_expr<_Op>(_Op(__unary_plus<_Tp>(), *this));
2343e78f53d1SNikolas Klauser}
2344e78f53d1SNikolas Klauser
2345e78f53d1SNikolas Klausertemplate <class _Tp>
2346e78f53d1SNikolas Klauserinline __val_expr<_UnaryOp<negate<_Tp>, const valarray<_Tp>&> > valarray<_Tp>::operator-() const {
2347e78f53d1SNikolas Klauser  using _Op = _UnaryOp<negate<_Tp>, const valarray<_Tp>&>;
2348e78f53d1SNikolas Klauser  return __val_expr<_Op>(_Op(negate<_Tp>(), *this));
2349e78f53d1SNikolas Klauser}
2350e78f53d1SNikolas Klauser
2351e78f53d1SNikolas Klausertemplate <class _Tp>
2352e78f53d1SNikolas Klauserinline __val_expr<_UnaryOp<__bit_not<_Tp>, const valarray<_Tp>&> > valarray<_Tp>::operator~() const {
2353e78f53d1SNikolas Klauser  using _Op = _UnaryOp<__bit_not<_Tp>, const valarray<_Tp>&>;
2354e78f53d1SNikolas Klauser  return __val_expr<_Op>(_Op(__bit_not<_Tp>(), *this));
2355e78f53d1SNikolas Klauser}
2356e78f53d1SNikolas Klauser
2357e78f53d1SNikolas Klausertemplate <class _Tp>
2358e78f53d1SNikolas Klauserinline __val_expr<_UnaryOp<logical_not<_Tp>, const valarray<_Tp>&> > valarray<_Tp>::operator!() const {
2359e78f53d1SNikolas Klauser  using _Op = _UnaryOp<logical_not<_Tp>, const valarray<_Tp>&>;
2360e78f53d1SNikolas Klauser  return __val_expr<_Op>(_Op(logical_not<_Tp>(), *this));
2361e78f53d1SNikolas Klauser}
2362e78f53d1SNikolas Klauser
2363e78f53d1SNikolas Klausertemplate <class _Tp>
2364e78f53d1SNikolas Klauserinline valarray<_Tp>& valarray<_Tp>::operator*=(const value_type& __x) {
2365e78f53d1SNikolas Klauser  for (value_type* __p = __begin_; __p != __end_; ++__p)
2366e78f53d1SNikolas Klauser    *__p *= __x;
2367e78f53d1SNikolas Klauser  return *this;
2368e78f53d1SNikolas Klauser}
2369e78f53d1SNikolas Klauser
2370e78f53d1SNikolas Klausertemplate <class _Tp>
2371e78f53d1SNikolas Klauserinline valarray<_Tp>& valarray<_Tp>::operator/=(const value_type& __x) {
2372e78f53d1SNikolas Klauser  for (value_type* __p = __begin_; __p != __end_; ++__p)
2373e78f53d1SNikolas Klauser    *__p /= __x;
2374e78f53d1SNikolas Klauser  return *this;
2375e78f53d1SNikolas Klauser}
2376e78f53d1SNikolas Klauser
2377e78f53d1SNikolas Klausertemplate <class _Tp>
2378e78f53d1SNikolas Klauserinline valarray<_Tp>& valarray<_Tp>::operator%=(const value_type& __x) {
2379e78f53d1SNikolas Klauser  for (value_type* __p = __begin_; __p != __end_; ++__p)
2380e78f53d1SNikolas Klauser    *__p %= __x;
2381e78f53d1SNikolas Klauser  return *this;
2382e78f53d1SNikolas Klauser}
2383e78f53d1SNikolas Klauser
2384e78f53d1SNikolas Klausertemplate <class _Tp>
2385e78f53d1SNikolas Klauserinline valarray<_Tp>& valarray<_Tp>::operator+=(const value_type& __x) {
2386e78f53d1SNikolas Klauser  for (value_type* __p = __begin_; __p != __end_; ++__p)
2387e78f53d1SNikolas Klauser    *__p += __x;
2388e78f53d1SNikolas Klauser  return *this;
2389e78f53d1SNikolas Klauser}
2390e78f53d1SNikolas Klauser
2391e78f53d1SNikolas Klausertemplate <class _Tp>
2392e78f53d1SNikolas Klauserinline valarray<_Tp>& valarray<_Tp>::operator-=(const value_type& __x) {
2393e78f53d1SNikolas Klauser  for (value_type* __p = __begin_; __p != __end_; ++__p)
2394e78f53d1SNikolas Klauser    *__p -= __x;
2395e78f53d1SNikolas Klauser  return *this;
2396e78f53d1SNikolas Klauser}
2397e78f53d1SNikolas Klauser
2398e78f53d1SNikolas Klausertemplate <class _Tp>
2399e78f53d1SNikolas Klauserinline valarray<_Tp>& valarray<_Tp>::operator^=(const value_type& __x) {
2400e78f53d1SNikolas Klauser  for (value_type* __p = __begin_; __p != __end_; ++__p)
2401e78f53d1SNikolas Klauser    *__p ^= __x;
2402e78f53d1SNikolas Klauser  return *this;
2403e78f53d1SNikolas Klauser}
2404e78f53d1SNikolas Klauser
2405e78f53d1SNikolas Klausertemplate <class _Tp>
2406e78f53d1SNikolas Klauserinline valarray<_Tp>& valarray<_Tp>::operator&=(const value_type& __x) {
2407e78f53d1SNikolas Klauser  for (value_type* __p = __begin_; __p != __end_; ++__p)
2408e78f53d1SNikolas Klauser    *__p &= __x;
2409e78f53d1SNikolas Klauser  return *this;
2410e78f53d1SNikolas Klauser}
2411e78f53d1SNikolas Klauser
2412e78f53d1SNikolas Klausertemplate <class _Tp>
2413e78f53d1SNikolas Klauserinline valarray<_Tp>& valarray<_Tp>::operator|=(const value_type& __x) {
2414e78f53d1SNikolas Klauser  for (value_type* __p = __begin_; __p != __end_; ++__p)
2415e78f53d1SNikolas Klauser    *__p |= __x;
2416e78f53d1SNikolas Klauser  return *this;
2417e78f53d1SNikolas Klauser}
2418e78f53d1SNikolas Klauser
2419e78f53d1SNikolas Klausertemplate <class _Tp>
2420e78f53d1SNikolas Klauserinline valarray<_Tp>& valarray<_Tp>::operator<<=(const value_type& __x) {
2421e78f53d1SNikolas Klauser  for (value_type* __p = __begin_; __p != __end_; ++__p)
2422e78f53d1SNikolas Klauser    *__p <<= __x;
2423e78f53d1SNikolas Klauser  return *this;
2424e78f53d1SNikolas Klauser}
2425e78f53d1SNikolas Klauser
2426e78f53d1SNikolas Klausertemplate <class _Tp>
2427e78f53d1SNikolas Klauserinline valarray<_Tp>& valarray<_Tp>::operator>>=(const value_type& __x) {
2428e78f53d1SNikolas Klauser  for (value_type* __p = __begin_; __p != __end_; ++__p)
2429e78f53d1SNikolas Klauser    *__p >>= __x;
2430e78f53d1SNikolas Klauser  return *this;
2431e78f53d1SNikolas Klauser}
2432e78f53d1SNikolas Klauser
2433e78f53d1SNikolas Klausertemplate <class _Tp>
2434e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
2435e78f53d1SNikolas Klauserinline valarray<_Tp>& valarray<_Tp>::operator*=(const _Expr& __v) {
2436e78f53d1SNikolas Klauser  size_t __i = 0;
2437e78f53d1SNikolas Klauser  for (value_type* __t = __begin_; __t != __end_; ++__t, ++__i)
2438e78f53d1SNikolas Klauser    *__t *= std::__get(__v, __i);
2439e78f53d1SNikolas Klauser  return *this;
2440e78f53d1SNikolas Klauser}
2441e78f53d1SNikolas Klauser
2442e78f53d1SNikolas Klausertemplate <class _Tp>
2443e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
2444e78f53d1SNikolas Klauserinline valarray<_Tp>& valarray<_Tp>::operator/=(const _Expr& __v) {
2445e78f53d1SNikolas Klauser  size_t __i = 0;
2446e78f53d1SNikolas Klauser  for (value_type* __t = __begin_; __t != __end_; ++__t, ++__i)
2447e78f53d1SNikolas Klauser    *__t /= std::__get(__v, __i);
2448e78f53d1SNikolas Klauser  return *this;
2449e78f53d1SNikolas Klauser}
2450e78f53d1SNikolas Klauser
2451e78f53d1SNikolas Klausertemplate <class _Tp>
2452e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
2453e78f53d1SNikolas Klauserinline valarray<_Tp>& valarray<_Tp>::operator%=(const _Expr& __v) {
2454e78f53d1SNikolas Klauser  size_t __i = 0;
2455e78f53d1SNikolas Klauser  for (value_type* __t = __begin_; __t != __end_; ++__t, ++__i)
2456e78f53d1SNikolas Klauser    *__t %= std::__get(__v, __i);
2457e78f53d1SNikolas Klauser  return *this;
2458e78f53d1SNikolas Klauser}
2459e78f53d1SNikolas Klauser
2460e78f53d1SNikolas Klausertemplate <class _Tp>
2461e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
2462e78f53d1SNikolas Klauserinline valarray<_Tp>& valarray<_Tp>::operator+=(const _Expr& __v) {
2463e78f53d1SNikolas Klauser  size_t __i = 0;
2464e78f53d1SNikolas Klauser  for (value_type* __t = __begin_; __t != __end_; ++__t, ++__i)
2465e78f53d1SNikolas Klauser    *__t += std::__get(__v, __i);
2466e78f53d1SNikolas Klauser  return *this;
2467e78f53d1SNikolas Klauser}
2468e78f53d1SNikolas Klauser
2469e78f53d1SNikolas Klausertemplate <class _Tp>
2470e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
2471e78f53d1SNikolas Klauserinline valarray<_Tp>& valarray<_Tp>::operator-=(const _Expr& __v) {
2472e78f53d1SNikolas Klauser  size_t __i = 0;
2473e78f53d1SNikolas Klauser  for (value_type* __t = __begin_; __t != __end_; ++__t, ++__i)
2474e78f53d1SNikolas Klauser    *__t -= std::__get(__v, __i);
2475e78f53d1SNikolas Klauser  return *this;
2476e78f53d1SNikolas Klauser}
2477e78f53d1SNikolas Klauser
2478e78f53d1SNikolas Klausertemplate <class _Tp>
2479e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
2480e78f53d1SNikolas Klauserinline valarray<_Tp>& valarray<_Tp>::operator^=(const _Expr& __v) {
2481e78f53d1SNikolas Klauser  size_t __i = 0;
2482e78f53d1SNikolas Klauser  for (value_type* __t = __begin_; __t != __end_; ++__t, ++__i)
2483e78f53d1SNikolas Klauser    *__t ^= std::__get(__v, __i);
2484e78f53d1SNikolas Klauser  return *this;
2485e78f53d1SNikolas Klauser}
2486e78f53d1SNikolas Klauser
2487e78f53d1SNikolas Klausertemplate <class _Tp>
2488e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
2489e78f53d1SNikolas Klauserinline valarray<_Tp>& valarray<_Tp>::operator|=(const _Expr& __v) {
2490e78f53d1SNikolas Klauser  size_t __i = 0;
2491e78f53d1SNikolas Klauser  for (value_type* __t = __begin_; __t != __end_; ++__t, ++__i)
2492e78f53d1SNikolas Klauser    *__t |= std::__get(__v, __i);
2493e78f53d1SNikolas Klauser  return *this;
2494e78f53d1SNikolas Klauser}
2495e78f53d1SNikolas Klauser
2496e78f53d1SNikolas Klausertemplate <class _Tp>
2497e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
2498e78f53d1SNikolas Klauserinline valarray<_Tp>& valarray<_Tp>::operator&=(const _Expr& __v) {
2499e78f53d1SNikolas Klauser  size_t __i = 0;
2500e78f53d1SNikolas Klauser  for (value_type* __t = __begin_; __t != __end_; ++__t, ++__i)
2501e78f53d1SNikolas Klauser    *__t &= std::__get(__v, __i);
2502e78f53d1SNikolas Klauser  return *this;
2503e78f53d1SNikolas Klauser}
2504e78f53d1SNikolas Klauser
2505e78f53d1SNikolas Klausertemplate <class _Tp>
2506e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
2507e78f53d1SNikolas Klauserinline valarray<_Tp>& valarray<_Tp>::operator<<=(const _Expr& __v) {
2508e78f53d1SNikolas Klauser  size_t __i = 0;
2509e78f53d1SNikolas Klauser  for (value_type* __t = __begin_; __t != __end_; ++__t, ++__i)
2510e78f53d1SNikolas Klauser    *__t <<= std::__get(__v, __i);
2511e78f53d1SNikolas Klauser  return *this;
2512e78f53d1SNikolas Klauser}
2513e78f53d1SNikolas Klauser
2514e78f53d1SNikolas Klausertemplate <class _Tp>
2515e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> >
2516e78f53d1SNikolas Klauserinline valarray<_Tp>& valarray<_Tp>::operator>>=(const _Expr& __v) {
2517e78f53d1SNikolas Klauser  size_t __i = 0;
2518e78f53d1SNikolas Klauser  for (value_type* __t = __begin_; __t != __end_; ++__t, ++__i)
2519e78f53d1SNikolas Klauser    *__t >>= std::__get(__v, __i);
2520e78f53d1SNikolas Klauser  return *this;
2521e78f53d1SNikolas Klauser}
2522e78f53d1SNikolas Klauser
2523e78f53d1SNikolas Klausertemplate <class _Tp>
2524e78f53d1SNikolas Klauserinline void valarray<_Tp>::swap(valarray& __v) _NOEXCEPT {
2525e78f53d1SNikolas Klauser  std::swap(__begin_, __v.__begin_);
2526e78f53d1SNikolas Klauser  std::swap(__end_, __v.__end_);
2527e78f53d1SNikolas Klauser}
2528e78f53d1SNikolas Klauser
2529e78f53d1SNikolas Klausertemplate <class _Tp>
2530e78f53d1SNikolas Klauserinline _Tp valarray<_Tp>::sum() const {
2531e78f53d1SNikolas Klauser  if (__begin_ == __end_)
2532e78f53d1SNikolas Klauser    return value_type();
2533e78f53d1SNikolas Klauser  const value_type* __p = __begin_;
2534e78f53d1SNikolas Klauser  _Tp __r               = *__p;
2535e78f53d1SNikolas Klauser  for (++__p; __p != __end_; ++__p)
2536e78f53d1SNikolas Klauser    __r += *__p;
2537e78f53d1SNikolas Klauser  return __r;
2538e78f53d1SNikolas Klauser}
2539e78f53d1SNikolas Klauser
2540e78f53d1SNikolas Klausertemplate <class _Tp>
2541e78f53d1SNikolas Klauserinline _Tp valarray<_Tp>::min() const {
2542e78f53d1SNikolas Klauser  if (__begin_ == __end_)
2543e78f53d1SNikolas Klauser    return value_type();
2544e78f53d1SNikolas Klauser  return *std::min_element(__begin_, __end_);
2545e78f53d1SNikolas Klauser}
2546e78f53d1SNikolas Klauser
2547e78f53d1SNikolas Klausertemplate <class _Tp>
2548e78f53d1SNikolas Klauserinline _Tp valarray<_Tp>::max() const {
2549e78f53d1SNikolas Klauser  if (__begin_ == __end_)
2550e78f53d1SNikolas Klauser    return value_type();
2551e78f53d1SNikolas Klauser  return *std::max_element(__begin_, __end_);
2552e78f53d1SNikolas Klauser}
2553e78f53d1SNikolas Klauser
2554e78f53d1SNikolas Klausertemplate <class _Tp>
2555e78f53d1SNikolas Klauservalarray<_Tp> valarray<_Tp>::shift(int __i) const {
2556e78f53d1SNikolas Klauser  valarray<value_type> __r;
2557e78f53d1SNikolas Klauser  size_t __n = size();
2558e78f53d1SNikolas Klauser  if (__n) {
2559e78f53d1SNikolas Klauser    __r.__begin_ = __r.__end_ = allocator<value_type>().allocate(__n);
2560e78f53d1SNikolas Klauser    const value_type* __sb;
2561e78f53d1SNikolas Klauser    value_type* __tb;
2562e78f53d1SNikolas Klauser    value_type* __te;
2563e78f53d1SNikolas Klauser    if (__i >= 0) {
2564e78f53d1SNikolas Klauser      __i  = std::min(__i, static_cast<int>(__n));
2565e78f53d1SNikolas Klauser      __sb = __begin_ + __i;
2566e78f53d1SNikolas Klauser      __tb = __r.__begin_;
2567e78f53d1SNikolas Klauser      __te = __r.__begin_ + (__n - __i);
2568e78f53d1SNikolas Klauser    } else {
2569e78f53d1SNikolas Klauser      __i  = std::min(-__i, static_cast<int>(__n));
2570e78f53d1SNikolas Klauser      __sb = __begin_;
2571e78f53d1SNikolas Klauser      __tb = __r.__begin_ + __i;
2572e78f53d1SNikolas Klauser      __te = __r.__begin_ + __n;
2573e78f53d1SNikolas Klauser    }
2574e78f53d1SNikolas Klauser    for (; __r.__end_ != __tb; ++__r.__end_)
2575e78f53d1SNikolas Klauser      ::new ((void*)__r.__end_) value_type();
2576e78f53d1SNikolas Klauser    for (; __r.__end_ != __te; ++__r.__end_, ++__sb)
2577e78f53d1SNikolas Klauser      ::new ((void*)__r.__end_) value_type(*__sb);
2578e78f53d1SNikolas Klauser    for (__te = __r.__begin_ + __n; __r.__end_ != __te; ++__r.__end_)
2579e78f53d1SNikolas Klauser      ::new ((void*)__r.__end_) value_type();
2580e78f53d1SNikolas Klauser  }
2581e78f53d1SNikolas Klauser  return __r;
2582e78f53d1SNikolas Klauser}
2583e78f53d1SNikolas Klauser
2584e78f53d1SNikolas Klausertemplate <class _Tp>
2585e78f53d1SNikolas Klauservalarray<_Tp> valarray<_Tp>::cshift(int __i) const {
2586e78f53d1SNikolas Klauser  valarray<value_type> __r;
2587e78f53d1SNikolas Klauser  size_t __n = size();
2588e78f53d1SNikolas Klauser  if (__n) {
2589e78f53d1SNikolas Klauser    __r.__begin_ = __r.__end_ = allocator<value_type>().allocate(__n);
2590e78f53d1SNikolas Klauser    __i %= static_cast<int>(__n);
2591e78f53d1SNikolas Klauser    const value_type* __m = __i >= 0 ? __begin_ + __i : __end_ + __i;
2592e78f53d1SNikolas Klauser    for (const value_type* __s = __m; __s != __end_; ++__r.__end_, ++__s)
2593e78f53d1SNikolas Klauser      ::new ((void*)__r.__end_) value_type(*__s);
2594e78f53d1SNikolas Klauser    for (const value_type* __s = __begin_; __s != __m; ++__r.__end_, ++__s)
2595e78f53d1SNikolas Klauser      ::new ((void*)__r.__end_) value_type(*__s);
2596e78f53d1SNikolas Klauser  }
2597e78f53d1SNikolas Klauser  return __r;
2598e78f53d1SNikolas Klauser}
2599e78f53d1SNikolas Klauser
2600e78f53d1SNikolas Klausertemplate <class _Tp>
2601e78f53d1SNikolas Klauservalarray<_Tp> valarray<_Tp>::apply(value_type __f(value_type)) const {
2602e78f53d1SNikolas Klauser  valarray<value_type> __r;
2603e78f53d1SNikolas Klauser  size_t __n = size();
2604e78f53d1SNikolas Klauser  if (__n) {
2605e78f53d1SNikolas Klauser    __r.__begin_ = __r.__end_ = allocator<value_type>().allocate(__n);
2606e78f53d1SNikolas Klauser    for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n)
2607e78f53d1SNikolas Klauser      ::new ((void*)__r.__end_) value_type(__f(*__p));
2608e78f53d1SNikolas Klauser  }
2609e78f53d1SNikolas Klauser  return __r;
2610e78f53d1SNikolas Klauser}
2611e78f53d1SNikolas Klauser
2612e78f53d1SNikolas Klausertemplate <class _Tp>
2613e78f53d1SNikolas Klauservalarray<_Tp> valarray<_Tp>::apply(value_type __f(const value_type&)) const {
2614e78f53d1SNikolas Klauser  valarray<value_type> __r;
2615e78f53d1SNikolas Klauser  size_t __n = size();
2616e78f53d1SNikolas Klauser  if (__n) {
2617e78f53d1SNikolas Klauser    __r.__begin_ = __r.__end_ = allocator<value_type>().allocate(__n);
2618e78f53d1SNikolas Klauser    for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n)
2619e78f53d1SNikolas Klauser      ::new ((void*)__r.__end_) value_type(__f(*__p));
2620e78f53d1SNikolas Klauser  }
2621e78f53d1SNikolas Klauser  return __r;
2622e78f53d1SNikolas Klauser}
2623e78f53d1SNikolas Klauser
2624e78f53d1SNikolas Klausertemplate <class _Tp>
2625e78f53d1SNikolas Klauserinline void valarray<_Tp>::__clear(size_t __capacity) {
2626e78f53d1SNikolas Klauser  if (__begin_ != nullptr) {
2627e78f53d1SNikolas Klauser    while (__end_ != __begin_)
2628e78f53d1SNikolas Klauser      (--__end_)->~value_type();
2629e78f53d1SNikolas Klauser    allocator<value_type>().deallocate(__begin_, __capacity);
2630e78f53d1SNikolas Klauser    __begin_ = __end_ = nullptr;
2631e78f53d1SNikolas Klauser  }
2632e78f53d1SNikolas Klauser}
2633e78f53d1SNikolas Klauser
2634e78f53d1SNikolas Klausertemplate <class _Tp>
2635e78f53d1SNikolas Klauservoid valarray<_Tp>::resize(size_t __n, value_type __x) {
2636e78f53d1SNikolas Klauser  __clear(size());
2637e78f53d1SNikolas Klauser  if (__n) {
2638e78f53d1SNikolas Klauser    __begin_ = __end_ = allocator<value_type>().allocate(__n);
2639e78f53d1SNikolas Klauser#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
2640e78f53d1SNikolas Klauser    try {
2641e78f53d1SNikolas Klauser#endif // _LIBCPP_HAS_NO_EXCEPTIONS
2642e78f53d1SNikolas Klauser      for (size_t __n_left = __n; __n_left; --__n_left, ++__end_)
2643e78f53d1SNikolas Klauser        ::new ((void*)__end_) value_type(__x);
2644e78f53d1SNikolas Klauser#ifndef _LIBCPP_HAS_NO_EXCEPTIONS
2645e78f53d1SNikolas Klauser    } catch (...) {
2646e78f53d1SNikolas Klauser      __clear(__n);
2647e78f53d1SNikolas Klauser      throw;
2648e78f53d1SNikolas Klauser    }
2649e78f53d1SNikolas Klauser#endif // _LIBCPP_HAS_NO_EXCEPTIONS
2650e78f53d1SNikolas Klauser  }
2651e78f53d1SNikolas Klauser}
2652e78f53d1SNikolas Klauser
2653e78f53d1SNikolas Klausertemplate <class _Tp>
2654e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI void swap(valarray<_Tp>& __x, valarray<_Tp>& __y) _NOEXCEPT {
2655e78f53d1SNikolas Klauser  __x.swap(__y);
2656e78f53d1SNikolas Klauser}
2657e78f53d1SNikolas Klauser
2658e78f53d1SNikolas Klausertemplate <class _Expr1,
2659e78f53d1SNikolas Klauser          class _Expr2,
2660e78f53d1SNikolas Klauser          __enable_if_t<__is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, int> = 0>
2661e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI __val_expr<_BinaryOp<multiplies<typename _Expr1::value_type>, _Expr1, _Expr2> >
2662e78f53d1SNikolas Klauseroperator*(const _Expr1& __x, const _Expr2& __y) {
2663e78f53d1SNikolas Klauser  typedef typename _Expr1::value_type value_type;
2664e78f53d1SNikolas Klauser  typedef _BinaryOp<multiplies<value_type>, _Expr1, _Expr2> _Op;
2665e78f53d1SNikolas Klauser  return __val_expr<_Op>(_Op(multiplies<value_type>(), __x, __y));
2666e78f53d1SNikolas Klauser}
2667e78f53d1SNikolas Klauser
2668e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
2669e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI
2670e78f53d1SNikolas Klauser__val_expr<_BinaryOp<multiplies<typename _Expr::value_type>, _Expr, __scalar_expr<typename _Expr::value_type> > >
2671e78f53d1SNikolas Klauseroperator*(const _Expr& __x, const typename _Expr::value_type& __y) {
2672e78f53d1SNikolas Klauser  typedef typename _Expr::value_type value_type;
2673e78f53d1SNikolas Klauser  typedef _BinaryOp<multiplies<value_type>, _Expr, __scalar_expr<value_type> > _Op;
2674e78f53d1SNikolas Klauser  return __val_expr<_Op>(_Op(multiplies<value_type>(), __x, __scalar_expr<value_type>(__y, __x.size())));
2675e78f53d1SNikolas Klauser}
2676e78f53d1SNikolas Klauser
2677e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
2678e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI
2679e78f53d1SNikolas Klauser__val_expr<_BinaryOp<multiplies<typename _Expr::value_type>, __scalar_expr<typename _Expr::value_type>, _Expr> >
2680e78f53d1SNikolas Klauseroperator*(const typename _Expr::value_type& __x, const _Expr& __y) {
2681e78f53d1SNikolas Klauser  typedef typename _Expr::value_type value_type;
2682e78f53d1SNikolas Klauser  typedef _BinaryOp<multiplies<value_type>, __scalar_expr<value_type>, _Expr> _Op;
2683e78f53d1SNikolas Klauser  return __val_expr<_Op>(_Op(multiplies<value_type>(), __scalar_expr<value_type>(__x, __y.size()), __y));
2684e78f53d1SNikolas Klauser}
2685e78f53d1SNikolas Klauser
2686e78f53d1SNikolas Klausertemplate <class _Expr1,
2687e78f53d1SNikolas Klauser          class _Expr2,
2688e78f53d1SNikolas Klauser          __enable_if_t<__is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, int> = 0>
2689e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI __val_expr<_BinaryOp<divides<typename _Expr1::value_type>, _Expr1, _Expr2> >
2690e78f53d1SNikolas Klauseroperator/(const _Expr1& __x, const _Expr2& __y) {
2691e78f53d1SNikolas Klauser  typedef typename _Expr1::value_type value_type;
2692e78f53d1SNikolas Klauser  typedef _BinaryOp<divides<value_type>, _Expr1, _Expr2> _Op;
2693e78f53d1SNikolas Klauser  return __val_expr<_Op>(_Op(divides<value_type>(), __x, __y));
2694e78f53d1SNikolas Klauser}
2695e78f53d1SNikolas Klauser
2696e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
2697e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI
2698e78f53d1SNikolas Klauser__val_expr<_BinaryOp<divides<typename _Expr::value_type>, _Expr, __scalar_expr<typename _Expr::value_type> > >
2699e78f53d1SNikolas Klauseroperator/(const _Expr& __x, const typename _Expr::value_type& __y) {
2700e78f53d1SNikolas Klauser  typedef typename _Expr::value_type value_type;
2701e78f53d1SNikolas Klauser  typedef _BinaryOp<divides<value_type>, _Expr, __scalar_expr<value_type> > _Op;
2702e78f53d1SNikolas Klauser  return __val_expr<_Op>(_Op(divides<value_type>(), __x, __scalar_expr<value_type>(__y, __x.size())));
2703e78f53d1SNikolas Klauser}
2704e78f53d1SNikolas Klauser
2705e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
2706e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI
2707e78f53d1SNikolas Klauser__val_expr<_BinaryOp<divides<typename _Expr::value_type>, __scalar_expr<typename _Expr::value_type>, _Expr> >
2708e78f53d1SNikolas Klauseroperator/(const typename _Expr::value_type& __x, const _Expr& __y) {
2709e78f53d1SNikolas Klauser  typedef typename _Expr::value_type value_type;
2710e78f53d1SNikolas Klauser  typedef _BinaryOp<divides<value_type>, __scalar_expr<value_type>, _Expr> _Op;
2711e78f53d1SNikolas Klauser  return __val_expr<_Op>(_Op(divides<value_type>(), __scalar_expr<value_type>(__x, __y.size()), __y));
2712e78f53d1SNikolas Klauser}
2713e78f53d1SNikolas Klauser
2714e78f53d1SNikolas Klausertemplate <class _Expr1,
2715e78f53d1SNikolas Klauser          class _Expr2,
2716e78f53d1SNikolas Klauser          __enable_if_t<__is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, int> = 0>
2717e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI __val_expr<_BinaryOp<modulus<typename _Expr1::value_type>, _Expr1, _Expr2> >
2718e78f53d1SNikolas Klauseroperator%(const _Expr1& __x, const _Expr2& __y) {
2719e78f53d1SNikolas Klauser  typedef typename _Expr1::value_type value_type;
2720e78f53d1SNikolas Klauser  typedef _BinaryOp<modulus<value_type>, _Expr1, _Expr2> _Op;
2721e78f53d1SNikolas Klauser  return __val_expr<_Op>(_Op(modulus<value_type>(), __x, __y));
2722e78f53d1SNikolas Klauser}
2723e78f53d1SNikolas Klauser
2724e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
2725e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI
2726e78f53d1SNikolas Klauser__val_expr<_BinaryOp<modulus<typename _Expr::value_type>, _Expr, __scalar_expr<typename _Expr::value_type> > >
2727e78f53d1SNikolas Klauseroperator%(const _Expr& __x, const typename _Expr::value_type& __y) {
2728e78f53d1SNikolas Klauser  typedef typename _Expr::value_type value_type;
2729e78f53d1SNikolas Klauser  typedef _BinaryOp<modulus<value_type>, _Expr, __scalar_expr<value_type> > _Op;
2730e78f53d1SNikolas Klauser  return __val_expr<_Op>(_Op(modulus<value_type>(), __x, __scalar_expr<value_type>(__y, __x.size())));
2731e78f53d1SNikolas Klauser}
2732e78f53d1SNikolas Klauser
2733e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
2734e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI
2735e78f53d1SNikolas Klauser__val_expr<_BinaryOp<modulus<typename _Expr::value_type>, __scalar_expr<typename _Expr::value_type>, _Expr> >
2736e78f53d1SNikolas Klauseroperator%(const typename _Expr::value_type& __x, const _Expr& __y) {
2737e78f53d1SNikolas Klauser  typedef typename _Expr::value_type value_type;
2738e78f53d1SNikolas Klauser  typedef _BinaryOp<modulus<value_type>, __scalar_expr<value_type>, _Expr> _Op;
2739e78f53d1SNikolas Klauser  return __val_expr<_Op>(_Op(modulus<value_type>(), __scalar_expr<value_type>(__x, __y.size()), __y));
2740e78f53d1SNikolas Klauser}
2741e78f53d1SNikolas Klauser
2742e78f53d1SNikolas Klausertemplate <class _Expr1,
2743e78f53d1SNikolas Klauser          class _Expr2,
2744e78f53d1SNikolas Klauser          __enable_if_t<__is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, int> = 0>
2745e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI __val_expr<_BinaryOp<plus<typename _Expr1::value_type>, _Expr1, _Expr2> >
2746e78f53d1SNikolas Klauseroperator+(const _Expr1& __x, const _Expr2& __y) {
2747e78f53d1SNikolas Klauser  typedef typename _Expr1::value_type value_type;
2748e78f53d1SNikolas Klauser  typedef _BinaryOp<plus<value_type>, _Expr1, _Expr2> _Op;
2749e78f53d1SNikolas Klauser  return __val_expr<_Op>(_Op(plus<value_type>(), __x, __y));
2750e78f53d1SNikolas Klauser}
2751e78f53d1SNikolas Klauser
2752e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
2753e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI
2754e78f53d1SNikolas Klauser__val_expr<_BinaryOp<plus<typename _Expr::value_type>, _Expr, __scalar_expr<typename _Expr::value_type> > >
2755e78f53d1SNikolas Klauseroperator+(const _Expr& __x, const typename _Expr::value_type& __y) {
2756e78f53d1SNikolas Klauser  typedef typename _Expr::value_type value_type;
2757e78f53d1SNikolas Klauser  typedef _BinaryOp<plus<value_type>, _Expr, __scalar_expr<value_type> > _Op;
2758e78f53d1SNikolas Klauser  return __val_expr<_Op>(_Op(plus<value_type>(), __x, __scalar_expr<value_type>(__y, __x.size())));
2759e78f53d1SNikolas Klauser}
2760e78f53d1SNikolas Klauser
2761e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
2762e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI
2763e78f53d1SNikolas Klauser__val_expr<_BinaryOp<plus<typename _Expr::value_type>, __scalar_expr<typename _Expr::value_type>, _Expr> >
2764e78f53d1SNikolas Klauseroperator+(const typename _Expr::value_type& __x, const _Expr& __y) {
2765e78f53d1SNikolas Klauser  typedef typename _Expr::value_type value_type;
2766e78f53d1SNikolas Klauser  typedef _BinaryOp<plus<value_type>, __scalar_expr<value_type>, _Expr> _Op;
2767e78f53d1SNikolas Klauser  return __val_expr<_Op>(_Op(plus<value_type>(), __scalar_expr<value_type>(__x, __y.size()), __y));
2768e78f53d1SNikolas Klauser}
2769e78f53d1SNikolas Klauser
2770e78f53d1SNikolas Klausertemplate <class _Expr1,
2771e78f53d1SNikolas Klauser          class _Expr2,
2772e78f53d1SNikolas Klauser          __enable_if_t<__is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, int> = 0>
2773e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI __val_expr<_BinaryOp<minus<typename _Expr1::value_type>, _Expr1, _Expr2> >
2774e78f53d1SNikolas Klauseroperator-(const _Expr1& __x, const _Expr2& __y) {
2775e78f53d1SNikolas Klauser  typedef typename _Expr1::value_type value_type;
2776e78f53d1SNikolas Klauser  typedef _BinaryOp<minus<value_type>, _Expr1, _Expr2> _Op;
2777e78f53d1SNikolas Klauser  return __val_expr<_Op>(_Op(minus<value_type>(), __x, __y));
2778e78f53d1SNikolas Klauser}
2779e78f53d1SNikolas Klauser
2780e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
2781e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI
2782e78f53d1SNikolas Klauser__val_expr<_BinaryOp<minus<typename _Expr::value_type>, _Expr, __scalar_expr<typename _Expr::value_type> > >
2783e78f53d1SNikolas Klauseroperator-(const _Expr& __x, const typename _Expr::value_type& __y) {
2784e78f53d1SNikolas Klauser  typedef typename _Expr::value_type value_type;
2785e78f53d1SNikolas Klauser  typedef _BinaryOp<minus<value_type>, _Expr, __scalar_expr<value_type> > _Op;
2786e78f53d1SNikolas Klauser  return __val_expr<_Op>(_Op(minus<value_type>(), __x, __scalar_expr<value_type>(__y, __x.size())));
2787e78f53d1SNikolas Klauser}
2788e78f53d1SNikolas Klauser
2789e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
2790e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI
2791e78f53d1SNikolas Klauser__val_expr<_BinaryOp<minus<typename _Expr::value_type>, __scalar_expr<typename _Expr::value_type>, _Expr> >
2792e78f53d1SNikolas Klauseroperator-(const typename _Expr::value_type& __x, const _Expr& __y) {
2793e78f53d1SNikolas Klauser  typedef typename _Expr::value_type value_type;
2794e78f53d1SNikolas Klauser  typedef _BinaryOp<minus<value_type>, __scalar_expr<value_type>, _Expr> _Op;
2795e78f53d1SNikolas Klauser  return __val_expr<_Op>(_Op(minus<value_type>(), __scalar_expr<value_type>(__x, __y.size()), __y));
2796e78f53d1SNikolas Klauser}
2797e78f53d1SNikolas Klauser
2798e78f53d1SNikolas Klausertemplate <class _Expr1,
2799e78f53d1SNikolas Klauser          class _Expr2,
2800e78f53d1SNikolas Klauser          __enable_if_t<__is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, int> = 0>
2801e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI __val_expr<_BinaryOp<bit_xor<typename _Expr1::value_type>, _Expr1, _Expr2> >
2802e78f53d1SNikolas Klauseroperator^(const _Expr1& __x, const _Expr2& __y) {
2803e78f53d1SNikolas Klauser  typedef typename _Expr1::value_type value_type;
2804e78f53d1SNikolas Klauser  typedef _BinaryOp<bit_xor<value_type>, _Expr1, _Expr2> _Op;
2805e78f53d1SNikolas Klauser  return __val_expr<_Op>(_Op(bit_xor<value_type>(), __x, __y));
2806e78f53d1SNikolas Klauser}
2807e78f53d1SNikolas Klauser
2808e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
2809e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI
2810e78f53d1SNikolas Klauser__val_expr<_BinaryOp<bit_xor<typename _Expr::value_type>, _Expr, __scalar_expr<typename _Expr::value_type> > >
2811e78f53d1SNikolas Klauseroperator^(const _Expr& __x, const typename _Expr::value_type& __y) {
2812e78f53d1SNikolas Klauser  typedef typename _Expr::value_type value_type;
2813e78f53d1SNikolas Klauser  typedef _BinaryOp<bit_xor<value_type>, _Expr, __scalar_expr<value_type> > _Op;
2814e78f53d1SNikolas Klauser  return __val_expr<_Op>(_Op(bit_xor<value_type>(), __x, __scalar_expr<value_type>(__y, __x.size())));
2815e78f53d1SNikolas Klauser}
2816e78f53d1SNikolas Klauser
2817e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
2818e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI
2819e78f53d1SNikolas Klauser__val_expr<_BinaryOp<bit_xor<typename _Expr::value_type>, __scalar_expr<typename _Expr::value_type>, _Expr> >
2820e78f53d1SNikolas Klauseroperator^(const typename _Expr::value_type& __x, const _Expr& __y) {
2821e78f53d1SNikolas Klauser  typedef typename _Expr::value_type value_type;
2822e78f53d1SNikolas Klauser  typedef _BinaryOp<bit_xor<value_type>, __scalar_expr<value_type>, _Expr> _Op;
2823e78f53d1SNikolas Klauser  return __val_expr<_Op>(_Op(bit_xor<value_type>(), __scalar_expr<value_type>(__x, __y.size()), __y));
2824e78f53d1SNikolas Klauser}
2825e78f53d1SNikolas Klauser
2826e78f53d1SNikolas Klausertemplate <class _Expr1,
2827e78f53d1SNikolas Klauser          class _Expr2,
2828e78f53d1SNikolas Klauser          __enable_if_t<__is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, int> = 0>
2829e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI __val_expr<_BinaryOp<bit_and<typename _Expr1::value_type>, _Expr1, _Expr2> >
2830e78f53d1SNikolas Klauseroperator&(const _Expr1& __x, const _Expr2& __y) {
2831e78f53d1SNikolas Klauser  typedef typename _Expr1::value_type value_type;
2832e78f53d1SNikolas Klauser  typedef _BinaryOp<bit_and<value_type>, _Expr1, _Expr2> _Op;
2833e78f53d1SNikolas Klauser  return __val_expr<_Op>(_Op(bit_and<value_type>(), __x, __y));
2834e78f53d1SNikolas Klauser}
2835e78f53d1SNikolas Klauser
2836e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
2837e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI
2838e78f53d1SNikolas Klauser__val_expr<_BinaryOp<bit_and<typename _Expr::value_type>, _Expr, __scalar_expr<typename _Expr::value_type> > >
2839e78f53d1SNikolas Klauseroperator&(const _Expr& __x, const typename _Expr::value_type& __y) {
2840e78f53d1SNikolas Klauser  typedef typename _Expr::value_type value_type;
2841e78f53d1SNikolas Klauser  typedef _BinaryOp<bit_and<value_type>, _Expr, __scalar_expr<value_type> > _Op;
2842e78f53d1SNikolas Klauser  return __val_expr<_Op>(_Op(bit_and<value_type>(), __x, __scalar_expr<value_type>(__y, __x.size())));
2843e78f53d1SNikolas Klauser}
2844e78f53d1SNikolas Klauser
2845e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
2846e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI
2847e78f53d1SNikolas Klauser__val_expr<_BinaryOp<bit_and<typename _Expr::value_type>, __scalar_expr<typename _Expr::value_type>, _Expr> >
2848e78f53d1SNikolas Klauseroperator&(const typename _Expr::value_type& __x, const _Expr& __y) {
2849e78f53d1SNikolas Klauser  typedef typename _Expr::value_type value_type;
2850e78f53d1SNikolas Klauser  typedef _BinaryOp<bit_and<value_type>, __scalar_expr<value_type>, _Expr> _Op;
2851e78f53d1SNikolas Klauser  return __val_expr<_Op>(_Op(bit_and<value_type>(), __scalar_expr<value_type>(__x, __y.size()), __y));
2852e78f53d1SNikolas Klauser}
2853e78f53d1SNikolas Klauser
2854e78f53d1SNikolas Klausertemplate <class _Expr1,
2855e78f53d1SNikolas Klauser          class _Expr2,
2856e78f53d1SNikolas Klauser          __enable_if_t<__is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, int> = 0>
2857e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI __val_expr<_BinaryOp<bit_or<typename _Expr1::value_type>, _Expr1, _Expr2> >
2858e78f53d1SNikolas Klauseroperator|(const _Expr1& __x, const _Expr2& __y) {
2859e78f53d1SNikolas Klauser  typedef typename _Expr1::value_type value_type;
2860e78f53d1SNikolas Klauser  typedef _BinaryOp<bit_or<value_type>, _Expr1, _Expr2> _Op;
2861e78f53d1SNikolas Klauser  return __val_expr<_Op>(_Op(bit_or<value_type>(), __x, __y));
2862e78f53d1SNikolas Klauser}
2863e78f53d1SNikolas Klauser
2864e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
2865e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI
2866e78f53d1SNikolas Klauser__val_expr<_BinaryOp<bit_or<typename _Expr::value_type>, _Expr, __scalar_expr<typename _Expr::value_type> > >
2867e78f53d1SNikolas Klauseroperator|(const _Expr& __x, const typename _Expr::value_type& __y) {
2868e78f53d1SNikolas Klauser  typedef typename _Expr::value_type value_type;
2869e78f53d1SNikolas Klauser  typedef _BinaryOp<bit_or<value_type>, _Expr, __scalar_expr<value_type> > _Op;
2870e78f53d1SNikolas Klauser  return __val_expr<_Op>(_Op(bit_or<value_type>(), __x, __scalar_expr<value_type>(__y, __x.size())));
2871e78f53d1SNikolas Klauser}
2872e78f53d1SNikolas Klauser
2873e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
2874e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI
2875e78f53d1SNikolas Klauser__val_expr<_BinaryOp<bit_or<typename _Expr::value_type>, __scalar_expr<typename _Expr::value_type>, _Expr> >
2876e78f53d1SNikolas Klauseroperator|(const typename _Expr::value_type& __x, const _Expr& __y) {
2877e78f53d1SNikolas Klauser  typedef typename _Expr::value_type value_type;
2878e78f53d1SNikolas Klauser  typedef _BinaryOp<bit_or<value_type>, __scalar_expr<value_type>, _Expr> _Op;
2879e78f53d1SNikolas Klauser  return __val_expr<_Op>(_Op(bit_or<value_type>(), __scalar_expr<value_type>(__x, __y.size()), __y));
2880e78f53d1SNikolas Klauser}
2881e78f53d1SNikolas Klauser
2882e78f53d1SNikolas Klausertemplate <class _Expr1,
2883e78f53d1SNikolas Klauser          class _Expr2,
2884e78f53d1SNikolas Klauser          __enable_if_t<__is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, int> = 0>
2885e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI __val_expr<_BinaryOp<__bit_shift_left<typename _Expr1::value_type>, _Expr1, _Expr2> >
2886e78f53d1SNikolas Klauseroperator<<(const _Expr1& __x, const _Expr2& __y) {
2887e78f53d1SNikolas Klauser  typedef typename _Expr1::value_type value_type;
2888e78f53d1SNikolas Klauser  typedef _BinaryOp<__bit_shift_left<value_type>, _Expr1, _Expr2> _Op;
2889e78f53d1SNikolas Klauser  return __val_expr<_Op>(_Op(__bit_shift_left<value_type>(), __x, __y));
2890e78f53d1SNikolas Klauser}
2891e78f53d1SNikolas Klauser
2892e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
2893e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI
2894e78f53d1SNikolas Klauser__val_expr< _BinaryOp<__bit_shift_left<typename _Expr::value_type>, _Expr, __scalar_expr<typename _Expr::value_type> > >
2895e78f53d1SNikolas Klauseroperator<<(const _Expr& __x, const typename _Expr::value_type& __y) {
2896e78f53d1SNikolas Klauser  typedef typename _Expr::value_type value_type;
2897e78f53d1SNikolas Klauser  typedef _BinaryOp<__bit_shift_left<value_type>, _Expr, __scalar_expr<value_type> > _Op;
2898e78f53d1SNikolas Klauser  return __val_expr<_Op>(_Op(__bit_shift_left<value_type>(), __x, __scalar_expr<value_type>(__y, __x.size())));
2899e78f53d1SNikolas Klauser}
2900e78f53d1SNikolas Klauser
2901e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
2902e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI
2903e78f53d1SNikolas Klauser__val_expr< _BinaryOp<__bit_shift_left<typename _Expr::value_type>, __scalar_expr<typename _Expr::value_type>, _Expr> >
2904e78f53d1SNikolas Klauseroperator<<(const typename _Expr::value_type& __x, const _Expr& __y) {
2905e78f53d1SNikolas Klauser  typedef typename _Expr::value_type value_type;
2906e78f53d1SNikolas Klauser  typedef _BinaryOp<__bit_shift_left<value_type>, __scalar_expr<value_type>, _Expr> _Op;
2907e78f53d1SNikolas Klauser  return __val_expr<_Op>(_Op(__bit_shift_left<value_type>(), __scalar_expr<value_type>(__x, __y.size()), __y));
2908e78f53d1SNikolas Klauser}
2909e78f53d1SNikolas Klauser
2910e78f53d1SNikolas Klausertemplate <class _Expr1,
2911e78f53d1SNikolas Klauser          class _Expr2,
2912e78f53d1SNikolas Klauser          __enable_if_t<__is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, int> = 0>
2913e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI __val_expr<_BinaryOp<__bit_shift_right<typename _Expr1::value_type>, _Expr1, _Expr2> >
2914e78f53d1SNikolas Klauseroperator>>(const _Expr1& __x, const _Expr2& __y) {
2915e78f53d1SNikolas Klauser  typedef typename _Expr1::value_type value_type;
2916e78f53d1SNikolas Klauser  typedef _BinaryOp<__bit_shift_right<value_type>, _Expr1, _Expr2> _Op;
2917e78f53d1SNikolas Klauser  return __val_expr<_Op>(_Op(__bit_shift_right<value_type>(), __x, __y));
2918e78f53d1SNikolas Klauser}
2919e78f53d1SNikolas Klauser
2920e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
2921e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI __val_expr<
2922e78f53d1SNikolas Klauser    _BinaryOp<__bit_shift_right<typename _Expr::value_type>, _Expr, __scalar_expr<typename _Expr::value_type> > >
2923e78f53d1SNikolas Klauseroperator>>(const _Expr& __x, const typename _Expr::value_type& __y) {
2924e78f53d1SNikolas Klauser  typedef typename _Expr::value_type value_type;
2925e78f53d1SNikolas Klauser  typedef _BinaryOp<__bit_shift_right<value_type>, _Expr, __scalar_expr<value_type> > _Op;
2926e78f53d1SNikolas Klauser  return __val_expr<_Op>(_Op(__bit_shift_right<value_type>(), __x, __scalar_expr<value_type>(__y, __x.size())));
2927e78f53d1SNikolas Klauser}
2928e78f53d1SNikolas Klauser
2929e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
2930e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI
2931e78f53d1SNikolas Klauser__val_expr< _BinaryOp<__bit_shift_right<typename _Expr::value_type>, __scalar_expr<typename _Expr::value_type>, _Expr> >
2932e78f53d1SNikolas Klauseroperator>>(const typename _Expr::value_type& __x, const _Expr& __y) {
2933e78f53d1SNikolas Klauser  typedef typename _Expr::value_type value_type;
2934e78f53d1SNikolas Klauser  typedef _BinaryOp<__bit_shift_right<value_type>, __scalar_expr<value_type>, _Expr> _Op;
2935e78f53d1SNikolas Klauser  return __val_expr<_Op>(_Op(__bit_shift_right<value_type>(), __scalar_expr<value_type>(__x, __y.size()), __y));
2936e78f53d1SNikolas Klauser}
2937e78f53d1SNikolas Klauser
2938e78f53d1SNikolas Klausertemplate <class _Expr1,
2939e78f53d1SNikolas Klauser          class _Expr2,
2940e78f53d1SNikolas Klauser          __enable_if_t<__is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, int> = 0>
2941e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI __val_expr<_BinaryOp<logical_and<typename _Expr1::value_type>, _Expr1, _Expr2> >
2942e78f53d1SNikolas Klauseroperator&&(const _Expr1& __x, const _Expr2& __y) {
2943e78f53d1SNikolas Klauser  typedef typename _Expr1::value_type value_type;
2944e78f53d1SNikolas Klauser  typedef _BinaryOp<logical_and<value_type>, _Expr1, _Expr2> _Op;
2945e78f53d1SNikolas Klauser  return __val_expr<_Op>(_Op(logical_and<value_type>(), __x, __y));
2946e78f53d1SNikolas Klauser}
2947e78f53d1SNikolas Klauser
2948e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
2949e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI
2950e78f53d1SNikolas Klauser__val_expr<_BinaryOp<logical_and<typename _Expr::value_type>, _Expr, __scalar_expr<typename _Expr::value_type> > >
2951e78f53d1SNikolas Klauseroperator&&(const _Expr& __x, const typename _Expr::value_type& __y) {
2952e78f53d1SNikolas Klauser  typedef typename _Expr::value_type value_type;
2953e78f53d1SNikolas Klauser  typedef _BinaryOp<logical_and<value_type>, _Expr, __scalar_expr<value_type> > _Op;
2954e78f53d1SNikolas Klauser  return __val_expr<_Op>(_Op(logical_and<value_type>(), __x, __scalar_expr<value_type>(__y, __x.size())));
2955e78f53d1SNikolas Klauser}
2956e78f53d1SNikolas Klauser
2957e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
2958e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI
2959e78f53d1SNikolas Klauser__val_expr<_BinaryOp<logical_and<typename _Expr::value_type>, __scalar_expr<typename _Expr::value_type>, _Expr> >
2960e78f53d1SNikolas Klauseroperator&&(const typename _Expr::value_type& __x, const _Expr& __y) {
2961e78f53d1SNikolas Klauser  typedef typename _Expr::value_type value_type;
2962e78f53d1SNikolas Klauser  typedef _BinaryOp<logical_and<value_type>, __scalar_expr<value_type>, _Expr> _Op;
2963e78f53d1SNikolas Klauser  return __val_expr<_Op>(_Op(logical_and<value_type>(), __scalar_expr<value_type>(__x, __y.size()), __y));
2964e78f53d1SNikolas Klauser}
2965e78f53d1SNikolas Klauser
2966e78f53d1SNikolas Klausertemplate <class _Expr1,
2967e78f53d1SNikolas Klauser          class _Expr2,
2968e78f53d1SNikolas Klauser          __enable_if_t<__is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, int> = 0>
2969e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI __val_expr<_BinaryOp<logical_or<typename _Expr1::value_type>, _Expr1, _Expr2> >
2970e78f53d1SNikolas Klauseroperator||(const _Expr1& __x, const _Expr2& __y) {
2971e78f53d1SNikolas Klauser  typedef typename _Expr1::value_type value_type;
2972e78f53d1SNikolas Klauser  typedef _BinaryOp<logical_or<value_type>, _Expr1, _Expr2> _Op;
2973e78f53d1SNikolas Klauser  return __val_expr<_Op>(_Op(logical_or<value_type>(), __x, __y));
2974e78f53d1SNikolas Klauser}
2975e78f53d1SNikolas Klauser
2976e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
2977e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI
2978e78f53d1SNikolas Klauser__val_expr<_BinaryOp<logical_or<typename _Expr::value_type>, _Expr, __scalar_expr<typename _Expr::value_type> > >
2979e78f53d1SNikolas Klauseroperator||(const _Expr& __x, const typename _Expr::value_type& __y) {
2980e78f53d1SNikolas Klauser  typedef typename _Expr::value_type value_type;
2981e78f53d1SNikolas Klauser  typedef _BinaryOp<logical_or<value_type>, _Expr, __scalar_expr<value_type> > _Op;
2982e78f53d1SNikolas Klauser  return __val_expr<_Op>(_Op(logical_or<value_type>(), __x, __scalar_expr<value_type>(__y, __x.size())));
2983e78f53d1SNikolas Klauser}
2984e78f53d1SNikolas Klauser
2985e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
2986e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI
2987e78f53d1SNikolas Klauser__val_expr<_BinaryOp<logical_or<typename _Expr::value_type>, __scalar_expr<typename _Expr::value_type>, _Expr> >
2988e78f53d1SNikolas Klauseroperator||(const typename _Expr::value_type& __x, const _Expr& __y) {
2989e78f53d1SNikolas Klauser  typedef typename _Expr::value_type value_type;
2990e78f53d1SNikolas Klauser  typedef _BinaryOp<logical_or<value_type>, __scalar_expr<value_type>, _Expr> _Op;
2991e78f53d1SNikolas Klauser  return __val_expr<_Op>(_Op(logical_or<value_type>(), __scalar_expr<value_type>(__x, __y.size()), __y));
2992e78f53d1SNikolas Klauser}
2993e78f53d1SNikolas Klauser
2994e78f53d1SNikolas Klausertemplate <class _Expr1,
2995e78f53d1SNikolas Klauser          class _Expr2,
2996e78f53d1SNikolas Klauser          __enable_if_t<__is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, int> = 0>
2997e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI __val_expr<_BinaryOp<equal_to<typename _Expr1::value_type>, _Expr1, _Expr2> >
2998e78f53d1SNikolas Klauseroperator==(const _Expr1& __x, const _Expr2& __y) {
2999e78f53d1SNikolas Klauser  typedef typename _Expr1::value_type value_type;
3000e78f53d1SNikolas Klauser  typedef _BinaryOp<equal_to<value_type>, _Expr1, _Expr2> _Op;
3001e78f53d1SNikolas Klauser  return __val_expr<_Op>(_Op(equal_to<value_type>(), __x, __y));
3002e78f53d1SNikolas Klauser}
3003e78f53d1SNikolas Klauser
3004e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
3005e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI
3006e78f53d1SNikolas Klauser__val_expr<_BinaryOp<equal_to<typename _Expr::value_type>, _Expr, __scalar_expr<typename _Expr::value_type> > >
3007e78f53d1SNikolas Klauseroperator==(const _Expr& __x, const typename _Expr::value_type& __y) {
3008e78f53d1SNikolas Klauser  typedef typename _Expr::value_type value_type;
3009e78f53d1SNikolas Klauser  typedef _BinaryOp<equal_to<value_type>, _Expr, __scalar_expr<value_type> > _Op;
3010e78f53d1SNikolas Klauser  return __val_expr<_Op>(_Op(equal_to<value_type>(), __x, __scalar_expr<value_type>(__y, __x.size())));
3011e78f53d1SNikolas Klauser}
3012e78f53d1SNikolas Klauser
3013e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
3014e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI
3015e78f53d1SNikolas Klauser__val_expr<_BinaryOp<equal_to<typename _Expr::value_type>, __scalar_expr<typename _Expr::value_type>, _Expr> >
3016e78f53d1SNikolas Klauseroperator==(const typename _Expr::value_type& __x, const _Expr& __y) {
3017e78f53d1SNikolas Klauser  typedef typename _Expr::value_type value_type;
3018e78f53d1SNikolas Klauser  typedef _BinaryOp<equal_to<value_type>, __scalar_expr<value_type>, _Expr> _Op;
3019e78f53d1SNikolas Klauser  return __val_expr<_Op>(_Op(equal_to<value_type>(), __scalar_expr<value_type>(__x, __y.size()), __y));
3020e78f53d1SNikolas Klauser}
3021e78f53d1SNikolas Klauser
3022e78f53d1SNikolas Klausertemplate <class _Expr1,
3023e78f53d1SNikolas Klauser          class _Expr2,
3024e78f53d1SNikolas Klauser          __enable_if_t<__is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, int> = 0>
3025e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI __val_expr<_BinaryOp<not_equal_to<typename _Expr1::value_type>, _Expr1, _Expr2> >
3026e78f53d1SNikolas Klauseroperator!=(const _Expr1& __x, const _Expr2& __y) {
3027e78f53d1SNikolas Klauser  typedef typename _Expr1::value_type value_type;
3028e78f53d1SNikolas Klauser  typedef _BinaryOp<not_equal_to<value_type>, _Expr1, _Expr2> _Op;
3029e78f53d1SNikolas Klauser  return __val_expr<_Op>(_Op(not_equal_to<value_type>(), __x, __y));
3030e78f53d1SNikolas Klauser}
3031e78f53d1SNikolas Klauser
3032e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
3033e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI
3034e78f53d1SNikolas Klauser__val_expr<_BinaryOp<not_equal_to<typename _Expr::value_type>, _Expr, __scalar_expr<typename _Expr::value_type> > >
3035e78f53d1SNikolas Klauseroperator!=(const _Expr& __x, const typename _Expr::value_type& __y) {
3036e78f53d1SNikolas Klauser  typedef typename _Expr::value_type value_type;
3037e78f53d1SNikolas Klauser  typedef _BinaryOp<not_equal_to<value_type>, _Expr, __scalar_expr<value_type> > _Op;
3038e78f53d1SNikolas Klauser  return __val_expr<_Op>(_Op(not_equal_to<value_type>(), __x, __scalar_expr<value_type>(__y, __x.size())));
3039e78f53d1SNikolas Klauser}
3040e78f53d1SNikolas Klauser
3041e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
3042e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI
3043e78f53d1SNikolas Klauser__val_expr<_BinaryOp<not_equal_to<typename _Expr::value_type>, __scalar_expr<typename _Expr::value_type>, _Expr> >
3044e78f53d1SNikolas Klauseroperator!=(const typename _Expr::value_type& __x, const _Expr& __y) {
3045e78f53d1SNikolas Klauser  typedef typename _Expr::value_type value_type;
3046e78f53d1SNikolas Klauser  typedef _BinaryOp<not_equal_to<value_type>, __scalar_expr<value_type>, _Expr> _Op;
3047e78f53d1SNikolas Klauser  return __val_expr<_Op>(_Op(not_equal_to<value_type>(), __scalar_expr<value_type>(__x, __y.size()), __y));
3048e78f53d1SNikolas Klauser}
3049e78f53d1SNikolas Klauser
3050e78f53d1SNikolas Klausertemplate <class _Expr1,
3051e78f53d1SNikolas Klauser          class _Expr2,
3052e78f53d1SNikolas Klauser          __enable_if_t<__is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, int> = 0>
3053e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI __val_expr<_BinaryOp<less<typename _Expr1::value_type>, _Expr1, _Expr2> >
3054e78f53d1SNikolas Klauseroperator<(const _Expr1& __x, const _Expr2& __y) {
3055e78f53d1SNikolas Klauser  typedef typename _Expr1::value_type value_type;
3056e78f53d1SNikolas Klauser  typedef _BinaryOp<less<value_type>, _Expr1, _Expr2> _Op;
3057e78f53d1SNikolas Klauser  return __val_expr<_Op>(_Op(less<value_type>(), __x, __y));
3058e78f53d1SNikolas Klauser}
3059e78f53d1SNikolas Klauser
3060e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
3061e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI
3062e78f53d1SNikolas Klauser__val_expr<_BinaryOp<less<typename _Expr::value_type>, _Expr, __scalar_expr<typename _Expr::value_type> > >
3063e78f53d1SNikolas Klauseroperator<(const _Expr& __x, const typename _Expr::value_type& __y) {
3064e78f53d1SNikolas Klauser  typedef typename _Expr::value_type value_type;
3065e78f53d1SNikolas Klauser  typedef _BinaryOp<less<value_type>, _Expr, __scalar_expr<value_type> > _Op;
3066e78f53d1SNikolas Klauser  return __val_expr<_Op>(_Op(less<value_type>(), __x, __scalar_expr<value_type>(__y, __x.size())));
3067e78f53d1SNikolas Klauser}
3068e78f53d1SNikolas Klauser
3069e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
3070e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI
3071e78f53d1SNikolas Klauser__val_expr<_BinaryOp<less<typename _Expr::value_type>, __scalar_expr<typename _Expr::value_type>, _Expr> >
3072e78f53d1SNikolas Klauseroperator<(const typename _Expr::value_type& __x, const _Expr& __y) {
3073e78f53d1SNikolas Klauser  typedef typename _Expr::value_type value_type;
3074e78f53d1SNikolas Klauser  typedef _BinaryOp<less<value_type>, __scalar_expr<value_type>, _Expr> _Op;
3075e78f53d1SNikolas Klauser  return __val_expr<_Op>(_Op(less<value_type>(), __scalar_expr<value_type>(__x, __y.size()), __y));
3076e78f53d1SNikolas Klauser}
3077e78f53d1SNikolas Klauser
3078e78f53d1SNikolas Klausertemplate <class _Expr1,
3079e78f53d1SNikolas Klauser          class _Expr2,
3080e78f53d1SNikolas Klauser          __enable_if_t<__is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, int> = 0>
3081e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI __val_expr<_BinaryOp<greater<typename _Expr1::value_type>, _Expr1, _Expr2> >
3082e78f53d1SNikolas Klauseroperator>(const _Expr1& __x, const _Expr2& __y) {
3083e78f53d1SNikolas Klauser  typedef typename _Expr1::value_type value_type;
3084e78f53d1SNikolas Klauser  typedef _BinaryOp<greater<value_type>, _Expr1, _Expr2> _Op;
3085e78f53d1SNikolas Klauser  return __val_expr<_Op>(_Op(greater<value_type>(), __x, __y));
3086e78f53d1SNikolas Klauser}
3087e78f53d1SNikolas Klauser
3088e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
3089e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI
3090e78f53d1SNikolas Klauser__val_expr<_BinaryOp<greater<typename _Expr::value_type>, _Expr, __scalar_expr<typename _Expr::value_type> > >
3091e78f53d1SNikolas Klauseroperator>(const _Expr& __x, const typename _Expr::value_type& __y) {
3092e78f53d1SNikolas Klauser  typedef typename _Expr::value_type value_type;
3093e78f53d1SNikolas Klauser  typedef _BinaryOp<greater<value_type>, _Expr, __scalar_expr<value_type> > _Op;
3094e78f53d1SNikolas Klauser  return __val_expr<_Op>(_Op(greater<value_type>(), __x, __scalar_expr<value_type>(__y, __x.size())));
3095e78f53d1SNikolas Klauser}
3096e78f53d1SNikolas Klauser
3097e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
3098e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI
3099e78f53d1SNikolas Klauser__val_expr<_BinaryOp<greater<typename _Expr::value_type>, __scalar_expr<typename _Expr::value_type>, _Expr> >
3100e78f53d1SNikolas Klauseroperator>(const typename _Expr::value_type& __x, const _Expr& __y) {
3101e78f53d1SNikolas Klauser  typedef typename _Expr::value_type value_type;
3102e78f53d1SNikolas Klauser  typedef _BinaryOp<greater<value_type>, __scalar_expr<value_type>, _Expr> _Op;
3103e78f53d1SNikolas Klauser  return __val_expr<_Op>(_Op(greater<value_type>(), __scalar_expr<value_type>(__x, __y.size()), __y));
3104e78f53d1SNikolas Klauser}
3105e78f53d1SNikolas Klauser
3106e78f53d1SNikolas Klausertemplate <class _Expr1,
3107e78f53d1SNikolas Klauser          class _Expr2,
3108e78f53d1SNikolas Klauser          __enable_if_t<__is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, int> = 0>
3109e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI __val_expr<_BinaryOp<less_equal<typename _Expr1::value_type>, _Expr1, _Expr2> >
3110e78f53d1SNikolas Klauseroperator<=(const _Expr1& __x, const _Expr2& __y) {
3111e78f53d1SNikolas Klauser  typedef typename _Expr1::value_type value_type;
3112e78f53d1SNikolas Klauser  typedef _BinaryOp<less_equal<value_type>, _Expr1, _Expr2> _Op;
3113e78f53d1SNikolas Klauser  return __val_expr<_Op>(_Op(less_equal<value_type>(), __x, __y));
3114e78f53d1SNikolas Klauser}
3115e78f53d1SNikolas Klauser
3116e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
3117e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI
3118e78f53d1SNikolas Klauser__val_expr<_BinaryOp<less_equal<typename _Expr::value_type>, _Expr, __scalar_expr<typename _Expr::value_type> > >
3119e78f53d1SNikolas Klauseroperator<=(const _Expr& __x, const typename _Expr::value_type& __y) {
3120e78f53d1SNikolas Klauser  typedef typename _Expr::value_type value_type;
3121e78f53d1SNikolas Klauser  typedef _BinaryOp<less_equal<value_type>, _Expr, __scalar_expr<value_type> > _Op;
3122e78f53d1SNikolas Klauser  return __val_expr<_Op>(_Op(less_equal<value_type>(), __x, __scalar_expr<value_type>(__y, __x.size())));
3123e78f53d1SNikolas Klauser}
3124e78f53d1SNikolas Klauser
3125e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
3126e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI
3127e78f53d1SNikolas Klauser__val_expr<_BinaryOp<less_equal<typename _Expr::value_type>, __scalar_expr<typename _Expr::value_type>, _Expr> >
3128e78f53d1SNikolas Klauseroperator<=(const typename _Expr::value_type& __x, const _Expr& __y) {
3129e78f53d1SNikolas Klauser  typedef typename _Expr::value_type value_type;
3130e78f53d1SNikolas Klauser  typedef _BinaryOp<less_equal<value_type>, __scalar_expr<value_type>, _Expr> _Op;
3131e78f53d1SNikolas Klauser  return __val_expr<_Op>(_Op(less_equal<value_type>(), __scalar_expr<value_type>(__x, __y.size()), __y));
3132e78f53d1SNikolas Klauser}
3133e78f53d1SNikolas Klauser
3134e78f53d1SNikolas Klausertemplate <class _Expr1,
3135e78f53d1SNikolas Klauser          class _Expr2,
3136e78f53d1SNikolas Klauser          __enable_if_t<__is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, int> = 0>
3137e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI __val_expr<_BinaryOp<greater_equal<typename _Expr1::value_type>, _Expr1, _Expr2> >
3138e78f53d1SNikolas Klauseroperator>=(const _Expr1& __x, const _Expr2& __y) {
3139e78f53d1SNikolas Klauser  typedef typename _Expr1::value_type value_type;
3140e78f53d1SNikolas Klauser  typedef _BinaryOp<greater_equal<value_type>, _Expr1, _Expr2> _Op;
3141e78f53d1SNikolas Klauser  return __val_expr<_Op>(_Op(greater_equal<value_type>(), __x, __y));
3142e78f53d1SNikolas Klauser}
3143e78f53d1SNikolas Klauser
3144e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
3145e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI
3146e78f53d1SNikolas Klauser__val_expr<_BinaryOp<greater_equal<typename _Expr::value_type>, _Expr, __scalar_expr<typename _Expr::value_type> > >
3147e78f53d1SNikolas Klauseroperator>=(const _Expr& __x, const typename _Expr::value_type& __y) {
3148e78f53d1SNikolas Klauser  typedef typename _Expr::value_type value_type;
3149e78f53d1SNikolas Klauser  typedef _BinaryOp<greater_equal<value_type>, _Expr, __scalar_expr<value_type> > _Op;
3150e78f53d1SNikolas Klauser  return __val_expr<_Op>(_Op(greater_equal<value_type>(), __x, __scalar_expr<value_type>(__y, __x.size())));
3151e78f53d1SNikolas Klauser}
3152e78f53d1SNikolas Klauser
3153e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
3154e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI
3155e78f53d1SNikolas Klauser__val_expr<_BinaryOp<greater_equal<typename _Expr::value_type>, __scalar_expr<typename _Expr::value_type>, _Expr> >
3156e78f53d1SNikolas Klauseroperator>=(const typename _Expr::value_type& __x, const _Expr& __y) {
3157e78f53d1SNikolas Klauser  typedef typename _Expr::value_type value_type;
3158e78f53d1SNikolas Klauser  typedef _BinaryOp<greater_equal<value_type>, __scalar_expr<value_type>, _Expr> _Op;
3159e78f53d1SNikolas Klauser  return __val_expr<_Op>(_Op(greater_equal<value_type>(), __scalar_expr<value_type>(__x, __y.size()), __y));
3160e78f53d1SNikolas Klauser}
3161e78f53d1SNikolas Klauser
3162e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
3163e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI __val_expr<_UnaryOp<__abs_expr<typename _Expr::value_type>, _Expr> >
3164e78f53d1SNikolas Klauserabs(const _Expr& __x) {
3165e78f53d1SNikolas Klauser  typedef typename _Expr::value_type value_type;
3166e78f53d1SNikolas Klauser  typedef _UnaryOp<__abs_expr<value_type>, _Expr> _Op;
3167e78f53d1SNikolas Klauser  return __val_expr<_Op>(_Op(__abs_expr<value_type>(), __x));
3168e78f53d1SNikolas Klauser}
3169e78f53d1SNikolas Klauser
3170e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
3171e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI __val_expr<_UnaryOp<__acos_expr<typename _Expr::value_type>, _Expr> >
3172e78f53d1SNikolas Klauseracos(const _Expr& __x) {
3173e78f53d1SNikolas Klauser  typedef typename _Expr::value_type value_type;
3174e78f53d1SNikolas Klauser  typedef _UnaryOp<__acos_expr<value_type>, _Expr> _Op;
3175e78f53d1SNikolas Klauser  return __val_expr<_Op>(_Op(__acos_expr<value_type>(), __x));
3176e78f53d1SNikolas Klauser}
3177e78f53d1SNikolas Klauser
3178e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
3179e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI __val_expr<_UnaryOp<__asin_expr<typename _Expr::value_type>, _Expr> >
3180e78f53d1SNikolas Klauserasin(const _Expr& __x) {
3181e78f53d1SNikolas Klauser  typedef typename _Expr::value_type value_type;
3182e78f53d1SNikolas Klauser  typedef _UnaryOp<__asin_expr<value_type>, _Expr> _Op;
3183e78f53d1SNikolas Klauser  return __val_expr<_Op>(_Op(__asin_expr<value_type>(), __x));
3184e78f53d1SNikolas Klauser}
3185e78f53d1SNikolas Klauser
3186e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
3187e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI __val_expr<_UnaryOp<__atan_expr<typename _Expr::value_type>, _Expr> >
3188e78f53d1SNikolas Klauseratan(const _Expr& __x) {
3189e78f53d1SNikolas Klauser  typedef typename _Expr::value_type value_type;
3190e78f53d1SNikolas Klauser  typedef _UnaryOp<__atan_expr<value_type>, _Expr> _Op;
3191e78f53d1SNikolas Klauser  return __val_expr<_Op>(_Op(__atan_expr<value_type>(), __x));
3192e78f53d1SNikolas Klauser}
3193e78f53d1SNikolas Klauser
3194e78f53d1SNikolas Klausertemplate <class _Expr1,
3195e78f53d1SNikolas Klauser          class _Expr2,
3196e78f53d1SNikolas Klauser          __enable_if_t<__is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, int> = 0>
3197e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI __val_expr<_BinaryOp<__atan2_expr<typename _Expr1::value_type>, _Expr1, _Expr2> >
3198e78f53d1SNikolas Klauseratan2(const _Expr1& __x, const _Expr2& __y) {
3199e78f53d1SNikolas Klauser  typedef typename _Expr1::value_type value_type;
3200e78f53d1SNikolas Klauser  typedef _BinaryOp<__atan2_expr<value_type>, _Expr1, _Expr2> _Op;
3201e78f53d1SNikolas Klauser  return __val_expr<_Op>(_Op(__atan2_expr<value_type>(), __x, __y));
3202e78f53d1SNikolas Klauser}
3203e78f53d1SNikolas Klauser
3204e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
3205e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI
3206e78f53d1SNikolas Klauser__val_expr<_BinaryOp<__atan2_expr<typename _Expr::value_type>, _Expr, __scalar_expr<typename _Expr::value_type> > >
3207e78f53d1SNikolas Klauseratan2(const _Expr& __x, const typename _Expr::value_type& __y) {
3208e78f53d1SNikolas Klauser  typedef typename _Expr::value_type value_type;
3209e78f53d1SNikolas Klauser  typedef _BinaryOp<__atan2_expr<value_type>, _Expr, __scalar_expr<value_type> > _Op;
3210e78f53d1SNikolas Klauser  return __val_expr<_Op>(_Op(__atan2_expr<value_type>(), __x, __scalar_expr<value_type>(__y, __x.size())));
3211e78f53d1SNikolas Klauser}
3212e78f53d1SNikolas Klauser
3213e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
3214e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI
3215e78f53d1SNikolas Klauser__val_expr<_BinaryOp<__atan2_expr<typename _Expr::value_type>, __scalar_expr<typename _Expr::value_type>, _Expr> >
3216e78f53d1SNikolas Klauseratan2(const typename _Expr::value_type& __x, const _Expr& __y) {
3217e78f53d1SNikolas Klauser  typedef typename _Expr::value_type value_type;
3218e78f53d1SNikolas Klauser  typedef _BinaryOp<__atan2_expr<value_type>, __scalar_expr<value_type>, _Expr> _Op;
3219e78f53d1SNikolas Klauser  return __val_expr<_Op>(_Op(__atan2_expr<value_type>(), __scalar_expr<value_type>(__x, __y.size()), __y));
3220e78f53d1SNikolas Klauser}
3221e78f53d1SNikolas Klauser
3222e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
3223e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI __val_expr<_UnaryOp<__cos_expr<typename _Expr::value_type>, _Expr> >
3224e78f53d1SNikolas Klausercos(const _Expr& __x) {
3225e78f53d1SNikolas Klauser  typedef typename _Expr::value_type value_type;
3226e78f53d1SNikolas Klauser  typedef _UnaryOp<__cos_expr<value_type>, _Expr> _Op;
3227e78f53d1SNikolas Klauser  return __val_expr<_Op>(_Op(__cos_expr<value_type>(), __x));
3228e78f53d1SNikolas Klauser}
3229e78f53d1SNikolas Klauser
3230e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
3231e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI __val_expr<_UnaryOp<__cosh_expr<typename _Expr::value_type>, _Expr> >
3232e78f53d1SNikolas Klausercosh(const _Expr& __x) {
3233e78f53d1SNikolas Klauser  typedef typename _Expr::value_type value_type;
3234e78f53d1SNikolas Klauser  typedef _UnaryOp<__cosh_expr<value_type>, _Expr> _Op;
3235e78f53d1SNikolas Klauser  return __val_expr<_Op>(_Op(__cosh_expr<value_type>(), __x));
3236e78f53d1SNikolas Klauser}
3237e78f53d1SNikolas Klauser
3238e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
3239e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI __val_expr<_UnaryOp<__exp_expr<typename _Expr::value_type>, _Expr> >
3240e78f53d1SNikolas Klauserexp(const _Expr& __x) {
3241e78f53d1SNikolas Klauser  typedef typename _Expr::value_type value_type;
3242e78f53d1SNikolas Klauser  typedef _UnaryOp<__exp_expr<value_type>, _Expr> _Op;
3243e78f53d1SNikolas Klauser  return __val_expr<_Op>(_Op(__exp_expr<value_type>(), __x));
3244e78f53d1SNikolas Klauser}
3245e78f53d1SNikolas Klauser
3246e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
3247e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI __val_expr<_UnaryOp<__log_expr<typename _Expr::value_type>, _Expr> >
3248e78f53d1SNikolas Klauserlog(const _Expr& __x) {
3249e78f53d1SNikolas Klauser  typedef typename _Expr::value_type value_type;
3250e78f53d1SNikolas Klauser  typedef _UnaryOp<__log_expr<value_type>, _Expr> _Op;
3251e78f53d1SNikolas Klauser  return __val_expr<_Op>(_Op(__log_expr<value_type>(), __x));
3252e78f53d1SNikolas Klauser}
3253e78f53d1SNikolas Klauser
3254e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
3255e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI __val_expr<_UnaryOp<__log10_expr<typename _Expr::value_type>, _Expr> >
3256e78f53d1SNikolas Klauserlog10(const _Expr& __x) {
3257e78f53d1SNikolas Klauser  typedef typename _Expr::value_type value_type;
3258e78f53d1SNikolas Klauser  typedef _UnaryOp<__log10_expr<value_type>, _Expr> _Op;
3259e78f53d1SNikolas Klauser  return __val_expr<_Op>(_Op(__log10_expr<value_type>(), __x));
3260e78f53d1SNikolas Klauser}
3261e78f53d1SNikolas Klauser
3262e78f53d1SNikolas Klausertemplate <class _Expr1,
3263e78f53d1SNikolas Klauser          class _Expr2,
3264e78f53d1SNikolas Klauser          __enable_if_t<__is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, int> = 0>
3265e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI __val_expr<_BinaryOp<__pow_expr<typename _Expr1::value_type>, _Expr1, _Expr2> >
3266e78f53d1SNikolas Klauserpow(const _Expr1& __x, const _Expr2& __y) {
3267e78f53d1SNikolas Klauser  typedef typename _Expr1::value_type value_type;
3268e78f53d1SNikolas Klauser  typedef _BinaryOp<__pow_expr<value_type>, _Expr1, _Expr2> _Op;
3269e78f53d1SNikolas Klauser  return __val_expr<_Op>(_Op(__pow_expr<value_type>(), __x, __y));
3270e78f53d1SNikolas Klauser}
3271e78f53d1SNikolas Klauser
3272e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
3273e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI
3274e78f53d1SNikolas Klauser__val_expr<_BinaryOp<__pow_expr<typename _Expr::value_type>, _Expr, __scalar_expr<typename _Expr::value_type> > >
3275e78f53d1SNikolas Klauserpow(const _Expr& __x, const typename _Expr::value_type& __y) {
3276e78f53d1SNikolas Klauser  typedef typename _Expr::value_type value_type;
3277e78f53d1SNikolas Klauser  typedef _BinaryOp<__pow_expr<value_type>, _Expr, __scalar_expr<value_type> > _Op;
3278e78f53d1SNikolas Klauser  return __val_expr<_Op>(_Op(__pow_expr<value_type>(), __x, __scalar_expr<value_type>(__y, __x.size())));
3279e78f53d1SNikolas Klauser}
3280e78f53d1SNikolas Klauser
3281e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
3282e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI
3283e78f53d1SNikolas Klauser__val_expr<_BinaryOp<__pow_expr<typename _Expr::value_type>, __scalar_expr<typename _Expr::value_type>, _Expr> >
3284e78f53d1SNikolas Klauserpow(const typename _Expr::value_type& __x, const _Expr& __y) {
3285e78f53d1SNikolas Klauser  typedef typename _Expr::value_type value_type;
3286e78f53d1SNikolas Klauser  typedef _BinaryOp<__pow_expr<value_type>, __scalar_expr<value_type>, _Expr> _Op;
3287e78f53d1SNikolas Klauser  return __val_expr<_Op>(_Op(__pow_expr<value_type>(), __scalar_expr<value_type>(__x, __y.size()), __y));
3288e78f53d1SNikolas Klauser}
3289e78f53d1SNikolas Klauser
3290e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
3291e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI __val_expr<_UnaryOp<__sin_expr<typename _Expr::value_type>, _Expr> >
3292e78f53d1SNikolas Klausersin(const _Expr& __x) {
3293e78f53d1SNikolas Klauser  typedef typename _Expr::value_type value_type;
3294e78f53d1SNikolas Klauser  typedef _UnaryOp<__sin_expr<value_type>, _Expr> _Op;
3295e78f53d1SNikolas Klauser  return __val_expr<_Op>(_Op(__sin_expr<value_type>(), __x));
3296e78f53d1SNikolas Klauser}
3297e78f53d1SNikolas Klauser
3298e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
3299e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI __val_expr<_UnaryOp<__sinh_expr<typename _Expr::value_type>, _Expr> >
3300e78f53d1SNikolas Klausersinh(const _Expr& __x) {
3301e78f53d1SNikolas Klauser  typedef typename _Expr::value_type value_type;
3302e78f53d1SNikolas Klauser  typedef _UnaryOp<__sinh_expr<value_type>, _Expr> _Op;
3303e78f53d1SNikolas Klauser  return __val_expr<_Op>(_Op(__sinh_expr<value_type>(), __x));
3304e78f53d1SNikolas Klauser}
3305e78f53d1SNikolas Klauser
3306e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
3307e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI __val_expr<_UnaryOp<__sqrt_expr<typename _Expr::value_type>, _Expr> >
3308e78f53d1SNikolas Klausersqrt(const _Expr& __x) {
3309e78f53d1SNikolas Klauser  typedef typename _Expr::value_type value_type;
3310e78f53d1SNikolas Klauser  typedef _UnaryOp<__sqrt_expr<value_type>, _Expr> _Op;
3311e78f53d1SNikolas Klauser  return __val_expr<_Op>(_Op(__sqrt_expr<value_type>(), __x));
3312e78f53d1SNikolas Klauser}
3313e78f53d1SNikolas Klauser
3314e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
3315e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI __val_expr<_UnaryOp<__tan_expr<typename _Expr::value_type>, _Expr> >
3316e78f53d1SNikolas Klausertan(const _Expr& __x) {
3317e78f53d1SNikolas Klauser  typedef typename _Expr::value_type value_type;
3318e78f53d1SNikolas Klauser  typedef _UnaryOp<__tan_expr<value_type>, _Expr> _Op;
3319e78f53d1SNikolas Klauser  return __val_expr<_Op>(_Op(__tan_expr<value_type>(), __x));
3320e78f53d1SNikolas Klauser}
3321e78f53d1SNikolas Klauser
3322e78f53d1SNikolas Klausertemplate <class _Expr, __enable_if_t<__is_val_expr<_Expr>::value, int> = 0>
3323e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI __val_expr<_UnaryOp<__tanh_expr<typename _Expr::value_type>, _Expr> >
3324e78f53d1SNikolas Klausertanh(const _Expr& __x) {
3325e78f53d1SNikolas Klauser  typedef typename _Expr::value_type value_type;
3326e78f53d1SNikolas Klauser  typedef _UnaryOp<__tanh_expr<value_type>, _Expr> _Op;
3327e78f53d1SNikolas Klauser  return __val_expr<_Op>(_Op(__tanh_expr<value_type>(), __x));
3328e78f53d1SNikolas Klauser}
3329e78f53d1SNikolas Klauser
3330e78f53d1SNikolas Klausertemplate <class _Tp>
3331e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI _Tp* begin(valarray<_Tp>& __v) {
3332e78f53d1SNikolas Klauser  return __v.__begin_;
3333e78f53d1SNikolas Klauser}
3334e78f53d1SNikolas Klauser
3335e78f53d1SNikolas Klausertemplate <class _Tp>
3336e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI const _Tp* begin(const valarray<_Tp>& __v) {
3337e78f53d1SNikolas Klauser  return __v.__begin_;
3338e78f53d1SNikolas Klauser}
3339e78f53d1SNikolas Klauser
3340e78f53d1SNikolas Klausertemplate <class _Tp>
3341e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI _Tp* end(valarray<_Tp>& __v) {
3342e78f53d1SNikolas Klauser  return __v.__end_;
3343e78f53d1SNikolas Klauser}
3344e78f53d1SNikolas Klauser
3345e78f53d1SNikolas Klausertemplate <class _Tp>
3346e78f53d1SNikolas Klauserinline _LIBCPP_HIDE_FROM_ABI const _Tp* end(const valarray<_Tp>& __v) {
3347e78f53d1SNikolas Klauser  return __v.__end_;
3348e78f53d1SNikolas Klauser}
3349e78f53d1SNikolas Klauser
3350e78f53d1SNikolas Klauser_LIBCPP_END_NAMESPACE_STD
3351e78f53d1SNikolas Klauser
3352e78f53d1SNikolas Klauser_LIBCPP_POP_MACROS
3353e78f53d1SNikolas Klauser
3354e78f53d1SNikolas Klauser#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
335573fbae83SNikolas Klauser#  include <__cxx03/algorithm>
335673fbae83SNikolas Klauser#  include <__cxx03/concepts>
335773fbae83SNikolas Klauser#  include <__cxx03/cstdlib>
335873fbae83SNikolas Klauser#  include <__cxx03/cstring>
335973fbae83SNikolas Klauser#  include <__cxx03/functional>
336073fbae83SNikolas Klauser#  include <__cxx03/stdexcept>
336173fbae83SNikolas Klauser#  include <__cxx03/type_traits>
3362e78f53d1SNikolas Klauser#endif
3363e78f53d1SNikolas Klauser
3364*ce777190SNikolas Klauser#endif // _LIBCPP___CXX03_VALARRAY
3365