#include <cassert>
#include <valarray>
struct S
{
// this ctor should not be required
S ()
: value (21)
{
}
S (int v)
: value (v)
{
}
S (const S& rhs)
: value (rhs.value)
{
}
S& operator+= (const S& rhs)
{
value += rhs.value;
return *this;
}
int value;
};
int main ()
{
const std::valarray<S> b (S (10), 1); // 10 elements with value 1
assert (b.sum ().value == 10);
return 0;
}
The wording in the standard seems to imply that the returned value should be a copy of one of the elements, and that op+= should be called on all of the other elements. If this is the case, then this an additional issue that would be detectable in user code [the user can count how many times the op+= is invoked]. This issue may apply to the min() and max() methods as well.
Index: include/valarray =================================================================== --- include/valarray (revision 609201) +++ include/valarray (working copy) @@ -174,7 +174,7 @@ // 26.3.2.7, p2 value_type sum () const { - return accumulate (_C_array.begin (), _C_array.end (), value_type ()); + return accumulate (_C_array.begin () + 1, _C_array.end (), _C_array [0]); } // 26.3.2.7, p3Rather than implementing it, I would like to replace the use of std::accumulate() with a simple loop like so:
Index: include/valarray =================================================================== --- include/valarray (revision 609201) +++ include/valarray (working copy) @@ -173,9 +173,7 @@ } // 26.3.2.7, p2 - value_type sum () const { - return accumulate (_C_array.begin (), _C_array.end (), value_type ()); - } + value_type sum () const; // 26.3.2.7, p3 value_type (min)() const { Index: include/valarray.cc =================================================================== --- include/valarray.cc (revision 609201) +++ include/valarray.cc (working copy) @@ -31,6 +31,18 @@ template <class _TypeT> +_TypeT valarray<_TypeT>::sum () const +{ + _TypeT __sum (_C_array [0]); + + for (_RWSTD_SIZE_T __i = 1; __i < _C_array.size (); ++__i) + __sum += _C_array [__i]; + + return __sum; +} + + +template <class _TypeT>