100db7afdSDavid E. O'Brien // The template and inlines for the -*- C++ -*- valarray class.
200db7afdSDavid E. O'Brien
3*f8a1b7d9SAlexander Kabaev // Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2004, 2005, 2006, 2007
400db7afdSDavid E. O'Brien // Free Software Foundation, Inc.
500db7afdSDavid E. O'Brien //
600db7afdSDavid E. O'Brien // This file is part of the GNU ISO C++ Library. This library is free
700db7afdSDavid E. O'Brien // software; you can redistribute it and/or modify it under the
800db7afdSDavid E. O'Brien // terms of the GNU General Public License as published by the
900db7afdSDavid E. O'Brien // Free Software Foundation; either version 2, or (at your option)
1000db7afdSDavid E. O'Brien // any later version.
1100db7afdSDavid E. O'Brien
1200db7afdSDavid E. O'Brien // This library is distributed in the hope that it will be useful,
1300db7afdSDavid E. O'Brien // but WITHOUT ANY WARRANTY; without even the implied warranty of
1400db7afdSDavid E. O'Brien // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1500db7afdSDavid E. O'Brien // GNU General Public License for more details.
1600db7afdSDavid E. O'Brien
1700db7afdSDavid E. O'Brien // You should have received a copy of the GNU General Public License along
1800db7afdSDavid E. O'Brien // with this library; see the file COPYING. If not, write to the Free
19*f8a1b7d9SAlexander Kabaev // Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
2000db7afdSDavid E. O'Brien // USA.
2100db7afdSDavid E. O'Brien
2200db7afdSDavid E. O'Brien // As a special exception, you may use this file as part of a free software
2300db7afdSDavid E. O'Brien // library without restriction. Specifically, if other files instantiate
2400db7afdSDavid E. O'Brien // templates or use macros or inline functions from this file, or you compile
2500db7afdSDavid E. O'Brien // this file and link it with other files to produce an executable, this
2600db7afdSDavid E. O'Brien // file does not by itself cause the resulting executable to be covered by
2700db7afdSDavid E. O'Brien // the GNU General Public License. This exception does not however
2800db7afdSDavid E. O'Brien // invalidate any other reasons why the executable file might be covered by
2900db7afdSDavid E. O'Brien // the GNU General Public License.
3000db7afdSDavid E. O'Brien
3100db7afdSDavid E. O'Brien /** @file valarray
32*f8a1b7d9SAlexander Kabaev * This is a Standard C++ Library header.
3300db7afdSDavid E. O'Brien */
3400db7afdSDavid E. O'Brien
35*f8a1b7d9SAlexander Kabaev // Written by Gabriel Dos Reis <[email protected]>
36*f8a1b7d9SAlexander Kabaev
37ffeaf689SAlexander Kabaev #ifndef _GLIBCXX_VALARRAY
38ffeaf689SAlexander Kabaev #define _GLIBCXX_VALARRAY 1
3900db7afdSDavid E. O'Brien
4000db7afdSDavid E. O'Brien #pragma GCC system_header
4100db7afdSDavid E. O'Brien
4200db7afdSDavid E. O'Brien #include <bits/c++config.h>
4300db7afdSDavid E. O'Brien #include <cstddef>
4400db7afdSDavid E. O'Brien #include <cmath>
4500db7afdSDavid E. O'Brien #include <cstdlib>
4600db7afdSDavid E. O'Brien #include <numeric>
4700db7afdSDavid E. O'Brien #include <algorithm>
48ffeaf689SAlexander Kabaev #include <debug/debug.h>
4900db7afdSDavid E. O'Brien
50*f8a1b7d9SAlexander Kabaev _GLIBCXX_BEGIN_NAMESPACE(std)
51*f8a1b7d9SAlexander Kabaev
521b86b14eSAlexander Kabaev template<class _Clos, typename _Tp>
531b86b14eSAlexander Kabaev class _Expr;
5400db7afdSDavid E. O'Brien
551b86b14eSAlexander Kabaev template<typename _Tp1, typename _Tp2>
561b86b14eSAlexander Kabaev class _ValArray;
5700db7afdSDavid E. O'Brien
581b86b14eSAlexander Kabaev template<class _Oper, template<class, class> class _Meta, class _Dom>
591b86b14eSAlexander Kabaev struct _UnClos;
6000db7afdSDavid E. O'Brien
611b86b14eSAlexander Kabaev template<class _Oper,
6200db7afdSDavid E. O'Brien template<class, class> class _Meta1,
6300db7afdSDavid E. O'Brien template<class, class> class _Meta2,
641b86b14eSAlexander Kabaev class _Dom1, class _Dom2>
651b86b14eSAlexander Kabaev class _BinClos;
6600db7afdSDavid E. O'Brien
671b86b14eSAlexander Kabaev template<template<class, class> class _Meta, class _Dom>
681b86b14eSAlexander Kabaev class _SClos;
6900db7afdSDavid E. O'Brien
701b86b14eSAlexander Kabaev template<template<class, class> class _Meta, class _Dom>
711b86b14eSAlexander Kabaev class _GClos;
7200db7afdSDavid E. O'Brien
731b86b14eSAlexander Kabaev template<template<class, class> class _Meta, class _Dom>
741b86b14eSAlexander Kabaev class _IClos;
7500db7afdSDavid E. O'Brien
761b86b14eSAlexander Kabaev template<template<class, class> class _Meta, class _Dom>
771b86b14eSAlexander Kabaev class _ValFunClos;
7800db7afdSDavid E. O'Brien
791b86b14eSAlexander Kabaev template<template<class, class> class _Meta, class _Dom>
801b86b14eSAlexander Kabaev class _RefFunClos;
8100db7afdSDavid E. O'Brien
8200db7afdSDavid E. O'Brien template<class _Tp> class valarray; // An array of type _Tp
8300db7afdSDavid E. O'Brien class slice; // BLAS-like slice out of an array
8400db7afdSDavid E. O'Brien template<class _Tp> class slice_array;
8500db7afdSDavid E. O'Brien class gslice; // generalized slice out of an array
8600db7afdSDavid E. O'Brien template<class _Tp> class gslice_array;
8700db7afdSDavid E. O'Brien template<class _Tp> class mask_array; // masked array
8800db7afdSDavid E. O'Brien template<class _Tp> class indirect_array; // indirected array
8900db7afdSDavid E. O'Brien
90*f8a1b7d9SAlexander Kabaev _GLIBCXX_END_NAMESPACE
9100db7afdSDavid E. O'Brien
9200db7afdSDavid E. O'Brien #include <bits/valarray_array.h>
93ffeaf689SAlexander Kabaev #include <bits/valarray_before.h>
9400db7afdSDavid E. O'Brien
_GLIBCXX_BEGIN_NAMESPACE(std)95*f8a1b7d9SAlexander Kabaev _GLIBCXX_BEGIN_NAMESPACE(std)
96*f8a1b7d9SAlexander Kabaev
97ffeaf689SAlexander Kabaev /**
98ffeaf689SAlexander Kabaev * @brief Smart array designed to support numeric processing.
99ffeaf689SAlexander Kabaev *
100ffeaf689SAlexander Kabaev * A valarray is an array that provides constraints intended to allow for
101ffeaf689SAlexander Kabaev * effective optimization of numeric array processing by reducing the
102ffeaf689SAlexander Kabaev * aliasing that can result from pointer representations. It represents a
103ffeaf689SAlexander Kabaev * one-dimensional array from which different multidimensional subsets can
104ffeaf689SAlexander Kabaev * be accessed and modified.
105ffeaf689SAlexander Kabaev *
106ffeaf689SAlexander Kabaev * @param Tp Type of object in the array.
107ffeaf689SAlexander Kabaev */
1081b86b14eSAlexander Kabaev template<class _Tp>
1091b86b14eSAlexander Kabaev class valarray
11000db7afdSDavid E. O'Brien {
1111b86b14eSAlexander Kabaev template<class _Op>
1121b86b14eSAlexander Kabaev struct _UnaryOp
1131b86b14eSAlexander Kabaev {
1141b86b14eSAlexander Kabaev typedef typename __fun<_Op, _Tp>::result_type __rt;
1151b86b14eSAlexander Kabaev typedef _Expr<_UnClos<_Op, _ValArray, _Tp>, __rt> _Rt;
1161b86b14eSAlexander Kabaev };
11700db7afdSDavid E. O'Brien public:
11800db7afdSDavid E. O'Brien typedef _Tp value_type;
11900db7afdSDavid E. O'Brien
12000db7afdSDavid E. O'Brien // _lib.valarray.cons_ construct/destroy:
121ffeaf689SAlexander Kabaev /// Construct an empty array.
12200db7afdSDavid E. O'Brien valarray();
123ffeaf689SAlexander Kabaev
124ffeaf689SAlexander Kabaev /// Construct an array with @a n elements.
12500db7afdSDavid E. O'Brien explicit valarray(size_t);
126ffeaf689SAlexander Kabaev
127ffeaf689SAlexander Kabaev /// Construct an array with @a n elements initialized to @a t.
12800db7afdSDavid E. O'Brien valarray(const _Tp&, size_t);
129ffeaf689SAlexander Kabaev
130ffeaf689SAlexander Kabaev /// Construct an array initialized to the first @a n elements of @a t.
13100db7afdSDavid E. O'Brien valarray(const _Tp* __restrict__, size_t);
132ffeaf689SAlexander Kabaev
133ffeaf689SAlexander Kabaev /// Copy constructor.
13400db7afdSDavid E. O'Brien valarray(const valarray&);
135ffeaf689SAlexander Kabaev
136ffeaf689SAlexander Kabaev /// Construct an array with the same size and values in @a sa.
13700db7afdSDavid E. O'Brien valarray(const slice_array<_Tp>&);
138ffeaf689SAlexander Kabaev
139ffeaf689SAlexander Kabaev /// Construct an array with the same size and values in @a ga.
14000db7afdSDavid E. O'Brien valarray(const gslice_array<_Tp>&);
141ffeaf689SAlexander Kabaev
142ffeaf689SAlexander Kabaev /// Construct an array with the same size and values in @a ma.
14300db7afdSDavid E. O'Brien valarray(const mask_array<_Tp>&);
144ffeaf689SAlexander Kabaev
145ffeaf689SAlexander Kabaev /// Construct an array with the same size and values in @a ia.
14600db7afdSDavid E. O'Brien valarray(const indirect_array<_Tp>&);
147ffeaf689SAlexander Kabaev
14800db7afdSDavid E. O'Brien template<class _Dom>
14900db7afdSDavid E. O'Brien valarray(const _Expr<_Dom, _Tp>& __e);
150*f8a1b7d9SAlexander Kabaev
15100db7afdSDavid E. O'Brien ~valarray();
15200db7afdSDavid E. O'Brien
15300db7afdSDavid E. O'Brien // _lib.valarray.assign_ assignment:
154ffeaf689SAlexander Kabaev /**
155ffeaf689SAlexander Kabaev * @brief Assign elements to an array.
156ffeaf689SAlexander Kabaev *
157ffeaf689SAlexander Kabaev * Assign elements of array to values in @a v. Results are undefined
158*f8a1b7d9SAlexander Kabaev * if @a v does not have the same size as this array.
159ffeaf689SAlexander Kabaev *
160ffeaf689SAlexander Kabaev * @param v Valarray to get values from.
161ffeaf689SAlexander Kabaev */
16200db7afdSDavid E. O'Brien valarray<_Tp>& operator=(const valarray<_Tp>&);
163ffeaf689SAlexander Kabaev
164ffeaf689SAlexander Kabaev /**
165ffeaf689SAlexander Kabaev * @brief Assign elements to a value.
166ffeaf689SAlexander Kabaev *
167ffeaf689SAlexander Kabaev * Assign all elements of array to @a t.
168ffeaf689SAlexander Kabaev *
169ffeaf689SAlexander Kabaev * @param t Value for elements.
170ffeaf689SAlexander Kabaev */
17100db7afdSDavid E. O'Brien valarray<_Tp>& operator=(const _Tp&);
172ffeaf689SAlexander Kabaev
173ffeaf689SAlexander Kabaev /**
174ffeaf689SAlexander Kabaev * @brief Assign elements to an array subset.
175ffeaf689SAlexander Kabaev *
176ffeaf689SAlexander Kabaev * Assign elements of array to values in @a sa. Results are undefined
177*f8a1b7d9SAlexander Kabaev * if @a sa does not have the same size as this array.
178ffeaf689SAlexander Kabaev *
179ffeaf689SAlexander Kabaev * @param sa Array slice to get values from.
180ffeaf689SAlexander Kabaev */
18100db7afdSDavid E. O'Brien valarray<_Tp>& operator=(const slice_array<_Tp>&);
182ffeaf689SAlexander Kabaev
183ffeaf689SAlexander Kabaev /**
184ffeaf689SAlexander Kabaev * @brief Assign elements to an array subset.
185ffeaf689SAlexander Kabaev *
186ffeaf689SAlexander Kabaev * Assign elements of array to values in @a ga. Results are undefined
187*f8a1b7d9SAlexander Kabaev * if @a ga does not have the same size as this array.
188ffeaf689SAlexander Kabaev *
189ffeaf689SAlexander Kabaev * @param ga Array slice to get values from.
190ffeaf689SAlexander Kabaev */
19100db7afdSDavid E. O'Brien valarray<_Tp>& operator=(const gslice_array<_Tp>&);
192ffeaf689SAlexander Kabaev
193ffeaf689SAlexander Kabaev /**
194ffeaf689SAlexander Kabaev * @brief Assign elements to an array subset.
195ffeaf689SAlexander Kabaev *
196ffeaf689SAlexander Kabaev * Assign elements of array to values in @a ma. Results are undefined
197*f8a1b7d9SAlexander Kabaev * if @a ma does not have the same size as this array.
198ffeaf689SAlexander Kabaev *
199ffeaf689SAlexander Kabaev * @param ma Array slice to get values from.
200ffeaf689SAlexander Kabaev */
20100db7afdSDavid E. O'Brien valarray<_Tp>& operator=(const mask_array<_Tp>&);
202ffeaf689SAlexander Kabaev
203ffeaf689SAlexander Kabaev /**
204ffeaf689SAlexander Kabaev * @brief Assign elements to an array subset.
205ffeaf689SAlexander Kabaev *
206ffeaf689SAlexander Kabaev * Assign elements of array to values in @a ia. Results are undefined
207*f8a1b7d9SAlexander Kabaev * if @a ia does not have the same size as this array.
208ffeaf689SAlexander Kabaev *
209ffeaf689SAlexander Kabaev * @param ia Array slice to get values from.
210ffeaf689SAlexander Kabaev */
21100db7afdSDavid E. O'Brien valarray<_Tp>& operator=(const indirect_array<_Tp>&);
21200db7afdSDavid E. O'Brien
21300db7afdSDavid E. O'Brien template<class _Dom> valarray<_Tp>&
21400db7afdSDavid E. O'Brien operator= (const _Expr<_Dom, _Tp>&);
21500db7afdSDavid E. O'Brien
21600db7afdSDavid E. O'Brien // _lib.valarray.access_ element access:
217ffeaf689SAlexander Kabaev /**
218ffeaf689SAlexander Kabaev * Return a reference to the i'th array element.
219ffeaf689SAlexander Kabaev *
220ffeaf689SAlexander Kabaev * @param i Index of element to return.
221ffeaf689SAlexander Kabaev * @return Reference to the i'th element.
222ffeaf689SAlexander Kabaev */
22300db7afdSDavid E. O'Brien _Tp& operator[](size_t);
224ffeaf689SAlexander Kabaev
225ffeaf689SAlexander Kabaev // _GLIBCXX_RESOLVE_LIB_DEFECTS
226ffeaf689SAlexander Kabaev // 389. Const overload of valarray::operator[] returns by value.
227ffeaf689SAlexander Kabaev const _Tp& operator[](size_t) const;
228ffeaf689SAlexander Kabaev
22900db7afdSDavid E. O'Brien // _lib.valarray.sub_ subset operations:
230ffeaf689SAlexander Kabaev /**
231ffeaf689SAlexander Kabaev * @brief Return an array subset.
232ffeaf689SAlexander Kabaev *
233ffeaf689SAlexander Kabaev * Returns a new valarray containing the elements of the array
234*f8a1b7d9SAlexander Kabaev * indicated by the slice argument. The new valarray has the same size
235*f8a1b7d9SAlexander Kabaev * as the input slice. @see slice.
236ffeaf689SAlexander Kabaev *
237ffeaf689SAlexander Kabaev * @param s The source slice.
238ffeaf689SAlexander Kabaev * @return New valarray containing elements in @a s.
239ffeaf689SAlexander Kabaev */
24000db7afdSDavid E. O'Brien _Expr<_SClos<_ValArray, _Tp>, _Tp> operator[](slice) const;
241ffeaf689SAlexander Kabaev
242ffeaf689SAlexander Kabaev /**
243ffeaf689SAlexander Kabaev * @brief Return a reference to an array subset.
244ffeaf689SAlexander Kabaev *
245ffeaf689SAlexander Kabaev * Returns a new valarray containing the elements of the array
246*f8a1b7d9SAlexander Kabaev * indicated by the slice argument. The new valarray has the same size
247*f8a1b7d9SAlexander Kabaev * as the input slice. @see slice.
248ffeaf689SAlexander Kabaev *
249ffeaf689SAlexander Kabaev * @param s The source slice.
250ffeaf689SAlexander Kabaev * @return New valarray containing elements in @a s.
251ffeaf689SAlexander Kabaev */
25200db7afdSDavid E. O'Brien slice_array<_Tp> operator[](slice);
253ffeaf689SAlexander Kabaev
254ffeaf689SAlexander Kabaev /**
255ffeaf689SAlexander Kabaev * @brief Return an array subset.
256ffeaf689SAlexander Kabaev *
257ffeaf689SAlexander Kabaev * Returns a slice_array referencing the elements of the array
258ffeaf689SAlexander Kabaev * indicated by the slice argument. @see gslice.
259ffeaf689SAlexander Kabaev *
260ffeaf689SAlexander Kabaev * @param s The source slice.
261ffeaf689SAlexander Kabaev * @return Slice_array referencing elements indicated by @a s.
262ffeaf689SAlexander Kabaev */
26300db7afdSDavid E. O'Brien _Expr<_GClos<_ValArray, _Tp>, _Tp> operator[](const gslice&) const;
264ffeaf689SAlexander Kabaev
265ffeaf689SAlexander Kabaev /**
266ffeaf689SAlexander Kabaev * @brief Return a reference to an array subset.
267ffeaf689SAlexander Kabaev *
268ffeaf689SAlexander Kabaev * Returns a new valarray containing the elements of the array
269*f8a1b7d9SAlexander Kabaev * indicated by the gslice argument. The new valarray has
270*f8a1b7d9SAlexander Kabaev * the same size as the input gslice. @see gslice.
271ffeaf689SAlexander Kabaev *
272ffeaf689SAlexander Kabaev * @param s The source gslice.
273ffeaf689SAlexander Kabaev * @return New valarray containing elements in @a s.
274ffeaf689SAlexander Kabaev */
27500db7afdSDavid E. O'Brien gslice_array<_Tp> operator[](const gslice&);
276ffeaf689SAlexander Kabaev
277ffeaf689SAlexander Kabaev /**
278ffeaf689SAlexander Kabaev * @brief Return an array subset.
279ffeaf689SAlexander Kabaev *
280ffeaf689SAlexander Kabaev * Returns a new valarray containing the elements of the array
281ffeaf689SAlexander Kabaev * indicated by the argument. The input is a valarray of bool which
282ffeaf689SAlexander Kabaev * represents a bitmask indicating which elements should be copied into
283ffeaf689SAlexander Kabaev * the new valarray. Each element of the array is added to the return
284ffeaf689SAlexander Kabaev * valarray if the corresponding element of the argument is true.
285ffeaf689SAlexander Kabaev *
286ffeaf689SAlexander Kabaev * @param m The valarray bitmask.
287ffeaf689SAlexander Kabaev * @return New valarray containing elements indicated by @a m.
288ffeaf689SAlexander Kabaev */
28900db7afdSDavid E. O'Brien valarray<_Tp> operator[](const valarray<bool>&) const;
290ffeaf689SAlexander Kabaev
291ffeaf689SAlexander Kabaev /**
292ffeaf689SAlexander Kabaev * @brief Return a reference to an array subset.
293ffeaf689SAlexander Kabaev *
294ffeaf689SAlexander Kabaev * Returns a new mask_array referencing the elements of the array
295ffeaf689SAlexander Kabaev * indicated by the argument. The input is a valarray of bool which
296ffeaf689SAlexander Kabaev * represents a bitmask indicating which elements are part of the
297ffeaf689SAlexander Kabaev * subset. Elements of the array are part of the subset if the
298ffeaf689SAlexander Kabaev * corresponding element of the argument is true.
299ffeaf689SAlexander Kabaev *
300ffeaf689SAlexander Kabaev * @param m The valarray bitmask.
301ffeaf689SAlexander Kabaev * @return New valarray containing elements indicated by @a m.
302ffeaf689SAlexander Kabaev */
30300db7afdSDavid E. O'Brien mask_array<_Tp> operator[](const valarray<bool>&);
304ffeaf689SAlexander Kabaev
305ffeaf689SAlexander Kabaev /**
306ffeaf689SAlexander Kabaev * @brief Return an array subset.
307ffeaf689SAlexander Kabaev *
308ffeaf689SAlexander Kabaev * Returns a new valarray containing the elements of the array
309ffeaf689SAlexander Kabaev * indicated by the argument. The elements in the argument are
310ffeaf689SAlexander Kabaev * interpreted as the indices of elements of this valarray to copy to
311ffeaf689SAlexander Kabaev * the return valarray.
312ffeaf689SAlexander Kabaev *
313ffeaf689SAlexander Kabaev * @param i The valarray element index list.
314ffeaf689SAlexander Kabaev * @return New valarray containing elements in @a s.
315ffeaf689SAlexander Kabaev */
31600db7afdSDavid E. O'Brien _Expr<_IClos<_ValArray, _Tp>, _Tp>
31700db7afdSDavid E. O'Brien operator[](const valarray<size_t>&) const;
318ffeaf689SAlexander Kabaev
319ffeaf689SAlexander Kabaev /**
320ffeaf689SAlexander Kabaev * @brief Return a reference to an array subset.
321ffeaf689SAlexander Kabaev *
322ffeaf689SAlexander Kabaev * Returns an indirect_array referencing the elements of the array
323ffeaf689SAlexander Kabaev * indicated by the argument. The elements in the argument are
324ffeaf689SAlexander Kabaev * interpreted as the indices of elements of this valarray to include
325ffeaf689SAlexander Kabaev * in the subset. The returned indirect_array refers to these
326ffeaf689SAlexander Kabaev * elements.
327ffeaf689SAlexander Kabaev *
328ffeaf689SAlexander Kabaev * @param i The valarray element index list.
329ffeaf689SAlexander Kabaev * @return Indirect_array referencing elements in @a i.
330ffeaf689SAlexander Kabaev */
33100db7afdSDavid E. O'Brien indirect_array<_Tp> operator[](const valarray<size_t>&);
33200db7afdSDavid E. O'Brien
33300db7afdSDavid E. O'Brien // _lib.valarray.unary_ unary operators:
334ffeaf689SAlexander Kabaev /// Return a new valarray by applying unary + to each element.
3351b86b14eSAlexander Kabaev typename _UnaryOp<__unary_plus>::_Rt operator+() const;
336ffeaf689SAlexander Kabaev
337ffeaf689SAlexander Kabaev /// Return a new valarray by applying unary - to each element.
3381b86b14eSAlexander Kabaev typename _UnaryOp<__negate>::_Rt operator-() const;
339ffeaf689SAlexander Kabaev
340ffeaf689SAlexander Kabaev /// Return a new valarray by applying unary ~ to each element.
3411b86b14eSAlexander Kabaev typename _UnaryOp<__bitwise_not>::_Rt operator~() const;
342ffeaf689SAlexander Kabaev
343ffeaf689SAlexander Kabaev /// Return a new valarray by applying unary ! to each element.
3441b86b14eSAlexander Kabaev typename _UnaryOp<__logical_not>::_Rt operator!() const;
34500db7afdSDavid E. O'Brien
34600db7afdSDavid E. O'Brien // _lib.valarray.cassign_ computed assignment:
347ffeaf689SAlexander Kabaev /// Multiply each element of array by @a t.
34800db7afdSDavid E. O'Brien valarray<_Tp>& operator*=(const _Tp&);
349ffeaf689SAlexander Kabaev
350ffeaf689SAlexander Kabaev /// Divide each element of array by @a t.
35100db7afdSDavid E. O'Brien valarray<_Tp>& operator/=(const _Tp&);
352ffeaf689SAlexander Kabaev
353ffeaf689SAlexander Kabaev /// Set each element e of array to e % @a t.
35400db7afdSDavid E. O'Brien valarray<_Tp>& operator%=(const _Tp&);
355ffeaf689SAlexander Kabaev
356ffeaf689SAlexander Kabaev /// Add @a t to each element of array.
35700db7afdSDavid E. O'Brien valarray<_Tp>& operator+=(const _Tp&);
358ffeaf689SAlexander Kabaev
359ffeaf689SAlexander Kabaev /// Subtract @a t to each element of array.
36000db7afdSDavid E. O'Brien valarray<_Tp>& operator-=(const _Tp&);
361ffeaf689SAlexander Kabaev
362ffeaf689SAlexander Kabaev /// Set each element e of array to e ^ @a t.
36300db7afdSDavid E. O'Brien valarray<_Tp>& operator^=(const _Tp&);
364ffeaf689SAlexander Kabaev
365ffeaf689SAlexander Kabaev /// Set each element e of array to e & @a t.
36600db7afdSDavid E. O'Brien valarray<_Tp>& operator&=(const _Tp&);
367ffeaf689SAlexander Kabaev
368ffeaf689SAlexander Kabaev /// Set each element e of array to e | @a t.
36900db7afdSDavid E. O'Brien valarray<_Tp>& operator|=(const _Tp&);
370ffeaf689SAlexander Kabaev
371ffeaf689SAlexander Kabaev /// Left shift each element e of array by @a t bits.
37200db7afdSDavid E. O'Brien valarray<_Tp>& operator<<=(const _Tp&);
373ffeaf689SAlexander Kabaev
374ffeaf689SAlexander Kabaev /// Right shift each element e of array by @a t bits.
37500db7afdSDavid E. O'Brien valarray<_Tp>& operator>>=(const _Tp&);
376ffeaf689SAlexander Kabaev
377ffeaf689SAlexander Kabaev /// Multiply elements of array by corresponding elements of @a v.
37800db7afdSDavid E. O'Brien valarray<_Tp>& operator*=(const valarray<_Tp>&);
379ffeaf689SAlexander Kabaev
380ffeaf689SAlexander Kabaev /// Divide elements of array by corresponding elements of @a v.
38100db7afdSDavid E. O'Brien valarray<_Tp>& operator/=(const valarray<_Tp>&);
382ffeaf689SAlexander Kabaev
383ffeaf689SAlexander Kabaev /// Modulo elements of array by corresponding elements of @a v.
38400db7afdSDavid E. O'Brien valarray<_Tp>& operator%=(const valarray<_Tp>&);
385ffeaf689SAlexander Kabaev
386ffeaf689SAlexander Kabaev /// Add corresponding elements of @a v to elements of array.
38700db7afdSDavid E. O'Brien valarray<_Tp>& operator+=(const valarray<_Tp>&);
388ffeaf689SAlexander Kabaev
389ffeaf689SAlexander Kabaev /// Subtract corresponding elements of @a v from elements of array.
39000db7afdSDavid E. O'Brien valarray<_Tp>& operator-=(const valarray<_Tp>&);
391ffeaf689SAlexander Kabaev
392ffeaf689SAlexander Kabaev /// Logical xor corresponding elements of @a v with elements of array.
39300db7afdSDavid E. O'Brien valarray<_Tp>& operator^=(const valarray<_Tp>&);
394ffeaf689SAlexander Kabaev
395ffeaf689SAlexander Kabaev /// Logical or corresponding elements of @a v with elements of array.
39600db7afdSDavid E. O'Brien valarray<_Tp>& operator|=(const valarray<_Tp>&);
397ffeaf689SAlexander Kabaev
398ffeaf689SAlexander Kabaev /// Logical and corresponding elements of @a v with elements of array.
39900db7afdSDavid E. O'Brien valarray<_Tp>& operator&=(const valarray<_Tp>&);
400ffeaf689SAlexander Kabaev
401ffeaf689SAlexander Kabaev /// Left shift elements of array by corresponding elements of @a v.
40200db7afdSDavid E. O'Brien valarray<_Tp>& operator<<=(const valarray<_Tp>&);
403ffeaf689SAlexander Kabaev
404ffeaf689SAlexander Kabaev /// Right shift elements of array by corresponding elements of @a v.
40500db7afdSDavid E. O'Brien valarray<_Tp>& operator>>=(const valarray<_Tp>&);
40600db7afdSDavid E. O'Brien
40700db7afdSDavid E. O'Brien template<class _Dom>
40800db7afdSDavid E. O'Brien valarray<_Tp>& operator*=(const _Expr<_Dom, _Tp>&);
40900db7afdSDavid E. O'Brien template<class _Dom>
41000db7afdSDavid E. O'Brien valarray<_Tp>& operator/=(const _Expr<_Dom, _Tp>&);
41100db7afdSDavid E. O'Brien template<class _Dom>
41200db7afdSDavid E. O'Brien valarray<_Tp>& operator%=(const _Expr<_Dom, _Tp>&);
41300db7afdSDavid E. O'Brien template<class _Dom>
41400db7afdSDavid E. O'Brien valarray<_Tp>& operator+=(const _Expr<_Dom, _Tp>&);
41500db7afdSDavid E. O'Brien template<class _Dom>
41600db7afdSDavid E. O'Brien valarray<_Tp>& operator-=(const _Expr<_Dom, _Tp>&);
41700db7afdSDavid E. O'Brien template<class _Dom>
41800db7afdSDavid E. O'Brien valarray<_Tp>& operator^=(const _Expr<_Dom, _Tp>&);
41900db7afdSDavid E. O'Brien template<class _Dom>
42000db7afdSDavid E. O'Brien valarray<_Tp>& operator|=(const _Expr<_Dom, _Tp>&);
42100db7afdSDavid E. O'Brien template<class _Dom>
42200db7afdSDavid E. O'Brien valarray<_Tp>& operator&=(const _Expr<_Dom, _Tp>&);
42300db7afdSDavid E. O'Brien template<class _Dom>
42400db7afdSDavid E. O'Brien valarray<_Tp>& operator<<=(const _Expr<_Dom, _Tp>&);
42500db7afdSDavid E. O'Brien template<class _Dom>
42600db7afdSDavid E. O'Brien valarray<_Tp>& operator>>=(const _Expr<_Dom, _Tp>&);
42700db7afdSDavid E. O'Brien
42800db7afdSDavid E. O'Brien // _lib.valarray.members_ member functions:
429ffeaf689SAlexander Kabaev /// Return the number of elements in array.
43000db7afdSDavid E. O'Brien size_t size() const;
431ffeaf689SAlexander Kabaev
432ffeaf689SAlexander Kabaev /**
433ffeaf689SAlexander Kabaev * @brief Return the sum of all elements in the array.
434ffeaf689SAlexander Kabaev *
435ffeaf689SAlexander Kabaev * Accumulates the sum of all elements into a Tp using +=. The order
436ffeaf689SAlexander Kabaev * of adding the elements is unspecified.
437ffeaf689SAlexander Kabaev */
43800db7afdSDavid E. O'Brien _Tp sum() const;
439ffeaf689SAlexander Kabaev
440ffeaf689SAlexander Kabaev /// Return the minimum element using operator<().
44100db7afdSDavid E. O'Brien _Tp min() const;
442ffeaf689SAlexander Kabaev
443ffeaf689SAlexander Kabaev /// Return the maximum element using operator<().
44400db7afdSDavid E. O'Brien _Tp max() const;
44500db7afdSDavid E. O'Brien
446ffeaf689SAlexander Kabaev /**
447ffeaf689SAlexander Kabaev * @brief Return a shifted array.
448ffeaf689SAlexander Kabaev *
449ffeaf689SAlexander Kabaev * A new valarray is constructed as a copy of this array with elements
450ffeaf689SAlexander Kabaev * in shifted positions. For an element with index i, the new position
451*f8a1b7d9SAlexander Kabaev * is i - n. The new valarray has the same size as the current one.
452*f8a1b7d9SAlexander Kabaev * New elements without a value are set to 0. Elements whose new
453ffeaf689SAlexander Kabaev * position is outside the bounds of the array are discarded.
454ffeaf689SAlexander Kabaev *
455ffeaf689SAlexander Kabaev * Positive arguments shift toward index 0, discarding elements [0, n).
456ffeaf689SAlexander Kabaev * Negative arguments discard elements from the top of the array.
457ffeaf689SAlexander Kabaev *
458ffeaf689SAlexander Kabaev * @param n Number of element positions to shift.
459ffeaf689SAlexander Kabaev * @return New valarray with elements in shifted positions.
460ffeaf689SAlexander Kabaev */
46100db7afdSDavid E. O'Brien valarray<_Tp> shift (int) const;
462ffeaf689SAlexander Kabaev
463ffeaf689SAlexander Kabaev /**
464ffeaf689SAlexander Kabaev * @brief Return a rotated array.
465ffeaf689SAlexander Kabaev *
466ffeaf689SAlexander Kabaev * A new valarray is constructed as a copy of this array with elements
467ffeaf689SAlexander Kabaev * in shifted positions. For an element with index i, the new position
468*f8a1b7d9SAlexander Kabaev * is (i - n) % size(). The new valarray has the same size as the
469ffeaf689SAlexander Kabaev * current one. Elements that are shifted beyond the array bounds are
470ffeaf689SAlexander Kabaev * shifted into the other end of the array. No elements are lost.
471ffeaf689SAlexander Kabaev *
472ffeaf689SAlexander Kabaev * Positive arguments shift toward index 0, wrapping around the top.
473ffeaf689SAlexander Kabaev * Negative arguments shift towards the top, wrapping around to 0.
474ffeaf689SAlexander Kabaev *
475ffeaf689SAlexander Kabaev * @param n Number of element positions to rotate.
476ffeaf689SAlexander Kabaev * @return New valarray with elements in shifted positions.
477ffeaf689SAlexander Kabaev */
47800db7afdSDavid E. O'Brien valarray<_Tp> cshift(int) const;
479ffeaf689SAlexander Kabaev
480ffeaf689SAlexander Kabaev /**
481ffeaf689SAlexander Kabaev * @brief Apply a function to the array.
482ffeaf689SAlexander Kabaev *
483ffeaf689SAlexander Kabaev * Returns a new valarray with elements assigned to the result of
484ffeaf689SAlexander Kabaev * applying func to the corresponding element of this array. The new
485*f8a1b7d9SAlexander Kabaev * array has the same size as this one.
486ffeaf689SAlexander Kabaev *
487ffeaf689SAlexander Kabaev * @param func Function of Tp returning Tp to apply.
488ffeaf689SAlexander Kabaev * @return New valarray with transformed elements.
489ffeaf689SAlexander Kabaev */
49000db7afdSDavid E. O'Brien _Expr<_ValFunClos<_ValArray, _Tp>, _Tp> apply(_Tp func(_Tp)) const;
491ffeaf689SAlexander Kabaev
492ffeaf689SAlexander Kabaev /**
493ffeaf689SAlexander Kabaev * @brief Apply a function to the array.
494ffeaf689SAlexander Kabaev *
495ffeaf689SAlexander Kabaev * Returns a new valarray with elements assigned to the result of
496ffeaf689SAlexander Kabaev * applying func to the corresponding element of this array. The new
497*f8a1b7d9SAlexander Kabaev * array has the same size as this one.
498ffeaf689SAlexander Kabaev *
499ffeaf689SAlexander Kabaev * @param func Function of const Tp& returning Tp to apply.
500ffeaf689SAlexander Kabaev * @return New valarray with transformed elements.
501ffeaf689SAlexander Kabaev */
50200db7afdSDavid E. O'Brien _Expr<_RefFunClos<_ValArray, _Tp>, _Tp> apply(_Tp func(const _Tp&)) const;
503ffeaf689SAlexander Kabaev
504ffeaf689SAlexander Kabaev /**
505ffeaf689SAlexander Kabaev * @brief Resize array.
506ffeaf689SAlexander Kabaev *
507*f8a1b7d9SAlexander Kabaev * Resize this array to @a size and set all elements to @a c. All
508ffeaf689SAlexander Kabaev * references and iterators are invalidated.
509ffeaf689SAlexander Kabaev *
510ffeaf689SAlexander Kabaev * @param size New array size.
511ffeaf689SAlexander Kabaev * @param c New value for all elements.
512ffeaf689SAlexander Kabaev */
51300db7afdSDavid E. O'Brien void resize(size_t __size, _Tp __c = _Tp());
51400db7afdSDavid E. O'Brien
51500db7afdSDavid E. O'Brien private:
51600db7afdSDavid E. O'Brien size_t _M_size;
51700db7afdSDavid E. O'Brien _Tp* __restrict__ _M_data;
51800db7afdSDavid E. O'Brien
51900db7afdSDavid E. O'Brien friend class _Array<_Tp>;
52000db7afdSDavid E. O'Brien };
52100db7afdSDavid E. O'Brien
52200db7afdSDavid E. O'Brien template<typename _Tp>
52300db7afdSDavid E. O'Brien inline const _Tp&
52400db7afdSDavid E. O'Brien valarray<_Tp>::operator[](size_t __i) const
525ffeaf689SAlexander Kabaev {
526ffeaf689SAlexander Kabaev __glibcxx_requires_subscript(__i);
527ffeaf689SAlexander Kabaev return _M_data[__i];
528ffeaf689SAlexander Kabaev }
52900db7afdSDavid E. O'Brien
53000db7afdSDavid E. O'Brien template<typename _Tp>
53100db7afdSDavid E. O'Brien inline _Tp&
53200db7afdSDavid E. O'Brien valarray<_Tp>::operator[](size_t __i)
533ffeaf689SAlexander Kabaev {
534ffeaf689SAlexander Kabaev __glibcxx_requires_subscript(__i);
535ffeaf689SAlexander Kabaev return _M_data[__i];
536ffeaf689SAlexander Kabaev }
53700db7afdSDavid E. O'Brien
538*f8a1b7d9SAlexander Kabaev _GLIBCXX_END_NAMESPACE
53900db7afdSDavid E. O'Brien
540ffeaf689SAlexander Kabaev #include <bits/valarray_after.h>
54100db7afdSDavid E. O'Brien #include <bits/slice_array.h>
54200db7afdSDavid E. O'Brien #include <bits/gslice.h>
54300db7afdSDavid E. O'Brien #include <bits/gslice_array.h>
54400db7afdSDavid E. O'Brien #include <bits/mask_array.h>
54500db7afdSDavid E. O'Brien #include <bits/indirect_array.h>
54600db7afdSDavid E. O'Brien
_GLIBCXX_BEGIN_NAMESPACE(std)547*f8a1b7d9SAlexander Kabaev _GLIBCXX_BEGIN_NAMESPACE(std)
548*f8a1b7d9SAlexander Kabaev
54900db7afdSDavid E. O'Brien template<typename _Tp>
5501b86b14eSAlexander Kabaev inline
5511b86b14eSAlexander Kabaev valarray<_Tp>::valarray() : _M_size(0), _M_data(0) {}
55200db7afdSDavid E. O'Brien
55300db7afdSDavid E. O'Brien template<typename _Tp>
5541b86b14eSAlexander Kabaev inline
valarray(size_t __n)5551b86b14eSAlexander Kabaev valarray<_Tp>::valarray(size_t __n)
55600db7afdSDavid E. O'Brien : _M_size(__n), _M_data(__valarray_get_storage<_Tp>(__n))
557ffeaf689SAlexander Kabaev { std::__valarray_default_construct(_M_data, _M_data + __n); }
55800db7afdSDavid E. O'Brien
55900db7afdSDavid E. O'Brien template<typename _Tp>
5601b86b14eSAlexander Kabaev inline
valarray(const _Tp & __t,size_t __n)5611b86b14eSAlexander Kabaev valarray<_Tp>::valarray(const _Tp& __t, size_t __n)
56200db7afdSDavid E. O'Brien : _M_size(__n), _M_data(__valarray_get_storage<_Tp>(__n))
563ffeaf689SAlexander Kabaev { std::__valarray_fill_construct(_M_data, _M_data + __n, __t); }
56400db7afdSDavid E. O'Brien
56500db7afdSDavid E. O'Brien template<typename _Tp>
5661b86b14eSAlexander Kabaev inline
valarray(const _Tp * __restrict__ __p,size_t __n)5671b86b14eSAlexander Kabaev valarray<_Tp>::valarray(const _Tp* __restrict__ __p, size_t __n)
56800db7afdSDavid E. O'Brien : _M_size(__n), _M_data(__valarray_get_storage<_Tp>(__n))
569ffeaf689SAlexander Kabaev {
570ffeaf689SAlexander Kabaev _GLIBCXX_DEBUG_ASSERT(__p != 0 || __n == 0);
571ffeaf689SAlexander Kabaev std::__valarray_copy_construct(__p, __p + __n, _M_data);
572ffeaf689SAlexander Kabaev }
57300db7afdSDavid E. O'Brien
57400db7afdSDavid E. O'Brien template<typename _Tp>
5751b86b14eSAlexander Kabaev inline
valarray(const valarray<_Tp> & __v)5761b86b14eSAlexander Kabaev valarray<_Tp>::valarray(const valarray<_Tp>& __v)
57700db7afdSDavid E. O'Brien : _M_size(__v._M_size), _M_data(__valarray_get_storage<_Tp>(__v._M_size))
578*f8a1b7d9SAlexander Kabaev { std::__valarray_copy_construct(__v._M_data, __v._M_data + _M_size,
579*f8a1b7d9SAlexander Kabaev _M_data); }
58000db7afdSDavid E. O'Brien
58100db7afdSDavid E. O'Brien template<typename _Tp>
5821b86b14eSAlexander Kabaev inline
valarray(const slice_array<_Tp> & __sa)5831b86b14eSAlexander Kabaev valarray<_Tp>::valarray(const slice_array<_Tp>& __sa)
58400db7afdSDavid E. O'Brien : _M_size(__sa._M_sz), _M_data(__valarray_get_storage<_Tp>(__sa._M_sz))
58500db7afdSDavid E. O'Brien {
586*f8a1b7d9SAlexander Kabaev std::__valarray_copy_construct
58700db7afdSDavid E. O'Brien (__sa._M_array, __sa._M_sz, __sa._M_stride, _Array<_Tp>(_M_data));
58800db7afdSDavid E. O'Brien }
58900db7afdSDavid E. O'Brien
59000db7afdSDavid E. O'Brien template<typename _Tp>
5911b86b14eSAlexander Kabaev inline
valarray(const gslice_array<_Tp> & __ga)5921b86b14eSAlexander Kabaev valarray<_Tp>::valarray(const gslice_array<_Tp>& __ga)
59300db7afdSDavid E. O'Brien : _M_size(__ga._M_index.size()),
59400db7afdSDavid E. O'Brien _M_data(__valarray_get_storage<_Tp>(_M_size))
59500db7afdSDavid E. O'Brien {
596*f8a1b7d9SAlexander Kabaev std::__valarray_copy_construct
59700db7afdSDavid E. O'Brien (__ga._M_array, _Array<size_t>(__ga._M_index),
59800db7afdSDavid E. O'Brien _Array<_Tp>(_M_data), _M_size);
59900db7afdSDavid E. O'Brien }
60000db7afdSDavid E. O'Brien
60100db7afdSDavid E. O'Brien template<typename _Tp>
6021b86b14eSAlexander Kabaev inline
valarray(const mask_array<_Tp> & __ma)6031b86b14eSAlexander Kabaev valarray<_Tp>::valarray(const mask_array<_Tp>& __ma)
60400db7afdSDavid E. O'Brien : _M_size(__ma._M_sz), _M_data(__valarray_get_storage<_Tp>(__ma._M_sz))
60500db7afdSDavid E. O'Brien {
606*f8a1b7d9SAlexander Kabaev std::__valarray_copy_construct
60700db7afdSDavid E. O'Brien (__ma._M_array, __ma._M_mask, _Array<_Tp>(_M_data), _M_size);
60800db7afdSDavid E. O'Brien }
60900db7afdSDavid E. O'Brien
61000db7afdSDavid E. O'Brien template<typename _Tp>
6111b86b14eSAlexander Kabaev inline
valarray(const indirect_array<_Tp> & __ia)6121b86b14eSAlexander Kabaev valarray<_Tp>::valarray(const indirect_array<_Tp>& __ia)
61300db7afdSDavid E. O'Brien : _M_size(__ia._M_sz), _M_data(__valarray_get_storage<_Tp>(__ia._M_sz))
61400db7afdSDavid E. O'Brien {
615*f8a1b7d9SAlexander Kabaev std::__valarray_copy_construct
61600db7afdSDavid E. O'Brien (__ia._M_array, __ia._M_index, _Array<_Tp>(_M_data), _M_size);
61700db7afdSDavid E. O'Brien }
61800db7afdSDavid E. O'Brien
61900db7afdSDavid E. O'Brien template<typename _Tp> template<class _Dom>
6201b86b14eSAlexander Kabaev inline
valarray(const _Expr<_Dom,_Tp> & __e)6211b86b14eSAlexander Kabaev valarray<_Tp>::valarray(const _Expr<_Dom, _Tp>& __e)
62200db7afdSDavid E. O'Brien : _M_size(__e.size()), _M_data(__valarray_get_storage<_Tp>(_M_size))
623*f8a1b7d9SAlexander Kabaev { std::__valarray_copy_construct(__e, _M_size, _Array<_Tp>(_M_data)); }
62400db7afdSDavid E. O'Brien
62500db7afdSDavid E. O'Brien template<typename _Tp>
6261b86b14eSAlexander Kabaev inline
~valarray()6271b86b14eSAlexander Kabaev valarray<_Tp>::~valarray()
62800db7afdSDavid E. O'Brien {
629ffeaf689SAlexander Kabaev std::__valarray_destroy_elements(_M_data, _M_data + _M_size);
630ffeaf689SAlexander Kabaev std::__valarray_release_memory(_M_data);
63100db7afdSDavid E. O'Brien }
63200db7afdSDavid E. O'Brien
63300db7afdSDavid E. O'Brien template<typename _Tp>
63400db7afdSDavid E. O'Brien inline valarray<_Tp>&
63500db7afdSDavid E. O'Brien valarray<_Tp>::operator=(const valarray<_Tp>& __v)
63600db7afdSDavid E. O'Brien {
637ffeaf689SAlexander Kabaev _GLIBCXX_DEBUG_ASSERT(_M_size == __v._M_size);
638ffeaf689SAlexander Kabaev std::__valarray_copy(__v._M_data, _M_size, _M_data);
63900db7afdSDavid E. O'Brien return *this;
64000db7afdSDavid E. O'Brien }
64100db7afdSDavid E. O'Brien
64200db7afdSDavid E. O'Brien template<typename _Tp>
64300db7afdSDavid E. O'Brien inline valarray<_Tp>&
64400db7afdSDavid E. O'Brien valarray<_Tp>::operator=(const _Tp& __t)
64500db7afdSDavid E. O'Brien {
646ffeaf689SAlexander Kabaev std::__valarray_fill(_M_data, _M_size, __t);
64700db7afdSDavid E. O'Brien return *this;
64800db7afdSDavid E. O'Brien }
64900db7afdSDavid E. O'Brien
65000db7afdSDavid E. O'Brien template<typename _Tp>
65100db7afdSDavid E. O'Brien inline valarray<_Tp>&
65200db7afdSDavid E. O'Brien valarray<_Tp>::operator=(const slice_array<_Tp>& __sa)
65300db7afdSDavid E. O'Brien {
654ffeaf689SAlexander Kabaev _GLIBCXX_DEBUG_ASSERT(_M_size == __sa._M_sz);
655ffeaf689SAlexander Kabaev std::__valarray_copy(__sa._M_array, __sa._M_sz,
65600db7afdSDavid E. O'Brien __sa._M_stride, _Array<_Tp>(_M_data));
65700db7afdSDavid E. O'Brien return *this;
65800db7afdSDavid E. O'Brien }
65900db7afdSDavid E. O'Brien
66000db7afdSDavid E. O'Brien template<typename _Tp>
66100db7afdSDavid E. O'Brien inline valarray<_Tp>&
66200db7afdSDavid E. O'Brien valarray<_Tp>::operator=(const gslice_array<_Tp>& __ga)
66300db7afdSDavid E. O'Brien {
664ffeaf689SAlexander Kabaev _GLIBCXX_DEBUG_ASSERT(_M_size == __ga._M_index.size());
665ffeaf689SAlexander Kabaev std::__valarray_copy(__ga._M_array, _Array<size_t>(__ga._M_index),
66600db7afdSDavid E. O'Brien _Array<_Tp>(_M_data), _M_size);
66700db7afdSDavid E. O'Brien return *this;
66800db7afdSDavid E. O'Brien }
66900db7afdSDavid E. O'Brien
67000db7afdSDavid E. O'Brien template<typename _Tp>
67100db7afdSDavid E. O'Brien inline valarray<_Tp>&
67200db7afdSDavid E. O'Brien valarray<_Tp>::operator=(const mask_array<_Tp>& __ma)
67300db7afdSDavid E. O'Brien {
674ffeaf689SAlexander Kabaev _GLIBCXX_DEBUG_ASSERT(_M_size == __ma._M_sz);
675ffeaf689SAlexander Kabaev std::__valarray_copy(__ma._M_array, __ma._M_mask,
67600db7afdSDavid E. O'Brien _Array<_Tp>(_M_data), _M_size);
67700db7afdSDavid E. O'Brien return *this;
67800db7afdSDavid E. O'Brien }
67900db7afdSDavid E. O'Brien
68000db7afdSDavid E. O'Brien template<typename _Tp>
68100db7afdSDavid E. O'Brien inline valarray<_Tp>&
68200db7afdSDavid E. O'Brien valarray<_Tp>::operator=(const indirect_array<_Tp>& __ia)
68300db7afdSDavid E. O'Brien {
684ffeaf689SAlexander Kabaev _GLIBCXX_DEBUG_ASSERT(_M_size == __ia._M_sz);
685ffeaf689SAlexander Kabaev std::__valarray_copy(__ia._M_array, __ia._M_index,
68600db7afdSDavid E. O'Brien _Array<_Tp>(_M_data), _M_size);
68700db7afdSDavid E. O'Brien return *this;
68800db7afdSDavid E. O'Brien }
68900db7afdSDavid E. O'Brien
69000db7afdSDavid E. O'Brien template<typename _Tp> template<class _Dom>
69100db7afdSDavid E. O'Brien inline valarray<_Tp>&
69200db7afdSDavid E. O'Brien valarray<_Tp>::operator=(const _Expr<_Dom, _Tp>& __e)
69300db7afdSDavid E. O'Brien {
694ffeaf689SAlexander Kabaev _GLIBCXX_DEBUG_ASSERT(_M_size == __e.size());
695ffeaf689SAlexander Kabaev std::__valarray_copy(__e, _M_size, _Array<_Tp>(_M_data));
69600db7afdSDavid E. O'Brien return *this;
69700db7afdSDavid E. O'Brien }
69800db7afdSDavid E. O'Brien
69900db7afdSDavid E. O'Brien template<typename _Tp>
70000db7afdSDavid E. O'Brien inline _Expr<_SClos<_ValArray,_Tp>, _Tp>
70100db7afdSDavid E. O'Brien valarray<_Tp>::operator[](slice __s) const
70200db7afdSDavid E. O'Brien {
70300db7afdSDavid E. O'Brien typedef _SClos<_ValArray,_Tp> _Closure;
70400db7afdSDavid E. O'Brien return _Expr<_Closure, _Tp>(_Closure (_Array<_Tp>(_M_data), __s));
70500db7afdSDavid E. O'Brien }
70600db7afdSDavid E. O'Brien
70700db7afdSDavid E. O'Brien template<typename _Tp>
70800db7afdSDavid E. O'Brien inline slice_array<_Tp>
70900db7afdSDavid E. O'Brien valarray<_Tp>::operator[](slice __s)
710*f8a1b7d9SAlexander Kabaev { return slice_array<_Tp>(_Array<_Tp>(_M_data), __s); }
71100db7afdSDavid E. O'Brien
71200db7afdSDavid E. O'Brien template<typename _Tp>
71300db7afdSDavid E. O'Brien inline _Expr<_GClos<_ValArray,_Tp>, _Tp>
71400db7afdSDavid E. O'Brien valarray<_Tp>::operator[](const gslice& __gs) const
71500db7afdSDavid E. O'Brien {
71600db7afdSDavid E. O'Brien typedef _GClos<_ValArray,_Tp> _Closure;
71700db7afdSDavid E. O'Brien return _Expr<_Closure, _Tp>
71800db7afdSDavid E. O'Brien (_Closure(_Array<_Tp>(_M_data), __gs._M_index->_M_index));
71900db7afdSDavid E. O'Brien }
72000db7afdSDavid E. O'Brien
72100db7afdSDavid E. O'Brien template<typename _Tp>
72200db7afdSDavid E. O'Brien inline gslice_array<_Tp>
72300db7afdSDavid E. O'Brien valarray<_Tp>::operator[](const gslice& __gs)
72400db7afdSDavid E. O'Brien {
72500db7afdSDavid E. O'Brien return gslice_array<_Tp>
72600db7afdSDavid E. O'Brien (_Array<_Tp>(_M_data), __gs._M_index->_M_index);
72700db7afdSDavid E. O'Brien }
72800db7afdSDavid E. O'Brien
72900db7afdSDavid E. O'Brien template<typename _Tp>
73000db7afdSDavid E. O'Brien inline valarray<_Tp>
73100db7afdSDavid E. O'Brien valarray<_Tp>::operator[](const valarray<bool>& __m) const
73200db7afdSDavid E. O'Brien {
7331b86b14eSAlexander Kabaev size_t __s = 0;
7341b86b14eSAlexander Kabaev size_t __e = __m.size();
73500db7afdSDavid E. O'Brien for (size_t __i=0; __i<__e; ++__i)
73600db7afdSDavid E. O'Brien if (__m[__i]) ++__s;
73700db7afdSDavid E. O'Brien return valarray<_Tp>(mask_array<_Tp>(_Array<_Tp>(_M_data), __s,
73800db7afdSDavid E. O'Brien _Array<bool> (__m)));
73900db7afdSDavid E. O'Brien }
74000db7afdSDavid E. O'Brien
74100db7afdSDavid E. O'Brien template<typename _Tp>
74200db7afdSDavid E. O'Brien inline mask_array<_Tp>
74300db7afdSDavid E. O'Brien valarray<_Tp>::operator[](const valarray<bool>& __m)
74400db7afdSDavid E. O'Brien {
7451b86b14eSAlexander Kabaev size_t __s = 0;
7461b86b14eSAlexander Kabaev size_t __e = __m.size();
74700db7afdSDavid E. O'Brien for (size_t __i=0; __i<__e; ++__i)
74800db7afdSDavid E. O'Brien if (__m[__i]) ++__s;
74900db7afdSDavid E. O'Brien return mask_array<_Tp>(_Array<_Tp>(_M_data), __s, _Array<bool>(__m));
75000db7afdSDavid E. O'Brien }
75100db7afdSDavid E. O'Brien
75200db7afdSDavid E. O'Brien template<typename _Tp>
75300db7afdSDavid E. O'Brien inline _Expr<_IClos<_ValArray,_Tp>, _Tp>
75400db7afdSDavid E. O'Brien valarray<_Tp>::operator[](const valarray<size_t>& __i) const
75500db7afdSDavid E. O'Brien {
75600db7afdSDavid E. O'Brien typedef _IClos<_ValArray,_Tp> _Closure;
75700db7afdSDavid E. O'Brien return _Expr<_Closure, _Tp>(_Closure(*this, __i));
75800db7afdSDavid E. O'Brien }
75900db7afdSDavid E. O'Brien
76000db7afdSDavid E. O'Brien template<typename _Tp>
76100db7afdSDavid E. O'Brien inline indirect_array<_Tp>
76200db7afdSDavid E. O'Brien valarray<_Tp>::operator[](const valarray<size_t>& __i)
76300db7afdSDavid E. O'Brien {
76400db7afdSDavid E. O'Brien return indirect_array<_Tp>(_Array<_Tp>(_M_data), __i.size(),
76500db7afdSDavid E. O'Brien _Array<size_t>(__i));
76600db7afdSDavid E. O'Brien }
76700db7afdSDavid E. O'Brien
76800db7afdSDavid E. O'Brien template<class _Tp>
7691b86b14eSAlexander Kabaev inline size_t
size()7701b86b14eSAlexander Kabaev valarray<_Tp>::size() const
7711b86b14eSAlexander Kabaev { return _M_size; }
77200db7afdSDavid E. O'Brien
77300db7afdSDavid E. O'Brien template<class _Tp>
77400db7afdSDavid E. O'Brien inline _Tp
sum()77500db7afdSDavid E. O'Brien valarray<_Tp>::sum() const
77600db7afdSDavid E. O'Brien {
777ffeaf689SAlexander Kabaev _GLIBCXX_DEBUG_ASSERT(_M_size > 0);
778ffeaf689SAlexander Kabaev return std::__valarray_sum(_M_data, _M_data + _M_size);
77900db7afdSDavid E. O'Brien }
78000db7afdSDavid E. O'Brien
78100db7afdSDavid E. O'Brien template<class _Tp>
78200db7afdSDavid E. O'Brien inline valarray<_Tp>
shift(int __n)78300db7afdSDavid E. O'Brien valarray<_Tp>::shift(int __n) const
78400db7afdSDavid E. O'Brien {
785*f8a1b7d9SAlexander Kabaev valarray<_Tp> __ret;
786*f8a1b7d9SAlexander Kabaev
787*f8a1b7d9SAlexander Kabaev if (_M_size == 0)
788*f8a1b7d9SAlexander Kabaev return __ret;
789*f8a1b7d9SAlexander Kabaev
790*f8a1b7d9SAlexander Kabaev _Tp* __restrict__ __tmp_M_data =
791*f8a1b7d9SAlexander Kabaev std::__valarray_get_storage<_Tp>(_M_size);
792*f8a1b7d9SAlexander Kabaev
793*f8a1b7d9SAlexander Kabaev if (__n == 0)
794*f8a1b7d9SAlexander Kabaev std::__valarray_copy_construct(_M_data,
795*f8a1b7d9SAlexander Kabaev _M_data + _M_size, __tmp_M_data);
796*f8a1b7d9SAlexander Kabaev else if (__n > 0) // shift left
79700db7afdSDavid E. O'Brien {
79800db7afdSDavid E. O'Brien if (size_t(__n) > _M_size)
799*f8a1b7d9SAlexander Kabaev __n = _M_size;
800*f8a1b7d9SAlexander Kabaev
801*f8a1b7d9SAlexander Kabaev std::__valarray_copy_construct(_M_data + __n,
802*f8a1b7d9SAlexander Kabaev _M_data + _M_size, __tmp_M_data);
803*f8a1b7d9SAlexander Kabaev std::__valarray_default_construct(__tmp_M_data + _M_size - __n,
804*f8a1b7d9SAlexander Kabaev __tmp_M_data + _M_size);
805*f8a1b7d9SAlexander Kabaev }
806*f8a1b7d9SAlexander Kabaev else // shift right
80700db7afdSDavid E. O'Brien {
808*f8a1b7d9SAlexander Kabaev if (size_t(-__n) > _M_size)
809*f8a1b7d9SAlexander Kabaev __n = -_M_size;
810*f8a1b7d9SAlexander Kabaev
811*f8a1b7d9SAlexander Kabaev std::__valarray_copy_construct(_M_data, _M_data + _M_size + __n,
812*f8a1b7d9SAlexander Kabaev __tmp_M_data - __n);
813*f8a1b7d9SAlexander Kabaev std::__valarray_default_construct(__tmp_M_data,
814*f8a1b7d9SAlexander Kabaev __tmp_M_data - __n);
81500db7afdSDavid E. O'Brien }
816*f8a1b7d9SAlexander Kabaev
817*f8a1b7d9SAlexander Kabaev __ret._M_size = _M_size;
818*f8a1b7d9SAlexander Kabaev __ret._M_data = __tmp_M_data;
819*f8a1b7d9SAlexander Kabaev return __ret;
82000db7afdSDavid E. O'Brien }
82100db7afdSDavid E. O'Brien
82200db7afdSDavid E. O'Brien template<class _Tp>
82300db7afdSDavid E. O'Brien inline valarray<_Tp>
cshift(int __n)82400db7afdSDavid E. O'Brien valarray<_Tp>::cshift(int __n) const
82500db7afdSDavid E. O'Brien {
826*f8a1b7d9SAlexander Kabaev valarray<_Tp> __ret;
827*f8a1b7d9SAlexander Kabaev
828*f8a1b7d9SAlexander Kabaev if (_M_size == 0)
829*f8a1b7d9SAlexander Kabaev return __ret;
830*f8a1b7d9SAlexander Kabaev
831*f8a1b7d9SAlexander Kabaev _Tp* __restrict__ __tmp_M_data =
832*f8a1b7d9SAlexander Kabaev std::__valarray_get_storage<_Tp>(_M_size);
833*f8a1b7d9SAlexander Kabaev
834*f8a1b7d9SAlexander Kabaev if (__n == 0)
835*f8a1b7d9SAlexander Kabaev std::__valarray_copy_construct(_M_data,
836*f8a1b7d9SAlexander Kabaev _M_data + _M_size, __tmp_M_data);
83700db7afdSDavid E. O'Brien else if (__n > 0) // cshift left
83800db7afdSDavid E. O'Brien {
839*f8a1b7d9SAlexander Kabaev if (size_t(__n) > _M_size)
840*f8a1b7d9SAlexander Kabaev __n = __n % _M_size;
841*f8a1b7d9SAlexander Kabaev
842*f8a1b7d9SAlexander Kabaev std::__valarray_copy_construct(_M_data, _M_data + __n,
843*f8a1b7d9SAlexander Kabaev __tmp_M_data + _M_size - __n);
844*f8a1b7d9SAlexander Kabaev std::__valarray_copy_construct(_M_data + __n, _M_data + _M_size,
845*f8a1b7d9SAlexander Kabaev __tmp_M_data);
84600db7afdSDavid E. O'Brien }
84700db7afdSDavid E. O'Brien else // cshift right
84800db7afdSDavid E. O'Brien {
849*f8a1b7d9SAlexander Kabaev if (size_t(-__n) > _M_size)
850*f8a1b7d9SAlexander Kabaev __n = -(size_t(-__n) % _M_size);
851*f8a1b7d9SAlexander Kabaev
852*f8a1b7d9SAlexander Kabaev std::__valarray_copy_construct(_M_data + _M_size + __n,
853*f8a1b7d9SAlexander Kabaev _M_data + _M_size, __tmp_M_data);
854*f8a1b7d9SAlexander Kabaev std::__valarray_copy_construct(_M_data, _M_data + _M_size + __n,
855*f8a1b7d9SAlexander Kabaev __tmp_M_data - __n);
85600db7afdSDavid E. O'Brien }
857*f8a1b7d9SAlexander Kabaev
858*f8a1b7d9SAlexander Kabaev __ret._M_size = _M_size;
859*f8a1b7d9SAlexander Kabaev __ret._M_data = __tmp_M_data;
860*f8a1b7d9SAlexander Kabaev return __ret;
86100db7afdSDavid E. O'Brien }
86200db7afdSDavid E. O'Brien
86300db7afdSDavid E. O'Brien template<class _Tp>
86400db7afdSDavid E. O'Brien inline void
resize(size_t __n,_Tp __c)86500db7afdSDavid E. O'Brien valarray<_Tp>::resize(size_t __n, _Tp __c)
86600db7afdSDavid E. O'Brien {
86700db7afdSDavid E. O'Brien // This complication is so to make valarray<valarray<T> > work
86800db7afdSDavid E. O'Brien // even though it is not required by the standard. Nobody should
86900db7afdSDavid E. O'Brien // be saying valarray<valarray<T> > anyway. See the specs.
870ffeaf689SAlexander Kabaev std::__valarray_destroy_elements(_M_data, _M_data + _M_size);
87100db7afdSDavid E. O'Brien if (_M_size != __n)
87200db7afdSDavid E. O'Brien {
873ffeaf689SAlexander Kabaev std::__valarray_release_memory(_M_data);
87400db7afdSDavid E. O'Brien _M_size = __n;
87500db7afdSDavid E. O'Brien _M_data = __valarray_get_storage<_Tp>(__n);
87600db7afdSDavid E. O'Brien }
877ffeaf689SAlexander Kabaev std::__valarray_fill_construct(_M_data, _M_data + __n, __c);
87800db7afdSDavid E. O'Brien }
87900db7afdSDavid E. O'Brien
88000db7afdSDavid E. O'Brien template<typename _Tp>
88100db7afdSDavid E. O'Brien inline _Tp
min()88200db7afdSDavid E. O'Brien valarray<_Tp>::min() const
88300db7afdSDavid E. O'Brien {
884ffeaf689SAlexander Kabaev _GLIBCXX_DEBUG_ASSERT(_M_size > 0);
885ffeaf689SAlexander Kabaev return *std::min_element(_M_data, _M_data+_M_size);
88600db7afdSDavid E. O'Brien }
88700db7afdSDavid E. O'Brien
88800db7afdSDavid E. O'Brien template<typename _Tp>
88900db7afdSDavid E. O'Brien inline _Tp
max()89000db7afdSDavid E. O'Brien valarray<_Tp>::max() const
89100db7afdSDavid E. O'Brien {
892ffeaf689SAlexander Kabaev _GLIBCXX_DEBUG_ASSERT(_M_size > 0);
893ffeaf689SAlexander Kabaev return *std::max_element(_M_data, _M_data+_M_size);
89400db7afdSDavid E. O'Brien }
89500db7afdSDavid E. O'Brien
89600db7afdSDavid E. O'Brien template<class _Tp>
89700db7afdSDavid E. O'Brien inline _Expr<_ValFunClos<_ValArray, _Tp>, _Tp>
apply(_Tp func (_Tp))89800db7afdSDavid E. O'Brien valarray<_Tp>::apply(_Tp func(_Tp)) const
89900db7afdSDavid E. O'Brien {
90000db7afdSDavid E. O'Brien typedef _ValFunClos<_ValArray, _Tp> _Closure;
90100db7afdSDavid E. O'Brien return _Expr<_Closure, _Tp>(_Closure(*this, func));
90200db7afdSDavid E. O'Brien }
90300db7afdSDavid E. O'Brien
90400db7afdSDavid E. O'Brien template<class _Tp>
90500db7afdSDavid E. O'Brien inline _Expr<_RefFunClos<_ValArray, _Tp>, _Tp>
apply(_Tp func (const _Tp &))90600db7afdSDavid E. O'Brien valarray<_Tp>::apply(_Tp func(const _Tp &)) const
90700db7afdSDavid E. O'Brien {
90800db7afdSDavid E. O'Brien typedef _RefFunClos<_ValArray, _Tp> _Closure;
90900db7afdSDavid E. O'Brien return _Expr<_Closure, _Tp>(_Closure(*this, func));
91000db7afdSDavid E. O'Brien }
91100db7afdSDavid E. O'Brien
91200db7afdSDavid E. O'Brien #define _DEFINE_VALARRAY_UNARY_OPERATOR(_Op, _Name) \
91300db7afdSDavid E. O'Brien template<typename _Tp> \
9141b86b14eSAlexander Kabaev inline typename valarray<_Tp>::template _UnaryOp<_Name>::_Rt \
91500db7afdSDavid E. O'Brien valarray<_Tp>::operator _Op() const \
91600db7afdSDavid E. O'Brien { \
91700db7afdSDavid E. O'Brien typedef _UnClos<_Name, _ValArray, _Tp> _Closure; \
9181b86b14eSAlexander Kabaev typedef typename __fun<_Name, _Tp>::result_type _Rt; \
9191b86b14eSAlexander Kabaev return _Expr<_Closure, _Rt>(_Closure(*this)); \
92000db7afdSDavid E. O'Brien }
92100db7afdSDavid E. O'Brien
9221b86b14eSAlexander Kabaev _DEFINE_VALARRAY_UNARY_OPERATOR(+, __unary_plus)
9231b86b14eSAlexander Kabaev _DEFINE_VALARRAY_UNARY_OPERATOR(-, __negate)
9241b86b14eSAlexander Kabaev _DEFINE_VALARRAY_UNARY_OPERATOR(~, __bitwise_not)
9251b86b14eSAlexander Kabaev _DEFINE_VALARRAY_UNARY_OPERATOR (!, __logical_not)
92600db7afdSDavid E. O'Brien
92700db7afdSDavid E. O'Brien #undef _DEFINE_VALARRAY_UNARY_OPERATOR
92800db7afdSDavid E. O'Brien
92900db7afdSDavid E. O'Brien #define _DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(_Op, _Name) \
93000db7afdSDavid E. O'Brien template<class _Tp> \
93100db7afdSDavid E. O'Brien inline valarray<_Tp>& \
93200db7afdSDavid E. O'Brien valarray<_Tp>::operator _Op##=(const _Tp &__t) \
93300db7afdSDavid E. O'Brien { \
93400db7afdSDavid E. O'Brien _Array_augmented_##_Name(_Array<_Tp>(_M_data), _M_size, __t); \
93500db7afdSDavid E. O'Brien return *this; \
93600db7afdSDavid E. O'Brien } \
93700db7afdSDavid E. O'Brien \
93800db7afdSDavid E. O'Brien template<class _Tp> \
93900db7afdSDavid E. O'Brien inline valarray<_Tp>& \
94000db7afdSDavid E. O'Brien valarray<_Tp>::operator _Op##=(const valarray<_Tp> &__v) \
94100db7afdSDavid E. O'Brien { \
942ffeaf689SAlexander Kabaev _GLIBCXX_DEBUG_ASSERT(_M_size == __v._M_size); \
94300db7afdSDavid E. O'Brien _Array_augmented_##_Name(_Array<_Tp>(_M_data), _M_size, \
94400db7afdSDavid E. O'Brien _Array<_Tp>(__v._M_data)); \
94500db7afdSDavid E. O'Brien return *this; \
94600db7afdSDavid E. O'Brien }
94700db7afdSDavid E. O'Brien
9481b86b14eSAlexander Kabaev _DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(+, __plus)
9491b86b14eSAlexander Kabaev _DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(-, __minus)
9501b86b14eSAlexander Kabaev _DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(*, __multiplies)
9511b86b14eSAlexander Kabaev _DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(/, __divides)
9521b86b14eSAlexander Kabaev _DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(%, __modulus)
9531b86b14eSAlexander Kabaev _DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(^, __bitwise_xor)
9541b86b14eSAlexander Kabaev _DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(&, __bitwise_and)
9551b86b14eSAlexander Kabaev _DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(|, __bitwise_or)
9561b86b14eSAlexander Kabaev _DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(<<, __shift_left)
9571b86b14eSAlexander Kabaev _DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(>>, __shift_right)
95800db7afdSDavid E. O'Brien
95900db7afdSDavid E. O'Brien #undef _DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT
96000db7afdSDavid E. O'Brien
96100db7afdSDavid E. O'Brien #define _DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(_Op, _Name) \
96200db7afdSDavid E. O'Brien template<class _Tp> template<class _Dom> \
96300db7afdSDavid E. O'Brien inline valarray<_Tp>& \
96400db7afdSDavid E. O'Brien valarray<_Tp>::operator _Op##=(const _Expr<_Dom, _Tp>& __e) \
96500db7afdSDavid E. O'Brien { \
96600db7afdSDavid E. O'Brien _Array_augmented_##_Name(_Array<_Tp>(_M_data), __e, _M_size); \
96700db7afdSDavid E. O'Brien return *this; \
96800db7afdSDavid E. O'Brien }
96900db7afdSDavid E. O'Brien
9701b86b14eSAlexander Kabaev _DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(+, __plus)
9711b86b14eSAlexander Kabaev _DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(-, __minus)
9721b86b14eSAlexander Kabaev _DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(*, __multiplies)
9731b86b14eSAlexander Kabaev _DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(/, __divides)
9741b86b14eSAlexander Kabaev _DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(%, __modulus)
9751b86b14eSAlexander Kabaev _DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(^, __bitwise_xor)
9761b86b14eSAlexander Kabaev _DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(&, __bitwise_and)
9771b86b14eSAlexander Kabaev _DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(|, __bitwise_or)
9781b86b14eSAlexander Kabaev _DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(<<, __shift_left)
9791b86b14eSAlexander Kabaev _DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(>>, __shift_right)
98000db7afdSDavid E. O'Brien
98100db7afdSDavid E. O'Brien #undef _DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT
98200db7afdSDavid E. O'Brien
98300db7afdSDavid E. O'Brien
98400db7afdSDavid E. O'Brien #define _DEFINE_BINARY_OPERATOR(_Op, _Name) \
98500db7afdSDavid E. O'Brien template<typename _Tp> \
9861b86b14eSAlexander Kabaev inline _Expr<_BinClos<_Name, _ValArray, _ValArray, _Tp, _Tp>, \
9871b86b14eSAlexander Kabaev typename __fun<_Name, _Tp>::result_type> \
98800db7afdSDavid E. O'Brien operator _Op(const valarray<_Tp>& __v, const valarray<_Tp>& __w) \
98900db7afdSDavid E. O'Brien { \
990ffeaf689SAlexander Kabaev _GLIBCXX_DEBUG_ASSERT(__v.size() == __w.size()); \
99100db7afdSDavid E. O'Brien typedef _BinClos<_Name, _ValArray, _ValArray, _Tp, _Tp> _Closure; \
9921b86b14eSAlexander Kabaev typedef typename __fun<_Name, _Tp>::result_type _Rt; \
9931b86b14eSAlexander Kabaev return _Expr<_Closure, _Rt>(_Closure(__v, __w)); \
99400db7afdSDavid E. O'Brien } \
99500db7afdSDavid E. O'Brien \
99600db7afdSDavid E. O'Brien template<typename _Tp> \
9971b86b14eSAlexander Kabaev inline _Expr<_BinClos<_Name, _ValArray,_Constant, _Tp, _Tp>, \
9981b86b14eSAlexander Kabaev typename __fun<_Name, _Tp>::result_type> \
99900db7afdSDavid E. O'Brien operator _Op(const valarray<_Tp>& __v, const _Tp& __t) \
100000db7afdSDavid E. O'Brien { \
100100db7afdSDavid E. O'Brien typedef _BinClos<_Name, _ValArray, _Constant, _Tp, _Tp> _Closure; \
10021b86b14eSAlexander Kabaev typedef typename __fun<_Name, _Tp>::result_type _Rt; \
10031b86b14eSAlexander Kabaev return _Expr<_Closure, _Rt>(_Closure(__v, __t)); \
100400db7afdSDavid E. O'Brien } \
100500db7afdSDavid E. O'Brien \
100600db7afdSDavid E. O'Brien template<typename _Tp> \
10071b86b14eSAlexander Kabaev inline _Expr<_BinClos<_Name, _Constant, _ValArray, _Tp, _Tp>, \
10081b86b14eSAlexander Kabaev typename __fun<_Name, _Tp>::result_type> \
100900db7afdSDavid E. O'Brien operator _Op(const _Tp& __t, const valarray<_Tp>& __v) \
101000db7afdSDavid E. O'Brien { \
101100db7afdSDavid E. O'Brien typedef _BinClos<_Name, _Constant, _ValArray, _Tp, _Tp> _Closure; \
10121b86b14eSAlexander Kabaev typedef typename __fun<_Name, _Tp>::result_type _Rt; \
101300db7afdSDavid E. O'Brien return _Expr<_Closure, _Rt>(_Closure(__t, __v)); \
101400db7afdSDavid E. O'Brien }
101500db7afdSDavid E. O'Brien
10161b86b14eSAlexander Kabaev _DEFINE_BINARY_OPERATOR(+, __plus)
10171b86b14eSAlexander Kabaev _DEFINE_BINARY_OPERATOR(-, __minus)
10181b86b14eSAlexander Kabaev _DEFINE_BINARY_OPERATOR(*, __multiplies)
10191b86b14eSAlexander Kabaev _DEFINE_BINARY_OPERATOR(/, __divides)
10201b86b14eSAlexander Kabaev _DEFINE_BINARY_OPERATOR(%, __modulus)
10211b86b14eSAlexander Kabaev _DEFINE_BINARY_OPERATOR(^, __bitwise_xor)
10221b86b14eSAlexander Kabaev _DEFINE_BINARY_OPERATOR(&, __bitwise_and)
10231b86b14eSAlexander Kabaev _DEFINE_BINARY_OPERATOR(|, __bitwise_or)
10241b86b14eSAlexander Kabaev _DEFINE_BINARY_OPERATOR(<<, __shift_left)
10251b86b14eSAlexander Kabaev _DEFINE_BINARY_OPERATOR(>>, __shift_right)
10261b86b14eSAlexander Kabaev _DEFINE_BINARY_OPERATOR(&&, __logical_and)
10271b86b14eSAlexander Kabaev _DEFINE_BINARY_OPERATOR(||, __logical_or)
10281b86b14eSAlexander Kabaev _DEFINE_BINARY_OPERATOR(==, __equal_to)
10291b86b14eSAlexander Kabaev _DEFINE_BINARY_OPERATOR(!=, __not_equal_to)
10301b86b14eSAlexander Kabaev _DEFINE_BINARY_OPERATOR(<, __less)
10311b86b14eSAlexander Kabaev _DEFINE_BINARY_OPERATOR(>, __greater)
10321b86b14eSAlexander Kabaev _DEFINE_BINARY_OPERATOR(<=, __less_equal)
10331b86b14eSAlexander Kabaev _DEFINE_BINARY_OPERATOR(>=, __greater_equal)
103400db7afdSDavid E. O'Brien
1035*f8a1b7d9SAlexander Kabaev #undef _DEFINE_BINARY_OPERATOR
1036*f8a1b7d9SAlexander Kabaev
1037*f8a1b7d9SAlexander Kabaev _GLIBCXX_END_NAMESPACE
103800db7afdSDavid E. O'Brien
1039ffeaf689SAlexander Kabaev #endif /* _GLIBCXX_VALARRAY */
1040