$extrastylesheet
Olena  User documentation 2.1
An Image Processing Platform
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
super.cc
1 // Copyright (C) 2007, 2008, 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/op/uminus.hh>
27 #include <mln/core/concept/object.hh>
28 #include <mln/value/int_u8.hh>
29 
30 
31 namespace my
32 {
33 
34 
35  // Value.
36 
37  template <typename E> struct Value;
38 
39  template <> struct Value<void> { typedef mln::Object<void> super; };
40 
41  template <typename E>
42  struct Value
43  {
44  typedef Value<void> category;
45  protected:
46  Value() {}
47  };
48 
49 
50  // Integer.
51 
52  template <typename E> struct Integer;
53 
54  template <> struct Integer<void> { typedef Value<void> super; };
55 
56  template <typename E>
57  struct Integer
58  {
59  typedef Integer<void> category;
60  };
61 
62  template <>
63  struct Integer<int>
64  {
65  typedef Integer<void> category;
66  int i;
67  Integer(int i) : i(i) {}
68  };
69 
70 
71  // Built_In.
72 
73  template <typename E> struct Built_In;
74 
75  template <> struct Built_In<void> { typedef void* super; }; // cause several posible
76 
77 
78  // test.
79 
80  struct test // like a built-in: no inheritance!
81  {
82  void is_test() {}
83  };
84 
85  // FIXME: Dead code?
86 // template <typename I>
87 // void foo(const Integer<I>&)
88 // {
89 // std::cout << "Int" << std::endl;
90 // }
91 
92 // template <typename I>
93 // void foo(const Value<I>&)
94 // {
95 // std::cout << "Value" << std::endl;
96 // }
97 
98 } // my
99 
100 
101 
102 namespace mln
103 {
104 
105  template <>
106  struct category< my::test >
107  {
108  typedef my::Built_In< my::Integer<void> > ret;
109  };
110 
111 // template <>
112 // struct category< int >
113 // {
114 // typedef my::Built_In< my::Integer<void> > ret;
115 // };
116 
117  namespace trait
118  {
119 
120  template <typename T>
121  struct set_unary_< op::uminus, my::Integer, T >
122  {
123  typedef bool ret;
124  };
125 
126  } // mln::trait
127 
128 } // mln
129 
130 
131 int main()
132 {
133  using namespace mln;
134 
135  mln_trait_op_uminus_(my::test) tmp;
136  tmp = true;
137  (void) tmp;
138 
139 // int i;
140 // my::foo<int>(i);
141 
142 // mln_trait_op_plus_(value::int_u8, int) t;
143 // void* v = t;
144 }