#include <iostream>
#include <vector>
#include <algorithm>
#include "Common/Base.hpp"

using namespace std;
using namespace common;


template <typename T>
struct TypeCompare
{
	bool operator () (const T *o1, const T *o2)
	{
		return &typeid(*o1) < &typeid(*o2);
	}
};


class KlasaBazowa
{
public:
	virtual ~KlasaBazowa() { }
	virtual char GetType() = 0;
};

class KlasaA : public KlasaBazowa
{
public:
	virtual char GetType() { return 'A'; };
};

class KlasaB : public KlasaBazowa
{
public:
	virtual char GetType() { return 'B'; };
};

class KlasaC : public KlasaBazowa
{
public:
	virtual char GetType() { return 'C'; };
};


int main(int argc, char **argv)
{
	std::vector<KlasaBazowa*> v;

	for (uint i = 0; i < 70; i++)
	{
		switch (g_Rand.RandUint(3))
		{
		case 0:
			v.push_back(new KlasaA());
			break;
		case 1:
			v.push_back(new KlasaB());
			break;
		case 2:
			v.push_back(new KlasaC());
			break;
		}
	}

	for (uint i = 0; i < v.size(); i++)
		cout << v[i]->GetType();
	cout << endl;

	std::sort(v.begin(), v.end(), TypeCompare<KlasaBazowa>());

	for (uint i = 0; i < v.size(); i++)
		cout << v[i]->GetType();
	cout << endl;
}

/*
Wyjście:

CCCBACCBAABCCCBBABBBCACCACCACABCBCCACABBCAAACBBBCBBAABBABAABAACCBBCAAC
AAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBBBBBCCCCCCCCCCCCCCCCCCCCCCCCC

*/

