Boost logo

Boost :

From: Neal Becker (ndbecker2_at_[hidden])
Date: 2005-06-03 13:41:11

christopher diggins wrote:

> ----- Original Message -----
> From: "Jonathan Turkanis" <technews_at_[hidden]>
> To: <boost_at_[hidden]>
> 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<
    BaseIterator> {

    friend class iterator_core_access;


    typedef typename
    typedef typename std::iterator_traits<BaseIterator>::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; }

    distance_to(strided_iterator<BaseIterator> const& y) const
    { return (y.base_reference()-this->base_reference())/stride; }


    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


Boost list run by bdawes at, gregod at, cpdaniel at, john at