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