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