for several times i used a small utility class, so i thought it might be interesting for boost too.
it takes pairs of arguments and compares them pairwise beginning with the first one.
an example usage would be a special sorting operators:
struct position
{
double x, y, z;
};bool operator < (position const &p1, position const &p2)
{
return compare (p1.x, p2.x)
(p1.y, p2.y)
(p1.z, p2.z);
}is equal to
bool operator < (position const &p1, position const &p2)
{
if (p1.x == p2.x)
if (p1.y == p2.y)
return p1.z < p2.z;
else
return p1.y < p2.y;
else
return p1.x < p2.x;
}or
struct person
{
std::string firstname, lastname;
};bool operator < (person const &p1, person const &p2)
{
return compare
(p1.lastname, p2.lastname, cmp_case_insensitive)
(p1.firstname, p2.firstname, cmp_case_insensitive);
}where cmp_case_insensitive is a comparision function which is used instead of operator < to compare the arguments.
the class itself is quite short:
class compare
{
enum result { minus, zero, plus };public:
compare () : v_ (zero) {}
template <typename T>
compare (T const &a, T const &b)
: v_ (compare () (a, b).v_)
{}
template <typename T, typename Cmp>
compare (T const &a, T const &b, Cmp cmp)
: v_ (compare () (a, b, cmp).v_)
{} template <typename T>
compare &operator () (T const &a, T const &b)
{
if (v_ == zero)
{
if (a < b)
v_ = plus;
else if (b < a)
v_ = minus;
else
v_ = zero;
}
return *this;
}
template <typename T, typename Cmp>
compare &operator () (T const &a, T const &b, Cmp cmp)
{
if (v_ == zero)
{
if (cmp (a, b))
v_ = plus;
else if (cmp (b, a))
v_ = minus;
else
v_ = zero;
}
return *this;
} operator bool ()
{
return v_ == plus;
} private:
result v_;
};-- jan langer ... [EMAIL PROTECTED] "pi ist genau drei"
_______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost
