Boost logo

Boost :

From: Pavol Droba (droba_at_[hidden])
Date: 2004-06-05 16:40:12


Hi,

On Sat, Jun 05, 2004 at 08:16:17AM -0400, Gennadiy Rozental wrote:
> Hi,
>
> For long time in my daytime projects I was using my class token_iterator
> designed based on old iterator_adaptor design (adopted for old compilers).
> Now when need arose for such functionality in Boost.Test. I looked in
> direction of boost::token_iterator. After some struggle I end up adopting my
> version to new design. Here some of comments and issues that made me opt
> so.
>

[snip]

This might seem a little bit out of topic, but some of the points you have addressed
are already solved by find/split_iterator provided in the string algo library.
Maybe you can have a look there. Unfortunately, the documentation is not 100% ready yet.

find_iterator is also based on generic iterator concept, however, the iterator is the only
template parameter, so you can easily specialize for string.

Simple usage looks like this:

#include <boost/algorithm/string.hpp>

using namespace boost;
using namespace std;

....

typedef split_iterator<string::iterator> splitter_t;

{
   string str("hello;how are you,bye");

   for(splitter_t it=splitter_t(str, token_finder(is_any_of(";,")));
       it!=splitter_t();
       ++it)
   {
      cout << copy_iterator_range<string>(*it) << endl;
   }
}

I hope, that there are not too many syntax errors in the example.

What can be seen there:

- find/split_iterator is templated only by an iterator.

- Finding algorithm is provided at runtime in the form of a "finder".
  There is a coupe of those defined in the string_algo lib. Specification
  can be seen here:
    http://tinyurl.com/29dg3

- An example here uses token_finder. It takes a predicate that recognizes valid
  tokens (separators). Thare is also a bunch of classification predicates there
  to help here (boost/algorithm/string/classification.hpp)

- Default initialized find_iterator is an end mark for all iterations.
  Once the iterator reaches the end position, it will not assert on later increments,
  rather it will not change.

- A value of the iterator is an iterator_range. It a a pair of iterators delimiting
  begin and end of match.
  
Just have a look if you are interested.

Regards,

Pavol.


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