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