/*
 * compare.hpp
 *
 * Created on: Apr 1, 2013
 * Author: Jan Travnicek
 */

#ifndef __COMPARE_HPP_
#define __COMPARE_HPP_

namespace std {

template < typename T, typename Enable = void >
struct compare;

template<>
struct compare<bool> {
	int operator()(bool first, bool second) const {
		return first - second;
	}
};

template<>
struct compare<char> {
	int operator()(char first, char second) const {
		return first - second;
	}
};

template<>
struct compare<short> {
	int operator()(short first, short second) const {
		return first - second;
	}
};

template<>
struct compare<unsigned> {
	int operator()(unsigned first, unsigned second) const {
		return first - second;
	}
};

template<>
struct compare<int> {
	int operator()(int first, int second) const {
		return first - second;
	}
};

template<>
struct compare<long> {
	int operator()(long first, long second) const {
		if ( first < second )
			return -1;
		else if ( first > second )
			return 1;
		else
			return 0;
	}
};

template<>
struct compare<long long> {
	int operator()(long long first, long long second) const {
		if ( first < second )
			return -1;
		else if ( first > second )
			return 1;
		else
			return 0;
	}
};

template<>
struct compare<double> {
	int operator()(double first, double second) const {
		if ( first < second )
			return -1;
		else if ( first > second )
			return 1;
		else
			return 0;
	}
};

template<class T>
struct compare<T*> {
	int operator()( T * const & first, T * const & second) const {
		static compare<typename std::decay < T >::type > comp;
		return comp(*first, *second);
	}
};

template<class T>
struct compare<T&> {
	int operator()( const T & first, const T & second) const {
		static compare<typename std::decay < T >::type > comp;
		return comp(first, second);
	}
};

} /* namespace std */

#endif /* __COMPARE_HPP_ */