
christopher diggins wrote:
----- Original Message ----- From: "Jonathan Turkanis" <technews@kangaroologic.com> To: <boost@lists.boost.org> Sent: Friday, June 03, 2005 2:00 PM Subject: [boost] Re: stride iterators and matricies
christopher diggins wrote:
Well all of this talk of matricies, and what not got me thinking that perhaps we should get back to basics and introduce stride iterators into Boost which properly model the Random Access Iterator concept (unless they are already existant somewhere and I simplty overlooked them :-p )
You did look at the iterators library, didn't you?
Yes. The only thing I saw resembling a stride iterator was permutation iterator. However I did not understand how to make a stride iterator using it. Perhaps it is trivial to create a stride iterator using the iterator library and you could show me how?
Here's my version: // arch-tag: dc0a48cf-c241-4480-b722-6e181cbd9fca /* * (C) Copyright Neal D. Becker (2004) * Permission to copy, use, modify, sell and distribute this software * is granted provided this copyright notice appears in all copies. * This software is provided "as is" without express or implied * warranty, and with no claim as to its suitability for any purpose. */ #ifndef strided_iterator_hpp #define strided_iterator_hpp #include <boost/iterator/iterator_adaptor.hpp> #include <iterator> namespace boost { template<typename BaseIterator> class strided_iterator : public boost::iterator_adaptor< strided_iterator<BaseIterator>, BaseIterator> { friend class iterator_core_access; public: typedef typename boost::iterator_adaptor<strided_iterator<BaseIterator>,BaseIterator> super_t; typedef typename std::iterator_traits<BaseIterator>::difference_type difference_type; strided_iterator() {} explicit strided_iterator (BaseIterator _base, size_t _stride) : super_t (_base), stride (_stride) {} void increment() { this->base_reference() += stride; } void decrement() { this->base_reference() -= stride; } void advance(difference_type n) { this->base_reference() += n*stride; } difference_type distance_to(strided_iterator<BaseIterator> const& y) const { return (y.base_reference()-this->base_reference())/stride; } private: const int stride; }; template<typename BaseIterator> strided_iterator<BaseIterator> make_strided_iterator(BaseIterator const& begin, int stride) { return strided_iterator<BaseIterator> (begin, stride); } } // namespace boost #endif