00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef LEMON_EXTENDED_PAIR_H
00018 #define LEMON_EXTENDED_PAIR_H
00019
00023
00024 namespace lemon {
00025
00045 template <typename T1, typename A1, typename T2, typename A2>
00046 struct extended_pair {
00050 typedef T1 first_type;
00054 typedef T2 second_type;
00055
00060 extended_pair() : first(), second() {}
00061
00065 extended_pair(A1 f, A2 s) : first(f), second(s) {}
00066
00071 template <class Pair>
00072 extended_pair(const Pair& pair) : first(pair.first), second(pair.second) {}
00073
00077 T1 first;
00081 T2 second;
00082 };
00083
00087 template <typename T1, typename T2,
00088 typename LA1, typename LA2, typename RA1, typename RA2>
00089 bool operator==(const extended_pair<T1, LA1, T2, LA2>& left,
00090 const extended_pair<T1, RA1, T2, RA2>& right) {
00091 return left.first == right.first && left.second == right.second;
00092 }
00093
00097 template <typename T1, typename T2,
00098 typename LA1, typename LA2, typename RA1, typename RA2>
00099 bool operator!=(const extended_pair<T1, LA1, T2, LA2>& left,
00100 const extended_pair<T1, RA1, T2, RA2>& right) {
00101 return !(left == right);
00102 }
00103
00107 template <typename T1, typename T2,
00108 typename LA1, typename LA2, typename RA1, typename RA2>
00109 bool operator<(const extended_pair<T1, LA1, T2, LA2>& left,
00110 const extended_pair<T1, RA1, T2, RA2>& right) {
00111 return left.first < right.first ||
00112 (!(right.first<left.first) && left.second < right.second);
00113 }
00114
00118 template <typename T1, typename T2,
00119 typename LA1, typename LA2, typename RA1, typename RA2>
00120 bool operator>(const extended_pair<T1, LA1, T2, LA2>& left,
00121 const extended_pair<T1, RA1, T2, RA2>& right) {
00122 return right < left;
00123 }
00124
00128 template <typename T1, typename T2,
00129 typename LA1, typename LA2, typename RA1, typename RA2>
00130 bool operator<=(const extended_pair<T1, LA1, T2, LA2>& left,
00131 const extended_pair<T1, RA1, T2, RA2>& right) {
00132 return !(right > left);
00133 }
00134
00138 template <typename T1, typename T2,
00139 typename LA1, typename LA2, typename RA1, typename RA2>
00140 bool operator>=(const extended_pair<T1, LA1, T2, LA2>& left,
00141 const extended_pair<T1, RA1, T2, RA2>& right) {
00142 return !(right < left);
00143 }
00144
00145 }
00146 #endif