NiHu  2.0
dual_range.hpp
Go to the documentation of this file.
1 // This file is a part of NiHu, a C++ BEM template library.
2 //
3 // Copyright (C) 2012-2014 Peter Fiala <fiala@hit.bme.hu>
4 // Copyright (C) 2012-2014 Peter Rucz <rucz@hit.bme.hu>
5 //
6 // This program is free software: you can redistribute it and/or modify
7 // it under the terms of the GNU General Public License as published by
8 // the Free Software Foundation, either version 3 of the License, or
9 // (at your option) any later version.
10 //
11 // This program is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 // GNU General Public License for more details.
15 //
16 // You should have received a copy of the GNU General Public License
17 // along with this program. If not, see <http://www.gnu.org/licenses/>.
18 
22 #ifndef DUAL_RANGE_HPP_INCLUDED
23 #define DUAL_RANGE_HPP_INCLUDED
24 
25 #include <utility>
26 
27 namespace NiHu
28 {
29 
31 namespace iteration
32 {
34  struct diadic {};
36  struct diagonal {};
37 }
38 
39 
40 template <class IterationMode, class It1, class It2>
42 
43 
48 template <class It1, class It2>
49 class dual_iterator<iteration::diagonal, It1, It2> :
50  public std::pair<It1, It2>
51 {
52  typedef std::pair<It1, It2> base_t;
53 
54 public:
57 
62  dual_iterator(It1 it1, It2 it2) :
63  base_t(it1, it2)
64  {
65  }
66 
71  {
72  ++base_t::first;
73  ++base_t::second;
74  return *this;
75  }
76 
81  {
82  return base_t::first != other.get_first() ||
83  base_t::second != other.get_second();
84  }
85 
89  It1 const &get_first(void) const
90  {
91  return base_t::first;
92  }
93 
97  It2 const &get_second(void) const
98  {
99  return base_t::second;
100  }
101 };
102 
103 
108 template <class It1, class It2>
109 class dual_iterator<iteration::diadic, It1, It2> :
110  public dual_iterator<iteration::diagonal, It1, It2>
111 {
112 public:
115 
118 
125  dual_iterator(It1 it1, It2 it2, It2 begin2, It2 end2) :
126  base_t(it1, it2), m_begin(begin2), m_end(end2)
127  {
128  }
129 
134  {
135  ++base_t::second;
136  if (base_t::second == m_end)
137  {
138  base_t::second = m_begin;
139  ++base_t::first;
140  }
141  return *this;
142  }
143 
144 private:
146  It2 m_begin;
148  It2 m_end;
149 };
150 
151 
153 template <class IterationMode, class OutIt, class InIt>
155 {
156 public:
159 
166  dual_range(OutIt obegin, OutIt oend, InIt ibegin, InIt iend) :
167  m_obegin(obegin), m_oend(oend), m_ibegin(ibegin), m_iend(iend)
168  {
169  }
170 
172  iterator begin(void) const
173  {
174  return begin_impl(IterationMode());
175  }
176 
178  iterator end(void) const
179  {
180  return end_impl(IterationMode());
181  }
182 
183 private:
185  iterator begin_impl(iteration::diadic) const
186  {
187  if (m_obegin == m_oend || m_ibegin == m_iend)
188  return end_impl(iteration::diadic());
189  return iterator(m_obegin, m_ibegin, m_ibegin, m_iend);
190  }
191 
193  iterator begin_impl(iteration::diagonal) const
194  {
195  return iterator(m_obegin, m_ibegin);
196  }
197 
199  iterator end_impl(iteration::diadic) const
200  {
201  return iterator(m_oend, m_ibegin, m_ibegin, m_iend);
202  }
203 
205  iterator end_impl(iteration::diagonal) const
206  {
207  return iterator(m_oend, m_iend);
208  }
209 
211  OutIt m_obegin;
213  OutIt m_oend;
215  InIt m_ibegin;
217  InIt m_iend;
218 };
219 
220 
221 
232 template <class IterationMode, class OutIt, class InIt>
233 dual_range<IterationMode, OutIt, InIt>
234  create_dual_range(IterationMode, OutIt obegin, OutIt oend, InIt ibegin, InIt iend)
235 {
236  return dual_range<IterationMode, OutIt, InIt>(obegin, oend, ibegin, iend);
237 }
238 
239 }
240 
241 #endif // DUAL_RANGE_HPP_INCLUDED
242 
NiHu::dual_iterator< iteration::diagonal, It1, It2 >::dual_iterator
dual_iterator(It1 it1, It2 it2)
constructor
Definition: dual_range.hpp:62
NiHu::dual_iterator< iteration::diadic, It1, It2 >::dual_iterator
dual_iterator(It1 it1, It2 it2, It2 begin2, It2 end2)
constructor
Definition: dual_range.hpp:125
NiHu::dual_range::dual_range
dual_range(OutIt obegin, OutIt oend, InIt ibegin, InIt iend)
constructor
Definition: dual_range.hpp:166
NiHu::iteration::diadic
inner and outer iterators (Descartes)
Definition: dual_range.hpp:34
NiHu::create_dual_range
dual_range< IterationMode, OutIt, InIt > create_dual_range(IterationMode, OutIt obegin, OutIt oend, InIt ibegin, InIt iend)
factory function to create a dual range
Definition: dual_range.hpp:234
NiHu::dual_iterator< iteration::diagonal, It1, It2 >::type
dual_iterator type
self-returning metafunction
Definition: dual_range.hpp:56
NiHu::dual_iterator
Definition: dual_range.hpp:41
NiHu::dual_iterator< iteration::diagonal, It1, It2 >::operator++
const dual_iterator & operator++()
increment operator
Definition: dual_range.hpp:70
NiHu::dual_range::begin
iterator begin(void) const
return begin iterator of dual range
Definition: dual_range.hpp:172
NiHu::dual_range::iterator
dual_iterator< IterationMode, OutIt, InIt > iterator
the range's iteartor type
Definition: dual_range.hpp:158
NiHu::dual_iterator< iteration::diadic, It1, It2 >::base_t
dual_iterator< iteration::diagonal, It1, It2 > base_t
the base type
Definition: dual_range.hpp:114
NiHu::dual_range::end
iterator end(void) const
return end iterator of dual range
Definition: dual_range.hpp:178
NiHu::iteration::diagonal
parallel
Definition: dual_range.hpp:36
NiHu::dual_iterator< iteration::diagonal, It1, It2 >::operator!=
bool operator!=(dual_iterator< iteration::diagonal, It1, It2 > const &other) const
compare two iterators
Definition: dual_range.hpp:80
NiHu::dual_iterator< iteration::diagonal, It1, It2 >::get_first
const It1 & get_first(void) const
return first iterator
Definition: dual_range.hpp:89
NiHu::dual_iterator< iteration::diagonal, It1, It2 >::get_second
const It2 & get_second(void) const
return second iterator
Definition: dual_range.hpp:97
NiHu::dual_iterator< iteration::diagonal, It1, It2 >
two iterators traversing in parallel mode
Definition: dual_range.hpp:49
NiHu::dual_iterator< iteration::diadic, It1, It2 >::type
dual_iterator type
self-returning metafunction
Definition: dual_range.hpp:117
NiHu::dual_iterator< iteration::diadic, It1, It2 >::operator++
const dual_iterator & operator++()
increment operator
Definition: dual_range.hpp:133
NiHu::dual_range
a combination of two ranges
Definition: dual_range.hpp:154