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