Move libcds 1.6.0 from SVN
[libcds.git] / cds / details / comparator.h
1 //$$CDS-header$$
2
3 #ifndef __CDS_DETAILS_COMPARATOR_H
4 #define __CDS_DETAILS_COMPARATOR_H
5
6 #include <functional>
7 #include <string>
8
9 namespace cds {
10     /// Helper classes and functions
11     namespace details {
12         /// Comparator
13         /**
14             Comparator is a functor (a class with binary @a operator() ) that compares two values.
15             The comparator is based on \p std::less<T> functor and returns the result
16             of comparing of two values:
17             \li -1 if a < b
18             \li 0 if a == b
19             \li 1 if a > b
20         */
21         template <typename T>
22         class Comparator {
23             //@cond
24             std::less< T > m_cmp;
25             //@endcond
26         public:
27             typedef T        value_type    ;    ///< Type of values to compare
28
29             /// Compare method
30             /**
31                 @return -1 if @p p1 < @p p2 \n
32                 0 if @p p1 == @p p2 \n
33                 1 if @p p1 > @p p2 \n
34             */
35             int operator()( const T& p1, const T& p2 ) const
36             {
37                 if ( m_cmp( p1, p2 ) )
38                     return -1;
39                 if ( m_cmp( p2, p1 ))
40                     return 1;
41                 return 0;
42             }
43         };
44
45         /// String specialization. It uses @a string::compare method
46         template <>
47         class Comparator< std::string > {
48         public:
49             //@cond
50             typedef std::string        value_type    ;    ///< Type of values to compare
51
52             int operator()( const std::string& str1, const std::string& str2 ) const
53             {
54                 return str1.compare( str2 );
55             }
56             //@endcond
57         };
58     }    // namespace details
59 }    // namespace cds
60
61 #endif // #ifndef __CDS_DETAILS_COMPARATOR_H