73 template <
bool, std::
size_t,
class>
82 std::conditional_t<Const, typename TreeSet<Dim>::container_type::const_iterator,
85 using Point =
typename TreeSet<Dim>::Point;
92 S(
float dist_sq,
TreeIndex node, RawIterator it = {})
noexcept
93 : dist_sq(dist_sq), node(node), it(it)
97 bool operator>(S
const& rhs)
const noexcept {
return dist_sq > rhs.dist_sq; }
100 using Queue = std::priority_queue<S, std::vector<S>, std::greater<S>>;
107 using iterator_category = std::forward_iterator_tag;
108 using difference_type = std::ptrdiff_t;
110 std::pair<typename std::iterator_traits<RawIterator>::value_type,
float>;
111 using reference = value_type
const&;
112 using pointer = value_type
const*;
119 template <
bool Const2,
class Geometry2,
120 std::enable_if_t<(Const && !Const2) || (Const == Const2 &&
121 !std::is_same_v<Geometry, Geometry2>),
125 , query_(other.query_)
126 , epsilon_sq_(other.epsilon_sq_)
129 auto queue = other.queue_;
130 while (!queue.empty()) {
131 queue_.emplace(queue.top().dist_sq, queue.top().node, queue.top().it);
150 reference operator*()
const {
return ret_; }
152 pointer operator->()
const {
return &ret_; }
154 template <
bool Const2,
class Geometry2>
157 return queue_.empty() == other.queue_.empty() &&
158 (queue_.empty() || queue_.top().it == other.queue_.top().it);
161 template <
bool Const2,
class Geometry2>
164 return !(*
this == other);
168 [[nodiscard]]
bool returnable(
TreeIndex node)
const
170 return ts_->isPureLeaf(node) && !ts_->empty(node);
173 [[nodiscard]]
bool returnable(S
const& s)
const {
return RawIterator{} != s.it; }
175 [[nodiscard]]
bool traversable(
TreeIndex node)
const {
return ts_->isParent(node); }
179 while (!queue_.empty()) {
180 S cur = queue_.top();
181 if (returnable(cur)) {
182 ret_.first = *cur.it;
183 ret_.second = std::sqrt(cur.dist_sq);
189 if (returnable(cur.node)) {
190 auto& v = ts_->values(cur.node);
193 for (
auto it = begin(v), last = end(v); it != last; ++it) {
196 queue_.emplace(dist_sq, cur.node, it);
201 TreeIndex node = ts_->child(cur.node, 0);
202 for (; BF > node.offset; ++node.offset) {
203 if (!traversable(node) && !returnable(node)) {
207 float dist_sq =
distanceSquared(query_, ts_->bounds(node)) + epsilon_sq_;
208 queue_.emplace(dist_sq, node);
213 [[nodiscard]] RawIterator iterator() {
return queue_.top().it; }
217 float epsilon = 0.0f)
218 : ts_(ts), query_(query), epsilon_sq_(epsilon * epsilon)
220 if (traversable(node) || returnable(node)) {
222 queue_.emplace(dist_sq, node);
228 template <
bool Const2,
class Geometry2, std::enable_if_t<!Const && Const2,
bool> = true>
231 , query_(other.query_)
232 , epsilon_sq_(other.epsilon_sq_)
235 auto queue = other.queue_;
236 while (!queue.empty()) {
237 auto const& cur = queue.top();
239 queue_.emplace(cur.dist_sq, cur.node, ts_->values(cur.node).erase(cur.it, cur.it));