Skip to content
Snippets Groups Projects
compare.hpp 1.79 KiB
Newer Older
  • Learn to ignore specific revisions
  • /*
     * compare.hpp
     *
     * Created on: Apr 1, 2013
     * Author: Jan Travnicek
     */
    
    
    Jan Trávníček's avatar
    Jan Trávníček committed
    #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 */
    
    
    Jan Trávníček's avatar
    Jan Trávníček committed
    #endif /* __COMPARE_HPP_ */