$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
From: Damien Fisher (damien_at_[hidden])
Date: 2002-05-17 08:15:04
On Fri, 17 May 2002, Daniel Frey wrote:
> > > template< typename Container >
> > > bool is_single_element( const Container& container )
> > > {
> > >    // Resolved at compile-time:
> > >    if( ::boost::is_pointer< Container::iterator >::value )
> > >      return !container.empty() &&
> > >        boost::next( container.begin() ) == container.end();
> > >    else
> > >      return !container.empty() &&
> > >        ++container.begin() == container.end();
> > > }
> > 
> > template<class It> bool is_single_element(It first, It last)
> > {
> >     return first != last && ++first == last;
> > }
> 
> How does this help to prevent unneccessary temporaries? You just moved
> them to the parameter list, don't you?
> 
> template< class Iterator >
> bool is_single_element( Iterator first, const Iterator& last )
> {
>    return first != last && ++first == last;
> }
> 
> template< class Container >
> bool is_single_element( const Container& container )
> {
>    return !container.empty() &&
>      ++Container::const_iterator( container.begin() ) ==
> container.end();
> }
I know was the one who wrote it, but I personally don't like the one
taking a container :).
Aren't iterators generally supposed to be "cheap" to copy?  Anyway, even
if they aren't, one could use boost::call_traits for the 2nd parameter.
(I've always wondered about whether this "cheap" copying is actually
required of a standard iterator or is just good practice, so I'd
appreciate clarification from someone as to whether I am just making
things up or not.)
When I get some time (hopefully this weekend) I'll write up distance_n
(which I personally find more appealing than is_single_element as it is
more STL-ish in its naming).