$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
From: Giovanni Bajo (giovannibajo_at_[hidden])
Date: 2003-12-04 14:29:53
Hello,
I think the new IA library is missing a quick walkthrough, or a how-to-use
document, or both. I'm upgrading some old code using the old IA library (and
this to say that I've an idea how the whole stuff work), but I can't find
answers to my questions. The documentation explains (in rather complex
words) what a boost::iterator_adaptor/facade is (entering also technical
discussions that really end-users *shouldn't* care). I find the
documentation too much technical. For instance:
boost\libs\iterator\doc\iterator_adaptor.html:
--------- QUOTE -----------
abstract:
Each specialization of the iterator_adaptor class template is derived from a
specialization of iterator_facade. core interface functions expected by
iterator_facade are implemented in terms of the iterator_adaptor's Base
template parameter. [...]
--------- UNQUOTE -----------
These are technical details I don't care. I'm here to know what
iterator_adaptor is and what I can use it for, not how it is implemented
internally. This first paragraph is totally misplaced IMO.
Luckily, we have an introduction (a bit later):
--------- QUOTE -----------
The iterator_adaptor class template adapts some Base 1 type to create a new
iterator. Instantiations of iterator_adaptor are derived from a
corresponding instantiation of iterator_facade and implement the core
behaviors in terms of the Base type. In essence, iterator_adaptor merely
forwards all operations to an instance of the Base type, which it stores as
a member.
--------- UNQUOTE -----------
The second sentence is tech-talkie again. The first and the third sentence
instead give me an outlook of the library, which is what I was expecting to
see at the very beginning of the document.
--------- QUOTE -----------
The user of iterator_adaptor creates a class derived from an instantiation
of iterator_adaptor and then selectively redefines some of the core member
functions described in the table above.
--------- UNQUOTE -----------
Interesting, but there is absolutely no table above. Then a full paragraph
about "use_default" and why (techinically, again) you need it (I really
wouldn't care, it'd be enough if you told me "just use 'use_default' for the
other template parameters"). Then, Reference, with implementation code.
Then, an "usage" paragraph:
--------- QUOTE -----------
The Derived template parameter must be a publicly derived from
iterator_adaptor. In order for Derived to model the iterator concepts
corresponding to iterator_traits<Derived>::iterator_category, the
expressions involving m_iterator in the specifications of those private
member functions of iterator_adaptor that may be called by
iterator_facade<Derived, ``\ *V*\, \ *C*\, \ *R*\, \ *D*\>`` in evaluating
any valid expression involving Derived in those concepts' requirements.
--------- UNQUOTE -----------
which I can barely grok, let alone being any helpful to me. Then,
standard-like member function explanations (most of them are private, which
I shouldn't care, should I?).
And that's it (for iterator_adaptor).
I read it a few times, I went through iterator_facade.html as well (which is
maybe slightly better, but still too many technical-centered), and I still
don't know how to use iterator_adaptor. I don't have ANY clue. Luckily, the
paragraph "upgrading from old iterator adaptor library" gave me some ideas
about what to do, so I started something.
I'm trying to write an iterator which behaves like
std::map<whatever,whatever>::iterator, but returns the values when
dereferenced, that is pair's second element (iterator over the values, like
Python's dict.itervalues()). I don't need it to be generic for all maps
(that would be a plus, but hey), I need it only for my very map
instantiation. I tried this:
struct Attribute { /* blah */ };
typedef std::map<int, Attribute> attribute_map_t;
class AttributeIterator
: public boost::iterator_adaptor
<
AttributeIterator,
attribute_map_t::iterator,
Attribute
>
{
Attribute dereference(void) const
{ return this->base()->second; }
};
but it didn't work. It seems like I should define also some copy
constructors, but the documentation didn't tell me. It didn't even tell me I
can change dereference, since there is no table. Of course, I can't find any
document explaining me how the derefence prototype has to look like, and
stuff like that.
Then I'd need also a const iterator (and I heard the new IA should generate
const iterators even more easily), but I can't find how to do it without cut
& pasting.
Now, tell me that I missed begginer.html, please, and that it's right there.
I think this library needs a whole introduction document, which drives you
step by step, and shows you how to use iterator_facade and iterator_adaptor
to do very simple tasks. It seems like Boost.Python without the "Tutorial
Introduction", I doubt anybody will know how to use it just by staring at
the
refence.
Just my 2c, hope it helps.
Giovanni Bajo