$extrastylesheet
Olena  User documentation 2.1
An Image Processing Platform
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
mixin.hh
1 // Copyright (C) 2007, 2008, 2009 EPITA Research and Development
2 // Laboratory (LRDE)
3 //
4 // This file is part of Olena.
5 //
6 // Olena is free software: you can redistribute it and/or modify it under
7 // the terms of the GNU General Public License as published by the Free
8 // Software Foundation, version 2 of the License.
9 //
10 // Olena is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 // General Public License for more details.
14 //
15 // You should have received a copy of the GNU General Public License
16 // along with Olena. If not, see <http://www.gnu.org/licenses/>.
17 //
18 // As a special exception, you may use this file as part of a free
19 // software project without restriction. Specifically, if other files
20 // instantiate templates or use macros or inline functions from this
21 // file, or you compile this file and link it with other files to produce
22 // an executable, this file does not by itself cause the resulting
23 // executable to be covered by the GNU General Public License. This
24 // exception does not however invalidate any other reasons why the
25 // executable file might be covered by the GNU General Public License.
26 
27 #ifndef MLN_VALUE_MIXIN_HH
28 # define MLN_VALUE_MIXIN_HH
29 
30 # include <mln/core/concept/function.hh>
31 # include <mln/core/concept/image.hh>
32 # include <mln/value/internal/value_like.hh>
33 
34 namespace mln
35 {
36 
37  namespace value
38  {
39  template <typename T, typename F>
40  struct mixin;
41  }
42 
43  namespace trait
44  {
45 
46  template <typename T, typename F>
47  struct value_< mln::value::mixin<T, F> >
48  : value_< T > // FIXME
49  {
50  static const T max()
51  {
52  static const F f = F();
53  return f.max();
54  }
55  };
56 
57  } // end of namespace trait
58 
59 
60  namespace value
61  {
62 
63  template <typename T, typename F>
64  struct mixin : T // , Value < mixin<T, F> >, internal::value_like_ <T, mln_enc(T), mixin<T, F>, mixin<T, F> >
65  {
66  // typedef T value;
67 
69  {
70  }
71 
72  mixin(const T& t)
73  : T(t)
74  {
75  }
76 
77  mixin(const mixin& rhs)
78  : T(rhs)
79  {
80  }
81 
83  {
84  // FIXME: (?) Test if (this == &rhs)...
85  this->T::operator=(rhs);
86  return *this;
87  }
88 
89  mixin& operator=(const T& t)
90  {
91  // FIXME: (?) Test if (this == &t)...
92  this->T::operator=(t);
93  return *this;
94  }
95  };
96 
97  } // end of namespace mln::value
98 
99 
100  template <typename T, typename F>
101  bool operator < (const value::mixin<T,F>& lhs, const value::mixin<T,F>& rhs)
102  {
103  static F f;
104  return f.less(lhs, rhs);
105  }
106 
107  // FIXME : check if there is an operator== in F
108 
109  // template <typename T, typename F>
110  // bool operator == (const value::mixin<T,F>& lhs, const value::mixin<T,F>& rhs)
111  // {
112  // static F f;
113  // return f.equal(lhs, rhs);
114  // }
115 
116  template <typename T, typename F>
118  {
119  static F f;
120  return !(f.less(lhs, rhs) || f.less(rhs, lhs));
121  }
122 
123  template <typename T, typename F>
124  bool operator <= (const value::mixin<T,F>& lhs, const value::mixin<T,F>& rhs)
125  {
126  static F f;
127  return f.less(lhs, rhs) || lhs == rhs;
128  }
129 
130  template <typename T, typename F>
132  {
133  static F f;
134  return ! (f.less(lhs, rhs) || lhs == rhs);
135  }
136 
137  template <typename T, typename F>
139  {
140  static F f;
141  return ! f.less(lhs, rhs);
142  }
143 
144 # ifndef MLN_INCLUDE_ONLY
145 
146 # endif // MLN_INCLUDE_ONLY
147 
148 }; // end of namespace mln
149 
150 #endif // ! MLN_VALUE_MIXIN_HH