75 template <
bool, std::
size_t,
class,
class,
class>
84 std::conditional_t<Const, typename TreeMap<Dim, T>::container_type::const_iterator,
89 using Point =
typename TreeMap<Dim, T>::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;
113 using value_type =
typename std::iterator_traits<RawIterator>::value_type;
114 using reference =
typename std::iterator_traits<RawIterator>::reference;
115 using pointer =
typename std::iterator_traits<RawIterator>::pointer;
123 bool Const2,
class Predicate2,
class Geometry2,
124 std::enable_if_t<(Const && !Const2) ||
125 (Const == Const2 && (!std::is_same_v<Predicate, Predicate2> ||
126 !std::is_same_v<Geometry, Geometry2>)),
132 , query_(other.query_)
133 , epsilon_sq_(other.epsilon_sq_)
135 auto queue = other.queue_;
136 while (!queue.empty()) {
137 queue_.emplace(queue.top().dist_sq, queue.top().node, queue.top().it);
156 reference operator*()
const {
return *queue_.top().it; }
158 pointer operator->()
const {
return &*queue_.top().it; }
160 template <
bool Const2,
class Predicate2,
class Geometry2>
164 return queue_.empty() == other.queue_.empty() &&
165 (queue_.empty() || queue_.top().it == other.queue_.top().it);
168 template <
bool Const2,
class Predicate2,
class Geometry2>
172 return !(*
this == other);
176 [[nodiscard]]
bool returnable(
177 typename std::iterator_traits<RawIterator>::value_type
const& value)
const
179 return Filter::returnable(pred_, value);
182 [[nodiscard]]
bool returnable(
TreeIndex node)
const
184 return tm_->isPureLeaf(node) && !tm_->empty(node);
187 [[nodiscard]]
bool returnable(S
const& s)
const {
return RawIterator{} != s.it; }
189 [[nodiscard]]
bool traversable(
TreeIndex node)
const
191 return tm_->isParent(node) && Filter::traversable(pred_, *tm_, tm_->node(node));
196 while (!queue_.empty()) {
197 auto cur = queue_.top();
198 if (returnable(cur)) {
204 if (returnable(cur.node)) {
205 auto& v = tm_->values(cur.node);
208 for (
auto it = begin(v), last = end(v); it != last; ++it) {
209 if (!returnable(*it)) {
214 queue_.emplace(dist_sq, cur.node, it);
219 TreeIndex node = tm_->child(cur.node, 0);
220 for (; BF > node.offset; ++node.offset) {
221 if (!traversable(node) && !returnable(node)) {
225 float dist_sq =
distanceSquared(query_, tm_->bounds(node)) + epsilon_sq_;
226 queue_.emplace(dist_sq, node);
231 [[nodiscard]] RawIterator iterator() {
return queue_.top().it; }
235 Geometry
const& query,
float epsilon = 0.0f)
236 : tm_(tm), pred_(pred), query_(query), epsilon_sq_(epsilon * epsilon)
238 Filter::init(pred_, *tm_);
240 if (traversable(node) || returnable(node)) {
242 queue_.emplace(dist_sq, node);
248 template <
bool Const2,
class Predicate2,
class Geometry2,
249 std::enable_if_t<!Const && Const2, bool> =
true>
254 , query_(other.query_)
255 , epsilon_sq_(other.epsilon_sq_)
257 auto queue = other.queue_;
258 while (!queue.empty()) {
259 auto const& cur = queue.top();
261 queue_.emplace(cur.dist_sq, cur.node, tm_->values(cur.node).erase(cur.it, cur.it));