00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #ifndef MTL_STRIDED_DENSE_EL_ITERATOR_INCLUDE
00013 #define MTL_STRIDED_DENSE_EL_ITERATOR_INCLUDE
00014
00015 #include <boost/numeric/mtl/mtl_fwd.hpp>
00016 #include <boost/numeric/mtl/detail/strided_base_cursor.hpp>
00017
00018 namespace mtl {
00019
00020
00022
00025 template <typename Value>
00026 struct strided_dense_el_const_iterator
00027 : public detail::strided_base_cursor<const Value*>
00028 {
00029 typedef const Value* key_type;
00030 typedef detail::strided_base_cursor<key_type> super;
00031 typedef strided_dense_el_const_iterator self;
00032
00033 strided_dense_el_const_iterator(key_type me, size_t stride) : super(me, stride) {}
00034
00035 template <typename Parameters>
00036 strided_dense_el_const_iterator(mtl::dense2D<Value, Parameters> const& ma, size_t r, size_t c, size_t stride)
00037 : super(ma.elements() + ma.indexer(ma, r, c), stride)
00038 {}
00039
00040 self operator+(int x) const
00041 {
00042 return super::operator+(x);
00043 }
00044
00045 const Value& operator*() const
00046 {
00047 return *(this->key);
00048 }
00049 };
00050
00052
00055 template <typename Value>
00056 struct strided_dense_el_iterator
00057 : public detail::strided_base_cursor<Value*>
00058 {
00059 typedef Value* key_type;
00060 typedef detail::strided_base_cursor<key_type> super;
00061 typedef strided_dense_el_iterator self;
00062
00063 strided_dense_el_iterator(key_type me, size_t stride) : super(me, stride) {}
00064
00065 template <typename Parameters>
00066 strided_dense_el_iterator(mtl::dense2D<Value, Parameters>& ma, size_t r, size_t c, size_t stride)
00067 : super(ma.elements() + ma.indexer(ma, r, c), stride)
00068 {}
00069
00070 self operator+(int x) const
00071 {
00072 self tmp(*this);
00073 tmp+= x;
00074 return tmp;
00075 }
00076
00077 Value& operator*() const
00078 {
00079 return *(this->key);
00080 }
00081 };
00082
00083
00084 }
00085
00086 #endif // MTL_STRIDED_DENSE_EL_ITERATOR_INCLUDE