aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGabriel Dos Reis <gdr@codesourcery.com>2000-08-18 10:40:23 +0000
committerGabriel Dos Reis <gdr@gcc.gnu.org>2000-08-18 10:40:23 +0000
commite3b4d2e9a6291d9f483fca967c6c57ced98a59b2 (patch)
tree36b4de222ae74dcdf726e981d2c154a059f473f4
parentf5c979243f2ae42dd76f74a255b53366f3e376a7 (diff)
downloadgcc-e3b4d2e9a6291d9f483fca967c6c57ced98a59b2.zip
gcc-e3b4d2e9a6291d9f483fca967c6c57ced98a59b2.tar.gz
gcc-e3b4d2e9a6291d9f483fca967c6c57ced98a59b2.tar.bz2
valarray_meta.h (_Expr<>::min, [...]): Implement.
* bits/valarray_meta.h (_Expr<>::min, _Expr<>::max): Implement. * bits/valarray_array.h (__valarray_min, __valarray_max): New function. From-SVN: r35783
-rw-r--r--libstdc++-v3/ChangeLog7
-rw-r--r--libstdc++-v3/bits/valarray_array.h32
-rw-r--r--libstdc++-v3/bits/valarray_meta.h35
3 files changed, 52 insertions, 22 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index d104533f..829722b 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -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
diff --git a/libstdc++-v3/bits/valarray_array.h b/libstdc++-v3/bits/valarray_array.h
index 4eb2eb8..de8a3bf 100644
--- a/libstdc++-v3/bits/valarray_array.h
+++ b/libstdc++-v3/bits/valarray_array.h
@@ -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.
diff --git a/libstdc++-v3/bits/valarray_meta.h b/libstdc++-v3/bits/valarray_meta.h
index c203d42..f52ddbf 100644
--- a/libstdc++-v3/bits/valarray_meta.h
+++ b/libstdc++-v3/bits/valarray_meta.h
@@ -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>