BEM++  2.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Groups Pages
scattered_range.hpp
1 // Copyright (C) 2011-2012 by the BEM++ Authors
2 //
3 // Permission is hereby granted, free of charge, to any person obtaining a copy
4 // of this software and associated documentation files (the "Software"), to deal
5 // in the Software without restriction, including without limitation the rights
6 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7 // copies of the Software, and to permit persons to whom the Software is
8 // furnished to do so, subject to the following conditions:
9 //
10 // The above copyright notice and this permission notice shall be included in
11 // all copies or substantial portions of the Software.
12 //
13 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19 // THE SOFTWARE.
20 
21 #ifndef bempp_scattered_range_hpp
22 #define bempp_scattered_range_hpp
23 
24 #include "../common/common.hpp"
25 
26 #include <tbb/tbb_stddef.h> // split class
27 #include <cmath>
28 #include <cassert>
29 
30 namespace Bempp
31 {
32 
34 {
35 public:
37  public:
38  const_iterator(size_t value, size_t end, size_t step) :
39  m_value(value), m_end(end), m_step(step) {
40  assert(step > 0);
41  }
42 
43  const_iterator operator++() {
44  m_value = std::min(m_value + m_step, m_end);
45  return *this;
46  }
47 
48  size_t value() const {
49  return m_value;
50  }
51 
52  size_t step() const {
53  return m_step;
54  }
55 
56  // Implicit conversion to size_t
57  operator size_t() const {
58  return m_value;
59  }
60 
61  private:
62  size_t m_value, m_end, m_step;
63  };
64 
65  ScatteredRange(size_t begin, size_t end, size_t step = 1) :
66  m_begin(begin), m_end(end), m_step(step) {}
67 
68  ScatteredRange(ScatteredRange& range, tbb::split) {
69  m_begin = range.m_begin + range.m_step;
70  m_end = range.m_end;
71  m_step = range.m_step * 2;
72  range.m_step *= 2;
73  }
74 
75  bool empty() const {
76  return m_begin >= m_end;
77  }
78 
79  bool is_divisible() const {
80  return m_begin + m_step < m_end;
81  }
82 
83  const_iterator begin() const {
84  return const_iterator(m_begin, m_end, m_step);
85  }
86 
87  const_iterator end() const {
88  return const_iterator(m_end, m_end, m_step);
89  }
90 
91  size_t step() const {
92  return m_step;
93  }
94 
95  size_t size() const {
96  if (empty())
97  return 0;
98  else
99  return (m_end - 1 - m_begin) / m_step + 1;
100  }
101 
102 private:
103  size_t m_begin, m_end, m_step;
104 };
105 
106 } // namespace Bempp
107 
108 #endif
Definition: scattered_range.hpp:36
Definition: scattered_range.hpp:33