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/value/rgb.hh>
00027 #include <mln/value/rgb8.hh>
00028 #include <mln/value/int_u8.hh>
00029 #include <mln/literal/all.hh>
00030 
00031 
00032 #define sym_compare_assert(V1, OP, V2)          \
00033                                                 \
00034     mln_assertion(V1 OP V2);
00035 
00036 #define compute_rgb(T, V1, OP, V2)              \
00037                                                 \
00038     T(                                          \
00039       V1.red() OP V2.red() ,                    \
00040       V1.green() OP V2.green() ,                \
00041       V1.blue() OP V2.blue()                    \
00042     )
00043 
00044 #define compute_rgb_sc(T, V1, OP, V2)           \
00045                                                 \
00046     T(                                          \
00047       V1.red() OP V2 ,                          \
00048       V1.green() OP V2 ,                        \
00049       V1.blue() OP V2                           \
00050     )
00051 
00052 
00053 #define test_interop(T1, T2, OP, V1, V2)                        \
00054 {                                                               \
00055     T1 i = V1;                                                  \
00056     T2 j = V2;                                                  \
00057                                                                 \
00058     i = i OP j;                                                 \
00059     sym_compare_assert(i, ==, compute_rgb(T1, V1, OP, V2));     \
00060     sym_compare_assert(j, ==, V2);                              \
00061                                                                 \
00062     i = V1;                                                     \
00063     j = V2;                                                     \
00064                                                                 \
00065     j = i OP j;                                                 \
00066     sym_compare_assert(j, ==, compute_rgb(T1,V1, OP, V2));      \
00067     sym_compare_assert(i, ==, V1);                              \
00068                                                                 \
00069     i = V1;                                                     \
00070     i OP##= i;                                                  \
00071     sym_compare_assert(i, ==, compute_rgb(T1,V1, OP, V1));      \
00072                                                                 \
00073     i = V1;                                                     \
00074     j = V2;                                                     \
00075     i OP##= j;                                                  \
00076     sym_compare_assert(i, ==, compute_rgb(T1,V1, OP, V2));      \
00077                                                                 \
00078     j OP##= j;                                                  \
00079     sym_compare_assert(j, ==, compute_rgb(T1,V2, OP, V2));      \
00080                                                                 \
00081     i = V1;                                                     \
00082     j = V2;                                                     \
00083     j OP##= i;                                                  \
00084     sym_compare_assert(j, ==, compute_rgb(T1,V2, OP, V1));      \
00085                                                                 \
00086     i = V1;                                                     \
00087     i OP##= i;                                                  \
00088     sym_compare_assert(i, ==, compute_rgb(T1,V1, OP, V1));      \
00089 }
00090 
00091 
00092 
00093 #define test_interop_sc(T1, T2, OP, V1, V2)                    \
00094 {                                                              \
00095     T1 i = V1;                                                 \
00096     T2 j = V2;                                                 \
00097                                                                \
00098     i = i OP j;                                                \
00099     sym_compare_assert(i, ==, compute_rgb_sc(T1,V1, OP, V2));  \
00100     sym_compare_assert(j, ==, V2);                             \
00101                                                                \
00102     i = V1;                                                    \
00103     j = V2;                                                    \
00104     i OP##= j;                                                 \
00105     sym_compare_assert(i, ==, compute_rgb_sc(T1, V1, OP, V2)); \
00106 }
00107 
00108 int main()
00109 {
00110   using namespace mln;
00111   using value::rgb;
00112   using value::rgb8;
00113   using value::int_u8;
00114   using value::int_u;
00115 
00116   using literal::blue;
00117   using literal::white;
00118 
00119   {
00120     test_interop(rgb8, rgb8, +, rgb8(4,5,6), rgb8(1,2,3));
00121     test_interop(rgb8, rgb8, -, rgb8(4,5,6), rgb8(1,2,3));
00122 
00123     test_interop(rgb<10>, rgb<10>, +, rgb<10>(4,5,6), rgb<10>(1,2,3));
00124     test_interop(rgb<10>, rgb<10>, -, rgb<10>(4,5,6), rgb<10>(1,2,3));
00125 
00126     test_interop(rgb<16>, rgb<16>, +, rgb<16>(4,5,6), rgb<16>(1,2,3));
00127     test_interop(rgb<16>, rgb<16>, -, rgb<16>(4,5,6), rgb<16>(1,2,3));
00128 
00129     test_interop_sc(rgb8, int, *, rgb8(4,5,6), 4);
00130     test_interop_sc(rgb8, int, /, rgb8(40,50,60), 10);
00131 
00132     test_interop_sc(rgb8, unsigned, *, rgb8(4,5,6), 4);
00133     test_interop_sc(rgb8, unsigned, /, rgb8(40,50,60), 10);
00134 
00135     
00136     
00137     
00138 
00139     test_interop_sc(rgb8, char, *, rgb8(4,5,6), 4);
00140     test_interop_sc(rgb8, char, /, rgb8(40,50,60), 10);
00141 
00142     test_interop_sc(rgb8, int_u8, *, rgb8(4,5,6), 4);
00143     test_interop_sc(rgb8, int_u8, /, rgb8(40,50,60), 10);
00144 
00145     test_interop_sc(rgb8, int_u<7>, *, rgb8(4,5,6), 4);
00146     test_interop_sc(rgb8, int_u<7>, /, rgb8(40,50,60), 10);
00147   }
00148 }