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_VALUE_INTERNAL_VALUE_LIKE_HH
00027 # define MLN_VALUE_INTERNAL_VALUE_LIKE_HH
00028
00032
00033 # include <mln/core/concept/value.hh>
00034 # include <mln/core/internal/force_exact.hh>
00035
00036
00037 namespace mln
00038 {
00039
00040 namespace value
00041 {
00042
00043 namespace internal
00044 {
00045
00050 template < typename V,
00051 typename C,
00052 typename N,
00053 typename E >
00054 struct value_like_
00055 {
00057 typedef V equiv;
00058
00060 typedef C enc;
00061
00063 typedef N interop;
00064
00066 V to_equiv() const;
00067
00069 const C& to_enc() const;
00070
00072 N to_interop() const;
00073
00074
00075
00076 C& handle_() { return v_; }
00077
00078 protected:
00079 enc v_;
00080 };
00081
00082
00086 template <typename V, typename C, typename N, typename E>
00087 bool operator==(const value_like_<V,C,N,E>& lhs, const value_like_<V,C,N,E>& rhs);
00088
00089
00093 template <typename V, typename C, typename N, typename E>
00094 bool operator<(const value_like_<V,C,N,E>& lhs, const value_like_<V,C,N,E>& rhs);
00095
00096
00097 # ifndef MLN_INCLUDE_ONLY
00098
00099 template <typename V, typename C, typename N, typename E>
00100 inline
00101 V
00102 value_like_<V,C,N,E>::to_equiv() const
00103 {
00104 return v_;
00105 }
00106
00107 template <typename V, typename C, typename N, typename E>
00108 inline
00109 const C&
00110 value_like_<V,C,N,E>::to_enc() const
00111 {
00112 return v_;
00113 }
00114
00115 template <typename V, typename C, typename N, typename E>
00116 inline
00117 N
00118 value_like_<V,C,N,E>::to_interop() const
00119 {
00120 return static_cast<N>(mln::internal::force_exact<E>(*this));
00121 }
00122
00123 template <typename V, typename C, typename N, typename E>
00124 inline
00125 bool operator==(const value_like_<V,C,N,E>& lhs,
00126 const value_like_<V,C,N,E>& rhs)
00127 {
00128 return lhs.to_enc() == rhs.to_enc();
00129 }
00130
00131 template <typename V, typename C, typename N, typename E>
00132 inline
00133 bool operator<(const value_like_<V,C,N,E>& lhs,
00134 const value_like_<V,C,N,E>& rhs)
00135 {
00136 return lhs.to_interop() < rhs.to_interop();
00137 }
00138
00139 # endif // ! MLN_INCLUDE_ONLY
00140
00141 }
00142
00143 }
00144
00145 }
00146
00147
00148 #endif // ! MLN_VALUE_INTERNAL_VALUE_LIKE_HH