[Patch] First bits of the algo merge

Howard Hinnant hhinnant@apple.com
Wed Dec 14 15:51:00 GMT 2005


On Dec 14, 2005, at 10:38 AM, Howard Hinnant wrote:

> On Dec 14, 2005, at 10:32 AM, Paolo Carlini wrote:
>
>> Paolo Carlini wrote:
>>
>>>> In order to check that everything was fine (also wrt  
>>>> __ops::bind2nd), I
>>>> decided to implement first the full change in v7-branch... and  
>>>> stumbled
>>>> on partial_sort_copy. The problem is that the predicate is both  
>>>> passed
>>>> to helpers working on the result iterators (i.e., make_heap,  
>>>> sort_heap)
>>>> and on a pair (first, result_first). Therefore, *which*  
>>>> value_types?!?
>>>>
>>> Well, maybe the issue is not so serious, because, among the concepts
>>> naturally there is:
>>>
>>>      __glibcxx_function_requires 
>>> (_ConvertibleConcept<_InputValueType,
>>> _OutputValueType>)
>>>
>>> and, if I understand correctly, that appear to imply that
>>> <_OutputValueType, _OutputValueType> is fine.
>>>
>>>
>> Actually, this issue is nasty, very nasty, and affects much more
>> seriously equal_range, binary_search and other functions which pass
>> around the predicate.
>>
>> Honestly, I'm about to give up, at least as far as mainline is  
>> concerned.
>
> I just now looked at partial_sort_copy and came to the same  
> conclusion you did (<_OutputValueType, _OutputValueType>).  I'll go  
> look at equal_range and binary_search...

<slapping forehead>  My Bad!  I got us started down the wrong track  
with:

> +  template<typename _Lhs, typename _Rhs>
> +  struct equal_to
> +  {
> +      bool
> +      operator()(const _Lhs& __lhs, const _Rhs& __rhs) const
> +      { return __lhs == __rhs; }
> +  };

That part about explicitly declaring the types is right.  The  
implementation of equal_to (and less) is wrong.

It should look more like:

template <class _Lhs, class _Rhs = _Lhs>
struct equal_to
{
     bool operator()(const _Lhs& __lhs, const _Lhs& __rhs) const  
{return __lhs == __rhs;}
     bool operator()(const _Lhs& __lhs, const _Rhs& __rhs) const  
{return __lhs == __rhs;}
     bool operator()(const _Rhs& __lhs, const _Lhs& __rhs) const  
{return __lhs == __rhs;}
     bool operator()(const _Rhs& __lhs, const _Rhs& __rhs) const  
{return __lhs == __rhs;}
};

template <class _Lhs>
struct equal_to<_Lhs, _Lhs>
{
     bool operator()(const _Lhs& __lhs, const _Lhs& __rhs) const  
{return __lhs == __rhs;}
};

Now you don't have to pull your hair out in <algorithm>. ;-)

Sorry for the false start.  That proxy test is still on the way...

-Howard



More information about the Libstdc++ mailing list