Boost logo

Boost :

Subject: Re: [boost] [Iterator][MultiIndex]iterator-specificpartition_point-relatedfunctions
From: Arno Schödl (aschoedl_at_[hidden])
Date: 2008-12-24 08:15:35


> > I should have said "for counting_iterator<int> or some other fundamental type", by
> > calculating with the bounds.

> Maybe so, but I'm obviously missing something, because I still can't
> guess what you have in mind.

counting_iterator<int> lower_bound( counting_iterator<int> begin, counting_iterator<int> end, int n ) {
  if( n<begin ) return begin;
  else if( n<end ) return counting_iterator<int>(n);
  else return end;
}

> > To get a bit more specific, are you suggesting introducing a boost::lower_bound? Do
> > you want it to always forward to boost::partition_point? Or should it by default
> > forward to std::lower_bound, and only be overloaded for those specific iterators for
> > which a custom boost::partition_point is implemented?

> My current thinking is:
> boost::lower_bound
> -> partition_point (via ADL)
> -> std::lower_bound (by default)
> Make sense?

Do you mean this?

namespace boost {

template< ... >
It lower_bound( It begin, It end, T value ) {
   using boost::partition_point;
   return partition_point( begin, end, boost::bind( ... ) );
}

template< ... >
It partition_point( It begin, It end, Pred pred ) {
   return std::lower_bound( begin, end, boost::bind( ... ) );
}

// a custom implementation of partition_point:
template< ... >
transform_iterator<It,Func> partition_point(transform_iterator<It,Func> begin, transform_iterator<It,Func> end, Pred pred ) {
   ...
}

... more custom implementations ...

}

Is implementing partition_point by std::lower_bound possible? I remember seeing a paper of yours that pointed out that in

template< class It, class T, class Pred )
lower_bound( It begin, It end, T value, Pred pred )

T must be It::value_type. Then, how do you do the forwarding? Instead, I suggest providing our own implementation of partition_point.

> > I think we agree that we must introduce a default boost::partition_point. How should
> > the customization happen there? Via ADL on partition_point, or again via overloading
> > boost::partition_point?

> Inviting users to overload in your namespace is simply not a viable
> customization approach in general, so ADL is it.

O.k., agreed.

Why do you think ADL is o.k. for customizing boost::partition_point (soon std::partition_point, N2666), but not for customizing std::lower_bound? AFAIK, the same arguments apply to both.

Arno

--
Dr. Arno Schoedl · aschoedl_at_[hidden] 
Technical Director 
 
think-cell Software GmbH · Invalidenstr. 34 · 10115 Berlin, Germany 
http://www.think-cell.com · phone +49-30-666473-10 · toll-free (US) +1-800-891-8091
Directors: Dr. Markus Hannebauer, Dr. Arno Schoedl · Amtsgericht Charlottenburg, HRB 85229

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