namespace ietl {
template <class VS>
typename ietl::vectorspace_traits<VS>::vector_type new_vector(const VS& vs)
{
return vs.new_vector();
}
template <class VS>
typename ietl::vectorspace_traits<VS>::size_type vec_dimension(const VS& vs)
{
return vs.vec_dimension();
}
template<class VS>
void project(typename ietl::vectorspace_traits<VS>::vector_type& v, const VS& vs)
{
vs.project(v);
}
}
The vectorspace class implements the required vector space functionality for any standard container.
namespace ietl {
template<class V>
class vectorspace {
public:
typedef V vector_type;
typedef typename V::value_type scalar_type;
typedef typename V::size_type size_type;
vectorspace(size_type n);
size_type vec_dimension() const;
vector_type new_vector() const;
void project(vector_type&) const {}
};
}
namespace ietl {
template <class V>
class vector_wrapper : public boost::shared_ptr<V> {
public:
vector_wrapper(V* p) : boost::shared_ptr<V>(p) {}
operator V& ();
operator const V& () const;
...
};
}
namespace ietl {
template<class V> class wrapper_vectorspace {
public:
typedef vector_wrapper<V> vector_type;
typedef typename V::value_type scalar_type;
typedef typename V::size_type size_type;
wrapper_vectorspace(size_type n):n_(n){}
size_type vec_dimension() const;
vector_type new_vector() const;
void project(vector_type& src) const {}
};