$extrastylesheet
Olena  User documentation 2.1
An Image Processing Platform
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
scalar.hh
1 // Copyright (C) 2006, 2007, 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 #ifndef MLN_VALUE_SCALAR_HH
27 # define MLN_VALUE_SCALAR_HH
28 
32 
33 # include <mln/value/concept/scalar.hh>
34 # include <mln/metal/is_a.hh>
35 # include <mln/metal/if.hh>
36 
37 
38 namespace mln
39 {
40 
41  namespace value
42  {
43 
44  template <typename T>
45  class scalar_ : public Scalar< scalar_<T> >
46  {
47  public:
48 
50  typedef T enc; // FIXME
51 
53  typedef T equiv; // FIXME
54 
55 
57  scalar_();
58 
60  explicit scalar_(const T& val);
61 
63  T to_equiv() const;
64 
65  protected:
66  T val_; // FIXME: const&?
67  };
68 
69  template <typename T> class scalar_< scalar_<T> >; // Safety: this type should not exist!
70 
71 
73  template <typename T>
74  std::ostream& operator<<(std::ostream& ostr, const scalar_<T>& s);
75 
76 
77 
78  // Routine scalar(T) -> scalar_<T>.
79 
80  namespace internal
81  {
82 
83  template <typename T>
85  {
86  typedef mlc_is_a(T, Scalar) is_scalar_;
87  typedef mlc_if(is_scalar_, T, scalar_<T>) ret;
88  };
89 
90  } // end of namespace mln::value::internal
91 
92 
93  // Routine.
94  template <typename T>
95  typename internal::helper_scalar_<T>::ret
96  scalar(const T& s); // FIXME: if T already is a scalar_...
97 
98 
99 
100 
101 # ifndef MLN_INCLUDE_ONLY
102 
103  // scalar_<T>.
104 
105  template <typename T>
106  inline
108  {
109  }
110 
111  template <typename T>
112  inline
113  scalar_<T>::scalar_(const T& val)
114  : val_(val)
115  {
116  }
117 
118  template <typename T>
119  inline
120  T
121  scalar_<T>::to_equiv() const
122  {
123  return val_;
124  }
125 
126  // Operator.
127 
128  template <typename T>
129  inline
130  std::ostream& operator<<(std::ostream& ostr, const scalar_<T>& s)
131  {
132  return ostr << s.to_equiv();
133  }
134 
135  // Routine.
136 
137  template <typename T>
138  inline
139  typename internal::helper_scalar_<T>::ret
140  scalar(const T& s)
141  {
142  typename internal::helper_scalar_<T>::ret tmp(s);
143  return tmp;
144  }
145 
146 # endif // ! MLN_INCLUDE_ONLY
147 
148  } // end of namespace mln::value
149 
150 } // end of namespace mln
151 
152 
153 #endif // ! MLN_VALUE_SCALAR_HH