valarray_meta.h (_Expr<>::min, [...]): Implement.
authorGabriel Dos Reis <gdr@codesourcery.com>
Fri, 18 Aug 2000 10:40:23 +0000 (10:40 +0000)
committerGabriel Dos Reis <gdr@gcc.gnu.org>
Fri, 18 Aug 2000 10:40:23 +0000 (10:40 +0000)
* bits/valarray_meta.h (_Expr<>::min, _Expr<>::max): Implement.

* bits/valarray_array.h (__valarray_min, __valarray_max): New
function.

From-SVN: r35783

libstdc++-v3/ChangeLog
libstdc++-v3/bits/valarray_array.h
libstdc++-v3/bits/valarray_meta.h

index d104533fb3f63c7cb0b62376f998c41f4677cedf..829722b7a1a44a749a77e8580f9ced7278f9648d 100644 (file)
@@ -1,3 +1,10 @@
+2000-08-18  Gabriel Dos Reis  <gdr@codesourcery.com>
+
+       * bits/valarray_meta.h (_Expr<>::min, _Expr<>::max): Implement.
+
+       * bits/valarray_array.h (__valarray_min, __valarray_max): New
+       function. 
+
 2000-08-17  Mark Mitchell  <mark@codesourcery.com>
 
        * bits/localefwd.h (std::locale): Use explicit `class' specified
index 4eb2eb868ddf6f0f13e85d2bcfbdea3d10a7b255..de8a3bf20aa7232965e98e96c3adce6d55efeb94 100644 (file)
@@ -293,7 +293,39 @@ namespace std
     while (__f != __l) __r = __r * *__f++;
     return __r;
   }
+
+  // Compute the min/max of an array-expression
+  template<typename _Ta>
+  inline typename _Ta::value_array
+  __valarray_min(const _Ta& __a)
+  {
+    size_t __s = __a.size();
+    typedef typename _Ta::value_type _Value_type;
+    _Value_type __r = __s == 0 ? _Value_type() : __a[0];
+    for (size_t __i = 1; __i < __s; ++__i)
+      {
+        _Value_type __t = __a[__i];
+        if (__t < __r)
+          __r = __t;
+      }
+    return __r;
+  }
   
+  template<typename _Ta>
+  inline typename _Ta::value_array
+  __valarray_max(const _Ta& __a)
+  {
+    size_t __s = __a.size();
+    typedef typename _Ta::value_type _Value_type;
+    _Value_type __r = __s == 0 ? _Value_type() : __a[0];
+    for (size_t __i = 1; __i < __s; ++__i)
+      {
+        _Value_type __t = __a[__i];
+        if (__t > __r)
+          __r = __t;
+      }
+    return __r;
+  }
   
   //
   // Helper class _Array, first layer of valarray abstraction.
index c203d421e05f534fd6caa82d767293b03b2f057a..f52ddbfd2f5e41541f39226f6cf1be5493c65b1c 100644 (file)
@@ -669,6 +669,9 @@ namespace std {
         
         valarray<value_type> shift (int) const;
         valarray<value_type> cshift (int) const;
+
+      value_type min() const;
+      value_type max() const;
 //     _Meta<_ApplyFunctionWithValue<_Expr>, value_type>
 //     apply (value_type _M_func (value_type)) const;
 //     _Meta<_ApplyFunctionWithConstRef<_Expr>, value_type>
@@ -729,28 +732,16 @@ namespace std {
             return __s;
         }
     }
-    
-    template<class _Dom, typename _Tp>
-    inline _Tp
-    min (const _Expr<_Dom,_Tp>& __e)
-    {
-        size_t __s = __e.size ();
-        _Tp  __m = __e[0];
-        for (size_t __i=1; __i<__s; ++__i)
-            if (__m > __e[__i]) __m = __e[__i];
-        return __m;
-    }
-    
-    template<class _Dom, typename _Tp>
-    inline _Tp
-    max (const _Expr<_Dom,_Tp>& __e)
-    {
-        size_t __s = __e.size();
-        _Tp __m = __e[0];
-        for (size_t __i=1; __i<__s; ++__i)
-            if (__m < __e[__i]) __m = __e[__i];
-        return __m;
-    }
+
+  template<class _Clos, typename _Tp>
+  inline _Tp
+  _Expr<_Clos, _Tp>::min() const
+  { return __valarray_min(_M_closure); }
+
+  template<class _Close, typename _Tp>
+  inline _Tp
+  _Expr<_Clos, _Tp>::max() const
+  { return __valarray_max(_M_closure); }
     
     template<class _Dom, typename _Tp>
     inline _Expr<_UnClos<logical_not,_Expr,_Dom>, bool>