|
Boost : |
From: David Abrahams (dave_at_[hidden])
Date: 2003-06-06 16:34:46
Roland Richter <roland_at_[hidden]> writes:
> David Abrahams wrote:
>> This is going to break every boost library and every user which is
>> depending on the current CVS version of iterator_adaptors. The new
>> adaptors are so much better designed and easier to use that making the
>> transition should be cake, but before I do anything drastic I want to
>> hear how loud the pre-emptive screaming is ;-)
>> Objections?
>>
>
> No objections, Your Honour :-) ... just two remarks.
>
> I tried to update the view library (uses iterator_adaptors a lot),
> and generally it turned out to be straight-forward. However:
>
> + permutation_iterator is missing - when will it be due?
I guess there's no plan.
If you found it easy to use the new iterator adaptors, I'm sure you
could write it in a jiffy.
Or you could petition Toon to do a new one.
> (It would be easier to "port" derived iterator types if there was
> a detailed how-to somewhere.)
Really? There's almost nothing to it, unless they need to calculate
complicated default types. The permutation iterator in particular is
*really* easy.
Off-the-cuff:
template <class ElementIterator, IndexIterator>
class permutation_iterator
: public iterator_adaptor<
permutation_iterator<ElementIterator, IndexIterator>
, ElementIterator >
{
typedef iterator_adaptor<
permutation_iterator<ElementIterator, IndexIterator>
, ElementIterator> super_t;
friend class iterator_core_access;
public:
permutation_iterator() : order_it_() {}
explicit permutation_iterator(ElementIterator x, OrderIterator y)
: super_t(x), order_it_(y) {}
template<class OtherElementIterator, OtherIndexIterator>
permutation_iterator(
permutation_iterator<OtherIterator> const& r
, typename enable_if_convertible<OtherElementIterator, ElementIterator>::type* = 0
, typename enable_if_convertible<OtherIndexIterator, IndexIterator>::type* = 0
)
: super_t(r.base())
{}
private:
typename super_t::reference dereference() const
{ return *(this->base() + *this->order_it_); }
void increment() { ++this->order_it_; }
void decrement() { --this->order_it_; }
void advance(typename super_t::difference_type n)
{
this->order_it_ += -n;
}
template<class OtherElementIterator, OtherIndexIterator>
typename super_t::difference_type
distance_to(reverse_iterator<OtherElementIterator, OtherIndexIterator> const& y) const
{
return y.order_it_ - this->order_it_;
}
IndexIterator order_it_;
};
I'm just guessing. Why don't you put this through its paces, then
contribute revised documentation and tests for the new library?
> + Problems with MSVC++ 7.0 (as ever) and dereference (I guess this is
> a problem with default types). Demonstrated with reverse_iterator:
>
>
> int numbers[] = { 1,2,3,4,5,6,7 };
> const int N = sizeof(numbers)/sizeof(int);
> std::vector<int> v( numbers, numbers + N );
>
> typedef boost::reverse_iterator< std::vector<int>::iterator >
> reverse_iterator;
> reverse_iterator rit( v.begin() );
>
> if( *rit == v[0] ) // Does not compile
> { }
>
> if( v[0] == *rit ) // Does not compile
> { }
What is the error message you get? ** Did you read it? **
The problem is most likely that vc7 has no partial specialization and
thus can't deduce the value_type of an int*. If you manually
specialize boost::detail::iterator_traits it should work.
-- Dave Abrahams Boost Consulting www.boost-consulting.com
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk