$extrastylesheet
Olena  User documentation 2.1
An Image Processing Platform
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
p_if_piter.hh
1 // Copyright (C) 2007, 2008, 2009, 2012, 2013 EPITA Research and
2 // Development 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_CORE_SITE_SET_P_IF_PITER_HH
28 # define MLN_CORE_SITE_SET_P_IF_PITER_HH
29 
35 # include <mln/core/internal/piter_adaptor.hh>
36 # include <mln/core/site_set/p_if.hh>
37 
38 
39 namespace mln
40 {
41 
42 
51  template <typename Pi, typename S, typename F>
52  struct p_if_piter_
53  : public internal::piter_adaptor_< Pi, // Adaptee.
54  p_if<S,F>, // Site_Set.
55  p_if_piter_<Pi,S,F> > // Exact.
56  {
58  p_if_piter_();
59 
61  p_if_piter_(const p_if<S,F>& s);
62 
65  void start_();
66 
68  void next_();
69 
71  void pi_change_target_(const p_if<S,F>& s);
73 
74  private:
75  typedef p_if_piter_<Pi,S,F> self_;
77 
78  protected:
79  using super_::s_;
80  using super_::pi_;
81  };
82 
83 
84 
85 # ifndef MLN_INCLUDE_ONLY
86 
87  template <typename Pi, typename S, typename F>
88  inline
90  {
91  }
92 
93  template <typename Pi, typename S, typename F>
94  inline
95  p_if_piter_<Pi,S,F>::p_if_piter_(const p_if<S,F>& s)
96  {
97  this->change_target(s);
98  }
99 
100  template <typename Pi, typename S, typename F>
101  inline
102  void
104  {
105  pi_.start();
106  while (pi_.is_valid() && ! s_->pred(pi_))
107  pi_.next();
108  }
109 
110  template <typename Pi, typename S, typename F>
111  inline
112  void
114  {
115  do
116  pi_.next();
117  while (pi_.is_valid() && ! s_->pred(pi_));
118  }
119 
120  template <typename Pi, typename S, typename F>
121  inline
122  void
123  p_if_piter_<Pi,S,F>::pi_change_target_(const p_if<S,F>& s)
124  {
125  pi_.change_target(s.overset());
126  }
127 
128 # endif // ! MLN_INCLUDE_ONLY
129 
130 } // end of namespace mln
131 
132 
133 #endif // ! MLN_CORE_SITE_SET_P_IF_PITER_HH