111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// The template and inlines for the -*- C++ -*- valarray class.
211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Copyright (C) 1997-2014 Free Software Foundation, Inc.
411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//
511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// This file is part of the GNU ISO C++ Library.  This library is free
611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// software; you can redistribute it and/or modify it under the
711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// terms of the GNU General Public License as published by the
811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Free Software Foundation; either version 3, or (at your option)
911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// any later version.
1011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
1111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// This library is distributed in the hope that it will be useful,
1211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// but WITHOUT ANY WARRANTY; without even the implied warranty of
1311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// GNU General Public License for more details.
1511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
1611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Under Section 7 of GPL version 3, you are granted additional
1711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// permissions described in the GCC Runtime Library Exception, version
1811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// 3.1, as published by the Free Software Foundation.
1911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
2011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// You should have received a copy of the GNU General Public License and
2111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// a copy of the GCC Runtime Library Exception along with this program;
2211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
2311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// <http://www.gnu.org/licenses/>.
2411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
2511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/** @file include/valarray
2611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *  This is a Standard C++ Library header. 
2711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */
2811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
2911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Written by Gabriel Dos Reis <Gabriel.Dos-Reis@DPTMaths.ENS-Cachan.Fr>
3011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifndef _GLIBCXX_VALARRAY
3211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define _GLIBCXX_VALARRAY 1
3311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#pragma GCC system_header
3511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <bits/c++config.h>
3711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <cmath>
3811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <algorithm>
3911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <debug/debug.h>
4011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if __cplusplus >= 201103L
4111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <initializer_list>
4211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
4311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
4411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertnamespace std _GLIBCXX_VISIBILITY(default)
4511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
4611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_GLIBCXX_BEGIN_NAMESPACE_VERSION
4711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
4811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<class _Clos, typename _Tp> 
4911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    class _Expr;
5011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
5111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Tp1, typename _Tp2> 
5211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    class _ValArray;    
5311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
5411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<class _Oper, template<class, class> class _Meta, class _Dom>
5511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct _UnClos;
5611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
5711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<class _Oper,
5811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        template<class, class> class _Meta1,
5911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        template<class, class> class _Meta2,
6011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        class _Dom1, class _Dom2> 
6111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    class _BinClos;
6211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
6311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<template<class, class> class _Meta, class _Dom> 
6411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    class _SClos;
6511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
6611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<template<class, class> class _Meta, class _Dom> 
6711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    class _GClos;
6811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    
6911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<template<class, class> class _Meta, class _Dom> 
7011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    class _IClos;
7111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    
7211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<template<class, class> class _Meta, class _Dom> 
7311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    class _ValFunClos;
7411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  
7511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<template<class, class> class _Meta, class _Dom> 
7611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    class _RefFunClos;
7711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
7811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<class _Tp> class valarray;   // An array of type _Tp
7911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  class slice;                          // BLAS-like slice out of an array
8011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<class _Tp> class slice_array;
8111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  class gslice;                         // generalized slice out of an array
8211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<class _Tp> class gslice_array;
8311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<class _Tp> class mask_array;     // masked array
8411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<class _Tp> class indirect_array; // indirected array
8511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
8611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_GLIBCXX_END_NAMESPACE_VERSION
8711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} // namespace
8811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
8911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <bits/valarray_array.h>
9011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <bits/valarray_before.h>
9111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  
9211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertnamespace std _GLIBCXX_VISIBILITY(default)
9311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
9411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_GLIBCXX_BEGIN_NAMESPACE_VERSION
9511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
9611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
9711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @defgroup numeric_arrays Numeric Arrays
9811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @ingroup numerics
9911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
10011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * Classes and functions for representing and manipulating arrays of elements.
10111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @{
10211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
10311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
10411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
10511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  @brief  Smart array designed to support numeric processing.
10611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
10711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  A valarray is an array that provides constraints intended to allow for
10811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  effective optimization of numeric array processing by reducing the
10911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  aliasing that can result from pointer representations.  It represents a
11011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  one-dimensional array from which different multidimensional subsets can
11111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  be accessed and modified.
11211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  
11311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  @tparam  _Tp  Type of object in the array.
11411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
11511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<class _Tp> 
11611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    class valarray
11711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
11811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<class _Op>
11911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	struct _UnaryOp 
12011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{
12111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  typedef typename __fun<_Op, _Tp>::result_type __rt;
12211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  typedef _Expr<_UnClos<_Op, _ValArray, _Tp>, __rt> _Rt;
12311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	};
12411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    public:
12511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef _Tp value_type;
12611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      
12711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	// _lib.valarray.cons_ construct/destroy:
12811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      ///  Construct an empty array.
12911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      valarray();
13011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
13111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      ///  Construct an array with @a n elements.
13211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit valarray(size_t);
13311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
13411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      ///  Construct an array with @a n elements initialized to @a t.
13511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      valarray(const _Tp&, size_t);
13611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
13711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      ///  Construct an array initialized to the first @a n elements of @a t.
13811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      valarray(const _Tp* __restrict__, size_t);
13911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
14011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      ///  Copy constructor.
14111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      valarray(const valarray&);
14211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
14311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if __cplusplus >= 201103L
14411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      ///  Move constructor.
14511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      valarray(valarray&&) noexcept;
14611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
14711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
14811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      ///  Construct an array with the same size and values in @a sa.
14911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      valarray(const slice_array<_Tp>&);
15011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
15111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      ///  Construct an array with the same size and values in @a ga.
15211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      valarray(const gslice_array<_Tp>&);
15311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
15411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      ///  Construct an array with the same size and values in @a ma.
15511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      valarray(const mask_array<_Tp>&);
15611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
15711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      ///  Construct an array with the same size and values in @a ia.
15811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      valarray(const indirect_array<_Tp>&);
15911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
16011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if __cplusplus >= 201103L
16111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      ///  Construct an array with an initializer_list of values.
16211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      valarray(initializer_list<_Tp>);
16311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
16411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
16511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<class _Dom>
16611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	valarray(const _Expr<_Dom, _Tp>& __e);
16711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
16811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      ~valarray() _GLIBCXX_NOEXCEPT;
16911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
17011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      // _lib.valarray.assign_ assignment:
17111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
17211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Assign elements to an array.
17311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
17411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  Assign elements of array to values in @a v.
17511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
17611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __v  Valarray to get values from.
17711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
17811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      valarray<_Tp>& operator=(const valarray<_Tp>& __v);
17911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
18011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if __cplusplus >= 201103L
18111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
18211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Move assign elements to an array.
18311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
18411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  Move assign elements of array to values in @a v.
18511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
18611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __v  Valarray to get values from.
18711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
18811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      valarray<_Tp>& operator=(valarray<_Tp>&& __v) noexcept;
18911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
19011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
19111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
19211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Assign elements to a value.
19311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
19411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  Assign all elements of array to @a t.
19511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
19611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __t  Value for elements.
19711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
19811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      valarray<_Tp>& operator=(const _Tp& __t);
19911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
20011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
20111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Assign elements to an array subset.
20211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
20311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  Assign elements of array to values in @a sa.  Results are undefined
20411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  if @a sa does not have the same size as this array.
20511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
20611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __sa  Array slice to get values from.
20711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
20811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      valarray<_Tp>& operator=(const slice_array<_Tp>& __sa);
20911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
21011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
21111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Assign elements to an array subset.
21211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
21311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  Assign elements of array to values in @a ga.  Results are undefined
21411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  if @a ga does not have the same size as this array.
21511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
21611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __ga  Array slice to get values from.
21711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
21811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      valarray<_Tp>& operator=(const gslice_array<_Tp>& __ga);
21911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
22011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
22111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Assign elements to an array subset.
22211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
22311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  Assign elements of array to values in @a ma.  Results are undefined
22411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  if @a ma does not have the same size as this array.
22511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
22611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __ma  Array slice to get values from.
22711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
22811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      valarray<_Tp>& operator=(const mask_array<_Tp>& __ma);
22911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
23011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
23111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Assign elements to an array subset.
23211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
23311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  Assign elements of array to values in @a ia.  Results are undefined
23411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  if @a ia does not have the same size as this array.
23511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
23611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __ia  Array slice to get values from.
23711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
23811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      valarray<_Tp>& operator=(const indirect_array<_Tp>& __ia);
23911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
24011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if __cplusplus >= 201103L
24111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
24211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Assign elements to an initializer_list.
24311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
24411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  Assign elements of array to values in @a __l.  Results are undefined
24511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  if @a __l does not have the same size as this array.
24611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
24711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __l  initializer_list to get values from.
24811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
24911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      valarray& operator=(initializer_list<_Tp> __l);
25011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
25111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
25211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<class _Dom> valarray<_Tp>&
25311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	operator= (const _Expr<_Dom, _Tp>&);
25411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
25511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      // _lib.valarray.access_ element access:
25611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
25711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  Return a reference to the i'th array element.  
25811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
25911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __i  Index of element to return.
26011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @return  Reference to the i'th element.
26111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
26211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _Tp&                operator[](size_t __i);
26311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
26411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      // _GLIBCXX_RESOLVE_LIB_DEFECTS
26511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      // 389. Const overload of valarray::operator[] returns by value.
26611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      const _Tp&          operator[](size_t) const;
26711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
26811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      // _lib.valarray.sub_ subset operations:
26911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
27011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Return an array subset.
27111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
27211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  Returns a new valarray containing the elements of the array
27311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  indicated by the slice argument.  The new valarray has the same size
27411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  as the input slice.  @see slice.
27511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
27611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __s  The source slice.
27711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @return  New valarray containing elements in @a __s.
27811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
27911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _Expr<_SClos<_ValArray, _Tp>, _Tp> operator[](slice __s) const;
28011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
28111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
28211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Return a reference to an array subset.
28311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
28411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  Returns a new valarray containing the elements of the array
28511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  indicated by the slice argument.  The new valarray has the same size
28611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  as the input slice.  @see slice.
28711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
28811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __s  The source slice.
28911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @return  New valarray containing elements in @a __s.
29011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
29111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      slice_array<_Tp>    operator[](slice __s);
29211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
29311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
29411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Return an array subset.
29511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
29611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  Returns a slice_array referencing the elements of the array
29711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  indicated by the slice argument.  @see gslice.
29811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
29911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __s  The source slice.
30011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @return  Slice_array referencing elements indicated by @a __s.
30111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
30211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _Expr<_GClos<_ValArray, _Tp>, _Tp> operator[](const gslice& __s) const;
30311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
30411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
30511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Return a reference to an array subset.
30611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
30711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  Returns a new valarray containing the elements of the array
30811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  indicated by the gslice argument.  The new valarray has
30911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  the same size as the input gslice.  @see gslice.
31011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
31111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __s  The source gslice.
31211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @return  New valarray containing elements in @a __s.
31311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
31411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      gslice_array<_Tp>   operator[](const gslice& __s);
31511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
31611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
31711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Return an array subset.
31811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
31911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  Returns a new valarray containing the elements of the array
32011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  indicated by the argument.  The input is a valarray of bool which
32111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  represents a bitmask indicating which elements should be copied into
32211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  the new valarray.  Each element of the array is added to the return
32311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  valarray if the corresponding element of the argument is true.
32411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
32511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __m  The valarray bitmask.
32611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @return  New valarray containing elements indicated by @a __m.
32711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
32811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      valarray<_Tp>       operator[](const valarray<bool>& __m) const;
32911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
33011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
33111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Return a reference to an array subset.
33211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
33311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  Returns a new mask_array referencing the elements of the array
33411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  indicated by the argument.  The input is a valarray of bool which
33511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  represents a bitmask indicating which elements are part of the
33611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  subset.  Elements of the array are part of the subset if the
33711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  corresponding element of the argument is true.
33811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
33911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __m  The valarray bitmask.
34011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @return  New valarray containing elements indicated by @a __m.
34111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
34211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      mask_array<_Tp>     operator[](const valarray<bool>& __m);
34311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
34411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
34511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Return an array subset.
34611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
34711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  Returns a new valarray containing the elements of the array
34811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  indicated by the argument.  The elements in the argument are
34911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  interpreted as the indices of elements of this valarray to copy to
35011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  the return valarray.
35111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
35211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __i  The valarray element index list.
35311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @return  New valarray containing elements in @a __s.
35411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
35511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _Expr<_IClos<_ValArray, _Tp>, _Tp>
35611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        operator[](const valarray<size_t>& __i) const;
35711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
35811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
35911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Return a reference to an array subset.
36011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
36111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  Returns an indirect_array referencing the elements of the array
36211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  indicated by the argument.  The elements in the argument are
36311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  interpreted as the indices of elements of this valarray to include
36411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  in the subset.  The returned indirect_array refers to these
36511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  elements.
36611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
36711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __i  The valarray element index list.
36811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @return  Indirect_array referencing elements in @a __i.
36911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
37011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      indirect_array<_Tp> operator[](const valarray<size_t>& __i);
37111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
37211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      // _lib.valarray.unary_ unary operators:
37311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      ///  Return a new valarray by applying unary + to each element.
37411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typename _UnaryOp<__unary_plus>::_Rt  operator+() const;
37511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
37611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      ///  Return a new valarray by applying unary - to each element.
37711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typename _UnaryOp<__negate>::_Rt      operator-() const;
37811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
37911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      ///  Return a new valarray by applying unary ~ to each element.
38011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typename _UnaryOp<__bitwise_not>::_Rt operator~() const;
38111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
38211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      ///  Return a new valarray by applying unary ! to each element.
38311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typename _UnaryOp<__logical_not>::_Rt operator!() const;
38411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
38511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      // _lib.valarray.cassign_ computed assignment:
38611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      ///  Multiply each element of array by @a t.
38711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      valarray<_Tp>& operator*=(const _Tp&);
38811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
38911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      ///  Divide each element of array by @a t.
39011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      valarray<_Tp>& operator/=(const _Tp&);
39111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
39211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      ///  Set each element e of array to e % @a t.
39311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      valarray<_Tp>& operator%=(const _Tp&);
39411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
39511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      ///  Add @a t to each element of array.
39611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      valarray<_Tp>& operator+=(const _Tp&);
39711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
39811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      ///  Subtract @a t to each element of array.
39911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      valarray<_Tp>& operator-=(const _Tp&);
40011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
40111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      ///  Set each element e of array to e ^ @a t.
40211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      valarray<_Tp>& operator^=(const _Tp&);
40311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
40411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      ///  Set each element e of array to e & @a t.
40511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      valarray<_Tp>& operator&=(const _Tp&);
40611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
40711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      ///  Set each element e of array to e | @a t.
40811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      valarray<_Tp>& operator|=(const _Tp&);
40911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
41011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      ///  Left shift each element e of array by @a t bits.
41111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      valarray<_Tp>& operator<<=(const _Tp&);
41211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
41311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      ///  Right shift each element e of array by @a t bits.
41411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      valarray<_Tp>& operator>>=(const _Tp&);
41511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
41611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      ///  Multiply elements of array by corresponding elements of @a v.
41711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      valarray<_Tp>& operator*=(const valarray<_Tp>&);
41811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
41911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      ///  Divide elements of array by corresponding elements of @a v.
42011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      valarray<_Tp>& operator/=(const valarray<_Tp>&);
42111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
42211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      ///  Modulo elements of array by corresponding elements of @a v.
42311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      valarray<_Tp>& operator%=(const valarray<_Tp>&);
42411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
42511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      ///  Add corresponding elements of @a v to elements of array.
42611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      valarray<_Tp>& operator+=(const valarray<_Tp>&);
42711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
42811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      ///  Subtract corresponding elements of @a v from elements of array.
42911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      valarray<_Tp>& operator-=(const valarray<_Tp>&);
43011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
43111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      ///  Logical xor corresponding elements of @a v with elements of array.
43211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      valarray<_Tp>& operator^=(const valarray<_Tp>&);
43311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
43411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      ///  Logical or corresponding elements of @a v with elements of array.
43511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      valarray<_Tp>& operator|=(const valarray<_Tp>&);
43611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
43711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      ///  Logical and corresponding elements of @a v with elements of array.
43811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      valarray<_Tp>& operator&=(const valarray<_Tp>&);
43911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
44011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      ///  Left shift elements of array by corresponding elements of @a v.
44111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      valarray<_Tp>& operator<<=(const valarray<_Tp>&);
44211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
44311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      ///  Right shift elements of array by corresponding elements of @a v.
44411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      valarray<_Tp>& operator>>=(const valarray<_Tp>&);
44511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
44611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<class _Dom>
44711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	valarray<_Tp>& operator*=(const _Expr<_Dom, _Tp>&);
44811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<class _Dom>
44911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	valarray<_Tp>& operator/=(const _Expr<_Dom, _Tp>&);
45011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<class _Dom>
45111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	valarray<_Tp>& operator%=(const _Expr<_Dom, _Tp>&);
45211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<class _Dom>
45311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	valarray<_Tp>& operator+=(const _Expr<_Dom, _Tp>&);
45411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<class _Dom>
45511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	valarray<_Tp>& operator-=(const _Expr<_Dom, _Tp>&);
45611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<class _Dom>
45711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	valarray<_Tp>& operator^=(const _Expr<_Dom, _Tp>&);
45811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<class _Dom>
45911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	valarray<_Tp>& operator|=(const _Expr<_Dom, _Tp>&);
46011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<class _Dom>
46111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	valarray<_Tp>& operator&=(const _Expr<_Dom, _Tp>&);
46211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<class _Dom>
46311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        valarray<_Tp>& operator<<=(const _Expr<_Dom, _Tp>&);
46411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<class _Dom>
46511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	valarray<_Tp>& operator>>=(const _Expr<_Dom, _Tp>&);
46611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
46711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      // _lib.valarray.members_ member functions:
46811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if __cplusplus >= 201103L
46911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      ///  Swap.
47011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void swap(valarray<_Tp>& __v) noexcept;
47111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
47211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
47311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      ///  Return the number of elements in array.
47411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      size_t size() const;
47511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
47611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
47711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Return the sum of all elements in the array.
47811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
47911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  Accumulates the sum of all elements into a Tp using +=.  The order
48011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  of adding the elements is unspecified.
48111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
48211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _Tp    sum() const;
48311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
48411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      ///  Return the minimum element using operator<().
48511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _Tp    min() const;	
48611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
48711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      ///  Return the maximum element using operator<().
48811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _Tp    max() const;	
48911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
49011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
49111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Return a shifted array.
49211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
49311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  A new valarray is constructed as a copy of this array with elements
49411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  in shifted positions.  For an element with index i, the new position
49511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  is i - n.  The new valarray has the same size as the current one.
49611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  New elements without a value are set to 0.  Elements whose new
49711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  position is outside the bounds of the array are discarded.
49811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
49911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  Positive arguments shift toward index 0, discarding elements [0, n).
50011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  Negative arguments discard elements from the top of the array.
50111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
50211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __n  Number of element positions to shift.
50311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @return  New valarray with elements in shifted positions.
50411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
50511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      valarray<_Tp> shift (int __n) const;
50611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
50711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
50811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Return a rotated array.
50911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
51011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  A new valarray is constructed as a copy of this array with elements
51111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  in shifted positions.  For an element with index i, the new position
51211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  is (i - n) % size().  The new valarray has the same size as the
51311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  current one.  Elements that are shifted beyond the array bounds are
51411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  shifted into the other end of the array.  No elements are lost.
51511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
51611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  Positive arguments shift toward index 0, wrapping around the top.
51711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  Negative arguments shift towards the top, wrapping around to 0.
51811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
51911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __n  Number of element positions to rotate.
52011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @return  New valarray with elements in shifted positions.
52111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
52211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      valarray<_Tp> cshift(int __n) const;
52311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
52411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
52511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Apply a function to the array.
52611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
52711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  Returns a new valarray with elements assigned to the result of
52811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  applying func to the corresponding element of this array.  The new
52911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  array has the same size as this one.
53011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
53111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  func  Function of Tp returning Tp to apply.
53211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @return  New valarray with transformed elements.
53311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
53411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _Expr<_ValFunClos<_ValArray, _Tp>, _Tp> apply(_Tp func(_Tp)) const;
53511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
53611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
53711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Apply a function to the array.
53811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
53911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  Returns a new valarray with elements assigned to the result of
54011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  applying func to the corresponding element of this array.  The new
54111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  array has the same size as this one.
54211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
54311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  func  Function of const Tp& returning Tp to apply.
54411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @return  New valarray with transformed elements.
54511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
54611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _Expr<_RefFunClos<_ValArray, _Tp>, _Tp> apply(_Tp func(const _Tp&)) const;
54711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
54811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      /**
54911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @brief  Resize array.
55011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
55111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  Resize this array to @a size and set all elements to @a c.  All
55211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  references and iterators are invalidated.
55311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *
55411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __size  New array size.
55511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       *  @param  __c  New value for all elements.
55611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       */
55711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void resize(size_t __size, _Tp __c = _Tp());
55811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
55911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    private:
56011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      size_t _M_size;
56111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _Tp* __restrict__ _M_data;
56211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      
56311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      friend class _Array<_Tp>;
56411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
56511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  
56611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Tp>
56711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline const _Tp&
56811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    valarray<_Tp>::operator[](size_t __i) const
56911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { 
57011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      __glibcxx_requires_subscript(__i);
57111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      return _M_data[__i];
57211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
57311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
57411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Tp>
57511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline _Tp&
57611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    valarray<_Tp>::operator[](size_t __i)
57711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { 
57811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      __glibcxx_requires_subscript(__i);
57911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      return _M_data[__i];
58011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
58111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
58211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  // @} group numeric_arrays
58311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
58411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_GLIBCXX_END_NAMESPACE_VERSION
58511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} // namespace
58611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
58711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <bits/valarray_after.h>
58811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <bits/slice_array.h>
58911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <bits/gslice.h>
59011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <bits/gslice_array.h>
59111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <bits/mask_array.h>
59211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <bits/indirect_array.h>
59311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
59411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertnamespace std _GLIBCXX_VISIBILITY(default)
59511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
59611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_GLIBCXX_BEGIN_NAMESPACE_VERSION
59711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
59811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
59911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @addtogroup numeric_arrays
60011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @{
60111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
60211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
60311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Tp>
60411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline
60511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    valarray<_Tp>::valarray() : _M_size(0), _M_data(0) {}
60611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
60711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Tp>
60811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline 
60911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    valarray<_Tp>::valarray(size_t __n) 
61011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    : _M_size(__n), _M_data(__valarray_get_storage<_Tp>(__n))
61111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { std::__valarray_default_construct(_M_data, _M_data + __n); }
61211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
61311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Tp>
61411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline
61511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    valarray<_Tp>::valarray(const _Tp& __t, size_t __n)
61611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    : _M_size(__n), _M_data(__valarray_get_storage<_Tp>(__n))
61711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { std::__valarray_fill_construct(_M_data, _M_data + __n, __t); }
61811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
61911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Tp>
62011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline
62111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    valarray<_Tp>::valarray(const _Tp* __restrict__ __p, size_t __n)
62211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    : _M_size(__n), _M_data(__valarray_get_storage<_Tp>(__n))
62311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { 
62411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _GLIBCXX_DEBUG_ASSERT(__p != 0 || __n == 0);
62511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      std::__valarray_copy_construct(__p, __p + __n, _M_data); 
62611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
62711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
62811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Tp>
62911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline
63011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    valarray<_Tp>::valarray(const valarray<_Tp>& __v)
63111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    : _M_size(__v._M_size), _M_data(__valarray_get_storage<_Tp>(__v._M_size))
63211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { std::__valarray_copy_construct(__v._M_data, __v._M_data + _M_size,
63311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert				     _M_data); }
63411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
63511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if __cplusplus >= 201103L
63611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Tp>
63711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline
63811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    valarray<_Tp>::valarray(valarray<_Tp>&& __v) noexcept
63911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    : _M_size(__v._M_size), _M_data(__v._M_data)
64011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
64111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      __v._M_size = 0;
64211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      __v._M_data = 0;
64311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
64411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
64511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
64611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Tp>
64711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline
64811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    valarray<_Tp>::valarray(const slice_array<_Tp>& __sa)
64911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    : _M_size(__sa._M_sz), _M_data(__valarray_get_storage<_Tp>(__sa._M_sz))
65011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
65111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      std::__valarray_copy_construct
65211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	(__sa._M_array, __sa._M_sz, __sa._M_stride, _Array<_Tp>(_M_data));
65311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
65411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
65511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Tp>
65611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline
65711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    valarray<_Tp>::valarray(const gslice_array<_Tp>& __ga)
65811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    : _M_size(__ga._M_index.size()),
65911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_data(__valarray_get_storage<_Tp>(_M_size))
66011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
66111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      std::__valarray_copy_construct
66211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	(__ga._M_array, _Array<size_t>(__ga._M_index),
66311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	 _Array<_Tp>(_M_data), _M_size);
66411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
66511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
66611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Tp>
66711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline
66811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    valarray<_Tp>::valarray(const mask_array<_Tp>& __ma)
66911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    : _M_size(__ma._M_sz), _M_data(__valarray_get_storage<_Tp>(__ma._M_sz))
67011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
67111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      std::__valarray_copy_construct
67211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	(__ma._M_array, __ma._M_mask, _Array<_Tp>(_M_data), _M_size);
67311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
67411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
67511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Tp>
67611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline
67711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    valarray<_Tp>::valarray(const indirect_array<_Tp>& __ia)
67811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    : _M_size(__ia._M_sz), _M_data(__valarray_get_storage<_Tp>(__ia._M_sz))
67911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
68011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      std::__valarray_copy_construct
68111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	(__ia._M_array, __ia._M_index, _Array<_Tp>(_M_data), _M_size);
68211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
68311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
68411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if __cplusplus >= 201103L
68511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Tp>
68611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline
68711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    valarray<_Tp>::valarray(initializer_list<_Tp> __l)
68811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    : _M_size(__l.size()), _M_data(__valarray_get_storage<_Tp>(__l.size()))
68911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { std::__valarray_copy_construct(__l.begin(), __l.end(), _M_data); }
69011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
69111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
69211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Tp> template<class _Dom>
69311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline
69411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    valarray<_Tp>::valarray(const _Expr<_Dom, _Tp>& __e)
69511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    : _M_size(__e.size()), _M_data(__valarray_get_storage<_Tp>(_M_size))
69611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { std::__valarray_copy_construct(__e, _M_size, _Array<_Tp>(_M_data)); }
69711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
69811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Tp>
69911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline
70011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    valarray<_Tp>::~valarray() _GLIBCXX_NOEXCEPT
70111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
70211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      std::__valarray_destroy_elements(_M_data, _M_data + _M_size);
70311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      std::__valarray_release_memory(_M_data);
70411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
70511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
70611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Tp>
70711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline valarray<_Tp>&
70811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    valarray<_Tp>::operator=(const valarray<_Tp>& __v)
70911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
71011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      // _GLIBCXX_RESOLVE_LIB_DEFECTS
71111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      // 630. arrays of valarray.
71211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      if (_M_size == __v._M_size)
71311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	std::__valarray_copy(__v._M_data, _M_size, _M_data);
71411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      else
71511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{
71611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  if (_M_data)
71711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	    {
71811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	      std::__valarray_destroy_elements(_M_data, _M_data + _M_size);
71911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	      std::__valarray_release_memory(_M_data);
72011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	    }
72111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  _M_size = __v._M_size;
72211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  _M_data = __valarray_get_storage<_Tp>(_M_size);
72311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  std::__valarray_copy_construct(__v._M_data, __v._M_data + _M_size,
72411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert					 _M_data);
72511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	}
72611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      return *this;
72711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
72811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
72911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if __cplusplus >= 201103L
73011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Tp>
73111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline valarray<_Tp>&
73211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    valarray<_Tp>::operator=(valarray<_Tp>&& __v) noexcept
73311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
73411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      if (_M_data)
73511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{
73611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  std::__valarray_destroy_elements(_M_data, _M_data + _M_size);
73711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  std::__valarray_release_memory(_M_data);
73811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	}
73911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_size = __v._M_size;
74011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_data = __v._M_data;
74111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      __v._M_size = 0;
74211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      __v._M_data = 0;
74311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      return *this;
74411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
74511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
74611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Tp>
74711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline valarray<_Tp>&
74811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    valarray<_Tp>::operator=(initializer_list<_Tp> __l)
74911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
75011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      // _GLIBCXX_RESOLVE_LIB_DEFECTS
75111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      // 630. arrays of valarray.
75211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      if (_M_size == __l.size())
75311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	std::__valarray_copy(__l.begin(), __l.size(), _M_data);
75411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      else
75511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{
75611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  if (_M_data)
75711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	    {
75811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	      std::__valarray_destroy_elements(_M_data, _M_data + _M_size);
75911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	      std::__valarray_release_memory(_M_data);
76011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	    }
76111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  _M_size = __l.size();
76211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  _M_data = __valarray_get_storage<_Tp>(_M_size);
76311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  std::__valarray_copy_construct(__l.begin(), __l.begin() + _M_size,
76411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert					 _M_data);
76511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	}
76611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      return *this;
76711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
76811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
76911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
77011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Tp>
77111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline valarray<_Tp>&
77211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    valarray<_Tp>::operator=(const _Tp& __t)
77311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
77411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      std::__valarray_fill(_M_data, _M_size, __t);
77511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      return *this;
77611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
77711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
77811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Tp>
77911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline valarray<_Tp>&
78011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    valarray<_Tp>::operator=(const slice_array<_Tp>& __sa)
78111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
78211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _GLIBCXX_DEBUG_ASSERT(_M_size == __sa._M_sz);
78311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      std::__valarray_copy(__sa._M_array, __sa._M_sz,
78411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			   __sa._M_stride, _Array<_Tp>(_M_data));
78511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      return *this;
78611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
78711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
78811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Tp>
78911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline valarray<_Tp>&
79011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    valarray<_Tp>::operator=(const gslice_array<_Tp>& __ga)
79111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
79211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _GLIBCXX_DEBUG_ASSERT(_M_size == __ga._M_index.size());
79311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      std::__valarray_copy(__ga._M_array, _Array<size_t>(__ga._M_index),
79411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			   _Array<_Tp>(_M_data), _M_size);
79511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      return *this;
79611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
79711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
79811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Tp>
79911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline valarray<_Tp>&
80011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    valarray<_Tp>::operator=(const mask_array<_Tp>& __ma)
80111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
80211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _GLIBCXX_DEBUG_ASSERT(_M_size == __ma._M_sz);
80311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      std::__valarray_copy(__ma._M_array, __ma._M_mask,
80411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			   _Array<_Tp>(_M_data), _M_size);
80511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      return *this;
80611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
80711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
80811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Tp>
80911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline valarray<_Tp>&
81011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    valarray<_Tp>::operator=(const indirect_array<_Tp>& __ia)
81111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
81211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _GLIBCXX_DEBUG_ASSERT(_M_size == __ia._M_sz);
81311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      std::__valarray_copy(__ia._M_array, __ia._M_index,
81411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			   _Array<_Tp>(_M_data), _M_size);
81511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      return *this;
81611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
81711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
81811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Tp> template<class _Dom>
81911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline valarray<_Tp>&
82011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    valarray<_Tp>::operator=(const _Expr<_Dom, _Tp>& __e)
82111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
82211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      // _GLIBCXX_RESOLVE_LIB_DEFECTS
82311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      // 630. arrays of valarray.
82411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      if (_M_size == __e.size())
82511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	std::__valarray_copy(__e, _M_size, _Array<_Tp>(_M_data));
82611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      else
82711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{
82811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  if (_M_data)
82911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	    {
83011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	      std::__valarray_destroy_elements(_M_data, _M_data + _M_size);
83111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	      std::__valarray_release_memory(_M_data);
83211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	    }
83311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  _M_size = __e.size();
83411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  _M_data = __valarray_get_storage<_Tp>(_M_size);
83511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  std::__valarray_copy_construct(__e, _M_size, _Array<_Tp>(_M_data));
83611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	}
83711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      return *this;
83811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
83911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
84011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Tp>
84111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline _Expr<_SClos<_ValArray,_Tp>, _Tp>
84211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    valarray<_Tp>::operator[](slice __s) const
84311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
84411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef _SClos<_ValArray,_Tp> _Closure;
84511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      return _Expr<_Closure, _Tp>(_Closure (_Array<_Tp>(_M_data), __s));
84611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
84711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
84811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Tp>
84911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline slice_array<_Tp>
85011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    valarray<_Tp>::operator[](slice __s)
85111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { return slice_array<_Tp>(_Array<_Tp>(_M_data), __s); }
85211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
85311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Tp>
85411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline _Expr<_GClos<_ValArray,_Tp>, _Tp>
85511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    valarray<_Tp>::operator[](const gslice& __gs) const
85611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
85711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef _GClos<_ValArray,_Tp> _Closure;
85811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      return _Expr<_Closure, _Tp>
85911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	(_Closure(_Array<_Tp>(_M_data), __gs._M_index->_M_index));
86011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
86111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
86211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Tp>
86311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline gslice_array<_Tp>
86411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    valarray<_Tp>::operator[](const gslice& __gs)
86511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
86611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      return gslice_array<_Tp>
86711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	(_Array<_Tp>(_M_data), __gs._M_index->_M_index);
86811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
86911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
87011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Tp>
87111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline valarray<_Tp>
87211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    valarray<_Tp>::operator[](const valarray<bool>& __m) const
87311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
87411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      size_t __s = 0;
87511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      size_t __e = __m.size();
87611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      for (size_t __i=0; __i<__e; ++__i)
87711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	if (__m[__i]) ++__s;
87811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      return valarray<_Tp>(mask_array<_Tp>(_Array<_Tp>(_M_data), __s,
87911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert					   _Array<bool> (__m)));
88011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
88111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
88211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Tp>
88311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline mask_array<_Tp>
88411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    valarray<_Tp>::operator[](const valarray<bool>& __m)
88511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
88611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      size_t __s = 0;
88711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      size_t __e = __m.size();
88811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      for (size_t __i=0; __i<__e; ++__i)
88911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	if (__m[__i]) ++__s;
89011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      return mask_array<_Tp>(_Array<_Tp>(_M_data), __s, _Array<bool>(__m));
89111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
89211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
89311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Tp>
89411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline _Expr<_IClos<_ValArray,_Tp>, _Tp>
89511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    valarray<_Tp>::operator[](const valarray<size_t>& __i) const
89611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
89711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef _IClos<_ValArray,_Tp> _Closure;
89811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      return _Expr<_Closure, _Tp>(_Closure(*this, __i));
89911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
90011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
90111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Tp>
90211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline indirect_array<_Tp>
90311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    valarray<_Tp>::operator[](const valarray<size_t>& __i)
90411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
90511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      return indirect_array<_Tp>(_Array<_Tp>(_M_data), __i.size(),
90611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert				 _Array<size_t>(__i));
90711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
90811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
90911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if __cplusplus >= 201103L
91011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<class _Tp>
91111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline void
91211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    valarray<_Tp>::swap(valarray<_Tp>& __v) noexcept
91311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
91411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      std::swap(_M_size, __v._M_size);
91511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      std::swap(_M_data, __v._M_data);
91611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
91711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
91811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
91911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<class _Tp>
92011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline size_t 
92111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    valarray<_Tp>::size() const
92211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { return _M_size; }
92311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
92411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<class _Tp>
92511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline _Tp
92611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    valarray<_Tp>::sum() const
92711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
92811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _GLIBCXX_DEBUG_ASSERT(_M_size > 0);
92911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      return std::__valarray_sum(_M_data, _M_data + _M_size);
93011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
93111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
93211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<class _Tp>
93311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert     inline valarray<_Tp>
93411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert     valarray<_Tp>::shift(int __n) const
93511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert     {
93611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       valarray<_Tp> __ret;
93711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
93811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       if (_M_size == 0)
93911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	 return __ret;
94011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
94111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       _Tp* __restrict__ __tmp_M_data =
94211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	 std::__valarray_get_storage<_Tp>(_M_size);
94311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
94411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       if (__n == 0)
94511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	 std::__valarray_copy_construct(_M_data,
94611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert					_M_data + _M_size, __tmp_M_data);
94711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       else if (__n > 0)      // shift left
94811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	 {
94911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	   if (size_t(__n) > _M_size)
95011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	     __n = int(_M_size);
95111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
95211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	   std::__valarray_copy_construct(_M_data + __n,
95311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert					  _M_data + _M_size, __tmp_M_data);
95411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	   std::__valarray_default_construct(__tmp_M_data + _M_size - __n,
95511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert					     __tmp_M_data + _M_size);
95611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	 }
95711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       else                   // shift right
95811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	 {
95911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	   if (-size_t(__n) > _M_size)
96011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	     __n = -int(_M_size);
96111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
96211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	   std::__valarray_copy_construct(_M_data, _M_data + _M_size + __n,
96311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert					  __tmp_M_data - __n);
96411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	   std::__valarray_default_construct(__tmp_M_data,
96511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert					     __tmp_M_data - __n);
96611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	 }
96711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
96811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       __ret._M_size = _M_size;
96911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       __ret._M_data = __tmp_M_data;
97011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       return __ret;
97111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert     }
97211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
97311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<class _Tp>
97411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert     inline valarray<_Tp>
97511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert     valarray<_Tp>::cshift(int __n) const
97611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert     {
97711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       valarray<_Tp> __ret;
97811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
97911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       if (_M_size == 0)
98011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	 return __ret;
98111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
98211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       _Tp* __restrict__ __tmp_M_data =
98311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	 std::__valarray_get_storage<_Tp>(_M_size);
98411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
98511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       if (__n == 0)
98611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	 std::__valarray_copy_construct(_M_data,
98711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert					_M_data + _M_size, __tmp_M_data);
98811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       else if (__n > 0)      // cshift left
98911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	 {
99011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	   if (size_t(__n) > _M_size)
99111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	     __n = int(__n % _M_size);
99211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
99311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	   std::__valarray_copy_construct(_M_data, _M_data + __n,
99411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert					  __tmp_M_data + _M_size - __n);
99511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	   std::__valarray_copy_construct(_M_data + __n, _M_data + _M_size,
99611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert					  __tmp_M_data);
99711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	 }
99811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       else                   // cshift right
99911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	 {
100011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	   if (-size_t(__n) > _M_size)
100111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	     __n = -int(-size_t(__n) % _M_size);
100211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
100311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	   std::__valarray_copy_construct(_M_data + _M_size + __n,
100411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert					  _M_data + _M_size, __tmp_M_data);
100511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	   std::__valarray_copy_construct(_M_data, _M_data + _M_size + __n,
100611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert					  __tmp_M_data - __n);
100711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	 }
100811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
100911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       __ret._M_size = _M_size;
101011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       __ret._M_data = __tmp_M_data;
101111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert       return __ret;
101211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert     }
101311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
101411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<class _Tp>
101511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline void
101611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    valarray<_Tp>::resize(size_t __n, _Tp __c)
101711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
101811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      // This complication is so to make valarray<valarray<T> > work
101911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      // even though it is not required by the standard.  Nobody should
102011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      // be saying valarray<valarray<T> > anyway.  See the specs.
102111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      std::__valarray_destroy_elements(_M_data, _M_data + _M_size);
102211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      if (_M_size != __n)
102311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	{
102411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  std::__valarray_release_memory(_M_data);
102511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  _M_size = __n;
102611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  _M_data = __valarray_get_storage<_Tp>(__n);
102711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	}
102811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      std::__valarray_fill_construct(_M_data, _M_data + __n, __c);
102911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
103011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    
103111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Tp>
103211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline _Tp
103311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    valarray<_Tp>::min() const
103411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
103511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _GLIBCXX_DEBUG_ASSERT(_M_size > 0);
103611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      return *std::min_element(_M_data, _M_data + _M_size);
103711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
103811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
103911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Tp>
104011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline _Tp
104111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    valarray<_Tp>::max() const
104211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
104311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _GLIBCXX_DEBUG_ASSERT(_M_size > 0);
104411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      return *std::max_element(_M_data, _M_data + _M_size);
104511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
104611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  
104711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<class _Tp>
104811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline _Expr<_ValFunClos<_ValArray, _Tp>, _Tp>
104911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    valarray<_Tp>::apply(_Tp func(_Tp)) const
105011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
105111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef _ValFunClos<_ValArray, _Tp> _Closure;
105211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      return _Expr<_Closure, _Tp>(_Closure(*this, func));
105311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
105411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
105511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<class _Tp>
105611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline _Expr<_RefFunClos<_ValArray, _Tp>, _Tp>
105711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    valarray<_Tp>::apply(_Tp func(const _Tp &)) const
105811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
105911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef _RefFunClos<_ValArray, _Tp> _Closure;
106011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      return _Expr<_Closure, _Tp>(_Closure(*this, func));
106111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
106211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
106311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define _DEFINE_VALARRAY_UNARY_OPERATOR(_Op, _Name)                     \
106411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Tp>						\
106511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline typename valarray<_Tp>::template _UnaryOp<_Name>::_Rt      	\
106611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    valarray<_Tp>::operator _Op() const					\
106711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {									\
106811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef _UnClos<_Name, _ValArray, _Tp> _Closure;	                \
106911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef typename __fun<_Name, _Tp>::result_type _Rt;              \
107011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      return _Expr<_Closure, _Rt>(_Closure(*this));			\
107111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
107211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
107311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _DEFINE_VALARRAY_UNARY_OPERATOR(+, __unary_plus)
107411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _DEFINE_VALARRAY_UNARY_OPERATOR(-, __negate)
107511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _DEFINE_VALARRAY_UNARY_OPERATOR(~, __bitwise_not)
107611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    _DEFINE_VALARRAY_UNARY_OPERATOR (!, __logical_not)
107711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
107811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#undef _DEFINE_VALARRAY_UNARY_OPERATOR
107911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
108011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define _DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(_Op, _Name)               \
108111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<class _Tp>							\
108211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline valarray<_Tp>&						\
108311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    valarray<_Tp>::operator _Op##=(const _Tp &__t)			\
108411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {									\
108511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _Array_augmented_##_Name(_Array<_Tp>(_M_data), _M_size, __t);	\
108611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      return *this;							\
108711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }									\
108811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert									\
108911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<class _Tp>							\
109011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline valarray<_Tp>&						\
109111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    valarray<_Tp>::operator _Op##=(const valarray<_Tp> &__v)		\
109211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {									\
109311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _GLIBCXX_DEBUG_ASSERT(_M_size == __v._M_size);                    \
109411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _Array_augmented_##_Name(_Array<_Tp>(_M_data), _M_size, 		\
109511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			       _Array<_Tp>(__v._M_data));		\
109611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      return *this;							\
109711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
109811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
109911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(+, __plus)
110011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(-, __minus)
110111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(*, __multiplies)
110211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(/, __divides)
110311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(%, __modulus)
110411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(^, __bitwise_xor)
110511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(&, __bitwise_and)
110611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(|, __bitwise_or)
110711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(<<, __shift_left)
110811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(>>, __shift_right)
110911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
111011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#undef _DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT
111111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
111211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define _DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(_Op, _Name)          \
111311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<class _Tp> template<class _Dom>				\
111411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline valarray<_Tp>&						\
111511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    valarray<_Tp>::operator _Op##=(const _Expr<_Dom, _Tp>& __e)		\
111611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {									\
111711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _Array_augmented_##_Name(_Array<_Tp>(_M_data), __e, _M_size);	\
111811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      return *this;							\
111911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
112011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
112111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(+, __plus)
112211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(-, __minus)
112311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(*, __multiplies)
112411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(/, __divides)
112511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(%, __modulus)
112611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(^, __bitwise_xor)
112711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(&, __bitwise_and)
112811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(|, __bitwise_or)
112911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(<<, __shift_left)
113011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(>>, __shift_right)
113111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
113211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#undef _DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT
113311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    
113411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
113511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define _DEFINE_BINARY_OPERATOR(_Op, _Name)				\
113611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Tp>						\
113711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline _Expr<_BinClos<_Name, _ValArray, _ValArray, _Tp, _Tp>,       \
113811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                 typename __fun<_Name, _Tp>::result_type>               \
113911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    operator _Op(const valarray<_Tp>& __v, const valarray<_Tp>& __w)	\
114011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {									\
114111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _GLIBCXX_DEBUG_ASSERT(__v.size() == __w.size());                  \
114211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef _BinClos<_Name, _ValArray, _ValArray, _Tp, _Tp> _Closure; \
114311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef typename __fun<_Name, _Tp>::result_type _Rt;              \
114411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      return _Expr<_Closure, _Rt>(_Closure(__v, __w));                  \
114511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }									\
114611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert									\
114711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Tp>						\
114811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline _Expr<_BinClos<_Name, _ValArray,_Constant, _Tp, _Tp>,        \
114911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                 typename __fun<_Name, _Tp>::result_type>               \
115011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    operator _Op(const valarray<_Tp>& __v, const _Tp& __t)		\
115111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {									\
115211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef _BinClos<_Name, _ValArray, _Constant, _Tp, _Tp> _Closure;	\
115311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef typename __fun<_Name, _Tp>::result_type _Rt;              \
115411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      return _Expr<_Closure, _Rt>(_Closure(__v, __t));	                \
115511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }									\
115611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert									\
115711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _Tp>						\
115811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline _Expr<_BinClos<_Name, _Constant, _ValArray, _Tp, _Tp>,       \
115911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                 typename __fun<_Name, _Tp>::result_type>               \
116011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    operator _Op(const _Tp& __t, const valarray<_Tp>& __v)		\
116111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {									\
116211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef _BinClos<_Name, _Constant, _ValArray, _Tp, _Tp> _Closure; \
116311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef typename __fun<_Name, _Tp>::result_type _Rt;              \
116411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      return _Expr<_Closure, _Rt>(_Closure(__t, __v));        	        \
116511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
116611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
116711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_DEFINE_BINARY_OPERATOR(+, __plus)
116811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_DEFINE_BINARY_OPERATOR(-, __minus)
116911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_DEFINE_BINARY_OPERATOR(*, __multiplies)
117011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_DEFINE_BINARY_OPERATOR(/, __divides)
117111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_DEFINE_BINARY_OPERATOR(%, __modulus)
117211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_DEFINE_BINARY_OPERATOR(^, __bitwise_xor)
117311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_DEFINE_BINARY_OPERATOR(&, __bitwise_and)
117411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_DEFINE_BINARY_OPERATOR(|, __bitwise_or)
117511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_DEFINE_BINARY_OPERATOR(<<, __shift_left)
117611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_DEFINE_BINARY_OPERATOR(>>, __shift_right)
117711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_DEFINE_BINARY_OPERATOR(&&, __logical_and)
117811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_DEFINE_BINARY_OPERATOR(||, __logical_or)
117911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_DEFINE_BINARY_OPERATOR(==, __equal_to)
118011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_DEFINE_BINARY_OPERATOR(!=, __not_equal_to)
118111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_DEFINE_BINARY_OPERATOR(<, __less)
118211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_DEFINE_BINARY_OPERATOR(>, __greater)
118311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_DEFINE_BINARY_OPERATOR(<=, __less_equal)
118411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_DEFINE_BINARY_OPERATOR(>=, __greater_equal)
118511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
118611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#undef _DEFINE_BINARY_OPERATOR
118711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
118811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if __cplusplus >= 201103L
118911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
119011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  @brief  Return an iterator pointing to the first element of
119111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *          the valarray.
119211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  @param  __va  valarray.
119311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
119411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<class _Tp>
119511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline _Tp*
119611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    begin(valarray<_Tp>& __va)
119711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { return std::__addressof(__va[0]); }
119811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
119911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
120011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  @brief  Return an iterator pointing to the first element of
120111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *          the const valarray.
120211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  @param  __va  valarray.
120311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
120411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<class _Tp>
120511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline const _Tp*
120611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    begin(const valarray<_Tp>& __va)
120711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { return std::__addressof(__va[0]); }
120811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
120911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
121011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  @brief  Return an iterator pointing to one past the last element of
121111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *          the valarray.
121211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  @param  __va  valarray.
121311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
121411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<class _Tp>
121511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline _Tp*
121611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    end(valarray<_Tp>& __va)
121711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { return std::__addressof(__va[0]) + __va.size(); }
121811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
121911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
122011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  @brief  Return an iterator pointing to one past the last element of
122111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *          the const valarray.
122211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *  @param  __va  valarray.
122311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
122411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<class _Tp>
122511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline const _Tp*
122611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    end(const valarray<_Tp>& __va)
122711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { return std::__addressof(__va[0]) + __va.size(); }
122811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif // C++11
122911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
123011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  // @} group numeric_arrays
123111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
123211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_GLIBCXX_END_NAMESPACE_VERSION
123311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} // namespace
123411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
123511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif /* _GLIBCXX_VALARRAY */
1236