Boost logo

Boost :

From: Thorsten Ottosen (nesotto_at_[hidden])
Date: 2005-09-09 11:26:45


Eric Niebler <eric <at> boost-consulting.com> writes:

> This looks good. Thanks for taking care of this. I still have a problem
> with range_value<> and friends. To satisfy the Range concept, users are
> required to specialize boost::range_value<> in spite of the fact that it
> will always be equivalent to std::iterator_traits<Range>::value_type.
> This makes Range harder to extend for no benefit. The Range library can
> provide range_value<> without requiring users to specialize it.

right. I have comitted a revision that deduces

- range_size
- range_difference
- range_value

based on the iterator types.

I don't know how much code this will break, but I hope it won't break
much. We'll see when the next regression pop up tomorrow.

Btw, my range_size uses this code

                template< class T >
                struct add_unsigned;

                template<>
                struct add_unsigned<short>
                {
                        typedef unsigned short type;
                };
    
                template<>
                struct add_unsigned<int>
                {
                        typedef unsigned int type;
                };

                template<>
                struct add_unsigned<long>
                {
                        typedef unsigned long type;
                };

#ifdef BOOST_HAS_LONG_LONG
                
                template<>
                struct add_unsigned<long long>
                {
                        typedef unsigned long long type;
                };
#endif

Can anybody spot weaknesses in that approach?
 
> Regarding the concepts, it is correct to say, as you do, that the calls
> to begin(), end(), et al., must be qualified by boost::. But they also
> must say that the following

<quote>
> is also well formed and has the same meaning:
>
> using namespace unspecified-namespace;
> boost_range_begin(x);
</quote>
 
> I think you should also say somewhere (but not necessarily in the
> Concepts section) that unspecified-namespace contains the
> implementations of boost_range_begin(), et al., for the std containers,
> std::pair, arrays and null-terminated strings. I think that should do
> it. Does anybody have a better suggestion?

The Range concepts have been a fruitful source of confusion. I'm still myself
a bit puzzled sometimes :-)

We want to say a range r supports
the expressions

boost::begin(r)
boost::end(r)
boost::size(r)

That is true fo certain types if we do include a certain header, otherwise it
is not. That has really irritated me: in one translation-unit T could be
conforming to a range, in others it need not to.

If we use your quote above, it seems to me that the to expressions
are not equivalent: you can't exchange one with the other.

A Range concept is composed of more than the concept defining
boost_range_begin()/boost_range_end().

We might want to say the following:

T models a Range if it models one of the following concepts


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