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_CORE_INTERNAL_COORD_IMPL_HH
00027 # define MLN_CORE_INTERNAL_COORD_IMPL_HH
00028 
00034 # include <mln/core/internal/force_exact.hh>
00035 
00036 
00037 namespace mln
00038 {
00039 
00040   namespace internal
00041   {
00042 
00043 
00045 
00046 
00047     
00048 
00049 
00050 
00051     template <unsigned n, typename C, typename E>
00052     struct coord_impl_;
00053 
00054     template <typename C, typename E>
00055     struct coord_impl_<1, C, E>
00056     {
00057       const C& ind() const;
00058     private:
00059       typedef coord_impl_<1, C, E> self_;
00060 
00061     };
00062 
00063     template <typename C, typename E>
00064     struct coord_impl_<2, C, E>
00065     {
00066       const C&row() const;
00067       const C&col() const;
00068     };
00069 
00070     template <typename C, typename E>
00071     struct coord_impl_<3, C, E>
00072     {
00073       const C&sli() const;
00074       const C&row() const;
00075       const C&col() const;
00076     };
00077 
00078 
00079     
00080 
00081     template <unsigned n, typename C, typename E>
00082     struct mutable_coord_impl_;
00083 
00084     template <typename C, typename E>
00085     struct mutable_coord_impl_<1, C, E>
00086     {
00087       const C& ind() const;
00088       C& ind();
00089     };
00090 
00091     template <typename C, typename E>
00092     struct mutable_coord_impl_<2, C, E>
00093     {
00094       const C& row() const;
00095       C& row();
00096       const C& col() const;
00097       C& col();
00098     };
00099 
00100     template <typename C, typename E>
00101     struct mutable_coord_impl_<3, C, E>
00102     {
00103       const C& sli() const;
00104       C& sli();
00105       const C& row() const;
00106       C& row();
00107       const C& col() const;
00108       C& col();
00109     };
00110 
00111 
00112 # ifndef MLN_INCLUDE_ONLY
00113 
00114     
00115 
00116     
00117 
00118     template <typename C, typename E>
00119     inline
00120     const C& coord_impl_<1, C, E>::ind() const
00121     {
00122       return internal::force_exact<E>(*this)[0];
00123     }
00124 
00125     
00126 
00127     template <typename C, typename E>
00128     inline
00129     const C& coord_impl_<2, C, E>::row() const
00130     {
00131       return internal::force_exact<E>(*this)[0];
00132     }
00133 
00134     template <typename C, typename E>
00135     inline
00136     const C& coord_impl_<2, C, E>::col() const
00137     {
00138       return internal::force_exact<E>(*this)[1];
00139     }
00140 
00141     
00142 
00143     template <typename C, typename E>
00144     inline
00145     const C& coord_impl_<3, C, E>::sli() const
00146     {
00147       return internal::force_exact<E>(*this)[0];
00148     }
00149 
00150     template <typename C, typename E>
00151     inline
00152     const C& coord_impl_<3, C, E>::row() const
00153     {
00154       return internal::force_exact<E>(*this)[1];
00155     }
00156 
00157     template <typename C, typename E>
00158     inline
00159     const C& coord_impl_<3, C, E>::col() const
00160     {
00161       return internal::force_exact<E>(*this)[2];
00162     }
00163 
00164 
00165     
00166 
00167     
00168 
00169     template <typename C, typename E>
00170     inline
00171     const C& mutable_coord_impl_<1, C, E>::ind() const
00172     {
00173       return internal::force_exact<E>(*this)[0];
00174     }
00175 
00176     template <typename C, typename E>
00177     inline
00178     C& mutable_coord_impl_<1, C, E>::ind()
00179     {
00180       return internal::force_exact<E>(*this)[0];
00181     }
00182 
00183     
00184 
00185     template <typename C, typename E>
00186     inline
00187     const C& mutable_coord_impl_<2, C, E>::row() const
00188     {
00189       return internal::force_exact<E>(*this)[0];
00190     }
00191 
00192     template <typename C, typename E>
00193     inline
00194     C& mutable_coord_impl_<2, C, E>::row()
00195     {
00196       return internal::force_exact<E>(*this)[0];
00197     }
00198 
00199     template <typename C, typename E>
00200     inline
00201     const C& mutable_coord_impl_<2, C, E>::col() const
00202     {
00203       return internal::force_exact<E>(*this)[1];
00204     }
00205 
00206     template <typename C, typename E>
00207     inline
00208     C& mutable_coord_impl_<2, C, E>::col()
00209     {
00210       return internal::force_exact<E>(*this)[1];
00211     }
00212 
00213     
00214 
00215     template <typename C, typename E>
00216     inline
00217     const C& mutable_coord_impl_<3, C, E>::sli() const
00218     {
00219       return internal::force_exact<E>(*this)[0];
00220     }
00221 
00222     template <typename C, typename E>
00223     inline
00224     C& mutable_coord_impl_<3, C, E>::sli()
00225     {
00226       return internal::force_exact<E>(*this)[0];
00227     }
00228 
00229     template <typename C, typename E>
00230     inline
00231     const C& mutable_coord_impl_<3, C, E>::row() const
00232     {
00233       return internal::force_exact<E>(*this)[1];
00234     }
00235 
00236     template <typename C, typename E>
00237     inline
00238     C& mutable_coord_impl_<3, C, E>::row()
00239     {
00240       return internal::force_exact<E>(*this)[1];
00241     }
00242 
00243     template <typename C, typename E>
00244     inline
00245     const C& mutable_coord_impl_<3, C, E>::col() const
00246     {
00247       return internal::force_exact<E>(*this)[2];
00248     }
00249 
00250     template <typename C, typename E>
00251     inline
00252     C& mutable_coord_impl_<3, C, E>::col()
00253     {
00254       return internal::force_exact<E>(*this)[2];
00255     }
00256 
00257 # endif // ! MLN_INCLUDE_ONLY
00258 
00259   } 
00260 
00261 } 
00262 
00263 
00264 #endif // ! MLN_CORE_INTERNAL_COORD_IMPL_HH