Boost logo

Boost :

From: Daniel Frey (daniel.frey_at_[hidden])
Date: 2003-08-23 04:21:03


Jan Langer wrote:
> hi,
> what is needed for the lexicographic class to be included into boost?

I don't know, but I think there are several ideas which haven't been
addressed and that we should at least have a look at:

a) Short-circuiting
b) Unnamed functions

> bool operator < (person const &p1, person const &p2)
> {
> return boost::lexicographic
> (p1.lastname, p2.lastname, cmp_lower)
> (p1.firstname, p2.firstname, cmp_lower)
> (p2.age, p1.age);
> }

The two points listed above are both visible here: Even if there are no
persons with the same name, age is accessed. Even worse, it may be a
costly method age() and the unaware user creates much worse code than
using nested if-else-structures.

Also, you might not want to define operator<. Sometimes, you just need
it in one place, e.g. std::sort( v.begin(), v.end(), /*HERE*/ );

I don't know how to solve these problems, though. The only idea I have
removes the comparator and uses macros. It does provide
short-circuiting, but I fear I might get stoned now. Anyway:

#define false(a,b) (!((a)==(b)))?((a)<(b)):!true
#define true(a,b) ((a)==(b))?((a)<(b)):false
#define BOOST_LEXICOGRAPHIC false

bool operator<( const person& p1, const person& p2 )
{
    return BOOST_LEXICOGRAPHIC
       ( p1.lastname, p2.lastname )
       ( p1.firstname, p2.firstname )
       ( p1.age, p2.age );
}

Regards, Daniel

-- 
Daniel Frey
aixigo AG - financial training, research and technology
Schloß-Rahe-Straße 15, 52072 Aachen, Germany
fon: +49 (0)241 936737-42, fax: +49 (0)241 936737-99
eMail: daniel.frey_at_[hidden], web: http://www.aixigo.de

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