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 #include <mln/trait/value/comp.hh>
00027
00028 #include <mln/value/int_u8.hh>
00029 #include <mln/algebra/vec.hh>
00030
00031
00032
00033
00034 template <typename T, unsigned i, typename C>
00035 void check_equal()
00036 {
00037 mlc_equal(mln_trait_value_comp(T, i), C)::check();
00038 }
00039
00040
00041 template <typename T>
00042 void check_scalar()
00043 {
00044 mlc_equal(mln_trait_value_comp(T, 0), T)::check();
00045 }
00046
00047
00048 template <typename T, typename C>
00049 void check_homogeneous()
00050 {
00051 mlc_equal(mln_trait_value_comp(T, 0), C)::check();
00052 }
00053
00054
00055 namespace mln
00056 {
00057
00058 template <typename R, typename G, typename B>
00059 struct my_rgb;
00060
00061 namespace trait
00062 {
00063
00064 template <typename R, typename G, typename B>
00065 struct value_< my_rgb<R,G,B> >
00066 {
00067 enum { dim = 3 };
00068 typedef void comp;
00069 typedef R comp_0;
00070 typedef G comp_1;
00071 typedef B comp_2;
00072 };
00073
00074 }
00075
00076 }
00077
00078
00079
00080 template <typename T,
00081 typename C0, typename C1, typename C2>
00082 void check_heterogeneous()
00083 {
00084 mlc_equal(mln_trait_value_comp(T, 0), C0)::check();
00085 mlc_equal(mln_trait_value_comp(T, 1), C1)::check();
00086 mlc_equal(mln_trait_value_comp(T, 2), C2)::check();
00087 }
00088
00089
00090
00091 int main()
00092 {
00093 using namespace mln;
00094
00095
00096
00097
00098 {
00099 typedef mln::value::int_u8 T;
00100 check_scalar<T>();
00101 check_equal<T, 0, T>();
00102 }
00103 {
00104 typedef int T;
00105 check_scalar<T>();
00106 check_equal<T, 0, T>();
00107 }
00108
00109
00110
00111
00112 {
00113 typedef float C;
00114 typedef algebra::vec<2, C> T;
00115 check_homogeneous< T, C >();
00116 check_equal< T, 0, C >();
00117 check_equal< T, 1, C >();
00118 }
00119 {
00120 typedef double C;
00121 typedef C T[2];
00122 check_homogeneous< T, C >();
00123 check_equal< T, 0, C >();
00124 check_equal< T, 1, C >();
00125 }
00126
00127
00128
00129
00130 {
00131 check_heterogeneous< my_rgb< bool, unsigned, float* >,
00132 bool, unsigned, float* >();
00133 }
00134 }