Boost logo

Boost :

From: Robert Ramey (ramey_at_[hidden])
Date: 2006-07-06 12:17:14

David Abrahams wrote:
> "Robert Ramey" <ramey_at_[hidden]> writes:
>> David Abrahams wrote:
>>> "Robert Ramey" <ramey_at_[hidden]> writes:
>>> How are these different from many of the iterators provided by
>>>, particularly transform_iterator?
>> describes
>> this.

Whoops - try

>> All the "dataflow iterators" are derived from boost.iterator. For
>> some I derived from transform iterator for others I derived
>> from filter and I forget the rest.
> I don't know what you mean by "derived" but if you're referring to
> regular C++ derivation, that generally doesn't result in a legal
> iterator class. For example, the result type of operator++ is usually
> wrong.

That's what I'm referring to. And it has required extra effort
to make operator++ work correctly.

>> Aside from implementing the transforming behavior required
>> for the specific instance, the only real addition is the
>> requirement that all of them have a templated constructor.
> Details would be helpful here.

See the above link.

>> This simple addition made all the difference for me.
>> This permitted me to compose them to any ressonable
>> depth and sequence with just one (rather long)
>> typedef into a new iterator which can be used
>> just as easily as any other.

> The existing iterator adaptors are easily composed, so I'd like to
> know a little more about what you did, and gained.

I wanted to be able do things like the following:

a) define an iterator for transforming 8 bit octets into 6 bit octets
b) define an iterator which would render 6 bit octets into ascii
codes as used in base64 coding
c) define an iterator which would insert line breaks every 50 characters

I wanted to be able to develope and test each of these separately.

so far no real problem with the boost iterators.

Then I wanted to compose them with a typedef

                const char *,
        ,const char // cwpro8 needs this

Wow - just great. Now just construct an instance of base64_text - and we're
in business. So I can do:

char * address; // pointer to character buffer
boost::archive::iterators::ostream_iterator<char> oi(os);
        address + count

Uh - oh - I can do the above - because I need to instanciate the iterator
some sort of make_???_iterator. This an extra pain and adds a lot of
It also prevents me from doing something like:

        address + count

should I find this convenient.

By adding the templated constructors and using them instead of
I was able to achieve what I desired.

>> I've never been able to convince anyone else
>> of the merit of the approach - but hope springs eternal.
> Maybe you never articulated sufficiently clearly what you added to the
> basics provided by the iterator library, and why.

LOL - apparently so.

Robert Ramey

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