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