$extrastylesheet
Olena  User documentation 2.1
An Image Processing Platform
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
comp.cc
1 // Copyright (C) 2009 EPITA Research and Development Laboratory (LRDE)
2 //
3 // This file is part of Olena.
4 //
5 // Olena is free software: you can redistribute it and/or modify it under
6 // the terms of the GNU General Public License as published by the Free
7 // Software Foundation, version 2 of the License.
8 //
9 // Olena is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 // General Public License for more details.
13 //
14 // You should have received a copy of the GNU General Public License
15 // along with Olena. If not, see <http://www.gnu.org/licenses/>.
16 //
17 // As a special exception, you may use this file as part of a free
18 // software project without restriction. Specifically, if other files
19 // instantiate templates or use macros or inline functions from this
20 // file, or you compile this file and link it with other files to produce
21 // an executable, this file does not by itself cause the resulting
22 // executable to be covered by the GNU General Public License. This
23 // exception does not however invalidate any other reasons why the
24 // executable file might be covered by the GNU General Public License.
25 
26 #include <mln/trait/value/comp.hh>
27 
28 #include <mln/value/int_u8.hh>
29 #include <mln/algebra/vec.hh>
30 
31 
32 
33 
34 template <typename T, unsigned i, typename C>
35 void check_equal()
36 {
37  mlc_equal(mln_trait_value_comp(T, i), C)::check();
38 }
39 
40 
41 template <typename T>
42 void check_scalar()
43 {
44  mlc_equal(mln_trait_value_comp(T, 0), T)::check();
45 }
46 
47 
48 template <typename T, typename C>
49 void check_homogeneous()
50 {
51  mlc_equal(mln_trait_value_comp(T, 0), C)::check();
52 }
53 
54 
55 namespace mln
56 {
57 
58  template <typename R, typename G, typename B>
59  struct my_rgb;
60 
61  namespace trait
62  {
63 
64  template <typename R, typename G, typename B>
65  struct value_< my_rgb<R,G,B> >
66  {
67  enum { dim = 3 };
68  typedef void comp;
69  typedef R comp_0;
70  typedef G comp_1;
71  typedef B comp_2;
72  };
73 
74  } // mln::trait
75 
76 } // mln
77 
78 
79 
80 template <typename T,
81  typename C0, typename C1, typename C2>
82 void check_heterogeneous()
83 {
84  mlc_equal(mln_trait_value_comp(T, 0), C0)::check();
85  mlc_equal(mln_trait_value_comp(T, 1), C1)::check();
86  mlc_equal(mln_trait_value_comp(T, 2), C2)::check();
87 }
88 
89 
90 
91 int main()
92 {
93  using namespace mln;
94 
95 
96  // Scalars.
97 
98  {
99  typedef mln::value::int_u8 T;
100  check_scalar<T>();
101  check_equal<T, 0, T>();
102  }
103  {
104  typedef int T;
105  check_scalar<T>();
106  check_equal<T, 0, T>();
107  }
108 
109 
110  // Homogeneous vectors.
111 
112  {
113  typedef float C;
114  typedef algebra::vec<2, C> T;
115  check_homogeneous< T, C >();
116  check_equal< T, 0, C >();
117  check_equal< T, 1, C >();
118  }
119  {
120  typedef double C;
121  typedef C T[2];
122  check_homogeneous< T, C >();
123  check_equal< T, 0, C >();
124  check_equal< T, 1, C >();
125  }
126 
127 
128  // Heterogeneous types.
129 
130  {
131  check_heterogeneous< my_rgb< bool, unsigned, float* >,
132  bool, unsigned, float* >();
133  }
134 }