11debfc3dSmrg// The template and inlines for the -*- C++ -*- valarray class. 21debfc3dSmrg 38feb0f0bSmrg// Copyright (C) 1997-2020 Free Software Foundation, Inc. 41debfc3dSmrg// 51debfc3dSmrg// This file is part of the GNU ISO C++ Library. This library is free 61debfc3dSmrg// software; you can redistribute it and/or modify it under the 71debfc3dSmrg// terms of the GNU General Public License as published by the 81debfc3dSmrg// Free Software Foundation; either version 3, or (at your option) 91debfc3dSmrg// any later version. 101debfc3dSmrg 111debfc3dSmrg// This library is distributed in the hope that it will be useful, 121debfc3dSmrg// but WITHOUT ANY WARRANTY; without even the implied warranty of 131debfc3dSmrg// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 141debfc3dSmrg// GNU General Public License for more details. 151debfc3dSmrg 161debfc3dSmrg// Under Section 7 of GPL version 3, you are granted additional 171debfc3dSmrg// permissions described in the GCC Runtime Library Exception, version 181debfc3dSmrg// 3.1, as published by the Free Software Foundation. 191debfc3dSmrg 201debfc3dSmrg// You should have received a copy of the GNU General Public License and 211debfc3dSmrg// a copy of the GCC Runtime Library Exception along with this program; 221debfc3dSmrg// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 231debfc3dSmrg// <http://www.gnu.org/licenses/>. 241debfc3dSmrg 251debfc3dSmrg/** @file include/valarray 261debfc3dSmrg * This is a Standard C++ Library header. 271debfc3dSmrg */ 281debfc3dSmrg 291debfc3dSmrg// Written by Gabriel Dos Reis <Gabriel.Dos-Reis@DPTMaths.ENS-Cachan.Fr> 301debfc3dSmrg 311debfc3dSmrg#ifndef _GLIBCXX_VALARRAY 321debfc3dSmrg#define _GLIBCXX_VALARRAY 1 331debfc3dSmrg 341debfc3dSmrg#pragma GCC system_header 351debfc3dSmrg 361debfc3dSmrg#include <bits/c++config.h> 371debfc3dSmrg#include <cmath> 381debfc3dSmrg#include <algorithm> 391debfc3dSmrg#include <debug/debug.h> 401debfc3dSmrg#if __cplusplus >= 201103L 411debfc3dSmrg#include <initializer_list> 421debfc3dSmrg#endif 431debfc3dSmrg 441debfc3dSmrgnamespace std _GLIBCXX_VISIBILITY(default) 451debfc3dSmrg{ 461debfc3dSmrg_GLIBCXX_BEGIN_NAMESPACE_VERSION 471debfc3dSmrg 481debfc3dSmrg template<class _Clos, typename _Tp> 491debfc3dSmrg class _Expr; 501debfc3dSmrg 511debfc3dSmrg template<typename _Tp1, typename _Tp2> 521debfc3dSmrg class _ValArray; 531debfc3dSmrg 54c0a68be4Smrgnamespace __detail 55c0a68be4Smrg{ 561debfc3dSmrg template<class _Oper, template<class, class> class _Meta, class _Dom> 571debfc3dSmrg struct _UnClos; 581debfc3dSmrg 591debfc3dSmrg template<class _Oper, 601debfc3dSmrg template<class, class> class _Meta1, 611debfc3dSmrg template<class, class> class _Meta2, 621debfc3dSmrg class _Dom1, class _Dom2> 631debfc3dSmrg class _BinClos; 641debfc3dSmrg 651debfc3dSmrg template<template<class, class> class _Meta, class _Dom> 661debfc3dSmrg class _SClos; 671debfc3dSmrg 681debfc3dSmrg template<template<class, class> class _Meta, class _Dom> 691debfc3dSmrg class _GClos; 701debfc3dSmrg 711debfc3dSmrg template<template<class, class> class _Meta, class _Dom> 721debfc3dSmrg class _IClos; 731debfc3dSmrg 741debfc3dSmrg template<template<class, class> class _Meta, class _Dom> 751debfc3dSmrg class _ValFunClos; 761debfc3dSmrg 771debfc3dSmrg template<template<class, class> class _Meta, class _Dom> 781debfc3dSmrg class _RefFunClos; 79c0a68be4Smrg} // namespace __detail 80c0a68be4Smrg 81c0a68be4Smrg using __detail::_UnClos; 82c0a68be4Smrg using __detail::_BinClos; 83c0a68be4Smrg using __detail::_SClos; 84c0a68be4Smrg using __detail::_GClos; 85c0a68be4Smrg using __detail::_IClos; 86c0a68be4Smrg using __detail::_ValFunClos; 87c0a68be4Smrg using __detail::_RefFunClos; 881debfc3dSmrg 891debfc3dSmrg template<class _Tp> class valarray; // An array of type _Tp 901debfc3dSmrg class slice; // BLAS-like slice out of an array 911debfc3dSmrg template<class _Tp> class slice_array; 921debfc3dSmrg class gslice; // generalized slice out of an array 931debfc3dSmrg template<class _Tp> class gslice_array; 941debfc3dSmrg template<class _Tp> class mask_array; // masked array 951debfc3dSmrg template<class _Tp> class indirect_array; // indirected array 961debfc3dSmrg 971debfc3dSmrg_GLIBCXX_END_NAMESPACE_VERSION 981debfc3dSmrg} // namespace 991debfc3dSmrg 1001debfc3dSmrg#include <bits/valarray_array.h> 1011debfc3dSmrg#include <bits/valarray_before.h> 1021debfc3dSmrg 1031debfc3dSmrgnamespace std _GLIBCXX_VISIBILITY(default) 1041debfc3dSmrg{ 1051debfc3dSmrg_GLIBCXX_BEGIN_NAMESPACE_VERSION 1061debfc3dSmrg 1071debfc3dSmrg /** 1081debfc3dSmrg * @defgroup numeric_arrays Numeric Arrays 1091debfc3dSmrg * @ingroup numerics 1101debfc3dSmrg * 1111debfc3dSmrg * Classes and functions for representing and manipulating arrays of elements. 1121debfc3dSmrg * @{ 1131debfc3dSmrg */ 1141debfc3dSmrg 1151debfc3dSmrg /** 1161debfc3dSmrg * @brief Smart array designed to support numeric processing. 1171debfc3dSmrg * 1181debfc3dSmrg * A valarray is an array that provides constraints intended to allow for 1191debfc3dSmrg * effective optimization of numeric array processing by reducing the 1201debfc3dSmrg * aliasing that can result from pointer representations. It represents a 1211debfc3dSmrg * one-dimensional array from which different multidimensional subsets can 1221debfc3dSmrg * be accessed and modified. 1231debfc3dSmrg * 1241debfc3dSmrg * @tparam _Tp Type of object in the array. 1251debfc3dSmrg */ 1261debfc3dSmrg template<class _Tp> 1271debfc3dSmrg class valarray 1281debfc3dSmrg { 1291debfc3dSmrg template<class _Op> 1301debfc3dSmrg struct _UnaryOp 1311debfc3dSmrg { 1321debfc3dSmrg typedef typename __fun<_Op, _Tp>::result_type __rt; 1331debfc3dSmrg typedef _Expr<_UnClos<_Op, _ValArray, _Tp>, __rt> _Rt; 1341debfc3dSmrg }; 1351debfc3dSmrg public: 1361debfc3dSmrg typedef _Tp value_type; 1371debfc3dSmrg 1381debfc3dSmrg // _lib.valarray.cons_ construct/destroy: 1391debfc3dSmrg /// Construct an empty array. 1401debfc3dSmrg valarray(); 1411debfc3dSmrg 1421debfc3dSmrg /// Construct an array with @a n elements. 1431debfc3dSmrg explicit valarray(size_t); 1441debfc3dSmrg 1451debfc3dSmrg /// Construct an array with @a n elements initialized to @a t. 1461debfc3dSmrg valarray(const _Tp&, size_t); 1471debfc3dSmrg 1481debfc3dSmrg /// Construct an array initialized to the first @a n elements of @a t. 1491debfc3dSmrg valarray(const _Tp* __restrict__, size_t); 1501debfc3dSmrg 1511debfc3dSmrg /// Copy constructor. 1521debfc3dSmrg valarray(const valarray&); 1531debfc3dSmrg 1541debfc3dSmrg#if __cplusplus >= 201103L 1551debfc3dSmrg /// Move constructor. 1561debfc3dSmrg valarray(valarray&&) noexcept; 1571debfc3dSmrg#endif 1581debfc3dSmrg 1591debfc3dSmrg /// Construct an array with the same size and values in @a sa. 1601debfc3dSmrg valarray(const slice_array<_Tp>&); 1611debfc3dSmrg 1621debfc3dSmrg /// Construct an array with the same size and values in @a ga. 1631debfc3dSmrg valarray(const gslice_array<_Tp>&); 1641debfc3dSmrg 1651debfc3dSmrg /// Construct an array with the same size and values in @a ma. 1661debfc3dSmrg valarray(const mask_array<_Tp>&); 1671debfc3dSmrg 1681debfc3dSmrg /// Construct an array with the same size and values in @a ia. 1691debfc3dSmrg valarray(const indirect_array<_Tp>&); 1701debfc3dSmrg 1711debfc3dSmrg#if __cplusplus >= 201103L 1721debfc3dSmrg /// Construct an array with an initializer_list of values. 1731debfc3dSmrg valarray(initializer_list<_Tp>); 1741debfc3dSmrg#endif 1751debfc3dSmrg 1761debfc3dSmrg template<class _Dom> 1771debfc3dSmrg valarray(const _Expr<_Dom, _Tp>& __e); 1781debfc3dSmrg 1791debfc3dSmrg ~valarray() _GLIBCXX_NOEXCEPT; 1801debfc3dSmrg 1811debfc3dSmrg // _lib.valarray.assign_ assignment: 1821debfc3dSmrg /** 1831debfc3dSmrg * @brief Assign elements to an array. 1841debfc3dSmrg * 1851debfc3dSmrg * Assign elements of array to values in @a v. 1861debfc3dSmrg * 1871debfc3dSmrg * @param __v Valarray to get values from. 1881debfc3dSmrg */ 1891debfc3dSmrg valarray<_Tp>& operator=(const valarray<_Tp>& __v); 1901debfc3dSmrg 1911debfc3dSmrg#if __cplusplus >= 201103L 1921debfc3dSmrg /** 1931debfc3dSmrg * @brief Move assign elements to an array. 1941debfc3dSmrg * 1951debfc3dSmrg * Move assign elements of array to values in @a v. 1961debfc3dSmrg * 1971debfc3dSmrg * @param __v Valarray to get values from. 1981debfc3dSmrg */ 1991debfc3dSmrg valarray<_Tp>& operator=(valarray<_Tp>&& __v) noexcept; 2001debfc3dSmrg#endif 2011debfc3dSmrg 2021debfc3dSmrg /** 2031debfc3dSmrg * @brief Assign elements to a value. 2041debfc3dSmrg * 2051debfc3dSmrg * Assign all elements of array to @a t. 2061debfc3dSmrg * 2071debfc3dSmrg * @param __t Value for elements. 2081debfc3dSmrg */ 2091debfc3dSmrg valarray<_Tp>& operator=(const _Tp& __t); 2101debfc3dSmrg 2111debfc3dSmrg /** 2121debfc3dSmrg * @brief Assign elements to an array subset. 2131debfc3dSmrg * 2141debfc3dSmrg * Assign elements of array to values in @a sa. Results are undefined 2151debfc3dSmrg * if @a sa does not have the same size as this array. 2161debfc3dSmrg * 2171debfc3dSmrg * @param __sa Array slice to get values from. 2181debfc3dSmrg */ 2191debfc3dSmrg valarray<_Tp>& operator=(const slice_array<_Tp>& __sa); 2201debfc3dSmrg 2211debfc3dSmrg /** 2221debfc3dSmrg * @brief Assign elements to an array subset. 2231debfc3dSmrg * 2241debfc3dSmrg * Assign elements of array to values in @a ga. Results are undefined 2251debfc3dSmrg * if @a ga does not have the same size as this array. 2261debfc3dSmrg * 2271debfc3dSmrg * @param __ga Array slice to get values from. 2281debfc3dSmrg */ 2291debfc3dSmrg valarray<_Tp>& operator=(const gslice_array<_Tp>& __ga); 2301debfc3dSmrg 2311debfc3dSmrg /** 2321debfc3dSmrg * @brief Assign elements to an array subset. 2331debfc3dSmrg * 2341debfc3dSmrg * Assign elements of array to values in @a ma. Results are undefined 2351debfc3dSmrg * if @a ma does not have the same size as this array. 2361debfc3dSmrg * 2371debfc3dSmrg * @param __ma Array slice to get values from. 2381debfc3dSmrg */ 2391debfc3dSmrg valarray<_Tp>& operator=(const mask_array<_Tp>& __ma); 2401debfc3dSmrg 2411debfc3dSmrg /** 2421debfc3dSmrg * @brief Assign elements to an array subset. 2431debfc3dSmrg * 2441debfc3dSmrg * Assign elements of array to values in @a ia. Results are undefined 2451debfc3dSmrg * if @a ia does not have the same size as this array. 2461debfc3dSmrg * 2471debfc3dSmrg * @param __ia Array slice to get values from. 2481debfc3dSmrg */ 2491debfc3dSmrg valarray<_Tp>& operator=(const indirect_array<_Tp>& __ia); 2501debfc3dSmrg 2511debfc3dSmrg#if __cplusplus >= 201103L 2521debfc3dSmrg /** 2531debfc3dSmrg * @brief Assign elements to an initializer_list. 2541debfc3dSmrg * 2551debfc3dSmrg * Assign elements of array to values in @a __l. Results are undefined 2561debfc3dSmrg * if @a __l does not have the same size as this array. 2571debfc3dSmrg * 2581debfc3dSmrg * @param __l initializer_list to get values from. 2591debfc3dSmrg */ 2601debfc3dSmrg valarray& operator=(initializer_list<_Tp> __l); 2611debfc3dSmrg#endif 2621debfc3dSmrg 2631debfc3dSmrg template<class _Dom> valarray<_Tp>& 2641debfc3dSmrg operator= (const _Expr<_Dom, _Tp>&); 2651debfc3dSmrg 2661debfc3dSmrg // _lib.valarray.access_ element access: 2671debfc3dSmrg /** 2681debfc3dSmrg * Return a reference to the i'th array element. 2691debfc3dSmrg * 2701debfc3dSmrg * @param __i Index of element to return. 2711debfc3dSmrg * @return Reference to the i'th element. 2721debfc3dSmrg */ 2731debfc3dSmrg _Tp& operator[](size_t __i); 2741debfc3dSmrg 2751debfc3dSmrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 2761debfc3dSmrg // 389. Const overload of valarray::operator[] returns by value. 2771debfc3dSmrg const _Tp& operator[](size_t) const; 2781debfc3dSmrg 2791debfc3dSmrg // _lib.valarray.sub_ subset operations: 2801debfc3dSmrg /** 2811debfc3dSmrg * @brief Return an array subset. 2821debfc3dSmrg * 2831debfc3dSmrg * Returns a new valarray containing the elements of the array 2841debfc3dSmrg * indicated by the slice argument. The new valarray has the same size 2851debfc3dSmrg * as the input slice. @see slice. 2861debfc3dSmrg * 2871debfc3dSmrg * @param __s The source slice. 2881debfc3dSmrg * @return New valarray containing elements in @a __s. 2891debfc3dSmrg */ 2901debfc3dSmrg _Expr<_SClos<_ValArray, _Tp>, _Tp> operator[](slice __s) const; 2911debfc3dSmrg 2921debfc3dSmrg /** 2931debfc3dSmrg * @brief Return a reference to an array subset. 2941debfc3dSmrg * 2951debfc3dSmrg * Returns a new valarray containing the elements of the array 2961debfc3dSmrg * indicated by the slice argument. The new valarray has the same size 2971debfc3dSmrg * as the input slice. @see slice. 2981debfc3dSmrg * 2991debfc3dSmrg * @param __s The source slice. 3001debfc3dSmrg * @return New valarray containing elements in @a __s. 3011debfc3dSmrg */ 3021debfc3dSmrg slice_array<_Tp> operator[](slice __s); 3031debfc3dSmrg 3041debfc3dSmrg /** 3051debfc3dSmrg * @brief Return an array subset. 3061debfc3dSmrg * 3071debfc3dSmrg * Returns a slice_array referencing the elements of the array 3081debfc3dSmrg * indicated by the slice argument. @see gslice. 3091debfc3dSmrg * 3101debfc3dSmrg * @param __s The source slice. 3111debfc3dSmrg * @return Slice_array referencing elements indicated by @a __s. 3121debfc3dSmrg */ 3131debfc3dSmrg _Expr<_GClos<_ValArray, _Tp>, _Tp> operator[](const gslice& __s) const; 3141debfc3dSmrg 3151debfc3dSmrg /** 3161debfc3dSmrg * @brief Return a reference to an array subset. 3171debfc3dSmrg * 3181debfc3dSmrg * Returns a new valarray containing the elements of the array 3191debfc3dSmrg * indicated by the gslice argument. The new valarray has 3201debfc3dSmrg * the same size as the input gslice. @see gslice. 3211debfc3dSmrg * 3221debfc3dSmrg * @param __s The source gslice. 3231debfc3dSmrg * @return New valarray containing elements in @a __s. 3241debfc3dSmrg */ 3251debfc3dSmrg gslice_array<_Tp> operator[](const gslice& __s); 3261debfc3dSmrg 3271debfc3dSmrg /** 3281debfc3dSmrg * @brief Return an array subset. 3291debfc3dSmrg * 3301debfc3dSmrg * Returns a new valarray containing the elements of the array 3311debfc3dSmrg * indicated by the argument. The input is a valarray of bool which 3321debfc3dSmrg * represents a bitmask indicating which elements should be copied into 3331debfc3dSmrg * the new valarray. Each element of the array is added to the return 3341debfc3dSmrg * valarray if the corresponding element of the argument is true. 3351debfc3dSmrg * 3361debfc3dSmrg * @param __m The valarray bitmask. 3371debfc3dSmrg * @return New valarray containing elements indicated by @a __m. 3381debfc3dSmrg */ 3391debfc3dSmrg valarray<_Tp> operator[](const valarray<bool>& __m) const; 3401debfc3dSmrg 3411debfc3dSmrg /** 3421debfc3dSmrg * @brief Return a reference to an array subset. 3431debfc3dSmrg * 3441debfc3dSmrg * Returns a new mask_array referencing the elements of the array 3451debfc3dSmrg * indicated by the argument. The input is a valarray of bool which 3461debfc3dSmrg * represents a bitmask indicating which elements are part of the 3471debfc3dSmrg * subset. Elements of the array are part of the subset if the 3481debfc3dSmrg * corresponding element of the argument is true. 3491debfc3dSmrg * 3501debfc3dSmrg * @param __m The valarray bitmask. 3511debfc3dSmrg * @return New valarray containing elements indicated by @a __m. 3521debfc3dSmrg */ 3531debfc3dSmrg mask_array<_Tp> operator[](const valarray<bool>& __m); 3541debfc3dSmrg 3551debfc3dSmrg /** 3561debfc3dSmrg * @brief Return an array subset. 3571debfc3dSmrg * 3581debfc3dSmrg * Returns a new valarray containing the elements of the array 3591debfc3dSmrg * indicated by the argument. The elements in the argument are 3601debfc3dSmrg * interpreted as the indices of elements of this valarray to copy to 3611debfc3dSmrg * the return valarray. 3621debfc3dSmrg * 3631debfc3dSmrg * @param __i The valarray element index list. 3641debfc3dSmrg * @return New valarray containing elements in @a __s. 3651debfc3dSmrg */ 3661debfc3dSmrg _Expr<_IClos<_ValArray, _Tp>, _Tp> 3671debfc3dSmrg operator[](const valarray<size_t>& __i) const; 3681debfc3dSmrg 3691debfc3dSmrg /** 3701debfc3dSmrg * @brief Return a reference to an array subset. 3711debfc3dSmrg * 3721debfc3dSmrg * Returns an indirect_array referencing the elements of the array 3731debfc3dSmrg * indicated by the argument. The elements in the argument are 3741debfc3dSmrg * interpreted as the indices of elements of this valarray to include 3751debfc3dSmrg * in the subset. The returned indirect_array refers to these 3761debfc3dSmrg * elements. 3771debfc3dSmrg * 3781debfc3dSmrg * @param __i The valarray element index list. 3791debfc3dSmrg * @return Indirect_array referencing elements in @a __i. 3801debfc3dSmrg */ 3811debfc3dSmrg indirect_array<_Tp> operator[](const valarray<size_t>& __i); 3821debfc3dSmrg 3831debfc3dSmrg // _lib.valarray.unary_ unary operators: 3841debfc3dSmrg /// Return a new valarray by applying unary + to each element. 3851debfc3dSmrg typename _UnaryOp<__unary_plus>::_Rt operator+() const; 3861debfc3dSmrg 3871debfc3dSmrg /// Return a new valarray by applying unary - to each element. 3881debfc3dSmrg typename _UnaryOp<__negate>::_Rt operator-() const; 3891debfc3dSmrg 3901debfc3dSmrg /// Return a new valarray by applying unary ~ to each element. 3911debfc3dSmrg typename _UnaryOp<__bitwise_not>::_Rt operator~() const; 3921debfc3dSmrg 3931debfc3dSmrg /// Return a new valarray by applying unary ! to each element. 3941debfc3dSmrg typename _UnaryOp<__logical_not>::_Rt operator!() const; 3951debfc3dSmrg 3961debfc3dSmrg // _lib.valarray.cassign_ computed assignment: 3971debfc3dSmrg /// Multiply each element of array by @a t. 3981debfc3dSmrg valarray<_Tp>& operator*=(const _Tp&); 3991debfc3dSmrg 4001debfc3dSmrg /// Divide each element of array by @a t. 4011debfc3dSmrg valarray<_Tp>& operator/=(const _Tp&); 4021debfc3dSmrg 4031debfc3dSmrg /// Set each element e of array to e % @a t. 4041debfc3dSmrg valarray<_Tp>& operator%=(const _Tp&); 4051debfc3dSmrg 4061debfc3dSmrg /// Add @a t to each element of array. 4071debfc3dSmrg valarray<_Tp>& operator+=(const _Tp&); 4081debfc3dSmrg 4091debfc3dSmrg /// Subtract @a t to each element of array. 4101debfc3dSmrg valarray<_Tp>& operator-=(const _Tp&); 4111debfc3dSmrg 4121debfc3dSmrg /// Set each element e of array to e ^ @a t. 4131debfc3dSmrg valarray<_Tp>& operator^=(const _Tp&); 4141debfc3dSmrg 4151debfc3dSmrg /// Set each element e of array to e & @a t. 4161debfc3dSmrg valarray<_Tp>& operator&=(const _Tp&); 4171debfc3dSmrg 4181debfc3dSmrg /// Set each element e of array to e | @a t. 4191debfc3dSmrg valarray<_Tp>& operator|=(const _Tp&); 4201debfc3dSmrg 4211debfc3dSmrg /// Left shift each element e of array by @a t bits. 4221debfc3dSmrg valarray<_Tp>& operator<<=(const _Tp&); 4231debfc3dSmrg 4241debfc3dSmrg /// Right shift each element e of array by @a t bits. 4251debfc3dSmrg valarray<_Tp>& operator>>=(const _Tp&); 4261debfc3dSmrg 4271debfc3dSmrg /// Multiply elements of array by corresponding elements of @a v. 4281debfc3dSmrg valarray<_Tp>& operator*=(const valarray<_Tp>&); 4291debfc3dSmrg 4301debfc3dSmrg /// Divide elements of array by corresponding elements of @a v. 4311debfc3dSmrg valarray<_Tp>& operator/=(const valarray<_Tp>&); 4321debfc3dSmrg 4331debfc3dSmrg /// Modulo elements of array by corresponding elements of @a v. 4341debfc3dSmrg valarray<_Tp>& operator%=(const valarray<_Tp>&); 4351debfc3dSmrg 4361debfc3dSmrg /// Add corresponding elements of @a v to elements of array. 4371debfc3dSmrg valarray<_Tp>& operator+=(const valarray<_Tp>&); 4381debfc3dSmrg 4391debfc3dSmrg /// Subtract corresponding elements of @a v from elements of array. 4401debfc3dSmrg valarray<_Tp>& operator-=(const valarray<_Tp>&); 4411debfc3dSmrg 4421debfc3dSmrg /// Logical xor corresponding elements of @a v with elements of array. 4431debfc3dSmrg valarray<_Tp>& operator^=(const valarray<_Tp>&); 4441debfc3dSmrg 4451debfc3dSmrg /// Logical or corresponding elements of @a v with elements of array. 4461debfc3dSmrg valarray<_Tp>& operator|=(const valarray<_Tp>&); 4471debfc3dSmrg 4481debfc3dSmrg /// Logical and corresponding elements of @a v with elements of array. 4491debfc3dSmrg valarray<_Tp>& operator&=(const valarray<_Tp>&); 4501debfc3dSmrg 4511debfc3dSmrg /// Left shift elements of array by corresponding elements of @a v. 4521debfc3dSmrg valarray<_Tp>& operator<<=(const valarray<_Tp>&); 4531debfc3dSmrg 4541debfc3dSmrg /// Right shift elements of array by corresponding elements of @a v. 4551debfc3dSmrg valarray<_Tp>& operator>>=(const valarray<_Tp>&); 4561debfc3dSmrg 4571debfc3dSmrg template<class _Dom> 4581debfc3dSmrg valarray<_Tp>& operator*=(const _Expr<_Dom, _Tp>&); 4591debfc3dSmrg template<class _Dom> 4601debfc3dSmrg valarray<_Tp>& operator/=(const _Expr<_Dom, _Tp>&); 4611debfc3dSmrg template<class _Dom> 4621debfc3dSmrg valarray<_Tp>& operator%=(const _Expr<_Dom, _Tp>&); 4631debfc3dSmrg template<class _Dom> 4641debfc3dSmrg valarray<_Tp>& operator+=(const _Expr<_Dom, _Tp>&); 4651debfc3dSmrg template<class _Dom> 4661debfc3dSmrg valarray<_Tp>& operator-=(const _Expr<_Dom, _Tp>&); 4671debfc3dSmrg template<class _Dom> 4681debfc3dSmrg valarray<_Tp>& operator^=(const _Expr<_Dom, _Tp>&); 4691debfc3dSmrg template<class _Dom> 4701debfc3dSmrg valarray<_Tp>& operator|=(const _Expr<_Dom, _Tp>&); 4711debfc3dSmrg template<class _Dom> 4721debfc3dSmrg valarray<_Tp>& operator&=(const _Expr<_Dom, _Tp>&); 4731debfc3dSmrg template<class _Dom> 4741debfc3dSmrg valarray<_Tp>& operator<<=(const _Expr<_Dom, _Tp>&); 4751debfc3dSmrg template<class _Dom> 4761debfc3dSmrg valarray<_Tp>& operator>>=(const _Expr<_Dom, _Tp>&); 4771debfc3dSmrg 4781debfc3dSmrg // _lib.valarray.members_ member functions: 4791debfc3dSmrg#if __cplusplus >= 201103L 4801debfc3dSmrg /// Swap. 4811debfc3dSmrg void swap(valarray<_Tp>& __v) noexcept; 4821debfc3dSmrg#endif 4831debfc3dSmrg 4841debfc3dSmrg /// Return the number of elements in array. 4851debfc3dSmrg size_t size() const; 4861debfc3dSmrg 4871debfc3dSmrg /** 4881debfc3dSmrg * @brief Return the sum of all elements in the array. 4891debfc3dSmrg * 4901debfc3dSmrg * Accumulates the sum of all elements into a Tp using +=. The order 4911debfc3dSmrg * of adding the elements is unspecified. 4921debfc3dSmrg */ 4931debfc3dSmrg _Tp sum() const; 4941debfc3dSmrg 4951debfc3dSmrg /// Return the minimum element using operator<(). 4961debfc3dSmrg _Tp min() const; 4971debfc3dSmrg 4981debfc3dSmrg /// Return the maximum element using operator<(). 4991debfc3dSmrg _Tp max() const; 5001debfc3dSmrg 5011debfc3dSmrg /** 5021debfc3dSmrg * @brief Return a shifted array. 5031debfc3dSmrg * 5041debfc3dSmrg * A new valarray is constructed as a copy of this array with elements 5051debfc3dSmrg * in shifted positions. For an element with index i, the new position 5061debfc3dSmrg * is i - n. The new valarray has the same size as the current one. 5071debfc3dSmrg * New elements without a value are set to 0. Elements whose new 5081debfc3dSmrg * position is outside the bounds of the array are discarded. 5091debfc3dSmrg * 5101debfc3dSmrg * Positive arguments shift toward index 0, discarding elements [0, n). 5111debfc3dSmrg * Negative arguments discard elements from the top of the array. 5121debfc3dSmrg * 5131debfc3dSmrg * @param __n Number of element positions to shift. 5141debfc3dSmrg * @return New valarray with elements in shifted positions. 5151debfc3dSmrg */ 5161debfc3dSmrg valarray<_Tp> shift (int __n) const; 5171debfc3dSmrg 5181debfc3dSmrg /** 5191debfc3dSmrg * @brief Return a rotated array. 5201debfc3dSmrg * 5211debfc3dSmrg * A new valarray is constructed as a copy of this array with elements 5221debfc3dSmrg * in shifted positions. For an element with index i, the new position 5231debfc3dSmrg * is (i - n) % size(). The new valarray has the same size as the 5241debfc3dSmrg * current one. Elements that are shifted beyond the array bounds are 5251debfc3dSmrg * shifted into the other end of the array. No elements are lost. 5261debfc3dSmrg * 5271debfc3dSmrg * Positive arguments shift toward index 0, wrapping around the top. 5281debfc3dSmrg * Negative arguments shift towards the top, wrapping around to 0. 5291debfc3dSmrg * 5301debfc3dSmrg * @param __n Number of element positions to rotate. 5311debfc3dSmrg * @return New valarray with elements in shifted positions. 5321debfc3dSmrg */ 5331debfc3dSmrg valarray<_Tp> cshift(int __n) const; 5341debfc3dSmrg 5351debfc3dSmrg /** 5361debfc3dSmrg * @brief Apply a function to the array. 5371debfc3dSmrg * 5381debfc3dSmrg * Returns a new valarray with elements assigned to the result of 5391debfc3dSmrg * applying func to the corresponding element of this array. The new 5401debfc3dSmrg * array has the same size as this one. 5411debfc3dSmrg * 5421debfc3dSmrg * @param func Function of Tp returning Tp to apply. 5431debfc3dSmrg * @return New valarray with transformed elements. 5441debfc3dSmrg */ 5451debfc3dSmrg _Expr<_ValFunClos<_ValArray, _Tp>, _Tp> apply(_Tp func(_Tp)) const; 5461debfc3dSmrg 5471debfc3dSmrg /** 5481debfc3dSmrg * @brief Apply a function to the array. 5491debfc3dSmrg * 5501debfc3dSmrg * Returns a new valarray with elements assigned to the result of 5511debfc3dSmrg * applying func to the corresponding element of this array. The new 5521debfc3dSmrg * array has the same size as this one. 5531debfc3dSmrg * 5541debfc3dSmrg * @param func Function of const Tp& returning Tp to apply. 5551debfc3dSmrg * @return New valarray with transformed elements. 5561debfc3dSmrg */ 5571debfc3dSmrg _Expr<_RefFunClos<_ValArray, _Tp>, _Tp> apply(_Tp func(const _Tp&)) const; 5581debfc3dSmrg 5591debfc3dSmrg /** 5601debfc3dSmrg * @brief Resize array. 5611debfc3dSmrg * 5621debfc3dSmrg * Resize this array to @a size and set all elements to @a c. All 5631debfc3dSmrg * references and iterators are invalidated. 5641debfc3dSmrg * 5651debfc3dSmrg * @param __size New array size. 5661debfc3dSmrg * @param __c New value for all elements. 5671debfc3dSmrg */ 5681debfc3dSmrg void resize(size_t __size, _Tp __c = _Tp()); 5691debfc3dSmrg 5701debfc3dSmrg private: 5711debfc3dSmrg size_t _M_size; 5721debfc3dSmrg _Tp* __restrict__ _M_data; 5731debfc3dSmrg 5741debfc3dSmrg friend class _Array<_Tp>; 5751debfc3dSmrg }; 5761debfc3dSmrg 5771debfc3dSmrg#if __cpp_deduction_guides >= 201606 5781debfc3dSmrg template<typename _Tp, size_t _Nm> 5791debfc3dSmrg valarray(const _Tp(&)[_Nm], size_t) -> valarray<_Tp>; 5801debfc3dSmrg#endif 5811debfc3dSmrg 5821debfc3dSmrg template<typename _Tp> 5831debfc3dSmrg inline const _Tp& 5841debfc3dSmrg valarray<_Tp>::operator[](size_t __i) const 5851debfc3dSmrg { 5861debfc3dSmrg __glibcxx_requires_subscript(__i); 5871debfc3dSmrg return _M_data[__i]; 5881debfc3dSmrg } 5891debfc3dSmrg 5901debfc3dSmrg template<typename _Tp> 5911debfc3dSmrg inline _Tp& 5921debfc3dSmrg valarray<_Tp>::operator[](size_t __i) 5931debfc3dSmrg { 5941debfc3dSmrg __glibcxx_requires_subscript(__i); 5951debfc3dSmrg return _M_data[__i]; 5961debfc3dSmrg } 5971debfc3dSmrg 5988feb0f0bSmrg /// @} group numeric_arrays 5991debfc3dSmrg 6001debfc3dSmrg_GLIBCXX_END_NAMESPACE_VERSION 6011debfc3dSmrg} // namespace 6021debfc3dSmrg 6031debfc3dSmrg#include <bits/valarray_after.h> 6041debfc3dSmrg#include <bits/slice_array.h> 6051debfc3dSmrg#include <bits/gslice.h> 6061debfc3dSmrg#include <bits/gslice_array.h> 6071debfc3dSmrg#include <bits/mask_array.h> 6081debfc3dSmrg#include <bits/indirect_array.h> 6091debfc3dSmrg 6101debfc3dSmrgnamespace std _GLIBCXX_VISIBILITY(default) 6111debfc3dSmrg{ 6121debfc3dSmrg_GLIBCXX_BEGIN_NAMESPACE_VERSION 6131debfc3dSmrg 6141debfc3dSmrg /** 6151debfc3dSmrg * @addtogroup numeric_arrays 6161debfc3dSmrg * @{ 6171debfc3dSmrg */ 6181debfc3dSmrg 6191debfc3dSmrg template<typename _Tp> 6201debfc3dSmrg inline 6211debfc3dSmrg valarray<_Tp>::valarray() : _M_size(0), _M_data(0) {} 6221debfc3dSmrg 6231debfc3dSmrg template<typename _Tp> 6241debfc3dSmrg inline 6251debfc3dSmrg valarray<_Tp>::valarray(size_t __n) 6261debfc3dSmrg : _M_size(__n), _M_data(__valarray_get_storage<_Tp>(__n)) 6271debfc3dSmrg { std::__valarray_default_construct(_M_data, _M_data + __n); } 6281debfc3dSmrg 6291debfc3dSmrg template<typename _Tp> 6301debfc3dSmrg inline 6311debfc3dSmrg valarray<_Tp>::valarray(const _Tp& __t, size_t __n) 6321debfc3dSmrg : _M_size(__n), _M_data(__valarray_get_storage<_Tp>(__n)) 6331debfc3dSmrg { std::__valarray_fill_construct(_M_data, _M_data + __n, __t); } 6341debfc3dSmrg 6351debfc3dSmrg template<typename _Tp> 6361debfc3dSmrg inline 6371debfc3dSmrg valarray<_Tp>::valarray(const _Tp* __restrict__ __p, size_t __n) 6381debfc3dSmrg : _M_size(__n), _M_data(__valarray_get_storage<_Tp>(__n)) 6391debfc3dSmrg { 6401debfc3dSmrg __glibcxx_assert(__p != 0 || __n == 0); 6411debfc3dSmrg std::__valarray_copy_construct(__p, __p + __n, _M_data); 6421debfc3dSmrg } 6431debfc3dSmrg 6441debfc3dSmrg template<typename _Tp> 6451debfc3dSmrg inline 6461debfc3dSmrg valarray<_Tp>::valarray(const valarray<_Tp>& __v) 6471debfc3dSmrg : _M_size(__v._M_size), _M_data(__valarray_get_storage<_Tp>(__v._M_size)) 6481debfc3dSmrg { std::__valarray_copy_construct(__v._M_data, __v._M_data + _M_size, 6491debfc3dSmrg _M_data); } 6501debfc3dSmrg 6511debfc3dSmrg#if __cplusplus >= 201103L 6521debfc3dSmrg template<typename _Tp> 6531debfc3dSmrg inline 6541debfc3dSmrg valarray<_Tp>::valarray(valarray<_Tp>&& __v) noexcept 6551debfc3dSmrg : _M_size(__v._M_size), _M_data(__v._M_data) 6561debfc3dSmrg { 6571debfc3dSmrg __v._M_size = 0; 6581debfc3dSmrg __v._M_data = 0; 6591debfc3dSmrg } 6601debfc3dSmrg#endif 6611debfc3dSmrg 6621debfc3dSmrg template<typename _Tp> 6631debfc3dSmrg inline 6641debfc3dSmrg valarray<_Tp>::valarray(const slice_array<_Tp>& __sa) 6651debfc3dSmrg : _M_size(__sa._M_sz), _M_data(__valarray_get_storage<_Tp>(__sa._M_sz)) 6661debfc3dSmrg { 6671debfc3dSmrg std::__valarray_copy_construct 6681debfc3dSmrg (__sa._M_array, __sa._M_sz, __sa._M_stride, _Array<_Tp>(_M_data)); 6691debfc3dSmrg } 6701debfc3dSmrg 6711debfc3dSmrg template<typename _Tp> 6721debfc3dSmrg inline 6731debfc3dSmrg valarray<_Tp>::valarray(const gslice_array<_Tp>& __ga) 6741debfc3dSmrg : _M_size(__ga._M_index.size()), 6751debfc3dSmrg _M_data(__valarray_get_storage<_Tp>(_M_size)) 6761debfc3dSmrg { 6771debfc3dSmrg std::__valarray_copy_construct 6781debfc3dSmrg (__ga._M_array, _Array<size_t>(__ga._M_index), 6791debfc3dSmrg _Array<_Tp>(_M_data), _M_size); 6801debfc3dSmrg } 6811debfc3dSmrg 6821debfc3dSmrg template<typename _Tp> 6831debfc3dSmrg inline 6841debfc3dSmrg valarray<_Tp>::valarray(const mask_array<_Tp>& __ma) 6851debfc3dSmrg : _M_size(__ma._M_sz), _M_data(__valarray_get_storage<_Tp>(__ma._M_sz)) 6861debfc3dSmrg { 6871debfc3dSmrg std::__valarray_copy_construct 6881debfc3dSmrg (__ma._M_array, __ma._M_mask, _Array<_Tp>(_M_data), _M_size); 6891debfc3dSmrg } 6901debfc3dSmrg 6911debfc3dSmrg template<typename _Tp> 6921debfc3dSmrg inline 6931debfc3dSmrg valarray<_Tp>::valarray(const indirect_array<_Tp>& __ia) 6941debfc3dSmrg : _M_size(__ia._M_sz), _M_data(__valarray_get_storage<_Tp>(__ia._M_sz)) 6951debfc3dSmrg { 6961debfc3dSmrg std::__valarray_copy_construct 6971debfc3dSmrg (__ia._M_array, __ia._M_index, _Array<_Tp>(_M_data), _M_size); 6981debfc3dSmrg } 6991debfc3dSmrg 7001debfc3dSmrg#if __cplusplus >= 201103L 7011debfc3dSmrg template<typename _Tp> 7021debfc3dSmrg inline 7031debfc3dSmrg valarray<_Tp>::valarray(initializer_list<_Tp> __l) 7041debfc3dSmrg : _M_size(__l.size()), _M_data(__valarray_get_storage<_Tp>(__l.size())) 7051debfc3dSmrg { std::__valarray_copy_construct(__l.begin(), __l.end(), _M_data); } 7061debfc3dSmrg#endif 7071debfc3dSmrg 7081debfc3dSmrg template<typename _Tp> template<class _Dom> 7091debfc3dSmrg inline 7101debfc3dSmrg valarray<_Tp>::valarray(const _Expr<_Dom, _Tp>& __e) 7111debfc3dSmrg : _M_size(__e.size()), _M_data(__valarray_get_storage<_Tp>(_M_size)) 7121debfc3dSmrg { std::__valarray_copy_construct(__e, _M_size, _Array<_Tp>(_M_data)); } 7131debfc3dSmrg 7141debfc3dSmrg template<typename _Tp> 7151debfc3dSmrg inline 7161debfc3dSmrg valarray<_Tp>::~valarray() _GLIBCXX_NOEXCEPT 7171debfc3dSmrg { 7181debfc3dSmrg std::__valarray_destroy_elements(_M_data, _M_data + _M_size); 7191debfc3dSmrg std::__valarray_release_memory(_M_data); 7201debfc3dSmrg } 7211debfc3dSmrg 7221debfc3dSmrg template<typename _Tp> 7231debfc3dSmrg inline valarray<_Tp>& 7241debfc3dSmrg valarray<_Tp>::operator=(const valarray<_Tp>& __v) 7251debfc3dSmrg { 7261debfc3dSmrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 7271debfc3dSmrg // 630. arrays of valarray. 7281debfc3dSmrg if (_M_size == __v._M_size) 7291debfc3dSmrg std::__valarray_copy(__v._M_data, _M_size, _M_data); 7301debfc3dSmrg else 7311debfc3dSmrg { 7321debfc3dSmrg if (_M_data) 7331debfc3dSmrg { 7341debfc3dSmrg std::__valarray_destroy_elements(_M_data, _M_data + _M_size); 7351debfc3dSmrg std::__valarray_release_memory(_M_data); 7361debfc3dSmrg } 7371debfc3dSmrg _M_size = __v._M_size; 7381debfc3dSmrg _M_data = __valarray_get_storage<_Tp>(_M_size); 7391debfc3dSmrg std::__valarray_copy_construct(__v._M_data, __v._M_data + _M_size, 7401debfc3dSmrg _M_data); 7411debfc3dSmrg } 7421debfc3dSmrg return *this; 7431debfc3dSmrg } 7441debfc3dSmrg 7451debfc3dSmrg#if __cplusplus >= 201103L 7461debfc3dSmrg template<typename _Tp> 7471debfc3dSmrg inline valarray<_Tp>& 7481debfc3dSmrg valarray<_Tp>::operator=(valarray<_Tp>&& __v) noexcept 7491debfc3dSmrg { 7501debfc3dSmrg if (_M_data) 7511debfc3dSmrg { 7521debfc3dSmrg std::__valarray_destroy_elements(_M_data, _M_data + _M_size); 7531debfc3dSmrg std::__valarray_release_memory(_M_data); 7541debfc3dSmrg } 7551debfc3dSmrg _M_size = __v._M_size; 7561debfc3dSmrg _M_data = __v._M_data; 7571debfc3dSmrg __v._M_size = 0; 7581debfc3dSmrg __v._M_data = 0; 7591debfc3dSmrg return *this; 7601debfc3dSmrg } 7611debfc3dSmrg 7621debfc3dSmrg template<typename _Tp> 7631debfc3dSmrg inline valarray<_Tp>& 7641debfc3dSmrg valarray<_Tp>::operator=(initializer_list<_Tp> __l) 7651debfc3dSmrg { 7661debfc3dSmrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 7671debfc3dSmrg // 630. arrays of valarray. 7681debfc3dSmrg if (_M_size == __l.size()) 7691debfc3dSmrg std::__valarray_copy(__l.begin(), __l.size(), _M_data); 7701debfc3dSmrg else 7711debfc3dSmrg { 7721debfc3dSmrg if (_M_data) 7731debfc3dSmrg { 7741debfc3dSmrg std::__valarray_destroy_elements(_M_data, _M_data + _M_size); 7751debfc3dSmrg std::__valarray_release_memory(_M_data); 7761debfc3dSmrg } 7771debfc3dSmrg _M_size = __l.size(); 7781debfc3dSmrg _M_data = __valarray_get_storage<_Tp>(_M_size); 7791debfc3dSmrg std::__valarray_copy_construct(__l.begin(), __l.begin() + _M_size, 7801debfc3dSmrg _M_data); 7811debfc3dSmrg } 7821debfc3dSmrg return *this; 7831debfc3dSmrg } 7841debfc3dSmrg#endif 7851debfc3dSmrg 7861debfc3dSmrg template<typename _Tp> 7871debfc3dSmrg inline valarray<_Tp>& 7881debfc3dSmrg valarray<_Tp>::operator=(const _Tp& __t) 7891debfc3dSmrg { 7901debfc3dSmrg std::__valarray_fill(_M_data, _M_size, __t); 7911debfc3dSmrg return *this; 7921debfc3dSmrg } 7931debfc3dSmrg 7941debfc3dSmrg template<typename _Tp> 7951debfc3dSmrg inline valarray<_Tp>& 7961debfc3dSmrg valarray<_Tp>::operator=(const slice_array<_Tp>& __sa) 7971debfc3dSmrg { 7981debfc3dSmrg __glibcxx_assert(_M_size == __sa._M_sz); 7991debfc3dSmrg std::__valarray_copy(__sa._M_array, __sa._M_sz, 8001debfc3dSmrg __sa._M_stride, _Array<_Tp>(_M_data)); 8011debfc3dSmrg return *this; 8021debfc3dSmrg } 8031debfc3dSmrg 8041debfc3dSmrg template<typename _Tp> 8051debfc3dSmrg inline valarray<_Tp>& 8061debfc3dSmrg valarray<_Tp>::operator=(const gslice_array<_Tp>& __ga) 8071debfc3dSmrg { 8081debfc3dSmrg __glibcxx_assert(_M_size == __ga._M_index.size()); 8091debfc3dSmrg std::__valarray_copy(__ga._M_array, _Array<size_t>(__ga._M_index), 8101debfc3dSmrg _Array<_Tp>(_M_data), _M_size); 8111debfc3dSmrg return *this; 8121debfc3dSmrg } 8131debfc3dSmrg 8141debfc3dSmrg template<typename _Tp> 8151debfc3dSmrg inline valarray<_Tp>& 8161debfc3dSmrg valarray<_Tp>::operator=(const mask_array<_Tp>& __ma) 8171debfc3dSmrg { 8181debfc3dSmrg __glibcxx_assert(_M_size == __ma._M_sz); 8191debfc3dSmrg std::__valarray_copy(__ma._M_array, __ma._M_mask, 8201debfc3dSmrg _Array<_Tp>(_M_data), _M_size); 8211debfc3dSmrg return *this; 8221debfc3dSmrg } 8231debfc3dSmrg 8241debfc3dSmrg template<typename _Tp> 8251debfc3dSmrg inline valarray<_Tp>& 8261debfc3dSmrg valarray<_Tp>::operator=(const indirect_array<_Tp>& __ia) 8271debfc3dSmrg { 8281debfc3dSmrg __glibcxx_assert(_M_size == __ia._M_sz); 8291debfc3dSmrg std::__valarray_copy(__ia._M_array, __ia._M_index, 8301debfc3dSmrg _Array<_Tp>(_M_data), _M_size); 8311debfc3dSmrg return *this; 8321debfc3dSmrg } 8331debfc3dSmrg 8341debfc3dSmrg template<typename _Tp> template<class _Dom> 8351debfc3dSmrg inline valarray<_Tp>& 8361debfc3dSmrg valarray<_Tp>::operator=(const _Expr<_Dom, _Tp>& __e) 8371debfc3dSmrg { 8381debfc3dSmrg // _GLIBCXX_RESOLVE_LIB_DEFECTS 8391debfc3dSmrg // 630. arrays of valarray. 8401debfc3dSmrg if (_M_size == __e.size()) 8411debfc3dSmrg std::__valarray_copy(__e, _M_size, _Array<_Tp>(_M_data)); 8421debfc3dSmrg else 8431debfc3dSmrg { 8441debfc3dSmrg if (_M_data) 8451debfc3dSmrg { 8461debfc3dSmrg std::__valarray_destroy_elements(_M_data, _M_data + _M_size); 8471debfc3dSmrg std::__valarray_release_memory(_M_data); 8481debfc3dSmrg } 8491debfc3dSmrg _M_size = __e.size(); 8501debfc3dSmrg _M_data = __valarray_get_storage<_Tp>(_M_size); 8511debfc3dSmrg std::__valarray_copy_construct(__e, _M_size, _Array<_Tp>(_M_data)); 8521debfc3dSmrg } 8531debfc3dSmrg return *this; 8541debfc3dSmrg } 8551debfc3dSmrg 8561debfc3dSmrg template<typename _Tp> 8571debfc3dSmrg inline _Expr<_SClos<_ValArray,_Tp>, _Tp> 8581debfc3dSmrg valarray<_Tp>::operator[](slice __s) const 8591debfc3dSmrg { 8601debfc3dSmrg typedef _SClos<_ValArray,_Tp> _Closure; 8611debfc3dSmrg return _Expr<_Closure, _Tp>(_Closure (_Array<_Tp>(_M_data), __s)); 8621debfc3dSmrg } 8631debfc3dSmrg 8641debfc3dSmrg template<typename _Tp> 8651debfc3dSmrg inline slice_array<_Tp> 8661debfc3dSmrg valarray<_Tp>::operator[](slice __s) 8671debfc3dSmrg { return slice_array<_Tp>(_Array<_Tp>(_M_data), __s); } 8681debfc3dSmrg 8691debfc3dSmrg template<typename _Tp> 8701debfc3dSmrg inline _Expr<_GClos<_ValArray,_Tp>, _Tp> 8711debfc3dSmrg valarray<_Tp>::operator[](const gslice& __gs) const 8721debfc3dSmrg { 8731debfc3dSmrg typedef _GClos<_ValArray,_Tp> _Closure; 8741debfc3dSmrg return _Expr<_Closure, _Tp> 8751debfc3dSmrg (_Closure(_Array<_Tp>(_M_data), __gs._M_index->_M_index)); 8761debfc3dSmrg } 8771debfc3dSmrg 8781debfc3dSmrg template<typename _Tp> 8791debfc3dSmrg inline gslice_array<_Tp> 8801debfc3dSmrg valarray<_Tp>::operator[](const gslice& __gs) 8811debfc3dSmrg { 8821debfc3dSmrg return gslice_array<_Tp> 8831debfc3dSmrg (_Array<_Tp>(_M_data), __gs._M_index->_M_index); 8841debfc3dSmrg } 8851debfc3dSmrg 8861debfc3dSmrg template<typename _Tp> 8871debfc3dSmrg inline valarray<_Tp> 8881debfc3dSmrg valarray<_Tp>::operator[](const valarray<bool>& __m) const 8891debfc3dSmrg { 8901debfc3dSmrg size_t __s = 0; 8911debfc3dSmrg size_t __e = __m.size(); 8921debfc3dSmrg for (size_t __i=0; __i<__e; ++__i) 8931debfc3dSmrg if (__m[__i]) ++__s; 8941debfc3dSmrg return valarray<_Tp>(mask_array<_Tp>(_Array<_Tp>(_M_data), __s, 8951debfc3dSmrg _Array<bool> (__m))); 8961debfc3dSmrg } 8971debfc3dSmrg 8981debfc3dSmrg template<typename _Tp> 8991debfc3dSmrg inline mask_array<_Tp> 9001debfc3dSmrg valarray<_Tp>::operator[](const valarray<bool>& __m) 9011debfc3dSmrg { 9021debfc3dSmrg size_t __s = 0; 9031debfc3dSmrg size_t __e = __m.size(); 9041debfc3dSmrg for (size_t __i=0; __i<__e; ++__i) 9051debfc3dSmrg if (__m[__i]) ++__s; 9061debfc3dSmrg return mask_array<_Tp>(_Array<_Tp>(_M_data), __s, _Array<bool>(__m)); 9071debfc3dSmrg } 9081debfc3dSmrg 9091debfc3dSmrg template<typename _Tp> 9101debfc3dSmrg inline _Expr<_IClos<_ValArray,_Tp>, _Tp> 9111debfc3dSmrg valarray<_Tp>::operator[](const valarray<size_t>& __i) const 9121debfc3dSmrg { 9131debfc3dSmrg typedef _IClos<_ValArray,_Tp> _Closure; 9141debfc3dSmrg return _Expr<_Closure, _Tp>(_Closure(*this, __i)); 9151debfc3dSmrg } 9161debfc3dSmrg 9171debfc3dSmrg template<typename _Tp> 9181debfc3dSmrg inline indirect_array<_Tp> 9191debfc3dSmrg valarray<_Tp>::operator[](const valarray<size_t>& __i) 9201debfc3dSmrg { 9211debfc3dSmrg return indirect_array<_Tp>(_Array<_Tp>(_M_data), __i.size(), 9221debfc3dSmrg _Array<size_t>(__i)); 9231debfc3dSmrg } 9241debfc3dSmrg 9251debfc3dSmrg#if __cplusplus >= 201103L 9261debfc3dSmrg template<class _Tp> 9271debfc3dSmrg inline void 9281debfc3dSmrg valarray<_Tp>::swap(valarray<_Tp>& __v) noexcept 9291debfc3dSmrg { 9301debfc3dSmrg std::swap(_M_size, __v._M_size); 9311debfc3dSmrg std::swap(_M_data, __v._M_data); 9321debfc3dSmrg } 9331debfc3dSmrg#endif 9341debfc3dSmrg 9351debfc3dSmrg template<class _Tp> 9361debfc3dSmrg inline size_t 9371debfc3dSmrg valarray<_Tp>::size() const 9381debfc3dSmrg { return _M_size; } 9391debfc3dSmrg 9401debfc3dSmrg template<class _Tp> 9411debfc3dSmrg inline _Tp 9421debfc3dSmrg valarray<_Tp>::sum() const 9431debfc3dSmrg { 9441debfc3dSmrg __glibcxx_assert(_M_size > 0); 9451debfc3dSmrg return std::__valarray_sum(_M_data, _M_data + _M_size); 9461debfc3dSmrg } 9471debfc3dSmrg 9481debfc3dSmrg template<class _Tp> 9491debfc3dSmrg inline valarray<_Tp> 9501debfc3dSmrg valarray<_Tp>::shift(int __n) const 9511debfc3dSmrg { 9521debfc3dSmrg valarray<_Tp> __ret; 9531debfc3dSmrg 9541debfc3dSmrg if (_M_size == 0) 9551debfc3dSmrg return __ret; 9561debfc3dSmrg 9571debfc3dSmrg _Tp* __restrict__ __tmp_M_data = 9581debfc3dSmrg std::__valarray_get_storage<_Tp>(_M_size); 9591debfc3dSmrg 9601debfc3dSmrg if (__n == 0) 9611debfc3dSmrg std::__valarray_copy_construct(_M_data, 9621debfc3dSmrg _M_data + _M_size, __tmp_M_data); 9631debfc3dSmrg else if (__n > 0) // shift left 9641debfc3dSmrg { 9651debfc3dSmrg if (size_t(__n) > _M_size) 9661debfc3dSmrg __n = int(_M_size); 9671debfc3dSmrg 9681debfc3dSmrg std::__valarray_copy_construct(_M_data + __n, 9691debfc3dSmrg _M_data + _M_size, __tmp_M_data); 9701debfc3dSmrg std::__valarray_default_construct(__tmp_M_data + _M_size - __n, 9711debfc3dSmrg __tmp_M_data + _M_size); 9721debfc3dSmrg } 9731debfc3dSmrg else // shift right 9741debfc3dSmrg { 9751debfc3dSmrg if (-size_t(__n) > _M_size) 9761debfc3dSmrg __n = -int(_M_size); 9771debfc3dSmrg 9781debfc3dSmrg std::__valarray_copy_construct(_M_data, _M_data + _M_size + __n, 9791debfc3dSmrg __tmp_M_data - __n); 9801debfc3dSmrg std::__valarray_default_construct(__tmp_M_data, 9811debfc3dSmrg __tmp_M_data - __n); 9821debfc3dSmrg } 9831debfc3dSmrg 9841debfc3dSmrg __ret._M_size = _M_size; 9851debfc3dSmrg __ret._M_data = __tmp_M_data; 9861debfc3dSmrg return __ret; 9871debfc3dSmrg } 9881debfc3dSmrg 9891debfc3dSmrg template<class _Tp> 9901debfc3dSmrg inline valarray<_Tp> 9911debfc3dSmrg valarray<_Tp>::cshift(int __n) const 9921debfc3dSmrg { 9931debfc3dSmrg valarray<_Tp> __ret; 9941debfc3dSmrg 9951debfc3dSmrg if (_M_size == 0) 9961debfc3dSmrg return __ret; 9971debfc3dSmrg 9981debfc3dSmrg _Tp* __restrict__ __tmp_M_data = 9991debfc3dSmrg std::__valarray_get_storage<_Tp>(_M_size); 10001debfc3dSmrg 10011debfc3dSmrg if (__n == 0) 10021debfc3dSmrg std::__valarray_copy_construct(_M_data, 10031debfc3dSmrg _M_data + _M_size, __tmp_M_data); 10041debfc3dSmrg else if (__n > 0) // cshift left 10051debfc3dSmrg { 10061debfc3dSmrg if (size_t(__n) > _M_size) 10071debfc3dSmrg __n = int(__n % _M_size); 10081debfc3dSmrg 10091debfc3dSmrg std::__valarray_copy_construct(_M_data, _M_data + __n, 10101debfc3dSmrg __tmp_M_data + _M_size - __n); 10111debfc3dSmrg std::__valarray_copy_construct(_M_data + __n, _M_data + _M_size, 10121debfc3dSmrg __tmp_M_data); 10131debfc3dSmrg } 10141debfc3dSmrg else // cshift right 10151debfc3dSmrg { 10161debfc3dSmrg if (-size_t(__n) > _M_size) 10171debfc3dSmrg __n = -int(-size_t(__n) % _M_size); 10181debfc3dSmrg 10191debfc3dSmrg std::__valarray_copy_construct(_M_data + _M_size + __n, 10201debfc3dSmrg _M_data + _M_size, __tmp_M_data); 10211debfc3dSmrg std::__valarray_copy_construct(_M_data, _M_data + _M_size + __n, 10221debfc3dSmrg __tmp_M_data - __n); 10231debfc3dSmrg } 10241debfc3dSmrg 10251debfc3dSmrg __ret._M_size = _M_size; 10261debfc3dSmrg __ret._M_data = __tmp_M_data; 10271debfc3dSmrg return __ret; 10281debfc3dSmrg } 10291debfc3dSmrg 10301debfc3dSmrg template<class _Tp> 10311debfc3dSmrg inline void 10321debfc3dSmrg valarray<_Tp>::resize(size_t __n, _Tp __c) 10331debfc3dSmrg { 10341debfc3dSmrg // This complication is so to make valarray<valarray<T> > work 10351debfc3dSmrg // even though it is not required by the standard. Nobody should 10361debfc3dSmrg // be saying valarray<valarray<T> > anyway. See the specs. 10371debfc3dSmrg std::__valarray_destroy_elements(_M_data, _M_data + _M_size); 10381debfc3dSmrg if (_M_size != __n) 10391debfc3dSmrg { 10401debfc3dSmrg std::__valarray_release_memory(_M_data); 10411debfc3dSmrg _M_size = __n; 10421debfc3dSmrg _M_data = __valarray_get_storage<_Tp>(__n); 10431debfc3dSmrg } 10441debfc3dSmrg std::__valarray_fill_construct(_M_data, _M_data + __n, __c); 10451debfc3dSmrg } 10461debfc3dSmrg 10471debfc3dSmrg template<typename _Tp> 10481debfc3dSmrg inline _Tp 10491debfc3dSmrg valarray<_Tp>::min() const 10501debfc3dSmrg { 10511debfc3dSmrg __glibcxx_assert(_M_size > 0); 10521debfc3dSmrg return *std::min_element(_M_data, _M_data + _M_size); 10531debfc3dSmrg } 10541debfc3dSmrg 10551debfc3dSmrg template<typename _Tp> 10561debfc3dSmrg inline _Tp 10571debfc3dSmrg valarray<_Tp>::max() const 10581debfc3dSmrg { 10591debfc3dSmrg __glibcxx_assert(_M_size > 0); 10601debfc3dSmrg return *std::max_element(_M_data, _M_data + _M_size); 10611debfc3dSmrg } 10621debfc3dSmrg 10631debfc3dSmrg template<class _Tp> 10641debfc3dSmrg inline _Expr<_ValFunClos<_ValArray, _Tp>, _Tp> 10651debfc3dSmrg valarray<_Tp>::apply(_Tp func(_Tp)) const 10661debfc3dSmrg { 10671debfc3dSmrg typedef _ValFunClos<_ValArray, _Tp> _Closure; 10681debfc3dSmrg return _Expr<_Closure, _Tp>(_Closure(*this, func)); 10691debfc3dSmrg } 10701debfc3dSmrg 10711debfc3dSmrg template<class _Tp> 10721debfc3dSmrg inline _Expr<_RefFunClos<_ValArray, _Tp>, _Tp> 10731debfc3dSmrg valarray<_Tp>::apply(_Tp func(const _Tp &)) const 10741debfc3dSmrg { 10751debfc3dSmrg typedef _RefFunClos<_ValArray, _Tp> _Closure; 10761debfc3dSmrg return _Expr<_Closure, _Tp>(_Closure(*this, func)); 10771debfc3dSmrg } 10781debfc3dSmrg 1079*23f5f463Smrg /// @cond undocumented 10801debfc3dSmrg#define _DEFINE_VALARRAY_UNARY_OPERATOR(_Op, _Name) \ 10811debfc3dSmrg template<typename _Tp> \ 10821debfc3dSmrg inline typename valarray<_Tp>::template _UnaryOp<_Name>::_Rt \ 10831debfc3dSmrg valarray<_Tp>::operator _Op() const \ 10841debfc3dSmrg { \ 10851debfc3dSmrg typedef _UnClos<_Name, _ValArray, _Tp> _Closure; \ 10861debfc3dSmrg typedef typename __fun<_Name, _Tp>::result_type _Rt; \ 10871debfc3dSmrg return _Expr<_Closure, _Rt>(_Closure(*this)); \ 10881debfc3dSmrg } 10891debfc3dSmrg 10901debfc3dSmrg _DEFINE_VALARRAY_UNARY_OPERATOR(+, __unary_plus) 10911debfc3dSmrg _DEFINE_VALARRAY_UNARY_OPERATOR(-, __negate) 10921debfc3dSmrg _DEFINE_VALARRAY_UNARY_OPERATOR(~, __bitwise_not) 10931debfc3dSmrg _DEFINE_VALARRAY_UNARY_OPERATOR (!, __logical_not) 10941debfc3dSmrg 10951debfc3dSmrg#undef _DEFINE_VALARRAY_UNARY_OPERATOR 10961debfc3dSmrg 10971debfc3dSmrg#define _DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(_Op, _Name) \ 10981debfc3dSmrg template<class _Tp> \ 10991debfc3dSmrg inline valarray<_Tp>& \ 11001debfc3dSmrg valarray<_Tp>::operator _Op##=(const _Tp &__t) \ 11011debfc3dSmrg { \ 11021debfc3dSmrg _Array_augmented_##_Name(_Array<_Tp>(_M_data), _M_size, __t); \ 11031debfc3dSmrg return *this; \ 11041debfc3dSmrg } \ 11051debfc3dSmrg \ 11061debfc3dSmrg template<class _Tp> \ 11071debfc3dSmrg inline valarray<_Tp>& \ 11081debfc3dSmrg valarray<_Tp>::operator _Op##=(const valarray<_Tp> &__v) \ 11091debfc3dSmrg { \ 11101debfc3dSmrg __glibcxx_assert(_M_size == __v._M_size); \ 11111debfc3dSmrg _Array_augmented_##_Name(_Array<_Tp>(_M_data), _M_size, \ 11121debfc3dSmrg _Array<_Tp>(__v._M_data)); \ 11131debfc3dSmrg return *this; \ 11141debfc3dSmrg } 11151debfc3dSmrg 11161debfc3dSmrg_DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(+, __plus) 11171debfc3dSmrg_DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(-, __minus) 11181debfc3dSmrg_DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(*, __multiplies) 11191debfc3dSmrg_DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(/, __divides) 11201debfc3dSmrg_DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(%, __modulus) 11211debfc3dSmrg_DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(^, __bitwise_xor) 11221debfc3dSmrg_DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(&, __bitwise_and) 11231debfc3dSmrg_DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(|, __bitwise_or) 11241debfc3dSmrg_DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(<<, __shift_left) 11251debfc3dSmrg_DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(>>, __shift_right) 11261debfc3dSmrg 11271debfc3dSmrg#undef _DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT 11281debfc3dSmrg 11291debfc3dSmrg#define _DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(_Op, _Name) \ 11301debfc3dSmrg template<class _Tp> template<class _Dom> \ 11311debfc3dSmrg inline valarray<_Tp>& \ 11321debfc3dSmrg valarray<_Tp>::operator _Op##=(const _Expr<_Dom, _Tp>& __e) \ 11331debfc3dSmrg { \ 11341debfc3dSmrg _Array_augmented_##_Name(_Array<_Tp>(_M_data), __e, _M_size); \ 11351debfc3dSmrg return *this; \ 11361debfc3dSmrg } 11371debfc3dSmrg 11381debfc3dSmrg_DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(+, __plus) 11391debfc3dSmrg_DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(-, __minus) 11401debfc3dSmrg_DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(*, __multiplies) 11411debfc3dSmrg_DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(/, __divides) 11421debfc3dSmrg_DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(%, __modulus) 11431debfc3dSmrg_DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(^, __bitwise_xor) 11441debfc3dSmrg_DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(&, __bitwise_and) 11451debfc3dSmrg_DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(|, __bitwise_or) 11461debfc3dSmrg_DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(<<, __shift_left) 11471debfc3dSmrg_DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(>>, __shift_right) 11481debfc3dSmrg 11491debfc3dSmrg#undef _DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT 11501debfc3dSmrg 11511debfc3dSmrg 11521debfc3dSmrg#define _DEFINE_BINARY_OPERATOR(_Op, _Name) \ 11531debfc3dSmrg template<typename _Tp> \ 11541debfc3dSmrg inline _Expr<_BinClos<_Name, _ValArray, _ValArray, _Tp, _Tp>, \ 11551debfc3dSmrg typename __fun<_Name, _Tp>::result_type> \ 11561debfc3dSmrg operator _Op(const valarray<_Tp>& __v, const valarray<_Tp>& __w) \ 11571debfc3dSmrg { \ 11581debfc3dSmrg __glibcxx_assert(__v.size() == __w.size()); \ 11591debfc3dSmrg typedef _BinClos<_Name, _ValArray, _ValArray, _Tp, _Tp> _Closure; \ 11601debfc3dSmrg typedef typename __fun<_Name, _Tp>::result_type _Rt; \ 11611debfc3dSmrg return _Expr<_Closure, _Rt>(_Closure(__v, __w)); \ 11621debfc3dSmrg } \ 11631debfc3dSmrg \ 11641debfc3dSmrg template<typename _Tp> \ 11651debfc3dSmrg inline _Expr<_BinClos<_Name, _ValArray,_Constant, _Tp, _Tp>, \ 11661debfc3dSmrg typename __fun<_Name, _Tp>::result_type> \ 1167c0a68be4Smrg operator _Op(const valarray<_Tp>& __v, \ 1168c0a68be4Smrg const typename valarray<_Tp>::value_type& __t) \ 11691debfc3dSmrg { \ 11701debfc3dSmrg typedef _BinClos<_Name, _ValArray, _Constant, _Tp, _Tp> _Closure; \ 11711debfc3dSmrg typedef typename __fun<_Name, _Tp>::result_type _Rt; \ 11721debfc3dSmrg return _Expr<_Closure, _Rt>(_Closure(__v, __t)); \ 11731debfc3dSmrg } \ 11741debfc3dSmrg \ 11751debfc3dSmrg template<typename _Tp> \ 11761debfc3dSmrg inline _Expr<_BinClos<_Name, _Constant, _ValArray, _Tp, _Tp>, \ 11771debfc3dSmrg typename __fun<_Name, _Tp>::result_type> \ 1178c0a68be4Smrg operator _Op(const typename valarray<_Tp>::value_type& __t, \ 1179c0a68be4Smrg const valarray<_Tp>& __v) \ 11801debfc3dSmrg { \ 11811debfc3dSmrg typedef _BinClos<_Name, _Constant, _ValArray, _Tp, _Tp> _Closure; \ 11821debfc3dSmrg typedef typename __fun<_Name, _Tp>::result_type _Rt; \ 11831debfc3dSmrg return _Expr<_Closure, _Rt>(_Closure(__t, __v)); \ 11841debfc3dSmrg } 11851debfc3dSmrg 11861debfc3dSmrg_DEFINE_BINARY_OPERATOR(+, __plus) 11871debfc3dSmrg_DEFINE_BINARY_OPERATOR(-, __minus) 11881debfc3dSmrg_DEFINE_BINARY_OPERATOR(*, __multiplies) 11891debfc3dSmrg_DEFINE_BINARY_OPERATOR(/, __divides) 11901debfc3dSmrg_DEFINE_BINARY_OPERATOR(%, __modulus) 11911debfc3dSmrg_DEFINE_BINARY_OPERATOR(^, __bitwise_xor) 11921debfc3dSmrg_DEFINE_BINARY_OPERATOR(&, __bitwise_and) 11931debfc3dSmrg_DEFINE_BINARY_OPERATOR(|, __bitwise_or) 11941debfc3dSmrg_DEFINE_BINARY_OPERATOR(<<, __shift_left) 11951debfc3dSmrg_DEFINE_BINARY_OPERATOR(>>, __shift_right) 11961debfc3dSmrg_DEFINE_BINARY_OPERATOR(&&, __logical_and) 11971debfc3dSmrg_DEFINE_BINARY_OPERATOR(||, __logical_or) 11981debfc3dSmrg_DEFINE_BINARY_OPERATOR(==, __equal_to) 11991debfc3dSmrg_DEFINE_BINARY_OPERATOR(!=, __not_equal_to) 12001debfc3dSmrg_DEFINE_BINARY_OPERATOR(<, __less) 12011debfc3dSmrg_DEFINE_BINARY_OPERATOR(>, __greater) 12021debfc3dSmrg_DEFINE_BINARY_OPERATOR(<=, __less_equal) 12031debfc3dSmrg_DEFINE_BINARY_OPERATOR(>=, __greater_equal) 12041debfc3dSmrg 12051debfc3dSmrg#undef _DEFINE_BINARY_OPERATOR 1206*23f5f463Smrg /// @endcond 12071debfc3dSmrg 12081debfc3dSmrg#if __cplusplus >= 201103L 12091debfc3dSmrg /** 12101debfc3dSmrg * @brief Return an iterator pointing to the first element of 12111debfc3dSmrg * the valarray. 12121debfc3dSmrg * @param __va valarray. 12131debfc3dSmrg */ 12141debfc3dSmrg template<class _Tp> 12151debfc3dSmrg inline _Tp* 12168feb0f0bSmrg begin(valarray<_Tp>& __va) noexcept 12178feb0f0bSmrg { return __va.size() ? std::__addressof(__va[0]) : nullptr; } 12181debfc3dSmrg 12191debfc3dSmrg /** 12201debfc3dSmrg * @brief Return an iterator pointing to the first element of 12211debfc3dSmrg * the const valarray. 12221debfc3dSmrg * @param __va valarray. 12231debfc3dSmrg */ 12241debfc3dSmrg template<class _Tp> 12251debfc3dSmrg inline const _Tp* 12268feb0f0bSmrg begin(const valarray<_Tp>& __va) noexcept 12278feb0f0bSmrg { return __va.size() ? std::__addressof(__va[0]) : nullptr; } 12281debfc3dSmrg 12291debfc3dSmrg /** 12301debfc3dSmrg * @brief Return an iterator pointing to one past the last element of 12311debfc3dSmrg * the valarray. 12321debfc3dSmrg * @param __va valarray. 12331debfc3dSmrg */ 12341debfc3dSmrg template<class _Tp> 12351debfc3dSmrg inline _Tp* 12368feb0f0bSmrg end(valarray<_Tp>& __va) noexcept 12378feb0f0bSmrg { 12388feb0f0bSmrg if (auto __n = __va.size()) 12398feb0f0bSmrg return std::__addressof(__va[0]) + __n; 12408feb0f0bSmrg else 12418feb0f0bSmrg return nullptr; 12428feb0f0bSmrg } 12431debfc3dSmrg 12441debfc3dSmrg /** 12451debfc3dSmrg * @brief Return an iterator pointing to one past the last element of 12461debfc3dSmrg * the const valarray. 12471debfc3dSmrg * @param __va valarray. 12481debfc3dSmrg */ 12491debfc3dSmrg template<class _Tp> 12501debfc3dSmrg inline const _Tp* 12518feb0f0bSmrg end(const valarray<_Tp>& __va) noexcept 12528feb0f0bSmrg { 12538feb0f0bSmrg if (auto __n = __va.size()) 12548feb0f0bSmrg return std::__addressof(__va[0]) + __n; 12558feb0f0bSmrg else 12568feb0f0bSmrg return nullptr; 12578feb0f0bSmrg } 12581debfc3dSmrg#endif // C++11 12591debfc3dSmrg 12608feb0f0bSmrg /// @} group numeric_arrays 12611debfc3dSmrg 12621debfc3dSmrg_GLIBCXX_END_NAMESPACE_VERSION 12631debfc3dSmrg} // namespace 12641debfc3dSmrg 12651debfc3dSmrg#endif /* _GLIBCXX_VALARRAY */ 1266