75 template <
bool, std::
size_t,
class,
class>
84 std::conditional_t<Const, typename TreeSet<Dim>::container_type::const_iterator,
89 using Point =
typename TreeSet<Dim>::Point;
96 S(
float dist_sq,
TreeIndex node, RawIterator it = {})
noexcept
97 : dist_sq(dist_sq), node(node), it(it)
101 bool operator>(S
const& rhs)
const noexcept {
return dist_sq > rhs.dist_sq; }
104 using Queue = std::priority_queue<S, std::vector<S>, std::greater<S>>;
111 using iterator_category = std::forward_iterator_tag;
112 using difference_type = std::ptrdiff_t;
114 std::pair<typename std::iterator_traits<RawIterator>::value_type,
float>;
115 using reference = value_type
const&;
116 using pointer = value_type
const*;
124 bool Const2,
class Predicate2,
class Geometry2,
125 std::enable_if_t<(Const && !Const2) ||
126 (Const == Const2 && (!std::is_same_v<Predicate, Predicate2> ||
127 !std::is_same_v<Geometry, Geometry2>)),
133 , query_(other.query_)
134 , epsilon_sq_(other.epsilon_sq_)
137 auto queue = other.queue_;
138 while (!queue.empty()) {
139 queue_.emplace(queue.top().dist_sq, queue.top().node, queue.top().it);
158 reference operator*()
const {
return ret_; }
160 pointer operator->()
const {
return &ret_; }
162 template <
bool Const2,
class Predicate2,
class Geometry2>
166 return queue_.empty() == other.queue_.empty() &&
167 (queue_.empty() || queue_.top().it == other.queue_.top().it);
170 template <
bool Const2,
class Predicate2,
class Geometry2>
174 return !(*
this == other);
178 [[nodiscard]]
bool returnable(
179 typename std::iterator_traits<RawIterator>::value_type
const& value)
const
181 return Filter::returnable(pred_, value);
184 [[nodiscard]]
bool returnable(
TreeIndex node)
const
186 return ts_->isPureLeaf(node) && !ts_->empty(node);
189 [[nodiscard]]
bool returnable(S
const& s)
const {
return RawIterator{} != s.it; }
191 [[nodiscard]]
bool traversable(
TreeIndex node)
const
193 return ts_->isParent(node) && Filter::traversable(pred_, *ts_, ts_->node(node));
198 while (!queue_.empty()) {
199 S cur = queue_.top();
200 if (returnable(cur)) {
201 ret_.first = *cur.it;
202 ret_.second = std::sqrt(cur.dist_sq);
208 if (returnable(cur.node)) {
209 auto& v = ts_->values(cur.node);
212 for (
auto it = begin(v), last = end(v); it != last; ++it) {
213 if (!returnable(*it)) {
218 queue_.emplace(dist_sq, cur.node, it);
223 TreeIndex node = ts_->child(cur.node, 0);
224 for (; BF > node.offset; ++node.offset) {
225 if (!traversable(node) && !returnable(node)) {
229 float dist_sq =
distanceSquared(query_, ts_->bounds(node)) + epsilon_sq_;
230 queue_.emplace(dist_sq, node);
235 [[nodiscard]] RawIterator iterator() {
return queue_.top().it; }
239 Geometry
const& query,
float epsilon = 0.0f)
240 : ts_(ts), pred_(pred), query_(query), epsilon_sq_(epsilon * epsilon)
242 Filter::init(pred_, *ts_);
244 if (traversable(node) || returnable(node)) {
246 queue_.emplace(dist_sq, node);
252 template <
bool Const2,
class Predicate2,
class Geometry2,
253 std::enable_if_t<!Const && Const2, bool> =
true>
258 , query_(other.query_)
259 , epsilon_sq_(other.epsilon_sq_)
262 auto queue = other.queue_;
263 while (!queue.empty()) {
264 auto const& cur = queue.top();
266 queue_.emplace(cur.dist_sq, cur.node, ts_->values(cur.node).erase(cur.it, cur.it));