34 #ifndef SHARK_LINALG_BLAS_VECTOR_PROXY_HPP 35 #define SHARK_LINALG_BLAS_VECTOR_PROXY_HPP 38 #include "detail/iterator.hpp" 44 class vector_reference:
public vector_expression<vector_reference<V> >{
46 typedef typename V::size_type size_type;
47 typedef typename V::difference_type difference_type;
48 typedef typename V::value_type value_type;
49 typedef typename V::scalar_type scalar_type;
55 typedef typename V::index_type index_type;
144 typedef typename boost::mpl::if_<boost::is_const<V>,
145 typename V::const_iterator,
152 const_iterator
end()
const{
163 iterator
set_element(iterator pos, index_type index, value_type value){
164 return expression().set_element(pos,index,value);
194 typedef typename V::size_type size_type;
195 typedef typename V::difference_type difference_type;
196 typedef typename V::value_type value_type;
197 typedef typename V::scalar_type scalar_type;
203 typedef typename V::index_type index_type;
207 typedef typename closure<V>::type vector_closure_type;
215 m_expression(data), m_range(r){
224 typename boost::disable_if<
225 boost::is_same<E,vector_range>
228 , m_range(other.range()){}
235 return m_range.start();
251 return m_range.size();
278 return m_expression(m_range(i));
283 return assign(*
this,
typename vector_temporary<V>::type(vr));
288 return assign(*
this,
typename vector_temporary<E>::type(e));
291 typedef subrange_iterator< typename vector_closure_type::iterator>
iterator;
292 typedef subrange_iterator< typename vector_closure_type::const_iterator>
const_iterator;
296 m_expression.begin(),m_expression.end(),
302 m_expression.begin(),m_expression.end(),
306 const_iterator
end()
const{
308 m_expression.begin(),m_expression.end(),
309 start()+
size(),start()
314 m_expression.begin(),m_expression.end(),
315 start()+
size(),start()
323 iterator
set_element(iterator pos, index_type index, value_type value){
324 return iterator(m_expression.set_element(pos.inner(),index+start(),value),start());
328 return iterator(m_expression.clear_range(first.inner(),last.inner()),start());
332 return iterator(m_expression.clear_element(pos.inner()),start());
336 m_expression.reserve(non_zeros);
339 vector_closure_type m_expression;
365 typename V::size_type start,
366 typename V::size_type stop
373 return subrange(static_cast<V&>(data), start, stop);
385 typedef std::size_t size_type;
386 typedef std::ptrdiff_t difference_type;
387 typedef typename boost::remove_const<T>::type value_type;
388 typedef value_type scalar_type;
394 typedef std::size_t index_type;
411 : m_values(expression().
storage())
412 , m_size(expression().
size())
413 , m_stride(expression().
stride()){}
421 : m_values(expression().
storage())
422 , m_size(expression().
size())
423 , m_stride(expression().
stride()){}
430 m_values(values),m_size(size),m_stride(
stride){}
473 return m_values[i*m_stride];
479 return m_values[i*m_stride];
485 return m_values[i*m_stride];
491 return m_values[i*m_stride];
502 return(*
this)[i] = t;
508 (*this)[i] = value_type();
513 return assign(
typename vector_temporary<self_type>::type(e));
517 return assign(
typename vector_temporary<E>::type(e));
534 const_iterator
end()
const {
549 iterator
set_element(iterator pos, index_type index, value_type value) {
551 (*this)(index) = value;
557 v(pos.index()) = value_type();
565 for(; start !=
end; ++start){
566 *start = value_type();
573 std::ptrdiff_t m_stride;
583 template <
class T, std::
size_t N>
588 template<
class T,
class I>
594 typedef std::size_t size_type;
595 typedef std::ptrdiff_t difference_type;
596 typedef typename boost::remove_const<T>::type value_type;
597 typedef value_type scalar_type;
603 typedef typename boost::remove_const<I>::type index_type;
620 : m_nonZeros(expression().
nnz())
621 , m_indices(expression().
indices())
622 , m_values(expression().
values())
623 , m_size(expression().
size()){}
636 size_type memoryLength
637 ): m_nonZeros(memoryLength)
669 difference_type diff = pos-
indices();
670 if(diff == (difference_type)
nnz() || *pos != i)
685 typedef compressed_storage_iterator<value_type const, index_type const>
const_iterator;
694 const_iterator
end()
const {
698 std::size_t m_nonZeros;
699 const_index_pointer m_indices;
700 const_pointer m_values;