#include <map>
#include <string>

#include <stdio.h>

class FOO
{
public:
        FOO() { printf("FOO::FOO()\n"); }
        FOO(const FOO&) { printf("FOO::FOO(const FOO &)\n"); }
        FOO& operator=(const FOO &) { printf("FOO::oprartor=(const FOO&)\n"); return *this; }
        ~FOO() { printf("FOO::~FOO\n"); }

        bool operator<(const FOO&) const { return "FOO::operator<(const FOO&)\n"; }
        bool operator>(const FOO&) const { return "FOO::operator>(const FOO&)\n"; }
        bool operator<=(const FOO&) const { return "FOO::operator<=(const FOO&)\n"; }
        bool operator>=(const FOO&) const { return "FOO::operator>=(const FOO&)\n"; }
        bool operator==(const FOO&) const { return "FOO::operator==(const FOO&)\n"; }
        bool operator!=(const FOO&) const { return "FOO::operator!=<(const FOO&)\n"; }
};

class BAR
{
public:
        BAR() { printf("BAR::BAR()\n"); }
        BAR(const BAR&) { printf("BAR::BAR(const BAR &)\n"); }
        BAR& operator=(const BAR &) { printf("BAR::oprartor=(const BAR&)\n"); return *this; }
        ~BAR() { printf("BAR::~BAR\n"); }

        bool operator<(const BAR&) const { return "BAR::operator<(const BAR&)\n"; }
        bool operator>(const BAR&) const { return "BAR::operator>(const BAR&)\n"; }
        bool operator<=(const BAR&) const { return "BAR::operator<=(const BAR&)\n"; }
        bool operator>=(const BAR&) const { return "BAR::operator>=(const BAR&)\n"; }
        bool operator==(const BAR&) const { return "BAR::operator==(const BAR&)\n"; }
        bool operator!=(const BAR&) const { return "BAR::operator!=<(const BAR&)\n"; }
};

int main(void)
{
        typedef std::pair<FOO, BAR> FooBar;
        typedef std::pair<const FOO&, const BAR&> FooBarRef;

        std::map<FooBar, int> myMap;
        FOO foo;
        BAR bar;

        printf("\nMethod 1:\n");
        myMap.insert(std::make_pair(FooBar(foo, bar), 1));
        printf("Done\n\n");

        myMap.clear();

        printf("\nMethod 2:\n");
        myMap.insert(std::make_pair(FooBarRef(foo, bar), 1));
        printf("Done\n\n");
}
