Boost logo

Boost :

From: jsiek_at_[hidden]
Date: 2000-06-12 21:47:30


David Abrahams writes:
> Given that *all* the inherited friend functions are supposed to be
> instantiated, I don't think this approach will work for conforming
> compilers. Even if it *would* work, I don't see what we'd gain by doing
> that.

Ok, here's another workaround idea: specialize the adaptor class based
on the iterator category and split the iterator functionality into
four iterator adaptor classes: trivial, forward, bidir, and random.

The following helper class would provide the def's for iterator and
const_iterator similar to what you proposed for reverse_iterators. The
iterator_adaptor classes would be specialized based on the category of
Iterator.

  template <class Iterator, class ConstIterator,
            class Traits = std::iterator_traits<Iterator>,
            class ConstTraits = std::iterator_traits<ConstIterator>,
            class Policies = default_iterator_policies>
  struct iterator_adaptor_helper
  {
    typedef typename Traits::iterator_category Cat;
    typedef iterator_adaptor<Cat, Policies, Iterator, Traits,
      Iterator, Traits> iterator;
    typedef iterator_adaptor<Cat, Policies, ConstIterator, ConstTraits,
      Iterator, Traits> const_iterator;
  };

So this won't work on VC++... well, I've got a workaround for that
too :)

So what's the advantage? Less code to write! Here's the new
implementation of reverse_iterators:

[... policy class ...]

template <class Iterator, class ConstIterator,
          class Traits = std::iterator_traits<Iterator>,
          class ConstTraits = std::iterator_traits<ConstIterator> >
struct reverse_iterators
{
  typedef iterator_adaptor_helper<Iterator,ConstIterator,Traits,ConstTraits,
    reverse_iterator_policies> Helper;
  typedef typename Helper::iterator iterator;
  typedef typename Helper::const_iterator const_iterator;
};

I've uploaded the code as iterator_adaptor.zip to the vault. All the
tests passed for g++ and KCC. I haven't tested the VC++
workaround yet.

Cheers,

Jeremy


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk