$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
From: Howard Hinnant (howard.hinnant_at_[hidden])
Date: 2007-02-06 14:06:15
On Feb 2, 2007, at 10:36 AM, Thorsten Ottosen wrote:
> David Abrahams wrote:
>> Thorsten Ottosen <thorsten.ottosen_at_[hidden]> writes:
>>
>>
>>> Hi,
>>>
>>> I couldn't find a way to do this. Maybe I have overlooked something.
>>> Anyway, making sure that operator<, operator== does the right
>>> thing is
>>> pretty important.
>>
>>
>> Strict weak ordering uses a single operations and does not relate two
>> operations. Thus you can test that < imposes a strict weak ordering,
>> but it can have nothing to do with ==. What you're testing below
>> would need some other name.
>
> Right. I guess both could be useful.
One approach is to use a debugging compare predicate which adapts
another predicate and adds a test. Something like:
template <class Compare>
struct debug_comp
{
Compare comp_;
debug_comp() {}
explicit debug_comp(const Compare& c) : comp_(c) {}
template <class Tp, class Up>
bool operator()(const Tp& x, const Up& y)
{
bool r = comp_(x, y);
if (r)
assert(!comp_(y, x));
return r;
}
};
Demo:
std::sort(v.begin(), v.end(), debug_comp<std::less<A> >());
It isn't an exhaustive test, but does tend to catch such bugs in the
wild. A disadvantage of this approach is that it may upset some
algorithms which only require comp(x,y) but not comp(y,x) to be valid.