Boost logo

Boost :

From: Thorsten Ottosen (nesotto_at_[hidden])
Date: 2005-03-24 13:30:42

"Eric Niebler" <eric_at_[hidden]> wrote in message
| Thorsten Ottosen wrote:

| says, it suggests an association with the iterator_range<> type. But
| also, in my understanding, the Range concept is a bit more inclusive
| than merely "iterator ranges". A std container satisfies the Range
| concept, doesn't it?


| Consider iterator_range_size(). I could have a
| container that satisfies the range concept for which .size() is an O(1)
| operation, but std::distance( .begin(), .end() ) is O(N). What Big-O is
| suggested by "iterator_range_size()" when applied to one of those contaiers?


but boost::size(a_range) is allowed to be O(N)

| So, our concern here is that someone could borrow boost's Range concept
| without using boost's Range code? But this is still boost's Range
| concept, so I'm not sure I agree with Dave that there is "no Boost
| relationship in sight". But I'll put that aside and plan for a future
| when the Range concept is widely recognized outside Boost. Calling it
| "range_begin()" leads to conflicts, but can they be resolved? Can we
| move the conflicting template into a different namespace?

I think so. Let's assume we want the functions to be named

namespace boost

then we can put the metafunctions into
a namespace like

namespace boost
    namespace range
        struct iterator;
        struct const_iterator;
        struct value;
        struct size;
        struct difference;

The implementation then does

namespace boost
    template< class T >
    typename range::iterator<T>::type begin( T& r )
    { return range_begin(r); }

To summarize this extension protocol

- put range_begin() etc in your types namespace
- (partial) specialize range::X for all X

The library protocol would be

- put library name as prefix on ADL hooks
- put metafunctions in a namespace with the name of the library


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