Milena (Olena)  User documentation 2.0a Id
 All Classes Namespaces Functions Variables Typedefs Enumerator 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>
84  const V& nlabels,
85  V& new_nlabels)
86  {
87  trace::entering("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  trace::exiting("make::relabelfun");
99  return fi2v;
100  }
101 
102 
103  template <typename V, typename F>
104  inline
105  fun::i2v::array<V>
107  const V& nlabels,
108  V& new_nlabels)
109  {
110  trace::entering("make::relabelfun");
111 
112  const F& fv2v = exact(fv2v_);
113 
114  unsigned nlabels_i = value::next(nlabels);
115 
116  util::array<V> new_labels(nlabels_i, mln_max(V));
117  new_labels(0) = literal::zero;
118  V tmp_nlabels = literal::zero;
119  fun::i2v::array<V> fi2v(nlabels_i, mln_max(V));
120  fi2v(0) = literal::zero;
121 
122  for (V i = 1; i < nlabels_i; ++i)
123  {
124  mln_assertion(fv2v(i) <= nlabels);
125  if (new_labels(fv2v(i)) == mln_max(V))
126  {
127  new_labels(fv2v(i)) = ++tmp_nlabels;
128  fi2v(i) = tmp_nlabels;
129  }
130  else
131  fi2v(i) = new_labels(fv2v(i));
132  }
133  new_nlabels = tmp_nlabels;
134  trace::exiting("make::relabelfun");
135  return fi2v;
136  }
137 
138 # endif // ! MLN_INCLUDE_ONLY
139 
140  } // end of namespace mln::make
141 
142 } // end of namespace mln
143 
144 
145 #endif // ! MLN_MAKE_RELABELFUN_HH