7 #ifndef INCLUDE_KDTREE_NODE_HPP 8 #define INCLUDE_KDTREE_NODE_HPP 10 #ifdef KDTREE_DEFINE_OSTREAM_OPERATORS 29 _Base_ptr
const __LEFT = NULL,
30 _Base_ptr
const __RIGHT = NULL)
31 : _M_parent(__PARENT), _M_left(__LEFT), _M_right(__RIGHT) {}
34 _S_minimum(_Base_ptr __x)
36 while (__x->_M_left) __x = __x->_M_left;
41 _S_maximum(_Base_ptr __x)
43 while (__x->_M_right) __x = __x->_M_right;
48 template <
typename _Val>
56 _Node(_Val
const& __VALUE = _Val(),
60 :
_Node_base(__PARENT, __LEFT, __RIGHT), _M_value(__VALUE) {}
62 #ifdef KDTREE_DEFINE_OSTREAM_OPERATORS 64 template <
typename Char,
typename Traits>
66 std::basic_ostream<Char, Traits>&
67 operator<<(typename std::basic_ostream<Char, Traits>& out,
71 out <<
" parent: " << node._M_parent;
72 out <<
"; left: " << node._M_left;
73 out <<
"; right: " << node._M_right;
77 template <
typename Char,
typename Traits>
79 std::basic_ostream<Char, Traits>&
80 operator<<(typename std::basic_ostream<Char, Traits>& out,
84 out <<
' ' << node._M_value;
85 out <<
"; parent: " << node._M_parent;
86 out <<
"; left: " << node._M_left;
87 out <<
"; right: " << node._M_right;
94 template <
typename _Val,
typename _Acc,
typename _Cmp>
98 _Node_compare(
size_t const __DIM, _Acc
const& acc, _Cmp
const& cmp)
99 : _M_DIM(__DIM), _M_acc(acc), _M_cmp(cmp) {}
102 operator()(_Val
const& __A, _Val
const& __B)
const 104 return _M_cmp(_M_acc(__A, _M_DIM), _M_acc(__B, _M_DIM));
119 template <
typename _ValA,
typename _ValB,
typename _Cmp,
124 const _Cmp& __cmp,
const _Acc& __acc,
125 const _ValA& __a,
const _ValB& __b)
127 return __cmp(__acc(__a, __dim), __acc(__b, __dim));
135 template <
typename _ValA,
typename _ValB,
typename _Dist,
138 typename _Dist::distance_type
140 const _Dist& __dist,
const _Acc& __acc,
141 const _ValA& __a,
const _ValB& __b)
143 return __dist(__acc(__a, __dim), __acc(__b, __dim));
152 template <
typename _ValA,
typename _ValB,
typename _Dist,
155 typename _Dist::distance_type
157 const _Dist& __dist,
const _Acc& __acc,
158 const _ValA& __a,
const _ValB& __b)
160 typename _Dist::distance_type d = 0;
161 for (
size_t i=0; i<__dim; ++i)
162 d += __dist(__acc(__a, i), __acc(__b, i));
171 template <
typename _Val,
typename _Cmp,
typename _Acc>
175 const _Cmp& __cmp,
const _Acc& __acc,
179 return __node->_M_left;
181 return __node->_M_right;
192 template <
class SearchVal,
193 typename _Val,
typename _Cmp,
194 typename _Acc,
typename _Dist,
197 std::pair<const _Node<_Val>*,
198 std::pair<size_t, typename _Dist::distance_type> >
201 const _Node<_Val>* __best,
typename _Dist::distance_type __max,
202 const _Cmp& __cmp,
const _Acc& __acc,
const _Dist& __dist,
207 size_t cur_dim = __dim+1;
211 if (__p(
static_cast<const _Node<_Val>*
>(cur)->_M_value))
213 typename _Dist::distance_type d = 0;
214 for (
size_t i=0; i != __k; ++i)
241 size_t probe_dim = cur_dim;
243 near_node = probe->_M_right;
245 near_node = probe->_M_left;
259 near_node = probe->_M_left;
260 far_node = probe->_M_right;
264 near_node = probe->_M_right;
265 far_node = probe->_M_left;
267 if (pprobe == probe->_M_parent)
269 if (__p(
static_cast<const _Node<_Val>*
>(probe)->_M_value))
271 typename _Dist::distance_type d = 0;
272 for (
size_t i=0; i < __k; ++i)
297 probe = probe->_M_parent;
303 if (pprobe == near_node && far_node
314 probe = probe->_M_parent;
320 cur = cur->_M_parent;
327 if (pcur == cur->_M_left)
328 near_node = cur->_M_right;
330 near_node = cur->_M_left;
340 return std::pair<const _Node<_Val>*,
341 std::pair<size_t, typename _Dist::distance_type> >
342 (__best, std::pair<size_t, typename _Dist::distance_type>
349 #endif // include guard bool _S_node_compare(const size_t __dim, const _Cmp &__cmp, const _Acc &__acc, const _ValA &__a, const _ValB &__b)
Definition: node.hpp:123
std::pair< const _Node< _Val > *, std::pair< size_t, typename _Dist::distance_type > > _S_node_nearest(const size_t __k, size_t __dim, SearchVal const &__val, const _Node< _Val > *__node, const _Node_base *__end, const _Node< _Val > *__best, typename _Dist::distance_type __max, const _Cmp &__cmp, const _Acc &__acc, const _Dist &__dist, _Predicate __p)
Definition: node.hpp:199
_Dist::distance_type _S_accumulate_node_distance(const size_t __dim, const _Dist &__dist, const _Acc &__acc, const _ValA &__a, const _ValB &__b)
Definition: node.hpp:156
_Node_base * _S_node_descend(const size_t __dim, const _Cmp &__cmp, const _Acc &__acc, const _Val &__val, const _Node_base *__node)
Definition: node.hpp:174
_Dist::distance_type _S_node_distance(const size_t __dim, const _Dist &__dist, const _Acc &__acc, const _ValA &__a, const _ValB &__b)
Definition: node.hpp:139
Definition: allocator.hpp:14