]> git.ipfire.org Git - thirdparty/gcc.git/blobdiff - libstdc++-v3/include/std/valarray
Update copyright years.
[thirdparty/gcc.git] / libstdc++-v3 / include / std / valarray
index 827524915f1b1182f1c945359dd8014ca4ff9b76..a4eecd833f71d74907b6e3821cbc037a0f02d51b 100644 (file)
@@ -1,6 +1,6 @@
 // The template and inlines for the -*- C++ -*- valarray class.
 
-// Copyright (C) 1997-2015 Free Software Foundation, Inc.
+// Copyright (C) 1997-2024 Free Software Foundation, Inc.
 //
 // This file is part of the GNU ISO C++ Library.  This library is free
 // software; you can redistribute it and/or modify it under the
@@ -23,7 +23,7 @@
 // <http://www.gnu.org/licenses/>.
 
 /** @file include/valarray
- *  This is a Standard C++ Library header. 
+ *  This is a Standard C++ Library header.
  */
 
 // Written by Gabriel Dos Reis <Gabriel.Dos-Reis@DPTMaths.ENS-Cachan.Fr>
@@ -33,6 +33,8 @@
 
 #pragma GCC system_header
 
+#include <bits/requires_hosted.h> // <cmath> dependant
+
 #include <bits/c++config.h>
 #include <cmath>
 #include <algorithm>
@@ -45,35 +47,46 @@ namespace std _GLIBCXX_VISIBILITY(default)
 {
 _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
-  template<class _Clos, typename _Tp> 
+  template<class _Clos, typename _Tp>
     class _Expr;
 
-  template<typename _Tp1, typename _Tp2> 
-    class _ValArray;    
+  template<typename _Tp1, typename _Tp2>
+    class _ValArray;
 
+namespace __detail
+{
   template<class _Oper, template<class, class> class _Meta, class _Dom>
     struct _UnClos;
 
   template<class _Oper,
         template<class, class> class _Meta1,
         template<class, class> class _Meta2,
-        class _Dom1, class _Dom2> 
-    class _BinClos;
-
-  template<template<class, class> class _Meta, class _Dom> 
-    class _SClos;
-
-  template<template<class, class> class _Meta, class _Dom> 
-    class _GClos;
-    
-  template<template<class, class> class _Meta, class _Dom> 
-    class _IClos;
-    
-  template<template<class, class> class _Meta, class _Dom> 
-    class _ValFunClos;
-  
-  template<template<class, class> class _Meta, class _Dom> 
-    class _RefFunClos;
+        class _Dom1, class _Dom2>
+    struct _BinClos;
+
+  template<template<class, class> class _Meta, class _Dom>
+    struct _SClos;
+
+  template<template<class, class> class _Meta, class _Dom>
+    struct _GClos;
+
+  template<template<class, class> class _Meta, class _Dom>
+    struct _IClos;
+
+  template<template<class, class> class _Meta, class _Dom>
+    struct _ValFunClos;
+
+  template<template<class, class> class _Meta, class _Dom>
+    struct _RefFunClos;
+} // namespace __detail
+
+  using __detail::_UnClos;
+  using __detail::_BinClos;
+  using __detail::_SClos;
+  using __detail::_GClos;
+  using __detail::_IClos;
+  using __detail::_ValFunClos;
+  using __detail::_RefFunClos;
 
   template<class _Tp> class valarray;   // An array of type _Tp
   class slice;                          // BLAS-like slice out of an array
@@ -88,7 +101,7 @@ _GLIBCXX_END_NAMESPACE_VERSION
 
 #include <bits/valarray_array.h>
 #include <bits/valarray_before.h>
-  
+
 namespace std _GLIBCXX_VISIBILITY(default)
 {
 _GLIBCXX_BEGIN_NAMESPACE_VERSION
@@ -109,24 +122,24 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
    *  aliasing that can result from pointer representations.  It represents a
    *  one-dimensional array from which different multidimensional subsets can
    *  be accessed and modified.
-   *  
+   *
    *  @tparam  _Tp  Type of object in the array.
    */
-  template<class _Tp> 
+  template<class _Tp>
     class valarray
     {
       template<class _Op>
-       struct _UnaryOp 
+       struct _UnaryOp
        {
          typedef typename __fun<_Op, _Tp>::result_type __rt;
          typedef _Expr<_UnClos<_Op, _ValArray, _Tp>, __rt> _Rt;
        };
     public:
       typedef _Tp value_type;
-      
+
        // _lib.valarray.cons_ construct/destroy:
       ///  Construct an empty array.
-      valarray();
+      valarray() _GLIBCXX_NOTHROW;
 
       ///  Construct an array with @a n elements.
       explicit valarray(size_t);
@@ -254,16 +267,16 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
       // _lib.valarray.access_ element access:
       /**
-       *  Return a reference to the i'th array element.  
+       *  Return a reference to the i'th array element.
        *
        *  @param  __i  Index of element to return.
        *  @return  Reference to the i'th element.
        */
-      _Tp&                operator[](size_t __i);
+      _Tp&                operator[](size_t __i) _GLIBCXX_NOTHROW;
 
       // _GLIBCXX_RESOLVE_LIB_DEFECTS
       // 389. Const overload of valarray::operator[] returns by value.
-      const _Tp&          operator[](size_t) const;
+      const _Tp&          operator[](size_t) const _GLIBCXX_NOTHROW;
 
       // _lib.valarray.sub_ subset operations:
       /**
@@ -482,10 +495,10 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       _Tp    sum() const;
 
       ///  Return the minimum element using operator<().
-      _Tp    min() const;      
+      _Tp    min() const;
 
       ///  Return the maximum element using operator<().
-      _Tp    max() const;      
+      _Tp    max() const;
 
       /**
        *  @brief  Return a shifted array.
@@ -525,25 +538,25 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
        *  @brief  Apply a function to the array.
        *
        *  Returns a new valarray with elements assigned to the result of
-       *  applying func to the corresponding element of this array.  The new
+       *  applying __func to the corresponding element of this array.  The new
        *  array has the same size as this one.
        *
-       *  @param  func  Function of Tp returning Tp to apply.
+       *  @param  __func  Function of Tp returning Tp to apply.
        *  @return  New valarray with transformed elements.
        */
-      _Expr<_ValFunClos<_ValArray, _Tp>, _Tp> apply(_Tp func(_Tp)) const;
+      _Expr<_ValFunClos<_ValArray, _Tp>, _Tp> apply(_Tp __func(_Tp)) const;
 
       /**
        *  @brief  Apply a function to the array.
        *
        *  Returns a new valarray with elements assigned to the result of
-       *  applying func to the corresponding element of this array.  The new
+       *  applying __func to the corresponding element of this array.  The new
        *  array has the same size as this one.
        *
-       *  @param  func  Function of const Tp& returning Tp to apply.
+       *  @param  __func  Function of const Tp& returning Tp to apply.
        *  @return  New valarray with transformed elements.
        */
-      _Expr<_RefFunClos<_ValArray, _Tp>, _Tp> apply(_Tp func(const _Tp&)) const;
+      _Expr<_RefFunClos<_ValArray, _Tp>, _Tp> apply(_Tp __func(const _Tp&)) const;
 
       /**
        *  @brief  Resize array.
@@ -559,27 +572,32 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     private:
       size_t _M_size;
       _Tp* __restrict__ _M_data;
-      
-      friend class _Array<_Tp>;
+
+      friend struct _Array<_Tp>;
     };
-  
+
+#if __cpp_deduction_guides >= 201606
+  template<typename _Tp, size_t _Nm>
+    valarray(const _Tp(&)[_Nm], size_t) -> valarray<_Tp>;
+#endif
+
   template<typename _Tp>
     inline const _Tp&
-    valarray<_Tp>::operator[](size_t __i) const
-    { 
+    valarray<_Tp>::operator[](size_t __i) const _GLIBCXX_NOTHROW
+    {
       __glibcxx_requires_subscript(__i);
       return _M_data[__i];
     }
 
   template<typename _Tp>
     inline _Tp&
-    valarray<_Tp>::operator[](size_t __i)
-    { 
+    valarray<_Tp>::operator[](size_t __i) _GLIBCXX_NOTHROW
+    {
       __glibcxx_requires_subscript(__i);
       return _M_data[__i];
     }
 
-  // @} group numeric_arrays
+  /// @} group numeric_arrays
 
 _GLIBCXX_END_NAMESPACE_VERSION
 } // namespace
@@ -602,11 +620,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
   template<typename _Tp>
     inline
-    valarray<_Tp>::valarray() : _M_size(0), _M_data(0) {}
+    valarray<_Tp>::valarray() _GLIBCXX_NOTHROW : _M_size(0), _M_data(0) {}
 
   template<typename _Tp>
-    inline 
-    valarray<_Tp>::valarray(size_t __n) 
+    inline
+    valarray<_Tp>::valarray(size_t __n)
     : _M_size(__n), _M_data(__valarray_get_storage<_Tp>(__n))
     { std::__valarray_default_construct(_M_data, _M_data + __n); }
 
@@ -620,9 +638,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     inline
     valarray<_Tp>::valarray(const _Tp* __restrict__ __p, size_t __n)
     : _M_size(__n), _M_data(__valarray_get_storage<_Tp>(__n))
-    { 
-      _GLIBCXX_DEBUG_ASSERT(__p != 0 || __n == 0);
-      std::__valarray_copy_construct(__p, __p + __n, _M_data); 
+    {
+      __glibcxx_assert(__p != 0 || __n == 0);
+      std::__valarray_copy_construct(__p, __p + __n, _M_data);
     }
 
   template<typename _Tp>
@@ -779,7 +797,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     inline valarray<_Tp>&
     valarray<_Tp>::operator=(const slice_array<_Tp>& __sa)
     {
-      _GLIBCXX_DEBUG_ASSERT(_M_size == __sa._M_sz);
+      __glibcxx_assert(_M_size == __sa._M_sz);
       std::__valarray_copy(__sa._M_array, __sa._M_sz,
                           __sa._M_stride, _Array<_Tp>(_M_data));
       return *this;
@@ -789,7 +807,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     inline valarray<_Tp>&
     valarray<_Tp>::operator=(const gslice_array<_Tp>& __ga)
     {
-      _GLIBCXX_DEBUG_ASSERT(_M_size == __ga._M_index.size());
+      __glibcxx_assert(_M_size == __ga._M_index.size());
       std::__valarray_copy(__ga._M_array, _Array<size_t>(__ga._M_index),
                           _Array<_Tp>(_M_data), _M_size);
       return *this;
@@ -799,7 +817,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     inline valarray<_Tp>&
     valarray<_Tp>::operator=(const mask_array<_Tp>& __ma)
     {
-      _GLIBCXX_DEBUG_ASSERT(_M_size == __ma._M_sz);
+      __glibcxx_assert(_M_size == __ma._M_sz);
       std::__valarray_copy(__ma._M_array, __ma._M_mask,
                           _Array<_Tp>(_M_data), _M_size);
       return *this;
@@ -809,7 +827,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     inline valarray<_Tp>&
     valarray<_Tp>::operator=(const indirect_array<_Tp>& __ia)
     {
-      _GLIBCXX_DEBUG_ASSERT(_M_size == __ia._M_sz);
+      __glibcxx_assert(_M_size == __ia._M_sz);
       std::__valarray_copy(__ia._M_array, __ia._M_index,
                           _Array<_Tp>(_M_data), _M_size);
       return *this;
@@ -875,6 +893,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       size_t __e = __m.size();
       for (size_t __i=0; __i<__e; ++__i)
        if (__m[__i]) ++__s;
+      __glibcxx_assert(__s <= _M_size);
       return valarray<_Tp>(mask_array<_Tp>(_Array<_Tp>(_M_data), __s,
                                           _Array<bool> (__m)));
     }
@@ -887,6 +906,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       size_t __e = __m.size();
       for (size_t __i=0; __i<__e; ++__i)
        if (__m[__i]) ++__s;
+      __glibcxx_assert(__s <= _M_size);
       return mask_array<_Tp>(_Array<_Tp>(_M_data), __s, _Array<bool>(__m));
     }
 
@@ -917,7 +937,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 #endif
 
   template<class _Tp>
-    inline size_t 
+    inline size_t
     valarray<_Tp>::size() const
     { return _M_size; }
 
@@ -925,7 +945,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     inline _Tp
     valarray<_Tp>::sum() const
     {
-      _GLIBCXX_DEBUG_ASSERT(_M_size > 0);
+      __glibcxx_assert(_M_size > 0);
       return std::__valarray_sum(_M_data, _M_data + _M_size);
     }
 
@@ -1027,12 +1047,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
        }
       std::__valarray_fill_construct(_M_data, _M_data + __n, __c);
     }
-    
+
   template<typename _Tp>
     inline _Tp
     valarray<_Tp>::min() const
     {
-      _GLIBCXX_DEBUG_ASSERT(_M_size > 0);
+      __glibcxx_assert(_M_size > 0);
       return *std::min_element(_M_data, _M_data + _M_size);
     }
 
@@ -1040,33 +1060,34 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     inline _Tp
     valarray<_Tp>::max() const
     {
-      _GLIBCXX_DEBUG_ASSERT(_M_size > 0);
+      __glibcxx_assert(_M_size > 0);
       return *std::max_element(_M_data, _M_data + _M_size);
     }
-  
+
   template<class _Tp>
     inline _Expr<_ValFunClos<_ValArray, _Tp>, _Tp>
-    valarray<_Tp>::apply(_Tp func(_Tp)) const
+    valarray<_Tp>::apply(_Tp __func(_Tp)) const
     {
       typedef _ValFunClos<_ValArray, _Tp> _Closure;
-      return _Expr<_Closure, _Tp>(_Closure(*this, func));
+      return _Expr<_Closure, _Tp>(_Closure(*this, __func));
     }
 
   template<class _Tp>
     inline _Expr<_RefFunClos<_ValArray, _Tp>, _Tp>
-    valarray<_Tp>::apply(_Tp func(const _Tp &)) const
+    valarray<_Tp>::apply(_Tp __func(const _Tp &)) const
     {
       typedef _RefFunClos<_ValArray, _Tp> _Closure;
-      return _Expr<_Closure, _Tp>(_Closure(*this, func));
+      return _Expr<_Closure, _Tp>(_Closure(*this, __func));
     }
 
+  /// @cond undocumented
 #define _DEFINE_VALARRAY_UNARY_OPERATOR(_Op, _Name)                     \
   template<typename _Tp>                                               \
-    inline typename valarray<_Tp>::template _UnaryOp<_Name>::_Rt       \
+    inline typename valarray<_Tp>::template _UnaryOp<_Name>::_Rt       \
     valarray<_Tp>::operator _Op() const                                        \
     {                                                                  \
-      typedef _UnClos<_Name, _ValArray, _Tp> _Closure;                 \
-      typedef typename __fun<_Name, _Tp>::result_type _Rt;              \
+      typedef _UnClos<_Name, _ValArray, _Tp> _Closure;                 \
+      typedef typename __fun<_Name, _Tp>::result_type _Rt;             \
       return _Expr<_Closure, _Rt>(_Closure(*this));                    \
     }
 
@@ -1090,7 +1111,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     inline valarray<_Tp>&                                              \
     valarray<_Tp>::operator _Op##=(const valarray<_Tp> &__v)           \
     {                                                                  \
-      _GLIBCXX_DEBUG_ASSERT(_M_size == __v._M_size);                    \
+      __glibcxx_assert(_M_size == __v._M_size);                                \
       _Array_augmented_##_Name(_Array<_Tp>(_M_data), _M_size,          \
                               _Array<_Tp>(__v._M_data));               \
       return *this;                                                    \
@@ -1130,38 +1151,40 @@ _DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(<<, __shift_left)
 _DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(>>, __shift_right)
 
 #undef _DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT
-    
+
 
 #define _DEFINE_BINARY_OPERATOR(_Op, _Name)                            \
   template<typename _Tp>                                               \
-    inline _Expr<_BinClos<_Name, _ValArray, _ValArray, _Tp, _Tp>,       \
-                 typename __fun<_Name, _Tp>::result_type>               \
+    inline _Expr<_BinClos<_Name, _ValArray, _ValArray, _Tp, _Tp>,      \
+                typename __fun<_Name, _Tp>::result_type>               \
     operator _Op(const valarray<_Tp>& __v, const valarray<_Tp>& __w)   \
     {                                                                  \
-      _GLIBCXX_DEBUG_ASSERT(__v.size() == __w.size());                  \
-      typedef _BinClos<_Name, _ValArray, _ValArray, _Tp, _Tp> _Closure; \
-      typedef typename __fun<_Name, _Tp>::result_type _Rt;              \
-      return _Expr<_Closure, _Rt>(_Closure(__v, __w));                  \
+      __glibcxx_assert(__v.size() == __w.size());                      \
+      typedef _BinClos<_Name, _ValArray, _ValArray, _Tp, _Tp> _Closure;        \
+      typedef typename __fun<_Name, _Tp>::result_type _Rt;             \
+      return _Expr<_Closure, _Rt>(_Closure(__v, __w));                 \
     }                                                                  \
                                                                        \
   template<typename _Tp>                                               \
-    inline _Expr<_BinClos<_Name, _ValArray,_Constant, _Tp, _Tp>,        \
-                 typename __fun<_Name, _Tp>::result_type>               \
-    operator _Op(const valarray<_Tp>& __v, const _Tp& __t)             \
+    inline _Expr<_BinClos<_Name, _ValArray,_Constant, _Tp, _Tp>,       \
+                typename __fun<_Name, _Tp>::result_type>               \
+    operator _Op(const valarray<_Tp>& __v,                             \
+                const typename valarray<_Tp>::value_type& __t)         \
     {                                                                  \
       typedef _BinClos<_Name, _ValArray, _Constant, _Tp, _Tp> _Closure;        \
-      typedef typename __fun<_Name, _Tp>::result_type _Rt;              \
-      return _Expr<_Closure, _Rt>(_Closure(__v, __t));                 \
+      typedef typename __fun<_Name, _Tp>::result_type _Rt;             \
+      return _Expr<_Closure, _Rt>(_Closure(__v, __t));                 \
     }                                                                  \
                                                                        \
   template<typename _Tp>                                               \
-    inline _Expr<_BinClos<_Name, _Constant, _ValArray, _Tp, _Tp>,       \
-                 typename __fun<_Name, _Tp>::result_type>               \
-    operator _Op(const _Tp& __t, const valarray<_Tp>& __v)             \
+    inline _Expr<_BinClos<_Name, _Constant, _ValArray, _Tp, _Tp>,      \
+                typename __fun<_Name, _Tp>::result_type>               \
+    operator _Op(const typename valarray<_Tp>::value_type& __t,                \
+                const valarray<_Tp>& __v)                              \
     {                                                                  \
-      typedef _BinClos<_Name, _Constant, _ValArray, _Tp, _Tp> _Closure; \
-      typedef typename __fun<_Name, _Tp>::result_type _Rt;              \
-      return _Expr<_Closure, _Rt>(_Closure(__t, __v));                 \
+      typedef _BinClos<_Name, _Constant, _ValArray, _Tp, _Tp> _Closure;        \
+      typedef typename __fun<_Name, _Tp>::result_type _Rt;             \
+      return _Expr<_Closure, _Rt>(_Closure(__t, __v));                 \
     }
 
 _DEFINE_BINARY_OPERATOR(+, __plus)
@@ -1184,6 +1207,7 @@ _DEFINE_BINARY_OPERATOR(<=, __less_equal)
 _DEFINE_BINARY_OPERATOR(>=, __greater_equal)
 
 #undef _DEFINE_BINARY_OPERATOR
+  /// @endcond
 
 #if __cplusplus >= 201103L
   /**
@@ -1192,9 +1216,10 @@ _DEFINE_BINARY_OPERATOR(>=, __greater_equal)
    *  @param  __va  valarray.
    */
   template<class _Tp>
+    [[__nodiscard__]]
     inline _Tp*
-    begin(valarray<_Tp>& __va)
-    { return std::__addressof(__va[0]); }
+    begin(valarray<_Tp>& __va) noexcept
+    { return __va.size() ? std::__addressof(__va[0]) : nullptr; }
 
   /**
    *  @brief  Return an iterator pointing to the first element of
@@ -1202,9 +1227,10 @@ _DEFINE_BINARY_OPERATOR(>=, __greater_equal)
    *  @param  __va  valarray.
    */
   template<class _Tp>
+    [[__nodiscard__]]
     inline const _Tp*
-    begin(const valarray<_Tp>& __va)
-    { return std::__addressof(__va[0]); }
+    begin(const valarray<_Tp>& __va) noexcept
+    { return __va.size() ? std::__addressof(__va[0]) : nullptr; }
 
   /**
    *  @brief  Return an iterator pointing to one past the last element of
@@ -1212,9 +1238,15 @@ _DEFINE_BINARY_OPERATOR(>=, __greater_equal)
    *  @param  __va  valarray.
    */
   template<class _Tp>
+    [[__nodiscard__]]
     inline _Tp*
-    end(valarray<_Tp>& __va)
-    { return std::__addressof(__va[0]) + __va.size(); }
+    end(valarray<_Tp>& __va) noexcept
+    {
+      if (auto __n = __va.size())
+       return std::__addressof(__va[0]) + __n;
+      else
+       return nullptr;
+    }
 
   /**
    *  @brief  Return an iterator pointing to one past the last element of
@@ -1222,12 +1254,18 @@ _DEFINE_BINARY_OPERATOR(>=, __greater_equal)
    *  @param  __va  valarray.
    */
   template<class _Tp>
+    [[__nodiscard__]]
     inline const _Tp*
-    end(const valarray<_Tp>& __va)
-    { return std::__addressof(__va[0]) + __va.size(); }
+    end(const valarray<_Tp>& __va) noexcept
+    {
+      if (auto __n = __va.size())
+       return std::__addressof(__va[0]) + __n;
+      else
+       return nullptr;
+    }
 #endif // C++11
 
-  // @} group numeric_arrays
+  /// @} group numeric_arrays
 
 _GLIBCXX_END_NAMESPACE_VERSION
 } // namespace