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-2013 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 #include <limits>
15 
16 namespace boost { namespace geometry { namespace index {
17 
18 namespace detail {
19 
20 template <size_t MaxElements>
21 struct default_min_elements_s
22 {
23  static const size_t raw_value = (MaxElements * 3) / 10;
24  static const size_t value = 1 <= raw_value ? raw_value : 1;
25 };
26 
27 inline size_t default_min_elements_d()
28 {
29  return (std::numeric_limits<size_t>::max)();
30 }
31 
32 inline size_t default_min_elements_d_calc(size_t max_elements, size_t min_elements)
33 {
34  if ( default_min_elements_d() == min_elements )
35  {
36  size_t raw_value = (max_elements * 3) / 10;
37  return 1 <= raw_value ? raw_value : 1;
38  }
39 
40  return min_elements;
41 }
42 
43 template <size_t MaxElements>
44 struct default_rstar_reinserted_elements_s
45 {
46  static const size_t value = (MaxElements * 3) / 10;
47 };
48 
49 inline size_t default_rstar_reinserted_elements_d()
50 {
51  return (std::numeric_limits<size_t>::max)();
52 }
53 
54 inline size_t default_rstar_reinserted_elements_d_calc(size_t max_elements, size_t reinserted_elements)
55 {
56  if ( default_rstar_reinserted_elements_d() == reinserted_elements )
57  {
58  return (max_elements * 3) / 10;
59  }
60 
61  return reinserted_elements;
62 }
63 
64 } // namespace detail
65 
72 template <size_t MaxElements,
73  size_t MinElements = detail::default_min_elements_s<MaxElements>::value>
74 struct linear
75 {
76  BOOST_MPL_ASSERT_MSG((0 < MinElements && 2*MinElements <= MaxElements+1),
77  INVALID_STATIC_MIN_MAX_PARAMETERS, (linear));
78 
79  static const size_t max_elements = MaxElements;
80  static const size_t min_elements = MinElements;
81 
82  static size_t get_max_elements() { return MaxElements; }
83  static size_t get_min_elements() { return MinElements; }
84 };
85 
92 template <size_t MaxElements,
93  size_t MinElements = detail::default_min_elements_s<MaxElements>::value>
94 struct quadratic
95 {
96  BOOST_MPL_ASSERT_MSG((0 < MinElements && 2*MinElements <= MaxElements+1),
97  INVALID_STATIC_MIN_MAX_PARAMETERS, (quadratic));
98 
99  static const size_t max_elements = MaxElements;
100  static const size_t min_elements = MinElements;
101 
102  static size_t get_max_elements() { return MaxElements; }
103  static size_t get_min_elements() { return MinElements; }
104 };
105 
120 template <size_t MaxElements,
121  size_t MinElements = detail::default_min_elements_s<MaxElements>::value,
122  size_t ReinsertedElements = detail::default_rstar_reinserted_elements_s<MaxElements>::value,
123  size_t OverlapCostThreshold = 32>
124 struct rstar
125 {
126  BOOST_MPL_ASSERT_MSG((0 < MinElements && 2*MinElements <= MaxElements+1),
127  INVALID_STATIC_MIN_MAX_PARAMETERS, (rstar));
128 
129  static const size_t max_elements = MaxElements;
130  static const size_t min_elements = MinElements;
131  static const size_t reinserted_elements = ReinsertedElements;
132  static const size_t overlap_cost_threshold = OverlapCostThreshold;
133 
134  static size_t get_max_elements() { return MaxElements; }
135  static size_t get_min_elements() { return MinElements; }
136  static size_t get_reinserted_elements() { return ReinsertedElements; }
137  static size_t get_overlap_cost_threshold() { return OverlapCostThreshold; }
138 };
139 
140 //template <size_t MaxElements, size_t MinElements>
141 //struct kmeans
142 //{
143 // static const size_t max_elements = MaxElements;
144 // static const size_t min_elements = MinElements;
145 //};
146 
151 {
152 public:
159  dynamic_linear(size_t max_elements,
160  size_t min_elements = detail::default_min_elements_d())
161  : m_max_elements(max_elements)
162  , m_min_elements(detail::default_min_elements_d_calc(max_elements, min_elements))
163  {
164  if (!(0 < m_min_elements && 2*m_min_elements <= m_max_elements+1))
165  detail::throw_invalid_argument("invalid min or/and max parameters of dynamic_linear");
166  }
167 
168  size_t get_max_elements() const { return m_max_elements; }
169  size_t get_min_elements() const { return m_min_elements; }
170 
171 private:
172  size_t m_max_elements;
173  size_t m_min_elements;
174 };
175 
180 {
181 public:
188  dynamic_quadratic(size_t max_elements,
189  size_t min_elements = detail::default_min_elements_d())
190  : m_max_elements(max_elements)
191  , m_min_elements(detail::default_min_elements_d_calc(max_elements, min_elements))
192  {
193  if (!(0 < m_min_elements && 2*m_min_elements <= m_max_elements+1))
194  detail::throw_invalid_argument("invalid min or/and max parameters of dynamic_quadratic");
195  }
196 
197  size_t get_max_elements() const { return m_max_elements; }
198  size_t get_min_elements() const { return m_min_elements; }
199 
200 private:
201  size_t m_max_elements;
202  size_t m_min_elements;
203 };
204 
209 {
210 public:
225  dynamic_rstar(size_t max_elements,
226  size_t min_elements = detail::default_min_elements_d(),
227  size_t reinserted_elements = detail::default_rstar_reinserted_elements_d(),
228  size_t overlap_cost_threshold = 32)
229  : m_max_elements(max_elements)
230  , m_min_elements(detail::default_min_elements_d_calc(max_elements, min_elements))
231  , m_reinserted_elements(detail::default_rstar_reinserted_elements_d_calc(max_elements, reinserted_elements))
232  , m_overlap_cost_threshold(overlap_cost_threshold)
233  {
234  if (!(0 < m_min_elements && 2*m_min_elements <= m_max_elements+1))
235  detail::throw_invalid_argument("invalid min or/and max parameters of dynamic_rstar");
236  }
237 
238  size_t get_max_elements() const { return m_max_elements; }
239  size_t get_min_elements() const { return m_min_elements; }
240  size_t get_reinserted_elements() const { return m_reinserted_elements; }
241  size_t get_overlap_cost_threshold() const { return m_overlap_cost_threshold; }
242 
243 private:
244  size_t m_max_elements;
245  size_t m_min_elements;
246  size_t m_reinserted_elements;
247  size_t m_overlap_cost_threshold;
248 };
249 
250 }}} // namespace boost::geometry::index
251 
252 #endif // BOOST_GEOMETRY_INDEX_PARAMETERS_HPP
Quadratic r-tree creation algorithm parameters - run-time version.
Definition: parameters.hpp:179
Linear r-tree creation algorithm parameters.
Definition: parameters.hpp:74
R*-tree creation algorithm parameters.
Definition: parameters.hpp:124
Linear r-tree creation algorithm parameters - run-time version.
Definition: parameters.hpp:150
R*-tree creation algorithm parameters - run-time version.
Definition: parameters.hpp:208
Quadratic r-tree creation algorithm parameters.
Definition: parameters.hpp:94
dynamic_quadratic(size_t max_elements, size_t min_elements=detail::default_min_elements_d())
The constructor.
Definition: parameters.hpp:188
dynamic_linear(size_t max_elements, size_t min_elements=detail::default_min_elements_d())
The constructor.
Definition: parameters.hpp:159
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:225