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 #ifndef MLN_UTIL_SITE_PAIR_HH
00027 # define MLN_UTIL_SITE_PAIR_HH
00028
00029 # include <mln/core/concept/proxy.hh>
00030 # include <mln/util/ord_pair.hh>
00031
00035
00036 namespace mln
00037 {
00038
00039 namespace util
00040 {
00041
00042
00043
00044
00045
00050
00051 template <typename P>
00052 class site_pair : public mln::Object< site_pair<P> >
00053 {
00054 public:
00055
00056
00057 typedef mln_coord(P) coord;
00058
00059 site_pair();
00060 site_pair(const P& first, const P& second);
00061
00063 const P& first() const;
00065 const P& second() const;
00066
00068 const util::ord_pair<P>& pair() const;
00069
00070 private:
00071 util::ord_pair<P> pair_;
00072 };
00073
00074
00075
00076
00077
00078
00079
00080 template <typename P>
00081 bool operator==(const site_pair<P>& lhs, const site_pair<P>& rhs);
00082
00083 template <typename P>
00084 bool operator< (const site_pair<P>& lhs, const site_pair<P>& rhs);
00085
00086 template <typename P>
00087 bool operator< (const site_pair<P>& lhs, const site_pair<P>& rhs);
00088
00089 template <typename P>
00090 std::ostream&
00091 operator<<(std::ostream& ostr, const site_pair<P>& p);
00092
00093 }
00094
00095
00096 namespace internal
00097 {
00098
00101
00102 template <typename P, typename E>
00103 struct subject_impl< const util::site_pair<P>, E >
00104 {
00105 const P& first() const;
00106 const P& second() const;
00107 const util::ord_pair<P>& pair() const;
00108
00109 private:
00110 const E& exact_() const;
00111 };
00112
00114
00115 }
00116
00117
00118
00119 # ifndef MLN_INCLUDE_ONLY
00120
00121 namespace util
00122 {
00123
00124
00125
00126
00127
00128 template <typename P>
00129 site_pair<P>::site_pair()
00130 {
00131 }
00132
00133 template <typename P>
00134 site_pair<P>::site_pair(const P& first, const P& second)
00135 : pair_(first, second)
00136 {
00137 }
00138
00139 template <typename P>
00140 inline
00141 const P&
00142 site_pair<P>::first() const
00143 {
00144 return pair_.first();
00145 }
00146
00147 template <typename P>
00148 inline
00149 const P&
00150 site_pair<P>::second() const
00151 {
00152 return pair_.second();
00153 }
00154
00155 template <typename P>
00156 inline
00157 const util::ord_pair<P>&
00158 site_pair<P>::pair() const
00159 {
00160 return pair_;
00161 }
00162
00163
00164
00165
00166
00167 template <typename P>
00168 inline
00169 bool
00170 operator==(const site_pair<P>& lhs, const site_pair<P>& rhs)
00171 {
00172 return lhs.pair() == rhs.pair();
00173 }
00174
00175 template <typename P>
00176 inline
00177 bool
00178 operator< (const site_pair<P>& lhs, const site_pair<P>& rhs)
00179 {
00180 return lhs.pair() < rhs.pair();
00181 }
00182
00183 template <typename P>
00184 inline
00185 bool
00186 operator<=(const site_pair<P>& lhs, const site_pair<P>& rhs)
00187 {
00188 return lhs.pair() <= rhs.pair();
00189 }
00190
00191 template <typename P>
00192 inline
00193 std::ostream&
00194 operator<<(std::ostream& ostr, const site_pair<P>& p)
00195 {
00196 ostr << "(" << p.first() << ", " << p.second() << ")";
00197 return ostr;
00198 }
00199
00200 }
00201
00202 namespace internal
00203 {
00204
00205 template <typename P, typename E>
00206 inline
00207 const E&
00208 subject_impl< const util::site_pair<P>, E >::exact_() const
00209 {
00210 return internal::force_exact<const E>(*this);
00211 }
00212
00213 template <typename P, typename E>
00214 inline
00215 const P&
00216 subject_impl< const util::site_pair<P>, E >::first() const
00217 {
00218 return exact_().get_subject().first();
00219 }
00220
00221 template <typename P, typename E>
00222 inline
00223 const P&
00224 subject_impl< const util::site_pair<P>, E >::second() const
00225 {
00226 return exact_().get_subject().second();
00227 }
00228
00229 }
00230
00231 # endif // ! MLN_INCLUDE_ONLY
00232
00233 }
00234
00235
00236 #endif // ! MLN_UTIL_SITE_PAIR_HH