
Hi Everyone, Have you tried to use iterator adaptors and found the documentation wanting? I have recently updated the documentation in the CVS: http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/*checkout*/boost/boost/libs/ utility/iterator_adaptors.htm?rev=HEAD However, enough people have had problems approaching this library that I thought it would be useful to ask about what would make a gentle introductory example. Beman recently sent me the enclosed, but it seems to define such an oddball toy iterator that I'm not sure it would be a very good motivating example. I'm asking for input, especially from anyone who has "gotten over the hump" so to speak, with iterator adaptors. TIA, Dave --------------------------------- David Abrahams * Boost Consulting dave@boost-consulting.com * http://www.boost-consulting.com ----- Original Message ----- From: "Beman Dawes" <bdawes@acm.org> To: "Dave Abrahams" <david.abrahams@rcn.com> Cc: "Jeremy Siek" <jsiek@cs.indiana.edu> Sent: Thursday, July 25, 2002 3:21 PM Subject: Iterator adaptor example
Dave,
Thanks for fixing the docs. I fixed and committed to CVS one more change of BaseType -> Base.
I found I needed an even more basic example than anything in the docs to play with, particularly for creating an iterator from scratch, and put together the attached.
It is very simple, and does not demonstrate advanced features, but it answered newbie questions I had in a way that only running code, modifying it, and running again can do. (Not to mention fixing all the errors I made before it would compile!)
Feel free to include it in the distribution if you think it would help others. Needs a better name of course.
--Beman
---------- // Really dumb iterator_adaptor example program -----------------------------// // (C) Copyright Beman Dawes 2002. 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. #include <boost/iterator_adaptors.hpp> #include <string> #include <iostream> class my_base { public: std::string name; my_base() : name( "foo" ) {} void operator++() { name = "bar"; } bool operator==( const my_base & rhs ) const { return name == rhs.name; } }; // if my_base had "const std::string & operator*() const { return name; }" // then custom policies would not be required. class my_policies : public boost::default_iterator_policies { public: template <class IteratorAdaptor> typename IteratorAdaptor::reference dereference(const IteratorAdaptor& x) const { return x.base().name; } }; typedef boost::iterator_adaptor< my_base, my_policies, // default_iterator_policies would do if my_base::op* were present const std::string, const std::string &, const std::string *, std::forward_iterator_tag, std::string::difference_type > my_iterator; int main() { my_iterator itr; my_iterator::value_type str( "hello, iterator\n" ); //verify value_type present std::cout << str; std::cout << *itr << std::endl; // foo std::cout << *++itr << std::endl; // bar std::cout << (itr == my_iterator() ? "bingo!" : "oops!" ) << std::endl; // oops std::cout << (itr == ++my_iterator() ? "bingo!" : "oops!" ) << std::endl; // bingo return 0; } [Non-text portions of this message have been removed]