1*e4b17023SJohn Marino// The template and inlines for the -*- C++ -*- valarray class. 2*e4b17023SJohn Marino 3*e4b17023SJohn Marino// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 4*e4b17023SJohn Marino// 2006, 2007, 2008, 2009, 2010, 2011 5*e4b17023SJohn Marino// Free Software Foundation, Inc. 6*e4b17023SJohn Marino// 7*e4b17023SJohn Marino// This file is part of the GNU ISO C++ Library. This library is free 8*e4b17023SJohn Marino// software; you can redistribute it and/or modify it under the 9*e4b17023SJohn Marino// terms of the GNU General Public License as published by the 10*e4b17023SJohn Marino// Free Software Foundation; either version 3, or (at your option) 11*e4b17023SJohn Marino// any later version. 12*e4b17023SJohn Marino 13*e4b17023SJohn Marino// This library is distributed in the hope that it will be useful, 14*e4b17023SJohn Marino// but WITHOUT ANY WARRANTY; without even the implied warranty of 15*e4b17023SJohn Marino// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16*e4b17023SJohn Marino// GNU General Public License for more details. 17*e4b17023SJohn Marino 18*e4b17023SJohn Marino// Under Section 7 of GPL version 3, you are granted additional 19*e4b17023SJohn Marino// permissions described in the GCC Runtime Library Exception, version 20*e4b17023SJohn Marino// 3.1, as published by the Free Software Foundation. 21*e4b17023SJohn Marino 22*e4b17023SJohn Marino// You should have received a copy of the GNU General Public License and 23*e4b17023SJohn Marino// a copy of the GCC Runtime Library Exception along with this program; 24*e4b17023SJohn Marino// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 25*e4b17023SJohn Marino// <http://www.gnu.org/licenses/>. 26*e4b17023SJohn Marino 27*e4b17023SJohn Marino/** @file include/valarray 28*e4b17023SJohn Marino * This is a Standard C++ Library header. 29*e4b17023SJohn Marino */ 30*e4b17023SJohn Marino 31*e4b17023SJohn Marino// Written by Gabriel Dos Reis <Gabriel.Dos-Reis@DPTMaths.ENS-Cachan.Fr> 32*e4b17023SJohn Marino 33*e4b17023SJohn Marino#ifndef _GLIBCXX_VALARRAY 34*e4b17023SJohn Marino#define _GLIBCXX_VALARRAY 1 35*e4b17023SJohn Marino 36*e4b17023SJohn Marino#pragma GCC system_header 37*e4b17023SJohn Marino 38*e4b17023SJohn Marino#include <bits/c++config.h> 39*e4b17023SJohn Marino#include <cmath> 40*e4b17023SJohn Marino#include <algorithm> 41*e4b17023SJohn Marino#include <debug/debug.h> 42*e4b17023SJohn Marino#ifdef __GXX_EXPERIMENTAL_CXX0X__ 43*e4b17023SJohn Marino#include <initializer_list> 44*e4b17023SJohn Marino#endif 45*e4b17023SJohn Marino 46*e4b17023SJohn Marinonamespace std _GLIBCXX_VISIBILITY(default) 47*e4b17023SJohn Marino{ 48*e4b17023SJohn Marino_GLIBCXX_BEGIN_NAMESPACE_VERSION 49*e4b17023SJohn Marino 50*e4b17023SJohn Marino template<class _Clos, typename _Tp> 51*e4b17023SJohn Marino class _Expr; 52*e4b17023SJohn Marino 53*e4b17023SJohn Marino template<typename _Tp1, typename _Tp2> 54*e4b17023SJohn Marino class _ValArray; 55*e4b17023SJohn Marino 56*e4b17023SJohn Marino template<class _Oper, template<class, class> class _Meta, class _Dom> 57*e4b17023SJohn Marino struct _UnClos; 58*e4b17023SJohn Marino 59*e4b17023SJohn Marino template<class _Oper, 60*e4b17023SJohn Marino template<class, class> class _Meta1, 61*e4b17023SJohn Marino template<class, class> class _Meta2, 62*e4b17023SJohn Marino class _Dom1, class _Dom2> 63*e4b17023SJohn Marino class _BinClos; 64*e4b17023SJohn Marino 65*e4b17023SJohn Marino template<template<class, class> class _Meta, class _Dom> 66*e4b17023SJohn Marino class _SClos; 67*e4b17023SJohn Marino 68*e4b17023SJohn Marino template<template<class, class> class _Meta, class _Dom> 69*e4b17023SJohn Marino class _GClos; 70*e4b17023SJohn Marino 71*e4b17023SJohn Marino template<template<class, class> class _Meta, class _Dom> 72*e4b17023SJohn Marino class _IClos; 73*e4b17023SJohn Marino 74*e4b17023SJohn Marino template<template<class, class> class _Meta, class _Dom> 75*e4b17023SJohn Marino class _ValFunClos; 76*e4b17023SJohn Marino 77*e4b17023SJohn Marino template<template<class, class> class _Meta, class _Dom> 78*e4b17023SJohn Marino class _RefFunClos; 79*e4b17023SJohn Marino 80*e4b17023SJohn Marino template<class _Tp> class valarray; // An array of type _Tp 81*e4b17023SJohn Marino class slice; // BLAS-like slice out of an array 82*e4b17023SJohn Marino template<class _Tp> class slice_array; 83*e4b17023SJohn Marino class gslice; // generalized slice out of an array 84*e4b17023SJohn Marino template<class _Tp> class gslice_array; 85*e4b17023SJohn Marino template<class _Tp> class mask_array; // masked array 86*e4b17023SJohn Marino template<class _Tp> class indirect_array; // indirected array 87*e4b17023SJohn Marino 88*e4b17023SJohn Marino_GLIBCXX_END_NAMESPACE_VERSION 89*e4b17023SJohn Marino} // namespace 90*e4b17023SJohn Marino 91*e4b17023SJohn Marino#include <bits/valarray_array.h> 92*e4b17023SJohn Marino#include <bits/valarray_before.h> 93*e4b17023SJohn Marino 94*e4b17023SJohn Marinonamespace std _GLIBCXX_VISIBILITY(default) 95*e4b17023SJohn Marino{ 96*e4b17023SJohn Marino_GLIBCXX_BEGIN_NAMESPACE_VERSION 97*e4b17023SJohn Marino 98*e4b17023SJohn Marino /** 99*e4b17023SJohn Marino * @defgroup numeric_arrays Numeric Arrays 100*e4b17023SJohn Marino * @ingroup numerics 101*e4b17023SJohn Marino * 102*e4b17023SJohn Marino * Classes and functions for representing and manipulating arrays of elements. 103*e4b17023SJohn Marino * @{ 104*e4b17023SJohn Marino */ 105*e4b17023SJohn Marino 106*e4b17023SJohn Marino /** 107*e4b17023SJohn Marino * @brief Smart array designed to support numeric processing. 108*e4b17023SJohn Marino * 109*e4b17023SJohn Marino * A valarray is an array that provides constraints intended to allow for 110*e4b17023SJohn Marino * effective optimization of numeric array processing by reducing the 111*e4b17023SJohn Marino * aliasing that can result from pointer representations. It represents a 112*e4b17023SJohn Marino * one-dimensional array from which different multidimensional subsets can 113*e4b17023SJohn Marino * be accessed and modified. 114*e4b17023SJohn Marino * 115*e4b17023SJohn Marino * @tparam _Tp Type of object in the array. 116*e4b17023SJohn Marino */ 117*e4b17023SJohn Marino template<class _Tp> 118*e4b17023SJohn Marino class valarray 119*e4b17023SJohn Marino { 120*e4b17023SJohn Marino template<class _Op> 121*e4b17023SJohn Marino struct _UnaryOp 122*e4b17023SJohn Marino { 123*e4b17023SJohn Marino typedef typename __fun<_Op, _Tp>::result_type __rt; 124*e4b17023SJohn Marino typedef _Expr<_UnClos<_Op, _ValArray, _Tp>, __rt> _Rt; 125*e4b17023SJohn Marino }; 126*e4b17023SJohn Marino public: 127*e4b17023SJohn Marino typedef _Tp value_type; 128*e4b17023SJohn Marino 129*e4b17023SJohn Marino // _lib.valarray.cons_ construct/destroy: 130*e4b17023SJohn Marino /// Construct an empty array. 131*e4b17023SJohn Marino valarray(); 132*e4b17023SJohn Marino 133*e4b17023SJohn Marino /// Construct an array with @a n elements. 134*e4b17023SJohn Marino explicit valarray(size_t); 135*e4b17023SJohn Marino 136*e4b17023SJohn Marino /// Construct an array with @a n elements initialized to @a t. 137*e4b17023SJohn Marino valarray(const _Tp&, size_t); 138*e4b17023SJohn Marino 139*e4b17023SJohn Marino /// Construct an array initialized to the first @a n elements of @a t. 140*e4b17023SJohn Marino valarray(const _Tp* __restrict__, size_t); 141*e4b17023SJohn Marino 142*e4b17023SJohn Marino /// Copy constructor. 143*e4b17023SJohn Marino valarray(const valarray&); 144*e4b17023SJohn Marino 145*e4b17023SJohn Marino#ifdef __GXX_EXPERIMENTAL_CXX0X__ 146*e4b17023SJohn Marino /// Move constructor. 147*e4b17023SJohn Marino valarray(valarray&&) noexcept; 148*e4b17023SJohn Marino#endif 149*e4b17023SJohn Marino 150*e4b17023SJohn Marino /// Construct an array with the same size and values in @a sa. 151*e4b17023SJohn Marino valarray(const slice_array<_Tp>&); 152*e4b17023SJohn Marino 153*e4b17023SJohn Marino /// Construct an array with the same size and values in @a ga. 154*e4b17023SJohn Marino valarray(const gslice_array<_Tp>&); 155*e4b17023SJohn Marino 156*e4b17023SJohn Marino /// Construct an array with the same size and values in @a ma. 157*e4b17023SJohn Marino valarray(const mask_array<_Tp>&); 158*e4b17023SJohn Marino 159*e4b17023SJohn Marino /// Construct an array with the same size and values in @a ia. 160*e4b17023SJohn Marino valarray(const indirect_array<_Tp>&); 161*e4b17023SJohn Marino 162*e4b17023SJohn Marino#ifdef __GXX_EXPERIMENTAL_CXX0X__ 163*e4b17023SJohn Marino /// Construct an array with an initializer_list of values. 164*e4b17023SJohn Marino valarray(initializer_list<_Tp>); 165*e4b17023SJohn Marino#endif 166*e4b17023SJohn Marino 167*e4b17023SJohn Marino template<class _Dom> 168*e4b17023SJohn Marino valarray(const _Expr<_Dom, _Tp>& __e); 169*e4b17023SJohn Marino 170*e4b17023SJohn Marino ~valarray() _GLIBCXX_NOEXCEPT; 171*e4b17023SJohn Marino 172*e4b17023SJohn Marino // _lib.valarray.assign_ assignment: 173*e4b17023SJohn Marino /** 174*e4b17023SJohn Marino * @brief Assign elements to an array. 175*e4b17023SJohn Marino * 176*e4b17023SJohn Marino * Assign elements of array to values in @a v. 177*e4b17023SJohn Marino * 178*e4b17023SJohn Marino * @param __v Valarray to get values from. 179*e4b17023SJohn Marino */ 180*e4b17023SJohn Marino valarray<_Tp>& operator=(const valarray<_Tp>& __v); 181*e4b17023SJohn Marino 182*e4b17023SJohn Marino#ifdef __GXX_EXPERIMENTAL_CXX0X__ 183*e4b17023SJohn Marino /** 184*e4b17023SJohn Marino * @brief Move assign elements to an array. 185*e4b17023SJohn Marino * 186*e4b17023SJohn Marino * Move assign elements of array to values in @a v. 187*e4b17023SJohn Marino * 188*e4b17023SJohn Marino * @param __v Valarray to get values from. 189*e4b17023SJohn Marino */ 190*e4b17023SJohn Marino valarray<_Tp>& operator=(valarray<_Tp>&& __v) noexcept; 191*e4b17023SJohn Marino#endif 192*e4b17023SJohn Marino 193*e4b17023SJohn Marino /** 194*e4b17023SJohn Marino * @brief Assign elements to a value. 195*e4b17023SJohn Marino * 196*e4b17023SJohn Marino * Assign all elements of array to @a t. 197*e4b17023SJohn Marino * 198*e4b17023SJohn Marino * @param __t Value for elements. 199*e4b17023SJohn Marino */ 200*e4b17023SJohn Marino valarray<_Tp>& operator=(const _Tp& __t); 201*e4b17023SJohn Marino 202*e4b17023SJohn Marino /** 203*e4b17023SJohn Marino * @brief Assign elements to an array subset. 204*e4b17023SJohn Marino * 205*e4b17023SJohn Marino * Assign elements of array to values in @a sa. Results are undefined 206*e4b17023SJohn Marino * if @a sa does not have the same size as this array. 207*e4b17023SJohn Marino * 208*e4b17023SJohn Marino * @param __sa Array slice to get values from. 209*e4b17023SJohn Marino */ 210*e4b17023SJohn Marino valarray<_Tp>& operator=(const slice_array<_Tp>& __sa); 211*e4b17023SJohn Marino 212*e4b17023SJohn Marino /** 213*e4b17023SJohn Marino * @brief Assign elements to an array subset. 214*e4b17023SJohn Marino * 215*e4b17023SJohn Marino * Assign elements of array to values in @a ga. Results are undefined 216*e4b17023SJohn Marino * if @a ga does not have the same size as this array. 217*e4b17023SJohn Marino * 218*e4b17023SJohn Marino * @param __ga Array slice to get values from. 219*e4b17023SJohn Marino */ 220*e4b17023SJohn Marino valarray<_Tp>& operator=(const gslice_array<_Tp>& __ga); 221*e4b17023SJohn Marino 222*e4b17023SJohn Marino /** 223*e4b17023SJohn Marino * @brief Assign elements to an array subset. 224*e4b17023SJohn Marino * 225*e4b17023SJohn Marino * Assign elements of array to values in @a ma. Results are undefined 226*e4b17023SJohn Marino * if @a ma does not have the same size as this array. 227*e4b17023SJohn Marino * 228*e4b17023SJohn Marino * @param __ma Array slice to get values from. 229*e4b17023SJohn Marino */ 230*e4b17023SJohn Marino valarray<_Tp>& operator=(const mask_array<_Tp>& __ma); 231*e4b17023SJohn Marino 232*e4b17023SJohn Marino /** 233*e4b17023SJohn Marino * @brief Assign elements to an array subset. 234*e4b17023SJohn Marino * 235*e4b17023SJohn Marino * Assign elements of array to values in @a ia. Results are undefined 236*e4b17023SJohn Marino * if @a ia does not have the same size as this array. 237*e4b17023SJohn Marino * 238*e4b17023SJohn Marino * @param __ia Array slice to get values from. 239*e4b17023SJohn Marino */ 240*e4b17023SJohn Marino valarray<_Tp>& operator=(const indirect_array<_Tp>& __ia); 241*e4b17023SJohn Marino 242*e4b17023SJohn Marino#ifdef __GXX_EXPERIMENTAL_CXX0X__ 243*e4b17023SJohn Marino /** 244*e4b17023SJohn Marino * @brief Assign elements to an initializer_list. 245*e4b17023SJohn Marino * 246*e4b17023SJohn Marino * Assign elements of array to values in @a __l. Results are undefined 247*e4b17023SJohn Marino * if @a __l does not have the same size as this array. 248*e4b17023SJohn Marino * 249*e4b17023SJohn Marino * @param __l initializer_list to get values from. 250*e4b17023SJohn Marino */ 251*e4b17023SJohn Marino valarray& operator=(initializer_list<_Tp> __l); 252*e4b17023SJohn Marino#endif 253*e4b17023SJohn Marino 254*e4b17023SJohn Marino template<class _Dom> valarray<_Tp>& 255*e4b17023SJohn Marino operator= (const _Expr<_Dom, _Tp>&); 256*e4b17023SJohn Marino 257*e4b17023SJohn Marino // _lib.valarray.access_ element access: 258*e4b17023SJohn Marino /** 259*e4b17023SJohn Marino * Return a reference to the i'th array element. 260*e4b17023SJohn Marino * 261*e4b17023SJohn Marino * @param __i Index of element to return. 262*e4b17023SJohn Marino * @return Reference to the i'th element. 263*e4b17023SJohn Marino */ 264*e4b17023SJohn Marino _Tp& operator[](size_t __i); 265*e4b17023SJohn Marino 266*e4b17023SJohn Marino // _GLIBCXX_RESOLVE_LIB_DEFECTS 267*e4b17023SJohn Marino // 389. Const overload of valarray::operator[] returns by value. 268*e4b17023SJohn Marino const _Tp& operator[](size_t) const; 269*e4b17023SJohn Marino 270*e4b17023SJohn Marino // _lib.valarray.sub_ subset operations: 271*e4b17023SJohn Marino /** 272*e4b17023SJohn Marino * @brief Return an array subset. 273*e4b17023SJohn Marino * 274*e4b17023SJohn Marino * Returns a new valarray containing the elements of the array 275*e4b17023SJohn Marino * indicated by the slice argument. The new valarray has the same size 276*e4b17023SJohn Marino * as the input slice. @see slice. 277*e4b17023SJohn Marino * 278*e4b17023SJohn Marino * @param __s The source slice. 279*e4b17023SJohn Marino * @return New valarray containing elements in @a __s. 280*e4b17023SJohn Marino */ 281*e4b17023SJohn Marino _Expr<_SClos<_ValArray, _Tp>, _Tp> operator[](slice __s) const; 282*e4b17023SJohn Marino 283*e4b17023SJohn Marino /** 284*e4b17023SJohn Marino * @brief Return a reference to an array subset. 285*e4b17023SJohn Marino * 286*e4b17023SJohn Marino * Returns a new valarray containing the elements of the array 287*e4b17023SJohn Marino * indicated by the slice argument. The new valarray has the same size 288*e4b17023SJohn Marino * as the input slice. @see slice. 289*e4b17023SJohn Marino * 290*e4b17023SJohn Marino * @param __s The source slice. 291*e4b17023SJohn Marino * @return New valarray containing elements in @a __s. 292*e4b17023SJohn Marino */ 293*e4b17023SJohn Marino slice_array<_Tp> operator[](slice __s); 294*e4b17023SJohn Marino 295*e4b17023SJohn Marino /** 296*e4b17023SJohn Marino * @brief Return an array subset. 297*e4b17023SJohn Marino * 298*e4b17023SJohn Marino * Returns a slice_array referencing the elements of the array 299*e4b17023SJohn Marino * indicated by the slice argument. @see gslice. 300*e4b17023SJohn Marino * 301*e4b17023SJohn Marino * @param __s The source slice. 302*e4b17023SJohn Marino * @return Slice_array referencing elements indicated by @a __s. 303*e4b17023SJohn Marino */ 304*e4b17023SJohn Marino _Expr<_GClos<_ValArray, _Tp>, _Tp> operator[](const gslice& __s) const; 305*e4b17023SJohn Marino 306*e4b17023SJohn Marino /** 307*e4b17023SJohn Marino * @brief Return a reference to an array subset. 308*e4b17023SJohn Marino * 309*e4b17023SJohn Marino * Returns a new valarray containing the elements of the array 310*e4b17023SJohn Marino * indicated by the gslice argument. The new valarray has 311*e4b17023SJohn Marino * the same size as the input gslice. @see gslice. 312*e4b17023SJohn Marino * 313*e4b17023SJohn Marino * @param __s The source gslice. 314*e4b17023SJohn Marino * @return New valarray containing elements in @a __s. 315*e4b17023SJohn Marino */ 316*e4b17023SJohn Marino gslice_array<_Tp> operator[](const gslice& __s); 317*e4b17023SJohn Marino 318*e4b17023SJohn Marino /** 319*e4b17023SJohn Marino * @brief Return an array subset. 320*e4b17023SJohn Marino * 321*e4b17023SJohn Marino * Returns a new valarray containing the elements of the array 322*e4b17023SJohn Marino * indicated by the argument. The input is a valarray of bool which 323*e4b17023SJohn Marino * represents a bitmask indicating which elements should be copied into 324*e4b17023SJohn Marino * the new valarray. Each element of the array is added to the return 325*e4b17023SJohn Marino * valarray if the corresponding element of the argument is true. 326*e4b17023SJohn Marino * 327*e4b17023SJohn Marino * @param __m The valarray bitmask. 328*e4b17023SJohn Marino * @return New valarray containing elements indicated by @a __m. 329*e4b17023SJohn Marino */ 330*e4b17023SJohn Marino valarray<_Tp> operator[](const valarray<bool>& __m) const; 331*e4b17023SJohn Marino 332*e4b17023SJohn Marino /** 333*e4b17023SJohn Marino * @brief Return a reference to an array subset. 334*e4b17023SJohn Marino * 335*e4b17023SJohn Marino * Returns a new mask_array referencing the elements of the array 336*e4b17023SJohn Marino * indicated by the argument. The input is a valarray of bool which 337*e4b17023SJohn Marino * represents a bitmask indicating which elements are part of the 338*e4b17023SJohn Marino * subset. Elements of the array are part of the subset if the 339*e4b17023SJohn Marino * corresponding element of the argument is true. 340*e4b17023SJohn Marino * 341*e4b17023SJohn Marino * @param __m The valarray bitmask. 342*e4b17023SJohn Marino * @return New valarray containing elements indicated by @a __m. 343*e4b17023SJohn Marino */ 344*e4b17023SJohn Marino mask_array<_Tp> operator[](const valarray<bool>& __m); 345*e4b17023SJohn Marino 346*e4b17023SJohn Marino /** 347*e4b17023SJohn Marino * @brief Return an array subset. 348*e4b17023SJohn Marino * 349*e4b17023SJohn Marino * Returns a new valarray containing the elements of the array 350*e4b17023SJohn Marino * indicated by the argument. The elements in the argument are 351*e4b17023SJohn Marino * interpreted as the indices of elements of this valarray to copy to 352*e4b17023SJohn Marino * the return valarray. 353*e4b17023SJohn Marino * 354*e4b17023SJohn Marino * @param __i The valarray element index list. 355*e4b17023SJohn Marino * @return New valarray containing elements in @a __s. 356*e4b17023SJohn Marino */ 357*e4b17023SJohn Marino _Expr<_IClos<_ValArray, _Tp>, _Tp> 358*e4b17023SJohn Marino operator[](const valarray<size_t>& __i) const; 359*e4b17023SJohn Marino 360*e4b17023SJohn Marino /** 361*e4b17023SJohn Marino * @brief Return a reference to an array subset. 362*e4b17023SJohn Marino * 363*e4b17023SJohn Marino * Returns an indirect_array referencing the elements of the array 364*e4b17023SJohn Marino * indicated by the argument. The elements in the argument are 365*e4b17023SJohn Marino * interpreted as the indices of elements of this valarray to include 366*e4b17023SJohn Marino * in the subset. The returned indirect_array refers to these 367*e4b17023SJohn Marino * elements. 368*e4b17023SJohn Marino * 369*e4b17023SJohn Marino * @param __i The valarray element index list. 370*e4b17023SJohn Marino * @return Indirect_array referencing elements in @a __i. 371*e4b17023SJohn Marino */ 372*e4b17023SJohn Marino indirect_array<_Tp> operator[](const valarray<size_t>& __i); 373*e4b17023SJohn Marino 374*e4b17023SJohn Marino // _lib.valarray.unary_ unary operators: 375*e4b17023SJohn Marino /// Return a new valarray by applying unary + to each element. 376*e4b17023SJohn Marino typename _UnaryOp<__unary_plus>::_Rt operator+() const; 377*e4b17023SJohn Marino 378*e4b17023SJohn Marino /// Return a new valarray by applying unary - to each element. 379*e4b17023SJohn Marino typename _UnaryOp<__negate>::_Rt operator-() const; 380*e4b17023SJohn Marino 381*e4b17023SJohn Marino /// Return a new valarray by applying unary ~ to each element. 382*e4b17023SJohn Marino typename _UnaryOp<__bitwise_not>::_Rt operator~() const; 383*e4b17023SJohn Marino 384*e4b17023SJohn Marino /// Return a new valarray by applying unary ! to each element. 385*e4b17023SJohn Marino typename _UnaryOp<__logical_not>::_Rt operator!() const; 386*e4b17023SJohn Marino 387*e4b17023SJohn Marino // _lib.valarray.cassign_ computed assignment: 388*e4b17023SJohn Marino /// Multiply each element of array by @a t. 389*e4b17023SJohn Marino valarray<_Tp>& operator*=(const _Tp&); 390*e4b17023SJohn Marino 391*e4b17023SJohn Marino /// Divide each element of array by @a t. 392*e4b17023SJohn Marino valarray<_Tp>& operator/=(const _Tp&); 393*e4b17023SJohn Marino 394*e4b17023SJohn Marino /// Set each element e of array to e % @a t. 395*e4b17023SJohn Marino valarray<_Tp>& operator%=(const _Tp&); 396*e4b17023SJohn Marino 397*e4b17023SJohn Marino /// Add @a t to each element of array. 398*e4b17023SJohn Marino valarray<_Tp>& operator+=(const _Tp&); 399*e4b17023SJohn Marino 400*e4b17023SJohn Marino /// Subtract @a t to each element of array. 401*e4b17023SJohn Marino valarray<_Tp>& operator-=(const _Tp&); 402*e4b17023SJohn Marino 403*e4b17023SJohn Marino /// Set each element e of array to e ^ @a t. 404*e4b17023SJohn Marino valarray<_Tp>& operator^=(const _Tp&); 405*e4b17023SJohn Marino 406*e4b17023SJohn Marino /// Set each element e of array to e & @a t. 407*e4b17023SJohn Marino valarray<_Tp>& operator&=(const _Tp&); 408*e4b17023SJohn Marino 409*e4b17023SJohn Marino /// Set each element e of array to e | @a t. 410*e4b17023SJohn Marino valarray<_Tp>& operator|=(const _Tp&); 411*e4b17023SJohn Marino 412*e4b17023SJohn Marino /// Left shift each element e of array by @a t bits. 413*e4b17023SJohn Marino valarray<_Tp>& operator<<=(const _Tp&); 414*e4b17023SJohn Marino 415*e4b17023SJohn Marino /// Right shift each element e of array by @a t bits. 416*e4b17023SJohn Marino valarray<_Tp>& operator>>=(const _Tp&); 417*e4b17023SJohn Marino 418*e4b17023SJohn Marino /// Multiply elements of array by corresponding elements of @a v. 419*e4b17023SJohn Marino valarray<_Tp>& operator*=(const valarray<_Tp>&); 420*e4b17023SJohn Marino 421*e4b17023SJohn Marino /// Divide elements of array by corresponding elements of @a v. 422*e4b17023SJohn Marino valarray<_Tp>& operator/=(const valarray<_Tp>&); 423*e4b17023SJohn Marino 424*e4b17023SJohn Marino /// Modulo elements of array by corresponding elements of @a v. 425*e4b17023SJohn Marino valarray<_Tp>& operator%=(const valarray<_Tp>&); 426*e4b17023SJohn Marino 427*e4b17023SJohn Marino /// Add corresponding elements of @a v to elements of array. 428*e4b17023SJohn Marino valarray<_Tp>& operator+=(const valarray<_Tp>&); 429*e4b17023SJohn Marino 430*e4b17023SJohn Marino /// Subtract corresponding elements of @a v from elements of array. 431*e4b17023SJohn Marino valarray<_Tp>& operator-=(const valarray<_Tp>&); 432*e4b17023SJohn Marino 433*e4b17023SJohn Marino /// Logical xor corresponding elements of @a v with elements of array. 434*e4b17023SJohn Marino valarray<_Tp>& operator^=(const valarray<_Tp>&); 435*e4b17023SJohn Marino 436*e4b17023SJohn Marino /// Logical or corresponding elements of @a v with elements of array. 437*e4b17023SJohn Marino valarray<_Tp>& operator|=(const valarray<_Tp>&); 438*e4b17023SJohn Marino 439*e4b17023SJohn Marino /// Logical and corresponding elements of @a v with elements of array. 440*e4b17023SJohn Marino valarray<_Tp>& operator&=(const valarray<_Tp>&); 441*e4b17023SJohn Marino 442*e4b17023SJohn Marino /// Left shift elements of array by corresponding elements of @a v. 443*e4b17023SJohn Marino valarray<_Tp>& operator<<=(const valarray<_Tp>&); 444*e4b17023SJohn Marino 445*e4b17023SJohn Marino /// Right shift elements of array by corresponding elements of @a v. 446*e4b17023SJohn Marino valarray<_Tp>& operator>>=(const valarray<_Tp>&); 447*e4b17023SJohn Marino 448*e4b17023SJohn Marino template<class _Dom> 449*e4b17023SJohn Marino valarray<_Tp>& operator*=(const _Expr<_Dom, _Tp>&); 450*e4b17023SJohn Marino template<class _Dom> 451*e4b17023SJohn Marino valarray<_Tp>& operator/=(const _Expr<_Dom, _Tp>&); 452*e4b17023SJohn Marino template<class _Dom> 453*e4b17023SJohn Marino valarray<_Tp>& operator%=(const _Expr<_Dom, _Tp>&); 454*e4b17023SJohn Marino template<class _Dom> 455*e4b17023SJohn Marino valarray<_Tp>& operator+=(const _Expr<_Dom, _Tp>&); 456*e4b17023SJohn Marino template<class _Dom> 457*e4b17023SJohn Marino valarray<_Tp>& operator-=(const _Expr<_Dom, _Tp>&); 458*e4b17023SJohn Marino template<class _Dom> 459*e4b17023SJohn Marino valarray<_Tp>& operator^=(const _Expr<_Dom, _Tp>&); 460*e4b17023SJohn Marino template<class _Dom> 461*e4b17023SJohn Marino valarray<_Tp>& operator|=(const _Expr<_Dom, _Tp>&); 462*e4b17023SJohn Marino template<class _Dom> 463*e4b17023SJohn Marino valarray<_Tp>& operator&=(const _Expr<_Dom, _Tp>&); 464*e4b17023SJohn Marino template<class _Dom> 465*e4b17023SJohn Marino valarray<_Tp>& operator<<=(const _Expr<_Dom, _Tp>&); 466*e4b17023SJohn Marino template<class _Dom> 467*e4b17023SJohn Marino valarray<_Tp>& operator>>=(const _Expr<_Dom, _Tp>&); 468*e4b17023SJohn Marino 469*e4b17023SJohn Marino // _lib.valarray.members_ member functions: 470*e4b17023SJohn Marino#ifdef __GXX_EXPERIMENTAL_CXX0X__ 471*e4b17023SJohn Marino /// Swap. 472*e4b17023SJohn Marino void swap(valarray<_Tp>& __v) noexcept; 473*e4b17023SJohn Marino#endif 474*e4b17023SJohn Marino 475*e4b17023SJohn Marino /// Return the number of elements in array. 476*e4b17023SJohn Marino size_t size() const; 477*e4b17023SJohn Marino 478*e4b17023SJohn Marino /** 479*e4b17023SJohn Marino * @brief Return the sum of all elements in the array. 480*e4b17023SJohn Marino * 481*e4b17023SJohn Marino * Accumulates the sum of all elements into a Tp using +=. The order 482*e4b17023SJohn Marino * of adding the elements is unspecified. 483*e4b17023SJohn Marino */ 484*e4b17023SJohn Marino _Tp sum() const; 485*e4b17023SJohn Marino 486*e4b17023SJohn Marino /// Return the minimum element using operator<(). 487*e4b17023SJohn Marino _Tp min() const; 488*e4b17023SJohn Marino 489*e4b17023SJohn Marino /// Return the maximum element using operator<(). 490*e4b17023SJohn Marino _Tp max() const; 491*e4b17023SJohn Marino 492*e4b17023SJohn Marino /** 493*e4b17023SJohn Marino * @brief Return a shifted array. 494*e4b17023SJohn Marino * 495*e4b17023SJohn Marino * A new valarray is constructed as a copy of this array with elements 496*e4b17023SJohn Marino * in shifted positions. For an element with index i, the new position 497*e4b17023SJohn Marino * is i - n. The new valarray has the same size as the current one. 498*e4b17023SJohn Marino * New elements without a value are set to 0. Elements whose new 499*e4b17023SJohn Marino * position is outside the bounds of the array are discarded. 500*e4b17023SJohn Marino * 501*e4b17023SJohn Marino * Positive arguments shift toward index 0, discarding elements [0, n). 502*e4b17023SJohn Marino * Negative arguments discard elements from the top of the array. 503*e4b17023SJohn Marino * 504*e4b17023SJohn Marino * @param __n Number of element positions to shift. 505*e4b17023SJohn Marino * @return New valarray with elements in shifted positions. 506*e4b17023SJohn Marino */ 507*e4b17023SJohn Marino valarray<_Tp> shift (int __n) const; 508*e4b17023SJohn Marino 509*e4b17023SJohn Marino /** 510*e4b17023SJohn Marino * @brief Return a rotated array. 511*e4b17023SJohn Marino * 512*e4b17023SJohn Marino * A new valarray is constructed as a copy of this array with elements 513*e4b17023SJohn Marino * in shifted positions. For an element with index i, the new position 514*e4b17023SJohn Marino * is (i - n) % size(). The new valarray has the same size as the 515*e4b17023SJohn Marino * current one. Elements that are shifted beyond the array bounds are 516*e4b17023SJohn Marino * shifted into the other end of the array. No elements are lost. 517*e4b17023SJohn Marino * 518*e4b17023SJohn Marino * Positive arguments shift toward index 0, wrapping around the top. 519*e4b17023SJohn Marino * Negative arguments shift towards the top, wrapping around to 0. 520*e4b17023SJohn Marino * 521*e4b17023SJohn Marino * @param __n Number of element positions to rotate. 522*e4b17023SJohn Marino * @return New valarray with elements in shifted positions. 523*e4b17023SJohn Marino */ 524*e4b17023SJohn Marino valarray<_Tp> cshift(int __n) const; 525*e4b17023SJohn Marino 526*e4b17023SJohn Marino /** 527*e4b17023SJohn Marino * @brief Apply a function to the array. 528*e4b17023SJohn Marino * 529*e4b17023SJohn Marino * Returns a new valarray with elements assigned to the result of 530*e4b17023SJohn Marino * applying func to the corresponding element of this array. The new 531*e4b17023SJohn Marino * array has the same size as this one. 532*e4b17023SJohn Marino * 533*e4b17023SJohn Marino * @param func Function of Tp returning Tp to apply. 534*e4b17023SJohn Marino * @return New valarray with transformed elements. 535*e4b17023SJohn Marino */ 536*e4b17023SJohn Marino _Expr<_ValFunClos<_ValArray, _Tp>, _Tp> apply(_Tp func(_Tp)) const; 537*e4b17023SJohn Marino 538*e4b17023SJohn Marino /** 539*e4b17023SJohn Marino * @brief Apply a function to the array. 540*e4b17023SJohn Marino * 541*e4b17023SJohn Marino * Returns a new valarray with elements assigned to the result of 542*e4b17023SJohn Marino * applying func to the corresponding element of this array. The new 543*e4b17023SJohn Marino * array has the same size as this one. 544*e4b17023SJohn Marino * 545*e4b17023SJohn Marino * @param func Function of const Tp& returning Tp to apply. 546*e4b17023SJohn Marino * @return New valarray with transformed elements. 547*e4b17023SJohn Marino */ 548*e4b17023SJohn Marino _Expr<_RefFunClos<_ValArray, _Tp>, _Tp> apply(_Tp func(const _Tp&)) const; 549*e4b17023SJohn Marino 550*e4b17023SJohn Marino /** 551*e4b17023SJohn Marino * @brief Resize array. 552*e4b17023SJohn Marino * 553*e4b17023SJohn Marino * Resize this array to @a size and set all elements to @a c. All 554*e4b17023SJohn Marino * references and iterators are invalidated. 555*e4b17023SJohn Marino * 556*e4b17023SJohn Marino * @param __size New array size. 557*e4b17023SJohn Marino * @param __c New value for all elements. 558*e4b17023SJohn Marino */ 559*e4b17023SJohn Marino void resize(size_t __size, _Tp __c = _Tp()); 560*e4b17023SJohn Marino 561*e4b17023SJohn Marino private: 562*e4b17023SJohn Marino size_t _M_size; 563*e4b17023SJohn Marino _Tp* __restrict__ _M_data; 564*e4b17023SJohn Marino 565*e4b17023SJohn Marino friend class _Array<_Tp>; 566*e4b17023SJohn Marino }; 567*e4b17023SJohn Marino 568*e4b17023SJohn Marino template<typename _Tp> 569*e4b17023SJohn Marino inline const _Tp& 570*e4b17023SJohn Marino valarray<_Tp>::operator[](size_t __i) const 571*e4b17023SJohn Marino { 572*e4b17023SJohn Marino __glibcxx_requires_subscript(__i); 573*e4b17023SJohn Marino return _M_data[__i]; 574*e4b17023SJohn Marino } 575*e4b17023SJohn Marino 576*e4b17023SJohn Marino template<typename _Tp> 577*e4b17023SJohn Marino inline _Tp& 578*e4b17023SJohn Marino valarray<_Tp>::operator[](size_t __i) 579*e4b17023SJohn Marino { 580*e4b17023SJohn Marino __glibcxx_requires_subscript(__i); 581*e4b17023SJohn Marino return _M_data[__i]; 582*e4b17023SJohn Marino } 583*e4b17023SJohn Marino 584*e4b17023SJohn Marino // @} group numeric_arrays 585*e4b17023SJohn Marino 586*e4b17023SJohn Marino_GLIBCXX_END_NAMESPACE_VERSION 587*e4b17023SJohn Marino} // namespace 588*e4b17023SJohn Marino 589*e4b17023SJohn Marino#include <bits/valarray_after.h> 590*e4b17023SJohn Marino#include <bits/slice_array.h> 591*e4b17023SJohn Marino#include <bits/gslice.h> 592*e4b17023SJohn Marino#include <bits/gslice_array.h> 593*e4b17023SJohn Marino#include <bits/mask_array.h> 594*e4b17023SJohn Marino#include <bits/indirect_array.h> 595*e4b17023SJohn Marino 596*e4b17023SJohn Marinonamespace std _GLIBCXX_VISIBILITY(default) 597*e4b17023SJohn Marino{ 598*e4b17023SJohn Marino_GLIBCXX_BEGIN_NAMESPACE_VERSION 599*e4b17023SJohn Marino 600*e4b17023SJohn Marino /** 601*e4b17023SJohn Marino * @addtogroup numeric_arrays 602*e4b17023SJohn Marino * @{ 603*e4b17023SJohn Marino */ 604*e4b17023SJohn Marino 605*e4b17023SJohn Marino template<typename _Tp> 606*e4b17023SJohn Marino inline 607*e4b17023SJohn Marino valarray<_Tp>::valarray() : _M_size(0), _M_data(0) {} 608*e4b17023SJohn Marino 609*e4b17023SJohn Marino template<typename _Tp> 610*e4b17023SJohn Marino inline 611*e4b17023SJohn Marino valarray<_Tp>::valarray(size_t __n) 612*e4b17023SJohn Marino : _M_size(__n), _M_data(__valarray_get_storage<_Tp>(__n)) 613*e4b17023SJohn Marino { std::__valarray_default_construct(_M_data, _M_data + __n); } 614*e4b17023SJohn Marino 615*e4b17023SJohn Marino template<typename _Tp> 616*e4b17023SJohn Marino inline 617*e4b17023SJohn Marino valarray<_Tp>::valarray(const _Tp& __t, size_t __n) 618*e4b17023SJohn Marino : _M_size(__n), _M_data(__valarray_get_storage<_Tp>(__n)) 619*e4b17023SJohn Marino { std::__valarray_fill_construct(_M_data, _M_data + __n, __t); } 620*e4b17023SJohn Marino 621*e4b17023SJohn Marino template<typename _Tp> 622*e4b17023SJohn Marino inline 623*e4b17023SJohn Marino valarray<_Tp>::valarray(const _Tp* __restrict__ __p, size_t __n) 624*e4b17023SJohn Marino : _M_size(__n), _M_data(__valarray_get_storage<_Tp>(__n)) 625*e4b17023SJohn Marino { 626*e4b17023SJohn Marino _GLIBCXX_DEBUG_ASSERT(__p != 0 || __n == 0); 627*e4b17023SJohn Marino std::__valarray_copy_construct(__p, __p + __n, _M_data); 628*e4b17023SJohn Marino } 629*e4b17023SJohn Marino 630*e4b17023SJohn Marino template<typename _Tp> 631*e4b17023SJohn Marino inline 632*e4b17023SJohn Marino valarray<_Tp>::valarray(const valarray<_Tp>& __v) 633*e4b17023SJohn Marino : _M_size(__v._M_size), _M_data(__valarray_get_storage<_Tp>(__v._M_size)) 634*e4b17023SJohn Marino { std::__valarray_copy_construct(__v._M_data, __v._M_data + _M_size, 635*e4b17023SJohn Marino _M_data); } 636*e4b17023SJohn Marino 637*e4b17023SJohn Marino#ifdef __GXX_EXPERIMENTAL_CXX0X__ 638*e4b17023SJohn Marino template<typename _Tp> 639*e4b17023SJohn Marino inline 640*e4b17023SJohn Marino valarray<_Tp>::valarray(valarray<_Tp>&& __v) noexcept 641*e4b17023SJohn Marino : _M_size(__v._M_size), _M_data(__v._M_data) 642*e4b17023SJohn Marino { 643*e4b17023SJohn Marino __v._M_size = 0; 644*e4b17023SJohn Marino __v._M_data = 0; 645*e4b17023SJohn Marino } 646*e4b17023SJohn Marino#endif 647*e4b17023SJohn Marino 648*e4b17023SJohn Marino template<typename _Tp> 649*e4b17023SJohn Marino inline 650*e4b17023SJohn Marino valarray<_Tp>::valarray(const slice_array<_Tp>& __sa) 651*e4b17023SJohn Marino : _M_size(__sa._M_sz), _M_data(__valarray_get_storage<_Tp>(__sa._M_sz)) 652*e4b17023SJohn Marino { 653*e4b17023SJohn Marino std::__valarray_copy_construct 654*e4b17023SJohn Marino (__sa._M_array, __sa._M_sz, __sa._M_stride, _Array<_Tp>(_M_data)); 655*e4b17023SJohn Marino } 656*e4b17023SJohn Marino 657*e4b17023SJohn Marino template<typename _Tp> 658*e4b17023SJohn Marino inline 659*e4b17023SJohn Marino valarray<_Tp>::valarray(const gslice_array<_Tp>& __ga) 660*e4b17023SJohn Marino : _M_size(__ga._M_index.size()), 661*e4b17023SJohn Marino _M_data(__valarray_get_storage<_Tp>(_M_size)) 662*e4b17023SJohn Marino { 663*e4b17023SJohn Marino std::__valarray_copy_construct 664*e4b17023SJohn Marino (__ga._M_array, _Array<size_t>(__ga._M_index), 665*e4b17023SJohn Marino _Array<_Tp>(_M_data), _M_size); 666*e4b17023SJohn Marino } 667*e4b17023SJohn Marino 668*e4b17023SJohn Marino template<typename _Tp> 669*e4b17023SJohn Marino inline 670*e4b17023SJohn Marino valarray<_Tp>::valarray(const mask_array<_Tp>& __ma) 671*e4b17023SJohn Marino : _M_size(__ma._M_sz), _M_data(__valarray_get_storage<_Tp>(__ma._M_sz)) 672*e4b17023SJohn Marino { 673*e4b17023SJohn Marino std::__valarray_copy_construct 674*e4b17023SJohn Marino (__ma._M_array, __ma._M_mask, _Array<_Tp>(_M_data), _M_size); 675*e4b17023SJohn Marino } 676*e4b17023SJohn Marino 677*e4b17023SJohn Marino template<typename _Tp> 678*e4b17023SJohn Marino inline 679*e4b17023SJohn Marino valarray<_Tp>::valarray(const indirect_array<_Tp>& __ia) 680*e4b17023SJohn Marino : _M_size(__ia._M_sz), _M_data(__valarray_get_storage<_Tp>(__ia._M_sz)) 681*e4b17023SJohn Marino { 682*e4b17023SJohn Marino std::__valarray_copy_construct 683*e4b17023SJohn Marino (__ia._M_array, __ia._M_index, _Array<_Tp>(_M_data), _M_size); 684*e4b17023SJohn Marino } 685*e4b17023SJohn Marino 686*e4b17023SJohn Marino#ifdef __GXX_EXPERIMENTAL_CXX0X__ 687*e4b17023SJohn Marino template<typename _Tp> 688*e4b17023SJohn Marino inline 689*e4b17023SJohn Marino valarray<_Tp>::valarray(initializer_list<_Tp> __l) 690*e4b17023SJohn Marino : _M_size(__l.size()), _M_data(__valarray_get_storage<_Tp>(__l.size())) 691*e4b17023SJohn Marino { std::__valarray_copy_construct(__l.begin(), __l.end(), _M_data); } 692*e4b17023SJohn Marino#endif 693*e4b17023SJohn Marino 694*e4b17023SJohn Marino template<typename _Tp> template<class _Dom> 695*e4b17023SJohn Marino inline 696*e4b17023SJohn Marino valarray<_Tp>::valarray(const _Expr<_Dom, _Tp>& __e) 697*e4b17023SJohn Marino : _M_size(__e.size()), _M_data(__valarray_get_storage<_Tp>(_M_size)) 698*e4b17023SJohn Marino { std::__valarray_copy_construct(__e, _M_size, _Array<_Tp>(_M_data)); } 699*e4b17023SJohn Marino 700*e4b17023SJohn Marino template<typename _Tp> 701*e4b17023SJohn Marino inline 702*e4b17023SJohn Marino valarray<_Tp>::~valarray() _GLIBCXX_NOEXCEPT 703*e4b17023SJohn Marino { 704*e4b17023SJohn Marino std::__valarray_destroy_elements(_M_data, _M_data + _M_size); 705*e4b17023SJohn Marino std::__valarray_release_memory(_M_data); 706*e4b17023SJohn Marino } 707*e4b17023SJohn Marino 708*e4b17023SJohn Marino template<typename _Tp> 709*e4b17023SJohn Marino inline valarray<_Tp>& 710*e4b17023SJohn Marino valarray<_Tp>::operator=(const valarray<_Tp>& __v) 711*e4b17023SJohn Marino { 712*e4b17023SJohn Marino // _GLIBCXX_RESOLVE_LIB_DEFECTS 713*e4b17023SJohn Marino // 630. arrays of valarray. 714*e4b17023SJohn Marino if (_M_size == __v._M_size) 715*e4b17023SJohn Marino std::__valarray_copy(__v._M_data, _M_size, _M_data); 716*e4b17023SJohn Marino else 717*e4b17023SJohn Marino { 718*e4b17023SJohn Marino if (_M_data) 719*e4b17023SJohn Marino { 720*e4b17023SJohn Marino std::__valarray_destroy_elements(_M_data, _M_data + _M_size); 721*e4b17023SJohn Marino std::__valarray_release_memory(_M_data); 722*e4b17023SJohn Marino } 723*e4b17023SJohn Marino _M_size = __v._M_size; 724*e4b17023SJohn Marino _M_data = __valarray_get_storage<_Tp>(_M_size); 725*e4b17023SJohn Marino std::__valarray_copy_construct(__v._M_data, __v._M_data + _M_size, 726*e4b17023SJohn Marino _M_data); 727*e4b17023SJohn Marino } 728*e4b17023SJohn Marino return *this; 729*e4b17023SJohn Marino } 730*e4b17023SJohn Marino 731*e4b17023SJohn Marino#ifdef __GXX_EXPERIMENTAL_CXX0X__ 732*e4b17023SJohn Marino template<typename _Tp> 733*e4b17023SJohn Marino inline valarray<_Tp>& 734*e4b17023SJohn Marino valarray<_Tp>::operator=(valarray<_Tp>&& __v) noexcept 735*e4b17023SJohn Marino { 736*e4b17023SJohn Marino if (_M_data) 737*e4b17023SJohn Marino { 738*e4b17023SJohn Marino std::__valarray_destroy_elements(_M_data, _M_data + _M_size); 739*e4b17023SJohn Marino std::__valarray_release_memory(_M_data); 740*e4b17023SJohn Marino } 741*e4b17023SJohn Marino _M_size = __v._M_size; 742*e4b17023SJohn Marino _M_data = __v._M_data; 743*e4b17023SJohn Marino __v._M_size = 0; 744*e4b17023SJohn Marino __v._M_data = 0; 745*e4b17023SJohn Marino return *this; 746*e4b17023SJohn Marino } 747*e4b17023SJohn Marino 748*e4b17023SJohn Marino template<typename _Tp> 749*e4b17023SJohn Marino inline valarray<_Tp>& 750*e4b17023SJohn Marino valarray<_Tp>::operator=(initializer_list<_Tp> __l) 751*e4b17023SJohn Marino { 752*e4b17023SJohn Marino // _GLIBCXX_RESOLVE_LIB_DEFECTS 753*e4b17023SJohn Marino // 630. arrays of valarray. 754*e4b17023SJohn Marino if (_M_size == __l.size()) 755*e4b17023SJohn Marino std::__valarray_copy(__l.begin(), __l.size(), _M_data); 756*e4b17023SJohn Marino else 757*e4b17023SJohn Marino { 758*e4b17023SJohn Marino if (_M_data) 759*e4b17023SJohn Marino { 760*e4b17023SJohn Marino std::__valarray_destroy_elements(_M_data, _M_data + _M_size); 761*e4b17023SJohn Marino std::__valarray_release_memory(_M_data); 762*e4b17023SJohn Marino } 763*e4b17023SJohn Marino _M_size = __l.size(); 764*e4b17023SJohn Marino _M_data = __valarray_get_storage<_Tp>(_M_size); 765*e4b17023SJohn Marino std::__valarray_copy_construct(__l.begin(), __l.begin() + _M_size, 766*e4b17023SJohn Marino _M_data); 767*e4b17023SJohn Marino } 768*e4b17023SJohn Marino return *this; 769*e4b17023SJohn Marino } 770*e4b17023SJohn Marino#endif 771*e4b17023SJohn Marino 772*e4b17023SJohn Marino template<typename _Tp> 773*e4b17023SJohn Marino inline valarray<_Tp>& 774*e4b17023SJohn Marino valarray<_Tp>::operator=(const _Tp& __t) 775*e4b17023SJohn Marino { 776*e4b17023SJohn Marino std::__valarray_fill(_M_data, _M_size, __t); 777*e4b17023SJohn Marino return *this; 778*e4b17023SJohn Marino } 779*e4b17023SJohn Marino 780*e4b17023SJohn Marino template<typename _Tp> 781*e4b17023SJohn Marino inline valarray<_Tp>& 782*e4b17023SJohn Marino valarray<_Tp>::operator=(const slice_array<_Tp>& __sa) 783*e4b17023SJohn Marino { 784*e4b17023SJohn Marino _GLIBCXX_DEBUG_ASSERT(_M_size == __sa._M_sz); 785*e4b17023SJohn Marino std::__valarray_copy(__sa._M_array, __sa._M_sz, 786*e4b17023SJohn Marino __sa._M_stride, _Array<_Tp>(_M_data)); 787*e4b17023SJohn Marino return *this; 788*e4b17023SJohn Marino } 789*e4b17023SJohn Marino 790*e4b17023SJohn Marino template<typename _Tp> 791*e4b17023SJohn Marino inline valarray<_Tp>& 792*e4b17023SJohn Marino valarray<_Tp>::operator=(const gslice_array<_Tp>& __ga) 793*e4b17023SJohn Marino { 794*e4b17023SJohn Marino _GLIBCXX_DEBUG_ASSERT(_M_size == __ga._M_index.size()); 795*e4b17023SJohn Marino std::__valarray_copy(__ga._M_array, _Array<size_t>(__ga._M_index), 796*e4b17023SJohn Marino _Array<_Tp>(_M_data), _M_size); 797*e4b17023SJohn Marino return *this; 798*e4b17023SJohn Marino } 799*e4b17023SJohn Marino 800*e4b17023SJohn Marino template<typename _Tp> 801*e4b17023SJohn Marino inline valarray<_Tp>& 802*e4b17023SJohn Marino valarray<_Tp>::operator=(const mask_array<_Tp>& __ma) 803*e4b17023SJohn Marino { 804*e4b17023SJohn Marino _GLIBCXX_DEBUG_ASSERT(_M_size == __ma._M_sz); 805*e4b17023SJohn Marino std::__valarray_copy(__ma._M_array, __ma._M_mask, 806*e4b17023SJohn Marino _Array<_Tp>(_M_data), _M_size); 807*e4b17023SJohn Marino return *this; 808*e4b17023SJohn Marino } 809*e4b17023SJohn Marino 810*e4b17023SJohn Marino template<typename _Tp> 811*e4b17023SJohn Marino inline valarray<_Tp>& 812*e4b17023SJohn Marino valarray<_Tp>::operator=(const indirect_array<_Tp>& __ia) 813*e4b17023SJohn Marino { 814*e4b17023SJohn Marino _GLIBCXX_DEBUG_ASSERT(_M_size == __ia._M_sz); 815*e4b17023SJohn Marino std::__valarray_copy(__ia._M_array, __ia._M_index, 816*e4b17023SJohn Marino _Array<_Tp>(_M_data), _M_size); 817*e4b17023SJohn Marino return *this; 818*e4b17023SJohn Marino } 819*e4b17023SJohn Marino 820*e4b17023SJohn Marino template<typename _Tp> template<class _Dom> 821*e4b17023SJohn Marino inline valarray<_Tp>& 822*e4b17023SJohn Marino valarray<_Tp>::operator=(const _Expr<_Dom, _Tp>& __e) 823*e4b17023SJohn Marino { 824*e4b17023SJohn Marino _GLIBCXX_DEBUG_ASSERT(_M_size == __e.size()); 825*e4b17023SJohn Marino std::__valarray_copy(__e, _M_size, _Array<_Tp>(_M_data)); 826*e4b17023SJohn Marino return *this; 827*e4b17023SJohn Marino } 828*e4b17023SJohn Marino 829*e4b17023SJohn Marino template<typename _Tp> 830*e4b17023SJohn Marino inline _Expr<_SClos<_ValArray,_Tp>, _Tp> 831*e4b17023SJohn Marino valarray<_Tp>::operator[](slice __s) const 832*e4b17023SJohn Marino { 833*e4b17023SJohn Marino typedef _SClos<_ValArray,_Tp> _Closure; 834*e4b17023SJohn Marino return _Expr<_Closure, _Tp>(_Closure (_Array<_Tp>(_M_data), __s)); 835*e4b17023SJohn Marino } 836*e4b17023SJohn Marino 837*e4b17023SJohn Marino template<typename _Tp> 838*e4b17023SJohn Marino inline slice_array<_Tp> 839*e4b17023SJohn Marino valarray<_Tp>::operator[](slice __s) 840*e4b17023SJohn Marino { return slice_array<_Tp>(_Array<_Tp>(_M_data), __s); } 841*e4b17023SJohn Marino 842*e4b17023SJohn Marino template<typename _Tp> 843*e4b17023SJohn Marino inline _Expr<_GClos<_ValArray,_Tp>, _Tp> 844*e4b17023SJohn Marino valarray<_Tp>::operator[](const gslice& __gs) const 845*e4b17023SJohn Marino { 846*e4b17023SJohn Marino typedef _GClos<_ValArray,_Tp> _Closure; 847*e4b17023SJohn Marino return _Expr<_Closure, _Tp> 848*e4b17023SJohn Marino (_Closure(_Array<_Tp>(_M_data), __gs._M_index->_M_index)); 849*e4b17023SJohn Marino } 850*e4b17023SJohn Marino 851*e4b17023SJohn Marino template<typename _Tp> 852*e4b17023SJohn Marino inline gslice_array<_Tp> 853*e4b17023SJohn Marino valarray<_Tp>::operator[](const gslice& __gs) 854*e4b17023SJohn Marino { 855*e4b17023SJohn Marino return gslice_array<_Tp> 856*e4b17023SJohn Marino (_Array<_Tp>(_M_data), __gs._M_index->_M_index); 857*e4b17023SJohn Marino } 858*e4b17023SJohn Marino 859*e4b17023SJohn Marino template<typename _Tp> 860*e4b17023SJohn Marino inline valarray<_Tp> 861*e4b17023SJohn Marino valarray<_Tp>::operator[](const valarray<bool>& __m) const 862*e4b17023SJohn Marino { 863*e4b17023SJohn Marino size_t __s = 0; 864*e4b17023SJohn Marino size_t __e = __m.size(); 865*e4b17023SJohn Marino for (size_t __i=0; __i<__e; ++__i) 866*e4b17023SJohn Marino if (__m[__i]) ++__s; 867*e4b17023SJohn Marino return valarray<_Tp>(mask_array<_Tp>(_Array<_Tp>(_M_data), __s, 868*e4b17023SJohn Marino _Array<bool> (__m))); 869*e4b17023SJohn Marino } 870*e4b17023SJohn Marino 871*e4b17023SJohn Marino template<typename _Tp> 872*e4b17023SJohn Marino inline mask_array<_Tp> 873*e4b17023SJohn Marino valarray<_Tp>::operator[](const valarray<bool>& __m) 874*e4b17023SJohn Marino { 875*e4b17023SJohn Marino size_t __s = 0; 876*e4b17023SJohn Marino size_t __e = __m.size(); 877*e4b17023SJohn Marino for (size_t __i=0; __i<__e; ++__i) 878*e4b17023SJohn Marino if (__m[__i]) ++__s; 879*e4b17023SJohn Marino return mask_array<_Tp>(_Array<_Tp>(_M_data), __s, _Array<bool>(__m)); 880*e4b17023SJohn Marino } 881*e4b17023SJohn Marino 882*e4b17023SJohn Marino template<typename _Tp> 883*e4b17023SJohn Marino inline _Expr<_IClos<_ValArray,_Tp>, _Tp> 884*e4b17023SJohn Marino valarray<_Tp>::operator[](const valarray<size_t>& __i) const 885*e4b17023SJohn Marino { 886*e4b17023SJohn Marino typedef _IClos<_ValArray,_Tp> _Closure; 887*e4b17023SJohn Marino return _Expr<_Closure, _Tp>(_Closure(*this, __i)); 888*e4b17023SJohn Marino } 889*e4b17023SJohn Marino 890*e4b17023SJohn Marino template<typename _Tp> 891*e4b17023SJohn Marino inline indirect_array<_Tp> 892*e4b17023SJohn Marino valarray<_Tp>::operator[](const valarray<size_t>& __i) 893*e4b17023SJohn Marino { 894*e4b17023SJohn Marino return indirect_array<_Tp>(_Array<_Tp>(_M_data), __i.size(), 895*e4b17023SJohn Marino _Array<size_t>(__i)); 896*e4b17023SJohn Marino } 897*e4b17023SJohn Marino 898*e4b17023SJohn Marino#ifdef __GXX_EXPERIMENTAL_CXX0X__ 899*e4b17023SJohn Marino template<class _Tp> 900*e4b17023SJohn Marino inline void 901*e4b17023SJohn Marino valarray<_Tp>::swap(valarray<_Tp>& __v) noexcept 902*e4b17023SJohn Marino { 903*e4b17023SJohn Marino std::swap(_M_size, __v._M_size); 904*e4b17023SJohn Marino std::swap(_M_data, __v._M_data); 905*e4b17023SJohn Marino } 906*e4b17023SJohn Marino#endif 907*e4b17023SJohn Marino 908*e4b17023SJohn Marino template<class _Tp> 909*e4b17023SJohn Marino inline size_t 910*e4b17023SJohn Marino valarray<_Tp>::size() const 911*e4b17023SJohn Marino { return _M_size; } 912*e4b17023SJohn Marino 913*e4b17023SJohn Marino template<class _Tp> 914*e4b17023SJohn Marino inline _Tp 915*e4b17023SJohn Marino valarray<_Tp>::sum() const 916*e4b17023SJohn Marino { 917*e4b17023SJohn Marino _GLIBCXX_DEBUG_ASSERT(_M_size > 0); 918*e4b17023SJohn Marino return std::__valarray_sum(_M_data, _M_data + _M_size); 919*e4b17023SJohn Marino } 920*e4b17023SJohn Marino 921*e4b17023SJohn Marino template<class _Tp> 922*e4b17023SJohn Marino inline valarray<_Tp> 923*e4b17023SJohn Marino valarray<_Tp>::shift(int __n) const 924*e4b17023SJohn Marino { 925*e4b17023SJohn Marino valarray<_Tp> __ret; 926*e4b17023SJohn Marino 927*e4b17023SJohn Marino if (_M_size == 0) 928*e4b17023SJohn Marino return __ret; 929*e4b17023SJohn Marino 930*e4b17023SJohn Marino _Tp* __restrict__ __tmp_M_data = 931*e4b17023SJohn Marino std::__valarray_get_storage<_Tp>(_M_size); 932*e4b17023SJohn Marino 933*e4b17023SJohn Marino if (__n == 0) 934*e4b17023SJohn Marino std::__valarray_copy_construct(_M_data, 935*e4b17023SJohn Marino _M_data + _M_size, __tmp_M_data); 936*e4b17023SJohn Marino else if (__n > 0) // shift left 937*e4b17023SJohn Marino { 938*e4b17023SJohn Marino if (size_t(__n) > _M_size) 939*e4b17023SJohn Marino __n = int(_M_size); 940*e4b17023SJohn Marino 941*e4b17023SJohn Marino std::__valarray_copy_construct(_M_data + __n, 942*e4b17023SJohn Marino _M_data + _M_size, __tmp_M_data); 943*e4b17023SJohn Marino std::__valarray_default_construct(__tmp_M_data + _M_size - __n, 944*e4b17023SJohn Marino __tmp_M_data + _M_size); 945*e4b17023SJohn Marino } 946*e4b17023SJohn Marino else // shift right 947*e4b17023SJohn Marino { 948*e4b17023SJohn Marino if (-size_t(__n) > _M_size) 949*e4b17023SJohn Marino __n = -int(_M_size); 950*e4b17023SJohn Marino 951*e4b17023SJohn Marino std::__valarray_copy_construct(_M_data, _M_data + _M_size + __n, 952*e4b17023SJohn Marino __tmp_M_data - __n); 953*e4b17023SJohn Marino std::__valarray_default_construct(__tmp_M_data, 954*e4b17023SJohn Marino __tmp_M_data - __n); 955*e4b17023SJohn Marino } 956*e4b17023SJohn Marino 957*e4b17023SJohn Marino __ret._M_size = _M_size; 958*e4b17023SJohn Marino __ret._M_data = __tmp_M_data; 959*e4b17023SJohn Marino return __ret; 960*e4b17023SJohn Marino } 961*e4b17023SJohn Marino 962*e4b17023SJohn Marino template<class _Tp> 963*e4b17023SJohn Marino inline valarray<_Tp> 964*e4b17023SJohn Marino valarray<_Tp>::cshift(int __n) const 965*e4b17023SJohn Marino { 966*e4b17023SJohn Marino valarray<_Tp> __ret; 967*e4b17023SJohn Marino 968*e4b17023SJohn Marino if (_M_size == 0) 969*e4b17023SJohn Marino return __ret; 970*e4b17023SJohn Marino 971*e4b17023SJohn Marino _Tp* __restrict__ __tmp_M_data = 972*e4b17023SJohn Marino std::__valarray_get_storage<_Tp>(_M_size); 973*e4b17023SJohn Marino 974*e4b17023SJohn Marino if (__n == 0) 975*e4b17023SJohn Marino std::__valarray_copy_construct(_M_data, 976*e4b17023SJohn Marino _M_data + _M_size, __tmp_M_data); 977*e4b17023SJohn Marino else if (__n > 0) // cshift left 978*e4b17023SJohn Marino { 979*e4b17023SJohn Marino if (size_t(__n) > _M_size) 980*e4b17023SJohn Marino __n = int(__n % _M_size); 981*e4b17023SJohn Marino 982*e4b17023SJohn Marino std::__valarray_copy_construct(_M_data, _M_data + __n, 983*e4b17023SJohn Marino __tmp_M_data + _M_size - __n); 984*e4b17023SJohn Marino std::__valarray_copy_construct(_M_data + __n, _M_data + _M_size, 985*e4b17023SJohn Marino __tmp_M_data); 986*e4b17023SJohn Marino } 987*e4b17023SJohn Marino else // cshift right 988*e4b17023SJohn Marino { 989*e4b17023SJohn Marino if (-size_t(__n) > _M_size) 990*e4b17023SJohn Marino __n = -int(-size_t(__n) % _M_size); 991*e4b17023SJohn Marino 992*e4b17023SJohn Marino std::__valarray_copy_construct(_M_data + _M_size + __n, 993*e4b17023SJohn Marino _M_data + _M_size, __tmp_M_data); 994*e4b17023SJohn Marino std::__valarray_copy_construct(_M_data, _M_data + _M_size + __n, 995*e4b17023SJohn Marino __tmp_M_data - __n); 996*e4b17023SJohn Marino } 997*e4b17023SJohn Marino 998*e4b17023SJohn Marino __ret._M_size = _M_size; 999*e4b17023SJohn Marino __ret._M_data = __tmp_M_data; 1000*e4b17023SJohn Marino return __ret; 1001*e4b17023SJohn Marino } 1002*e4b17023SJohn Marino 1003*e4b17023SJohn Marino template<class _Tp> 1004*e4b17023SJohn Marino inline void 1005*e4b17023SJohn Marino valarray<_Tp>::resize(size_t __n, _Tp __c) 1006*e4b17023SJohn Marino { 1007*e4b17023SJohn Marino // This complication is so to make valarray<valarray<T> > work 1008*e4b17023SJohn Marino // even though it is not required by the standard. Nobody should 1009*e4b17023SJohn Marino // be saying valarray<valarray<T> > anyway. See the specs. 1010*e4b17023SJohn Marino std::__valarray_destroy_elements(_M_data, _M_data + _M_size); 1011*e4b17023SJohn Marino if (_M_size != __n) 1012*e4b17023SJohn Marino { 1013*e4b17023SJohn Marino std::__valarray_release_memory(_M_data); 1014*e4b17023SJohn Marino _M_size = __n; 1015*e4b17023SJohn Marino _M_data = __valarray_get_storage<_Tp>(__n); 1016*e4b17023SJohn Marino } 1017*e4b17023SJohn Marino std::__valarray_fill_construct(_M_data, _M_data + __n, __c); 1018*e4b17023SJohn Marino } 1019*e4b17023SJohn Marino 1020*e4b17023SJohn Marino template<typename _Tp> 1021*e4b17023SJohn Marino inline _Tp 1022*e4b17023SJohn Marino valarray<_Tp>::min() const 1023*e4b17023SJohn Marino { 1024*e4b17023SJohn Marino _GLIBCXX_DEBUG_ASSERT(_M_size > 0); 1025*e4b17023SJohn Marino return *std::min_element(_M_data, _M_data + _M_size); 1026*e4b17023SJohn Marino } 1027*e4b17023SJohn Marino 1028*e4b17023SJohn Marino template<typename _Tp> 1029*e4b17023SJohn Marino inline _Tp 1030*e4b17023SJohn Marino valarray<_Tp>::max() const 1031*e4b17023SJohn Marino { 1032*e4b17023SJohn Marino _GLIBCXX_DEBUG_ASSERT(_M_size > 0); 1033*e4b17023SJohn Marino return *std::max_element(_M_data, _M_data + _M_size); 1034*e4b17023SJohn Marino } 1035*e4b17023SJohn Marino 1036*e4b17023SJohn Marino template<class _Tp> 1037*e4b17023SJohn Marino inline _Expr<_ValFunClos<_ValArray, _Tp>, _Tp> 1038*e4b17023SJohn Marino valarray<_Tp>::apply(_Tp func(_Tp)) const 1039*e4b17023SJohn Marino { 1040*e4b17023SJohn Marino typedef _ValFunClos<_ValArray, _Tp> _Closure; 1041*e4b17023SJohn Marino return _Expr<_Closure, _Tp>(_Closure(*this, func)); 1042*e4b17023SJohn Marino } 1043*e4b17023SJohn Marino 1044*e4b17023SJohn Marino template<class _Tp> 1045*e4b17023SJohn Marino inline _Expr<_RefFunClos<_ValArray, _Tp>, _Tp> 1046*e4b17023SJohn Marino valarray<_Tp>::apply(_Tp func(const _Tp &)) const 1047*e4b17023SJohn Marino { 1048*e4b17023SJohn Marino typedef _RefFunClos<_ValArray, _Tp> _Closure; 1049*e4b17023SJohn Marino return _Expr<_Closure, _Tp>(_Closure(*this, func)); 1050*e4b17023SJohn Marino } 1051*e4b17023SJohn Marino 1052*e4b17023SJohn Marino#define _DEFINE_VALARRAY_UNARY_OPERATOR(_Op, _Name) \ 1053*e4b17023SJohn Marino template<typename _Tp> \ 1054*e4b17023SJohn Marino inline typename valarray<_Tp>::template _UnaryOp<_Name>::_Rt \ 1055*e4b17023SJohn Marino valarray<_Tp>::operator _Op() const \ 1056*e4b17023SJohn Marino { \ 1057*e4b17023SJohn Marino typedef _UnClos<_Name, _ValArray, _Tp> _Closure; \ 1058*e4b17023SJohn Marino typedef typename __fun<_Name, _Tp>::result_type _Rt; \ 1059*e4b17023SJohn Marino return _Expr<_Closure, _Rt>(_Closure(*this)); \ 1060*e4b17023SJohn Marino } 1061*e4b17023SJohn Marino 1062*e4b17023SJohn Marino _DEFINE_VALARRAY_UNARY_OPERATOR(+, __unary_plus) 1063*e4b17023SJohn Marino _DEFINE_VALARRAY_UNARY_OPERATOR(-, __negate) 1064*e4b17023SJohn Marino _DEFINE_VALARRAY_UNARY_OPERATOR(~, __bitwise_not) 1065*e4b17023SJohn Marino _DEFINE_VALARRAY_UNARY_OPERATOR (!, __logical_not) 1066*e4b17023SJohn Marino 1067*e4b17023SJohn Marino#undef _DEFINE_VALARRAY_UNARY_OPERATOR 1068*e4b17023SJohn Marino 1069*e4b17023SJohn Marino#define _DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(_Op, _Name) \ 1070*e4b17023SJohn Marino template<class _Tp> \ 1071*e4b17023SJohn Marino inline valarray<_Tp>& \ 1072*e4b17023SJohn Marino valarray<_Tp>::operator _Op##=(const _Tp &__t) \ 1073*e4b17023SJohn Marino { \ 1074*e4b17023SJohn Marino _Array_augmented_##_Name(_Array<_Tp>(_M_data), _M_size, __t); \ 1075*e4b17023SJohn Marino return *this; \ 1076*e4b17023SJohn Marino } \ 1077*e4b17023SJohn Marino \ 1078*e4b17023SJohn Marino template<class _Tp> \ 1079*e4b17023SJohn Marino inline valarray<_Tp>& \ 1080*e4b17023SJohn Marino valarray<_Tp>::operator _Op##=(const valarray<_Tp> &__v) \ 1081*e4b17023SJohn Marino { \ 1082*e4b17023SJohn Marino _GLIBCXX_DEBUG_ASSERT(_M_size == __v._M_size); \ 1083*e4b17023SJohn Marino _Array_augmented_##_Name(_Array<_Tp>(_M_data), _M_size, \ 1084*e4b17023SJohn Marino _Array<_Tp>(__v._M_data)); \ 1085*e4b17023SJohn Marino return *this; \ 1086*e4b17023SJohn Marino } 1087*e4b17023SJohn Marino 1088*e4b17023SJohn Marino_DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(+, __plus) 1089*e4b17023SJohn Marino_DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(-, __minus) 1090*e4b17023SJohn Marino_DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(*, __multiplies) 1091*e4b17023SJohn Marino_DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(/, __divides) 1092*e4b17023SJohn Marino_DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(%, __modulus) 1093*e4b17023SJohn Marino_DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(^, __bitwise_xor) 1094*e4b17023SJohn Marino_DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(&, __bitwise_and) 1095*e4b17023SJohn Marino_DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(|, __bitwise_or) 1096*e4b17023SJohn Marino_DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(<<, __shift_left) 1097*e4b17023SJohn Marino_DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(>>, __shift_right) 1098*e4b17023SJohn Marino 1099*e4b17023SJohn Marino#undef _DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT 1100*e4b17023SJohn Marino 1101*e4b17023SJohn Marino#define _DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(_Op, _Name) \ 1102*e4b17023SJohn Marino template<class _Tp> template<class _Dom> \ 1103*e4b17023SJohn Marino inline valarray<_Tp>& \ 1104*e4b17023SJohn Marino valarray<_Tp>::operator _Op##=(const _Expr<_Dom, _Tp>& __e) \ 1105*e4b17023SJohn Marino { \ 1106*e4b17023SJohn Marino _Array_augmented_##_Name(_Array<_Tp>(_M_data), __e, _M_size); \ 1107*e4b17023SJohn Marino return *this; \ 1108*e4b17023SJohn Marino } 1109*e4b17023SJohn Marino 1110*e4b17023SJohn Marino_DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(+, __plus) 1111*e4b17023SJohn Marino_DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(-, __minus) 1112*e4b17023SJohn Marino_DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(*, __multiplies) 1113*e4b17023SJohn Marino_DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(/, __divides) 1114*e4b17023SJohn Marino_DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(%, __modulus) 1115*e4b17023SJohn Marino_DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(^, __bitwise_xor) 1116*e4b17023SJohn Marino_DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(&, __bitwise_and) 1117*e4b17023SJohn Marino_DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(|, __bitwise_or) 1118*e4b17023SJohn Marino_DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(<<, __shift_left) 1119*e4b17023SJohn Marino_DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(>>, __shift_right) 1120*e4b17023SJohn Marino 1121*e4b17023SJohn Marino#undef _DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT 1122*e4b17023SJohn Marino 1123*e4b17023SJohn Marino 1124*e4b17023SJohn Marino#define _DEFINE_BINARY_OPERATOR(_Op, _Name) \ 1125*e4b17023SJohn Marino template<typename _Tp> \ 1126*e4b17023SJohn Marino inline _Expr<_BinClos<_Name, _ValArray, _ValArray, _Tp, _Tp>, \ 1127*e4b17023SJohn Marino typename __fun<_Name, _Tp>::result_type> \ 1128*e4b17023SJohn Marino operator _Op(const valarray<_Tp>& __v, const valarray<_Tp>& __w) \ 1129*e4b17023SJohn Marino { \ 1130*e4b17023SJohn Marino _GLIBCXX_DEBUG_ASSERT(__v.size() == __w.size()); \ 1131*e4b17023SJohn Marino typedef _BinClos<_Name, _ValArray, _ValArray, _Tp, _Tp> _Closure; \ 1132*e4b17023SJohn Marino typedef typename __fun<_Name, _Tp>::result_type _Rt; \ 1133*e4b17023SJohn Marino return _Expr<_Closure, _Rt>(_Closure(__v, __w)); \ 1134*e4b17023SJohn Marino } \ 1135*e4b17023SJohn Marino \ 1136*e4b17023SJohn Marino template<typename _Tp> \ 1137*e4b17023SJohn Marino inline _Expr<_BinClos<_Name, _ValArray,_Constant, _Tp, _Tp>, \ 1138*e4b17023SJohn Marino typename __fun<_Name, _Tp>::result_type> \ 1139*e4b17023SJohn Marino operator _Op(const valarray<_Tp>& __v, const _Tp& __t) \ 1140*e4b17023SJohn Marino { \ 1141*e4b17023SJohn Marino typedef _BinClos<_Name, _ValArray, _Constant, _Tp, _Tp> _Closure; \ 1142*e4b17023SJohn Marino typedef typename __fun<_Name, _Tp>::result_type _Rt; \ 1143*e4b17023SJohn Marino return _Expr<_Closure, _Rt>(_Closure(__v, __t)); \ 1144*e4b17023SJohn Marino } \ 1145*e4b17023SJohn Marino \ 1146*e4b17023SJohn Marino template<typename _Tp> \ 1147*e4b17023SJohn Marino inline _Expr<_BinClos<_Name, _Constant, _ValArray, _Tp, _Tp>, \ 1148*e4b17023SJohn Marino typename __fun<_Name, _Tp>::result_type> \ 1149*e4b17023SJohn Marino operator _Op(const _Tp& __t, const valarray<_Tp>& __v) \ 1150*e4b17023SJohn Marino { \ 1151*e4b17023SJohn Marino typedef _BinClos<_Name, _Constant, _ValArray, _Tp, _Tp> _Closure; \ 1152*e4b17023SJohn Marino typedef typename __fun<_Name, _Tp>::result_type _Rt; \ 1153*e4b17023SJohn Marino return _Expr<_Closure, _Rt>(_Closure(__t, __v)); \ 1154*e4b17023SJohn Marino } 1155*e4b17023SJohn Marino 1156*e4b17023SJohn Marino_DEFINE_BINARY_OPERATOR(+, __plus) 1157*e4b17023SJohn Marino_DEFINE_BINARY_OPERATOR(-, __minus) 1158*e4b17023SJohn Marino_DEFINE_BINARY_OPERATOR(*, __multiplies) 1159*e4b17023SJohn Marino_DEFINE_BINARY_OPERATOR(/, __divides) 1160*e4b17023SJohn Marino_DEFINE_BINARY_OPERATOR(%, __modulus) 1161*e4b17023SJohn Marino_DEFINE_BINARY_OPERATOR(^, __bitwise_xor) 1162*e4b17023SJohn Marino_DEFINE_BINARY_OPERATOR(&, __bitwise_and) 1163*e4b17023SJohn Marino_DEFINE_BINARY_OPERATOR(|, __bitwise_or) 1164*e4b17023SJohn Marino_DEFINE_BINARY_OPERATOR(<<, __shift_left) 1165*e4b17023SJohn Marino_DEFINE_BINARY_OPERATOR(>>, __shift_right) 1166*e4b17023SJohn Marino_DEFINE_BINARY_OPERATOR(&&, __logical_and) 1167*e4b17023SJohn Marino_DEFINE_BINARY_OPERATOR(||, __logical_or) 1168*e4b17023SJohn Marino_DEFINE_BINARY_OPERATOR(==, __equal_to) 1169*e4b17023SJohn Marino_DEFINE_BINARY_OPERATOR(!=, __not_equal_to) 1170*e4b17023SJohn Marino_DEFINE_BINARY_OPERATOR(<, __less) 1171*e4b17023SJohn Marino_DEFINE_BINARY_OPERATOR(>, __greater) 1172*e4b17023SJohn Marino_DEFINE_BINARY_OPERATOR(<=, __less_equal) 1173*e4b17023SJohn Marino_DEFINE_BINARY_OPERATOR(>=, __greater_equal) 1174*e4b17023SJohn Marino 1175*e4b17023SJohn Marino#undef _DEFINE_BINARY_OPERATOR 1176*e4b17023SJohn Marino 1177*e4b17023SJohn Marino#ifdef __GXX_EXPERIMENTAL_CXX0X__ 1178*e4b17023SJohn Marino /** 1179*e4b17023SJohn Marino * @brief Return an iterator pointing to the first element of 1180*e4b17023SJohn Marino * the valarray. 1181*e4b17023SJohn Marino * @param __va valarray. 1182*e4b17023SJohn Marino */ 1183*e4b17023SJohn Marino template<class _Tp> 1184*e4b17023SJohn Marino inline _Tp* 1185*e4b17023SJohn Marino begin(valarray<_Tp>& __va) 1186*e4b17023SJohn Marino { return std::__addressof(__va[0]); } 1187*e4b17023SJohn Marino 1188*e4b17023SJohn Marino /** 1189*e4b17023SJohn Marino * @brief Return an iterator pointing to the first element of 1190*e4b17023SJohn Marino * the const valarray. 1191*e4b17023SJohn Marino * @param __va valarray. 1192*e4b17023SJohn Marino */ 1193*e4b17023SJohn Marino template<class _Tp> 1194*e4b17023SJohn Marino inline const _Tp* 1195*e4b17023SJohn Marino begin(const valarray<_Tp>& __va) 1196*e4b17023SJohn Marino { return std::__addressof(__va[0]); } 1197*e4b17023SJohn Marino 1198*e4b17023SJohn Marino /** 1199*e4b17023SJohn Marino * @brief Return an iterator pointing to one past the last element of 1200*e4b17023SJohn Marino * the valarray. 1201*e4b17023SJohn Marino * @param __va valarray. 1202*e4b17023SJohn Marino */ 1203*e4b17023SJohn Marino template<class _Tp> 1204*e4b17023SJohn Marino inline _Tp* 1205*e4b17023SJohn Marino end(valarray<_Tp>& __va) 1206*e4b17023SJohn Marino { return std::__addressof(__va[0]) + __va.size(); } 1207*e4b17023SJohn Marino 1208*e4b17023SJohn Marino /** 1209*e4b17023SJohn Marino * @brief Return an iterator pointing to one past the last element of 1210*e4b17023SJohn Marino * the const valarray. 1211*e4b17023SJohn Marino * @param __va valarray. 1212*e4b17023SJohn Marino */ 1213*e4b17023SJohn Marino template<class _Tp> 1214*e4b17023SJohn Marino inline const _Tp* 1215*e4b17023SJohn Marino end(const valarray<_Tp>& __va) 1216*e4b17023SJohn Marino { return std::__addressof(__va[0]) + __va.size(); } 1217*e4b17023SJohn Marino#endif // __GXX_EXPERIMENTAL_CXX0X__ 1218*e4b17023SJohn Marino 1219*e4b17023SJohn Marino // @} group numeric_arrays 1220*e4b17023SJohn Marino 1221*e4b17023SJohn Marino_GLIBCXX_END_NAMESPACE_VERSION 1222*e4b17023SJohn Marino} // namespace 1223*e4b17023SJohn Marino 1224*e4b17023SJohn Marino#endif /* _GLIBCXX_VALARRAY */ 1225