00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifndef OPENMS_KERNEL_COMPARATORUTILS_H
00029 #define OPENMS_KERNEL_COMPARATORUTILS_H
00030
00031 #include <functional>
00032
00046 namespace OpenMS
00047 {
00048
00062 template < class Cmp >
00063 struct PointerComparator
00064 : public std::binary_function<typename Cmp::first_argument_type *, typename Cmp::second_argument_type *, typename Cmp::result_type>
00065 {
00066 PointerComparator(PointerComparator const& pCmp) : cmp_ ( pCmp.cmp_ ) {}
00067 PointerComparator(Cmp const& cmp = Cmp() ) : cmp_(cmp) {}
00068
00069 template < typename T1, typename T2 >
00070 typename Cmp::result_type
00071 operator () ( T1 left, T2 right) const
00072 {
00073 return cmp_ ( *left, *right );
00074 }
00075
00076 protected:
00077 Cmp const & cmp_;
00078 };
00079
00092 template < class Cmp >
00093 PointerComparator < Cmp> pointerComparator ( Cmp const & cmp )
00094 { return PointerComparator < Cmp > ( cmp ); }
00095
00096
00097
00098
00099
00100
00101
00110 template < class Cmp >
00111 struct ReverseComparator
00112 : std::binary_function<typename Cmp::second_argument_type, typename Cmp::first_argument_type, typename Cmp::result_type>
00113
00114 {
00115 ReverseComparator(ReverseComparator const& cmp) : cmp_(cmp.cmp_) {}
00116
00117 ReverseComparator(Cmp const& cmp = Cmp()) : cmp_(cmp) {}
00118
00119 template < typename T1, typename T2 >
00120 typename Cmp::result_type
00121 operator () ( T1 left, T2 right) const
00122 {
00123 return cmp_ ( right, left );
00124 }
00125
00126 protected:
00127 Cmp const & cmp_;
00128 };
00129
00142 template < class Cmp >
00143 ReverseComparator < Cmp> reverseComparator ( Cmp const & cmp )
00144 { return ReverseComparator < Cmp > ( cmp ); }
00145
00146
00147
00148
00149
00150
00151
00161 template < typename Cmp1, typename Cmp2 >
00162 struct LexicographicComparator
00163 : std::binary_function<typename Cmp1::first_argument_type, typename Cmp1::second_argument_type, bool >
00164 {
00165 LexicographicComparator(Cmp1 const& cmp1 = Cmp1(), Cmp2 const& cmp2 = Cmp2()) : cmp1_(cmp1), cmp2_(cmp2) {}
00166
00167 template < typename T1, typename T2 >
00168 bool
00169 operator () ( T1 left, T2 right) const
00170 {
00171 if (cmp1_(left, right))
00172 {
00173 return true;
00174 }
00175 else
00176 {
00177 if (cmp1_(right, left))
00178 {
00179 return false;
00180 }
00181 else
00182 {
00183 return cmp2_(left, right);
00184 }
00185 }
00186 }
00187
00188 protected:
00189 Cmp1 const & cmp1_;
00190 Cmp2 const & cmp2_;
00191 };
00192
00199 template < typename Cmp1, typename Cmp2 >
00200 LexicographicComparator < Cmp1, Cmp2 > lexicographicComparator ( Cmp1 const & cmp1, Cmp2 const & cmp2 )
00201 { return LexicographicComparator < Cmp1, Cmp2 > ( cmp1, cmp2 ); }
00202
00203
00204 }
00205
00206 #endif // OPENMS_KERNEL_COMPARATORUTILS_H