Boost logo

Boost :

From: Thorsten Ottosen (nesotto_at_[hidden])
Date: 2003-05-11 16:19:31


> > Likewise, for me a container is simply one form of range, but I can
> > imagine many others. Perhaps I should take a look at the Views
> > library? To phrase the library in terms of containers seems to limit
> > it, to me.
>
> I like your approach, FWIW. It's easy enough to get an iterator out
> of a sequence when you need one. It can be harder to come up with a
> sequence given an iterator.

ok, I thought a little about it and I tend to agree that there is an
underlying range abstraction. I remember Pavol Dropa wrote a class called
iterator_range for his string lib...and that is maybe what we've got, not a
range, but an iterator range concept:

Concept: IteratorRange

Description:
A type is an IteratorRange if objects of that type can be used to construct
iterators (denoting ranges) that can be passes to iterator-based algorithms.

Associated types:

Name | Type
| Requirements
----------------------------------------------------------------------------
------------
iterator type | iterator_range_traits<X>::iterator |
The type of iterator used to iterate through an iterator range's elements.
const iterator type | iterator_range_traits<X>::const_iterator | A
type of iterator that may be used to examine, but not to modify, an iterator
range's elements
distance type | iterator_range_traits<X>::difference_type | bla
bla
size_type | iterator_range_traits<X>::size_type |
bla bla

Notation:
      X A type that is a model of IteratorRange
      x, y, z Object of type X

Valid expressions:

Name | Expression | Type
requirements | Return type
----------------------------------------------------------------------------
--------------
beginning of range | begin( x ) |
| iterator_range_traits<X>::iterator if a is mutable,

iterator_range_traits<X>::const_iterator otherwise
 end of range | end( x ) |
| iterator_range_traits<X>::iterator if a is mutable,

iterator_range_traits<X>::const_iterator otherwise
 size of range | size( x ) |
| iterator_range_traits<X>::isize_type

Complexity guarantess:
begin() and end() are amortized constant time. size() is linear in the
iterator range's size or better

Invariants
same as on http://www.sgi.com/tech/stl/Container.html

Concept: ReversibleIteratorRange

Description:
A type is an IteratorRange if objects of that type can be used to construct
iterators (at least bidirectional) (denoting ranges) that can be passes to
iterator-based algorithms.

Associated types:

Name | Type
| Requirements
----------------------------------------------------------------------------
------------
Reverse iterator type |
iterator_range_traits<X>::reverse_iterator | The type of
iterator used to iterate through a reversible

iterator range's elements.
const reverse iterator type |
iterator_range_traits<X>::const_reverse_iterator | A type of iterator
that may be used to examine, but not to modify,

a reversible iterator range's elements
Valid expressions:

Name | Expression |
Type requirements | Return type
----------------------------------------------------------------------------
--------------
beginning of reverse range | rbegin( x ) |
| iterator_range_traits<X>::reverse_iterator if a is mutable,

iterator_range_traits<X>::const_reverse_iterator otherwise
 end of reverse range | rend( x ) |
| bla bla

So could this be a way to go?

regards

Thorsten


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