$extrastylesheet
Olena  User documentation 2.1
An Image Processing Platform
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
relabelfun.hh
1 // Copyright (C) 2008, 2009, 2010 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_MAKE_RELABELFUN_HH
28 # define MLN_MAKE_RELABELFUN_HH
29 
33 
34 # include <mln/core/concept/function.hh>
35 # include <mln/fun/i2v/array.hh>
36 # include <mln/value/next.hh>
37 
38 namespace mln
39 {
40 
41  namespace make
42  {
43 
54  template <typename V, typename F>
55  fun::i2v::array<V>
56  relabelfun(const Function_v2b<F>& fv2b,
57  const V& nlabels,
58  V& new_nlabels);
59 
71  template <typename V, typename F>
72  fun::i2v::array<V>
73  relabelfun(const Function_v2v<F>& fv2v,
74  const V& nlabels,
75  V& new_nlabels);
76 
77 
78 # ifndef MLN_INCLUDE_ONLY
79 
80  template <typename V, typename F>
81  inline
82  fun::i2v::array<V>
83  relabelfun(const Function_v2b<F>& fv2b_,
84  const V& nlabels,
85  V& new_nlabels)
86  {
87  mln_trace("make::relabelfun");
88 
89  const F& fv2b = exact(fv2b_);
90 
91  unsigned nlabels_i = value::next(nlabels);
92  V tmp_nlabels = literal::zero;
93  fun::i2v::array<V> fi2v(nlabels_i, literal::zero);
94  for (V i = 1; i < nlabels_i; ++i)
95  if (fv2b(i))
96  fi2v(i) = ++tmp_nlabels;
97  new_nlabels = tmp_nlabels;
98  return fi2v;
99  }
100 
101 
102  template <typename V, typename F>
103  inline
104  fun::i2v::array<V>
105  relabelfun(const Function_v2v<F>& fv2v_,
106  const V& nlabels,
107  V& new_nlabels)
108  {
109  mln_trace("make::relabelfun");
110 
111  const F& fv2v = exact(fv2v_);
112 
113  unsigned nlabels_i = value::next(nlabels);
114 
115  util::array<V> new_labels(nlabels_i, mln_max(V));
116  new_labels(0) = literal::zero;
117  V tmp_nlabels = literal::zero;
118  fun::i2v::array<V> fi2v(nlabels_i, mln_max(V));
119  fi2v(0) = literal::zero;
120 
121  for (V i = 1; i < nlabels_i; ++i)
122  {
123  mln_assertion(fv2v(i) <= nlabels);
124  if (new_labels(fv2v(i)) == mln_max(V))
125  {
126  new_labels(fv2v(i)) = ++tmp_nlabels;
127  fi2v(i) = tmp_nlabels;
128  }
129  else
130  fi2v(i) = new_labels(fv2v(i));
131  }
132  new_nlabels = tmp_nlabels;
133  return fi2v;
134  }
135 
136 # endif // ! MLN_INCLUDE_ONLY
137 
138  } // end of namespace mln::make
139 
140 } // end of namespace mln
141 
142 
143 #endif // ! MLN_MAKE_RELABELFUN_HH