Skip to content

Commit f839a01

Browse files
committed
change query API to use visitor pattern
cc @JaapSuter
1 parent c9321d8 commit f839a01

File tree

2 files changed

+20
-20
lines changed

2 files changed

+20
-20
lines changed

include/kdbush.hpp

+18-18
Original file line numberDiff line numberDiff line change
@@ -50,31 +50,31 @@ class KDBush {
5050
sortKD(0, size - 1, 0);
5151
}
5252

53-
template <typename TOutputIter>
53+
template <typename TVisitor>
5454
void range(const TNumber minX,
5555
const TNumber minY,
5656
const TNumber maxX,
5757
const TNumber maxY,
58-
TOutputIter out) {
59-
range(minX, minY, maxX, maxY, out, 0, ids.size() - 1, 0);
58+
const TVisitor &visitor) {
59+
range(minX, minY, maxX, maxY, visitor, 0, ids.size() - 1, 0);
6060
}
6161

62-
template <typename TOutputIter>
63-
void within(const TNumber qx, const TNumber qy, const TNumber r, TOutputIter out) {
64-
within(qx, qy, r, out, 0, ids.size() - 1, 0);
62+
template <typename TVisitor>
63+
void within(const TNumber qx, const TNumber qy, const TNumber r, const TVisitor &visitor) {
64+
within(qx, qy, r, visitor, 0, ids.size() - 1, 0);
6565
}
6666

6767
private:
6868
std::vector<TIndex> ids;
6969
std::vector<std::pair<TNumber, TNumber>> points;
7070
std::uint8_t nodeSize;
7171

72-
template <typename TOutputIter>
72+
template <typename TVisitor>
7373
void range(const TNumber minX,
7474
const TNumber minY,
7575
const TNumber maxX,
7676
const TNumber maxY,
77-
TOutputIter out,
77+
const TVisitor &visitor,
7878
const TIndex left,
7979
const TIndex right,
8080
const std::uint8_t axis) {
@@ -83,7 +83,7 @@ class KDBush {
8383
for (auto i = left; i <= right; i++) {
8484
const TNumber x = std::get<0>(points[i]);
8585
const TNumber y = std::get<1>(points[i]);
86-
if (x >= minX && x <= maxX && y >= minY && y <= maxY) *out++ = ids[i];
86+
if (x >= minX && x <= maxX && y >= minY && y <= maxY) visitor(ids[i]);
8787
}
8888
return;
8989
}
@@ -92,20 +92,20 @@ class KDBush {
9292
const TNumber x = std::get<0>(points[m]);
9393
const TNumber y = std::get<1>(points[m]);
9494

95-
if (x >= minX && x <= maxX && y >= minY && y <= maxY) *out++ = ids[m];
95+
if (x >= minX && x <= maxX && y >= minY && y <= maxY) visitor(ids[m]);
9696

9797
if (axis == 0 ? minX <= x : minY <= y)
98-
range(minX, minY, maxX, maxY, out, left, m - 1, (axis + 1) % 2);
98+
range(minX, minY, maxX, maxY, visitor, left, m - 1, (axis + 1) % 2);
9999

100100
if (axis == 0 ? maxX >= x : maxY >= y)
101-
range(minX, minY, maxX, maxY, out, m + 1, right, (axis + 1) % 2);
101+
range(minX, minY, maxX, maxY, visitor, m + 1, right, (axis + 1) % 2);
102102
}
103103

104-
template <typename TOutputIter>
104+
template <typename TVisitor>
105105
void within(const TNumber qx,
106106
const TNumber qy,
107107
const TNumber r,
108-
TOutputIter out,
108+
const TVisitor &visitor,
109109
const TIndex left,
110110
const TIndex right,
111111
const std::uint8_t axis) {
@@ -116,7 +116,7 @@ class KDBush {
116116
for (auto i = left; i <= right; i++) {
117117
const TNumber x = std::get<0>(points[i]);
118118
const TNumber y = std::get<1>(points[i]);
119-
if (sqDist(x, y, qx, qy) <= r2) *out++ = ids[i];
119+
if (sqDist(x, y, qx, qy) <= r2) visitor(ids[i]);
120120
}
121121
return;
122122
}
@@ -125,13 +125,13 @@ class KDBush {
125125
const TNumber x = std::get<0>(points[m]);
126126
const TNumber y = std::get<1>(points[m]);
127127

128-
if (sqDist(x, y, qx, qy) <= r2) *out++ = ids[m];
128+
if (sqDist(x, y, qx, qy) <= r2) visitor(ids[m]);
129129

130130
if (axis == 0 ? qx - r <= x : qy - r <= y)
131-
within(qx, qy, r, out, left, m - 1, (axis + 1) % 2);
131+
within(qx, qy, r, visitor, left, m - 1, (axis + 1) % 2);
132132

133133
if (axis == 0 ? qx + r >= x : qy + r >= y)
134-
within(qx, qy, r, out, m + 1, right, (axis + 1) % 2);
134+
within(qx, qy, r, visitor, m + 1, right, (axis + 1) % 2);
135135
}
136136

137137
void sortKD(const TIndex left, const TIndex right, const std::uint8_t axis) {

test.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ static void testRange() {
2828
kdbush::KDBush<TPoint> index(points, 10);
2929
TIds expectedIds = { 3, 90, 77, 72, 62, 96, 47, 8, 17, 15, 69, 71, 44, 19, 18, 45, 60, 20 };
3030
TIds result;
31-
index.range(20, 30, 50, 70, std::back_inserter(result));
31+
index.range(20, 30, 50, 70, [&result](const auto id) { result.push_back(id); });
3232

3333
assert(std::equal(expectedIds.begin(), expectedIds.end(), result.begin()));
3434
}
@@ -37,7 +37,7 @@ static void testRadius() {
3737
kdbush::KDBush<TPoint> index(points, 10);
3838
TIds expectedIds = { 3, 96, 71, 44, 18, 45, 60, 6, 25, 92, 42, 20 };
3939
TIds result;
40-
index.within(50, 50, 20, std::back_inserter(result));
40+
index.within(50, 50, 20, [&result](const auto id) { result.push_back(id); });
4141

4242
assert(std::equal(expectedIds.begin(), expectedIds.end(), result.begin()));
4343
}

0 commit comments

Comments
 (0)