Milena (Olena)  User documentation 2.0a Id
 All Classes Namespaces Functions Variables Typedefs Enumerator Groups Pages
site_set_iterator_base.hh
1 // Copyright (C) 2008, 2009, 2011 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_CORE_INTERNAL_SITE_SET_ITERATOR_BASE_HH
28 # define MLN_CORE_INTERNAL_SITE_SET_ITERATOR_BASE_HH
29 
34 
35 # include <mln/core/internal/site_iterator_base.hh>
36 
37 
38 namespace mln
39 {
40 
41  namespace internal
42  {
43 
51  //
52  template <typename S, typename E>
53  class site_set_iterator_base : public site_iterator_base<S, E>
54  {
55  public:
56 
58  typedef S pset;
59 
61  const S& site_set() const;
62 
64  const mln_psite(S)& p_hook_() const;
65 
67  void change_target(const S& s);
68 
71  void change_target_(const S& s);
72 
73  protected:
74 
76  mln_psite(S) p_;
77 
79  site_set_iterator_base();
80  };
81 
82 
83 #ifndef MLN_INCLUDE_ONLY
84 
85  template <typename S, typename E>
86  inline
87  site_set_iterator_base<S, E>::site_set_iterator_base()
88  {
89  }
90 
91  template <typename S, typename E>
92  inline
93  const S&
94  site_set_iterator_base<S, E>::site_set() const
95  {
96  mln_precondition(this->s_ != 0);
97  return *this->s_;
98  }
99 
100  template <typename S, typename E>
101  inline
102  void
103  site_set_iterator_base<S, E>::change_target(const S& s)
104  {
105  this->s_ = & s;
106  // p might be also updated since it can hold a pointer towards
107  // the set it designates, so:
108  if_possible::change_target(p_, s);
109  // Likewise, the iterator might need to update specific data.
110  exact(this)->change_target_(s);
111  // Last:
112  this->invalidate();
113  }
114 
115  template <typename S, typename E>
116  inline
117  void
118  site_set_iterator_base<S, E>::change_target_(const S& s)
119  {
120  (void) s;
121  // Empty by default.
122  }
123 
124  template <typename S, typename E>
125  inline
126  const mln_psite(S)&
127  site_set_iterator_base<S, E>::p_hook_() const
128  {
129  return p_;
130  }
131 
132 #endif // ! MLN_INCLUDE_ONLY
133 
134  } // end of namespace internal
135 
136 } // end of namespace mln
137 
138 
139 #endif // ! MLN_CORE_INTERNAL_SITE_SET_ITERATOR_BASE_HH