|
Boost : |
From: Kresimir Fresl (fresl_at_[hidden])
Date: 2002-06-30 10:12:34
David Abrahams wrote:
> From: "Joerg Walter"
>>I'm not sure about this. valarray<>'s greatest weakness w.r.t. uBLAS is,
>>that iterators are missing.
> Plain pointers should make fine valarray iterators, FWIW.
Yes, but valarray<> hasn't member functions begin() and end().
There are three possibilities then:
1) to use numerics::array_adaptor<>, as Joerg proposed in
another post (thread ``uBLAS and valarray'');
2) to write specializations of numerics::vector<> and
numerics::matrix<> for valarray<>;
3) to use some traits class, eg. Dietmar Kuehl's array_traits<>
extended with valarray<> specialization, but then all
occurances of `v.begin()' and `v.end()' in uBLAS classes
must be changed to `begin (v)' and `end (v)' (more precisely,
to `boost::begin (v)' and `boost::end (v)').
There's one more thing with second and third approach:
const version of valarray<T>::operator[]() returns `T' and not
`T const&'. Therefore, specializations for `const valarray<>'
should be something like:
============================================
// fictitious extension of Dietmar Kuehl's array_traits<>
template <typename T>
struct array_traits<std::valarray<T> const> {
typedef T const* iterator;
// other typedefs
static iterator begin (std::valarray<T> const& cva) {
std::valarray<T>& va = const_cast<std::valarray<T>&> (cva);
return &va[0];
}
static iterator end (std::valarray<T> const& cva) {
std::valarray<T>& va = const_cast<std::valarray<T>&> (cva);
return &va[0] + va.size();
}
// ...
};
=============================================
fres
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk