72 template <
bool, std::
size_t,
class,
class>
81 std::conditional_t<Const, typename TreeMap<Dim, T>::container_type::const_iterator,
84 using Point =
typename TreeMap<Dim, T>::Point;
91 S(
float dist_sq,
TreeIndex node, RawIterator it = {})
noexcept
92 : dist_sq(dist_sq), node(node), it(it)
96 bool operator>(S
const& rhs)
const noexcept {
return dist_sq > rhs.dist_sq; }
99 using Queue = std::priority_queue<S, std::vector<S>, std::greater<S>>;
106 using iterator_category = std::forward_iterator_tag;
107 using difference_type = std::ptrdiff_t;
108 using value_type =
typename std::iterator_traits<RawIterator>::value_type;
109 using reference =
typename std::iterator_traits<RawIterator>::reference;
110 using pointer =
typename std::iterator_traits<RawIterator>::pointer;
117 template <
bool Const2,
class Geometry2,
118 std::enable_if_t<(Const && !Const2) || (Const == Const2 &&
119 !std::is_same_v<Geometry, Geometry2>),
122 : tm_(other.tm_), query_(other.query_), epsilon_sq_(other.epsilon_sq_)
124 auto queue = other.queue_;
125 while (!queue.empty()) {
126 queue_.emplace(queue.top().dist_sq, queue.top().node, queue.top().it);
145 reference operator*()
const {
return *queue_.top().it; }
147 pointer operator->()
const {
return &*queue_.top().it; }
149 template <
bool Const2,
class Geometry2>
152 return queue_.empty() == other.queue_.empty() &&
153 (queue_.empty() || queue_.top().it == other.queue_.top().it);
156 template <
bool Const2,
class Geometry2>
159 return !(*
this == other);
163 [[nodiscard]]
bool returnable(
TreeIndex node)
const
165 return tm_->isPureLeaf(node) && !tm_->empty(node);
168 [[nodiscard]]
bool returnable(S
const& s)
const {
return RawIterator{} != s.it; }
170 [[nodiscard]]
bool traversable(
TreeIndex node)
const {
return tm_->isParent(node); }
174 while (!queue_.empty()) {
175 auto cur = queue_.top();
176 if (returnable(cur)) {
182 if (returnable(cur.node)) {
183 auto& v = tm_->values(cur.node);
186 for (
auto it = begin(v), last = end(v); it != last; ++it) {
189 queue_.emplace(dist_sq, cur.node, it);
194 TreeIndex node = tm_->child(cur.node, 0);
195 for (; BF > node.offset; ++node.offset) {
196 if (!traversable(node) && !returnable(node)) {
200 float dist_sq =
distanceSquared(query_, tm_->bounds(node)) + epsilon_sq_;
201 queue_.emplace(dist_sq, node);
206 [[nodiscard]] RawIterator iterator() {
return queue_.top().it; }
210 float epsilon = 0.0f)
211 : tm_(tm), query_(query), epsilon_sq_(epsilon * epsilon)
213 if (traversable(node) || returnable(node)) {
215 queue_.emplace(dist_sq, node);
221 template <
bool Const2,
class Geometry2, std::enable_if_t<!Const && Const2,
bool> = true>
223 : tm_(other.tm), query_(other.query_), epsilon_sq_(other.epsilon_sq_)
225 auto queue = other.queue_;
226 while (!queue.empty()) {
227 auto const& cur = queue.top();
229 queue_.emplace(cur.dist_sq, cur.node, tm_->values(cur.node).erase(cur.it, cur.it));