hi,
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

Reply via email to