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