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_MIXIN_HH
00027 # define MLN_VALUE_MIXIN_HH
00028
00029 # include <mln/core/concept/function.hh>
00030 # include <mln/core/concept/image.hh>
00031 # include <mln/value/internal/value_like.hh>
00032
00033 namespace mln
00034 {
00035
00036 namespace value
00037 {
00038 template <typename T, typename F>
00039 struct mixin;
00040 }
00041
00042 namespace trait
00043 {
00044
00045 template <typename T, typename F>
00046 struct value_< mln::value::mixin<T, F> >
00047 : value_< T >
00048 {
00049 static const T max()
00050 {
00051 static const F f = F();
00052 return f.max();
00053 }
00054 };
00055
00056 }
00057
00058
00059 namespace value
00060 {
00061
00062 template <typename T, typename F>
00063 struct mixin : T
00064 {
00065
00066
00067 mixin()
00068 {
00069 }
00070
00071 mixin(const T& t)
00072 : T(t)
00073 {
00074 }
00075
00076 mixin(const mixin& rhs)
00077 : T(rhs)
00078 {
00079 }
00080
00081 mixin& operator=(const mixin& rhs)
00082 {
00083
00084 this->T::operator=(rhs);
00085 return *this;
00086 }
00087
00088 mixin& operator=(const T& t)
00089 {
00090
00091 this->T::operator=(t);
00092 return *this;
00093 }
00094 };
00095
00096 }
00097
00098
00099 template <typename T, typename F>
00100 bool operator < (const value::mixin<T,F>& lhs, const value::mixin<T,F>& rhs)
00101 {
00102 static F f;
00103 return f.less(lhs, rhs);
00104 }
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115 template <typename T, typename F>
00116 bool operator == (const value::mixin<T,F>& lhs, const value::mixin<T,F>& rhs)
00117 {
00118 static F f;
00119 return !(f.less(lhs, rhs) || f.less(rhs, lhs));
00120 }
00121
00122 template <typename T, typename F>
00123 bool operator <= (const value::mixin<T,F>& lhs, const value::mixin<T,F>& rhs)
00124 {
00125 static F f;
00126 return f.less(lhs, rhs) || lhs == rhs;
00127 }
00128
00129 template <typename T, typename F>
00130 bool operator > (const value::mixin<T,F>& lhs, const value::mixin<T,F>& rhs)
00131 {
00132 static F f;
00133 return ! (f.less(lhs, rhs) || lhs == rhs);
00134 }
00135
00136 template <typename T, typename F>
00137 bool operator >= (const value::mixin<T,F>& lhs, const value::mixin<T,F>& rhs)
00138 {
00139 static F f;
00140 return ! f.less(lhs, rhs);
00141 }
00142
00143 # ifndef MLN_INCLUDE_ONLY
00144
00145 # endif // MLN_INCLUDE_ONLY
00146
00147 };
00148
00149 #endif // ! MLN_VALUE_MIXIN_HH