Boost.Geometry.Index
 All Classes Functions Typedefs Groups
parameters.hpp
1 // Boost.Geometry Index
2 //
3 // R-tree algorithms parameters
4 //
5 // Copyright (c) 2011-2017 Adam Wulkiewicz, Lodz, Poland.
6 //
7 // Use, modification and distribution is subject to the Boost Software License,
8 // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
9 // http://www.boost.org/LICENSE_1_0.txt)
10 
11 #ifndef BOOST_GEOMETRY_INDEX_PARAMETERS_HPP
12 #define BOOST_GEOMETRY_INDEX_PARAMETERS_HPP
13 
14 
15 #include <limits>
16 
17 #include <boost/mpl/assert.hpp>
18 
19 #include <boost/geometry/index/detail/exception.hpp>
20 
21 
22 namespace boost { namespace geometry { namespace index {
23 
24 namespace detail {
25 
26 template <size_t MaxElements>
27 struct default_min_elements_s
28 {
29  static const size_t raw_value = (MaxElements * 3) / 10;
30  static const size_t value = 1 <= raw_value ? raw_value : 1;
31 };
32 
33 inline size_t default_min_elements_d()
34 {
35  return (std::numeric_limits<size_t>::max)();
36 }
37 
38 inline size_t default_min_elements_d_calc(size_t max_elements, size_t min_elements)
39 {
40  if ( default_min_elements_d() == min_elements )
41  {
42  size_t raw_value = (max_elements * 3) / 10;
43  return 1 <= raw_value ? raw_value : 1;
44  }
45 
46  return min_elements;
47 }
48 
49 template <size_t MaxElements>
50 struct default_rstar_reinserted_elements_s
51 {
52  static const size_t value = (MaxElements * 3) / 10;
53 };
54 
55 inline size_t default_rstar_reinserted_elements_d()
56 {
57  return (std::numeric_limits<size_t>::max)();
58 }
59 
60 inline size_t default_rstar_reinserted_elements_d_calc(size_t max_elements, size_t reinserted_elements)
61 {
62  if ( default_rstar_reinserted_elements_d() == reinserted_elements )
63  {
64  return (max_elements * 3) / 10;
65  }
66 
67  return reinserted_elements;
68 }
69 
70 } // namespace detail
71 
78 template <size_t MaxElements,
79  size_t MinElements = detail::default_min_elements_s<MaxElements>::value>
80 struct linear
81 {
82  BOOST_MPL_ASSERT_MSG((0 < MinElements && 2*MinElements <= MaxElements+1),
83  INVALID_STATIC_MIN_MAX_PARAMETERS, (linear));
84 
85  static const size_t max_elements = MaxElements;
86  static const size_t min_elements = MinElements;
87 
88  static size_t get_max_elements() { return MaxElements; }
89  static size_t get_min_elements() { return MinElements; }
90 };
91 
98 template <size_t MaxElements,
99  size_t MinElements = detail::default_min_elements_s<MaxElements>::value>
100 struct quadratic
101 {
102  BOOST_MPL_ASSERT_MSG((0 < MinElements && 2*MinElements <= MaxElements+1),
103  INVALID_STATIC_MIN_MAX_PARAMETERS, (quadratic));
104 
105  static const size_t max_elements = MaxElements;
106  static const size_t min_elements = MinElements;
107 
108  static size_t get_max_elements() { return MaxElements; }
109  static size_t get_min_elements() { return MinElements; }
110 };
111 
126 template <size_t MaxElements,
127  size_t MinElements = detail::default_min_elements_s<MaxElements>::value,
128  size_t ReinsertedElements = detail::default_rstar_reinserted_elements_s<MaxElements>::value,
129  size_t OverlapCostThreshold = 32>
130 struct rstar
131 {
132  BOOST_MPL_ASSERT_MSG((0 < MinElements && 2*MinElements <= MaxElements+1),
133  INVALID_STATIC_MIN_MAX_PARAMETERS, (rstar));
134 
135  static const size_t max_elements = MaxElements;
136  static const size_t min_elements = MinElements;
137  static const size_t reinserted_elements = ReinsertedElements;
138  static const size_t overlap_cost_threshold = OverlapCostThreshold;
139 
140  static size_t get_max_elements() { return MaxElements; }
141  static size_t get_min_elements() { return MinElements; }
142  static size_t get_reinserted_elements() { return ReinsertedElements; }
143  static size_t get_overlap_cost_threshold() { return OverlapCostThreshold; }
144 };
145 
146 //template <size_t MaxElements, size_t MinElements>
147 //struct kmeans
148 //{
149 // static const size_t max_elements = MaxElements;
150 // static const size_t min_elements = MinElements;
151 //};
152 
157 {
158 public:
165  explicit dynamic_linear(size_t max_elements,
166  size_t min_elements = detail::default_min_elements_d())
167  : m_max_elements(max_elements)
168  , m_min_elements(detail::default_min_elements_d_calc(max_elements, min_elements))
169  {
170  if (!(0 < m_min_elements && 2*m_min_elements <= m_max_elements+1))
171  detail::throw_invalid_argument("invalid min or/and max parameters of dynamic_linear");
172  }
173 
174  size_t get_max_elements() const { return m_max_elements; }
175  size_t get_min_elements() const { return m_min_elements; }
176 
177 private:
178  size_t m_max_elements;
179  size_t m_min_elements;
180 };
181 
186 {
187 public:
194  explicit dynamic_quadratic(size_t max_elements,
195  size_t min_elements = detail::default_min_elements_d())
196  : m_max_elements(max_elements)
197  , m_min_elements(detail::default_min_elements_d_calc(max_elements, min_elements))
198  {
199  if (!(0 < m_min_elements && 2*m_min_elements <= m_max_elements+1))
200  detail::throw_invalid_argument("invalid min or/and max parameters of dynamic_quadratic");
201  }
202 
203  size_t get_max_elements() const { return m_max_elements; }
204  size_t get_min_elements() const { return m_min_elements; }
205 
206 private:
207  size_t m_max_elements;
208  size_t m_min_elements;
209 };
210 
215 {
216 public:
231  explicit dynamic_rstar(size_t max_elements,
232  size_t min_elements = detail::default_min_elements_d(),
233  size_t reinserted_elements = detail::default_rstar_reinserted_elements_d(),
234  size_t overlap_cost_threshold = 32)
235  : m_max_elements(max_elements)
236  , m_min_elements(detail::default_min_elements_d_calc(max_elements, min_elements))
237  , m_reinserted_elements(detail::default_rstar_reinserted_elements_d_calc(max_elements, reinserted_elements))
238  , m_overlap_cost_threshold(overlap_cost_threshold)
239  {
240  if (!(0 < m_min_elements && 2*m_min_elements <= m_max_elements+1))
241  detail::throw_invalid_argument("invalid min or/and max parameters of dynamic_rstar");
242  }
243 
244  size_t get_max_elements() const { return m_max_elements; }
245  size_t get_min_elements() const { return m_min_elements; }
246  size_t get_reinserted_elements() const { return m_reinserted_elements; }
247  size_t get_overlap_cost_threshold() const { return m_overlap_cost_threshold; }
248 
249 private:
250  size_t m_max_elements;
251  size_t m_min_elements;
252  size_t m_reinserted_elements;
253  size_t m_overlap_cost_threshold;
254 };
255 
256 }}} // namespace boost::geometry::index
257 
258 #endif // BOOST_GEOMETRY_INDEX_PARAMETERS_HPP
Quadratic r-tree creation algorithm parameters - run-time version.
Definition: parameters.hpp:185
Linear r-tree creation algorithm parameters.
Definition: parameters.hpp:80
R*-tree creation algorithm parameters.
Definition: parameters.hpp:130
Linear r-tree creation algorithm parameters - run-time version.
Definition: parameters.hpp:156
R*-tree creation algorithm parameters - run-time version.
Definition: parameters.hpp:214
Quadratic r-tree creation algorithm parameters.
Definition: parameters.hpp:100
dynamic_quadratic(size_t max_elements, size_t min_elements=detail::default_min_elements_d())
The constructor.
Definition: parameters.hpp:194
dynamic_linear(size_t max_elements, size_t min_elements=detail::default_min_elements_d())
The constructor.
Definition: parameters.hpp:165
dynamic_rstar(size_t max_elements, size_t min_elements=detail::default_min_elements_d(), size_t reinserted_elements=detail::default_rstar_reinserted_elements_d(), size_t overlap_cost_threshold=32)
The constructor.
Definition: parameters.hpp:231