h3 3.4.0 → 3.4.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +5 -1
- data/ext/h3/src/.travis.yml +5 -0
- data/ext/h3/src/CHANGELOG.md +25 -0
- data/ext/h3/src/CMakeLists.txt +5 -8
- data/ext/h3/src/CONTRIBUTING.md +2 -0
- data/ext/h3/src/README.md +6 -2
- data/ext/h3/src/VERSION +1 -1
- data/ext/h3/src/appveyor.yml +6 -1
- data/ext/h3/src/docs/api/misc.md +16 -0
- data/ext/h3/src/docs/community/bindings.md +9 -0
- data/ext/h3/src/docs/community/tutorials.md +4 -0
- data/ext/h3/src/scripts/binding_functions.ps1 +1 -2
- data/ext/h3/src/scripts/binding_functions.sh +3 -2
- data/ext/h3/src/scripts/coverage.sh.in +3 -3
- data/ext/h3/src/src/apps/applib/include/utility.h +60 -0
- data/ext/h3/src/src/apps/applib/lib/utility.c +196 -2
- data/ext/h3/src/src/apps/benchmarks/benchmarkPolyfill.c +7 -4
- data/ext/h3/src/src/apps/filters/geoToH3.c +73 -27
- data/ext/h3/src/src/apps/filters/h3ToGeo.c +63 -47
- data/ext/h3/src/src/apps/filters/h3ToGeoBoundary.c +64 -48
- data/ext/h3/src/src/apps/filters/h3ToLocalIj.c +4 -5
- data/ext/h3/src/src/apps/filters/hexRange.c +0 -1
- data/ext/h3/src/src/apps/filters/kRing.c +60 -28
- data/ext/h3/src/src/apps/filters/localIjToH3.c +75 -0
- data/ext/h3/src/src/apps/miscapps/generateBaseCellNeighbors.c +2 -2
- data/ext/h3/src/src/apps/testapps/testBBox.c +18 -0
- data/ext/h3/src/src/apps/testapps/testCompact.c +41 -0
- data/ext/h3/src/src/apps/testapps/testCoordIj.c +0 -1
- data/ext/h3/src/src/apps/testapps/testCoordIjk.c +53 -0
- data/ext/h3/src/src/apps/testapps/testH3Api.c +20 -0
- data/ext/h3/src/src/apps/testapps/testH3Distance.c +5 -3
- data/ext/h3/src/src/apps/testapps/testH3Line.c +18 -6
- data/ext/h3/src/src/apps/testapps/testH3ToLocalIj.c +75 -3
- data/ext/h3/src/src/apps/testapps/testH3UniEdge.c +17 -11
- data/ext/h3/src/src/apps/testapps/testHexRanges.c +10 -0
- data/ext/h3/src/src/apps/testapps/testKRing.c +11 -7
- data/ext/h3/src/src/h3lib/lib/algos.c +2 -1
- data/ext/h3/src/src/h3lib/lib/geoCoord.c +10 -10
- data/ext/h3/src/src/h3lib/lib/h3Index.c +1 -2
- data/ext/h3/src/src/h3lib/lib/localij.c +32 -36
- data/lib/h3/version.rb +1 -1
- metadata +4 -7
- data/ext/h3/src/cmake/CheckAlloca.cmake +0 -33
- data/ext/h3/src/cmake/CheckVLA.cmake +0 -33
- data/ext/h3/src/cmake/alloca_test.c +0 -29
- data/ext/h3/src/cmake/vla_test.c +0 -26
- data/ext/h3/src/src/h3lib/include/stackAlloc.h +0 -64
@@ -1,5 +1,5 @@
|
|
1
1
|
/*
|
2
|
-
* Copyright 2018 Uber Technologies, Inc.
|
2
|
+
* Copyright 2018-2019 Uber Technologies, Inc.
|
3
3
|
*
|
4
4
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
5
5
|
* you may not use this file except in compliance with the License.
|
@@ -20,15 +20,14 @@
|
|
20
20
|
* usage: `h3ToLocalIj [origin]`
|
21
21
|
*
|
22
22
|
* The program reads H3 indexes from stdin and outputs the corresponding
|
23
|
-
* IJ coordinates to stdout, until EOF is encountered.
|
24
|
-
*
|
25
|
-
* could not be obtained.
|
23
|
+
* IJ coordinates to stdout, until EOF is encountered. `NA` is printed if the
|
24
|
+
* IJ coordinates could not be obtained.
|
26
25
|
*
|
27
26
|
* `origin` indicates the origin (or anchoring) index for the IJ coordinate
|
28
27
|
* space.
|
29
28
|
*
|
30
29
|
* This program has the same limitations as the `experimentalH3ToLocalIj`
|
31
|
-
*
|
30
|
+
* function.
|
32
31
|
*/
|
33
32
|
|
34
33
|
#include <inttypes.h>
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/*
|
2
|
-
* Copyright 2016-2017 Uber Technologies, Inc.
|
2
|
+
* Copyright 2016-2017, 2019 Uber Technologies, Inc.
|
3
3
|
*
|
4
4
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
5
5
|
* you may not use this file except in compliance with the License.
|
@@ -17,57 +17,89 @@
|
|
17
17
|
* @brief stdin/stdout filter that converts from integer H3 indexes to
|
18
18
|
* k-rings
|
19
19
|
*
|
20
|
-
* usage: `kRing [
|
20
|
+
* usage: `kRing -k <k> [--print-distances] [--origin origin]`
|
21
21
|
*
|
22
22
|
* The program reads H3 indexes from stdin until EOF and outputs
|
23
23
|
* the H3 indexes within k-ring `k` to stdout.
|
24
|
+
*
|
25
|
+
* --print-distances may be specified to also print the grid distance
|
26
|
+
* from the origin index.
|
24
27
|
*/
|
25
28
|
|
29
|
+
#include <inttypes.h>
|
30
|
+
#include <stdbool.h>
|
26
31
|
#include <stdio.h>
|
27
32
|
#include <stdlib.h>
|
28
|
-
#include "
|
29
|
-
#include "h3Index.h"
|
30
|
-
#include "stackAlloc.h"
|
33
|
+
#include "h3api.h"
|
31
34
|
#include "utility.h"
|
32
35
|
|
33
|
-
void doCell(H3Index h, int k) {
|
36
|
+
void doCell(H3Index h, int k, int printDistances) {
|
34
37
|
int maxSize = H3_EXPORT(maxKringSize)(k);
|
35
38
|
H3Index* rings = calloc(maxSize, sizeof(H3Index));
|
36
|
-
|
39
|
+
int* distances = calloc(maxSize, sizeof(int));
|
40
|
+
H3_EXPORT(kRingDistances)(h, k, rings, distances);
|
37
41
|
|
38
42
|
for (int i = 0; i < maxSize; i++) {
|
39
43
|
if (rings[i] != 0) {
|
40
|
-
|
44
|
+
h3Print(rings[i]);
|
45
|
+
if (printDistances) {
|
46
|
+
printf(" %d\n", distances[i]);
|
47
|
+
} else {
|
48
|
+
printf("\n");
|
49
|
+
}
|
41
50
|
}
|
42
51
|
}
|
43
52
|
|
53
|
+
free(distances);
|
44
54
|
free(rings);
|
45
55
|
}
|
46
56
|
|
47
57
|
int main(int argc, char* argv[]) {
|
48
|
-
// check command line args
|
49
|
-
if (argc != 2) {
|
50
|
-
fprintf(stderr, "usage: %s [k]\n", argv[0]);
|
51
|
-
exit(1);
|
52
|
-
}
|
53
|
-
|
54
58
|
int k = 0;
|
55
|
-
|
56
|
-
|
59
|
+
H3Index origin = 0;
|
60
|
+
|
61
|
+
Arg helpArg = {.names = {"-h", "--help"},
|
62
|
+
.helpText = "Show this help message."};
|
63
|
+
Arg kArg = {.names = {"-k", NULL},
|
64
|
+
.required = true,
|
65
|
+
.scanFormat = "%d",
|
66
|
+
.valueName = "k",
|
67
|
+
.value = &k,
|
68
|
+
.helpText = "Radius in hexagons."};
|
69
|
+
Arg printDistancesArg = {
|
70
|
+
.names = {"-d", "--print-distances"},
|
71
|
+
.helpText = "Print distance from origin after each index."};
|
72
|
+
Arg originArg = {
|
73
|
+
.names = {"-o", "--origin"},
|
74
|
+
.scanFormat = "%" PRIx64,
|
75
|
+
.valueName = "origin",
|
76
|
+
.value = &origin,
|
77
|
+
.helpText =
|
78
|
+
"Origin, or not specified to read origins from standard in."};
|
79
|
+
|
80
|
+
Arg* args[] = {&helpArg, &kArg, &printDistancesArg, &originArg};
|
81
|
+
|
82
|
+
if (parseArgs(argc, argv, 4, args, &helpArg,
|
83
|
+
"Print indexes k distance away from the origin")) {
|
84
|
+
return helpArg.found ? 0 : 1;
|
57
85
|
}
|
58
86
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
//
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
87
|
+
if (originArg.found) {
|
88
|
+
doCell(origin, k, printDistancesArg.found);
|
89
|
+
} else {
|
90
|
+
// process the indexes on stdin
|
91
|
+
char buff[BUFF_SIZE];
|
92
|
+
while (1) {
|
93
|
+
// get an index from stdin
|
94
|
+
if (!fgets(buff, BUFF_SIZE, stdin)) {
|
95
|
+
if (feof(stdin))
|
96
|
+
break;
|
97
|
+
else
|
98
|
+
error("reading H3 index from stdin");
|
99
|
+
}
|
69
100
|
|
70
|
-
|
71
|
-
|
101
|
+
H3Index h3 = H3_EXPORT(stringToH3)(buff);
|
102
|
+
doCell(h3, k, printDistancesArg.found);
|
103
|
+
}
|
72
104
|
}
|
73
105
|
}
|
@@ -0,0 +1,75 @@
|
|
1
|
+
/*
|
2
|
+
* Copyright 2019 Uber Technologies, Inc.
|
3
|
+
*
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
* you may not use this file except in compliance with the License.
|
6
|
+
* You may obtain a copy of the License at
|
7
|
+
*
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
*
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
* See the License for the specific language governing permissions and
|
14
|
+
* limitations under the License.
|
15
|
+
*/
|
16
|
+
/** @file
|
17
|
+
* @brief stdin/stdout filter that converts from local IJ coordinates to
|
18
|
+
* H3 indexes. This is experimental.
|
19
|
+
*
|
20
|
+
* usage: `localIjToH3 [origin]`
|
21
|
+
*
|
22
|
+
* The program reads IJ coordinates (in the format `i j` separated by newlines)
|
23
|
+
* from stdin and outputs the corresponding H3 indexes to stdout, until EOF is
|
24
|
+
* encountered. `NA` is printed if the H3 index could not be obtained.
|
25
|
+
*
|
26
|
+
* `origin` indicates the origin (or anchoring) index for the IJ coordinate
|
27
|
+
* space.
|
28
|
+
*
|
29
|
+
* This program has the same limitations as the `experimentalLocalIjToH3`
|
30
|
+
* function.
|
31
|
+
*/
|
32
|
+
|
33
|
+
#include <inttypes.h>
|
34
|
+
#include <stdio.h>
|
35
|
+
#include <stdlib.h>
|
36
|
+
#include "h3api.h"
|
37
|
+
#include "utility.h"
|
38
|
+
|
39
|
+
void doCell(const CoordIJ *ij, H3Index origin) {
|
40
|
+
H3Index h;
|
41
|
+
if (H3_EXPORT(experimentalLocalIjToH3)(origin, ij, &h)) {
|
42
|
+
printf("NA\n");
|
43
|
+
} else {
|
44
|
+
h3Println(h);
|
45
|
+
}
|
46
|
+
}
|
47
|
+
|
48
|
+
int main(int argc, char *argv[]) {
|
49
|
+
// check command line args
|
50
|
+
if (argc != 2) {
|
51
|
+
fprintf(stderr, "usage: %s [origin]\n", argv[0]);
|
52
|
+
exit(1);
|
53
|
+
}
|
54
|
+
|
55
|
+
H3Index origin = H3_EXPORT(stringToH3(argv[1]));
|
56
|
+
if (!H3_EXPORT(h3IsValid)(origin)) error("origin is invalid");
|
57
|
+
|
58
|
+
// process the coordinates on stdin
|
59
|
+
char buff[BUFF_SIZE];
|
60
|
+
while (1) {
|
61
|
+
// get coordinates from stdin
|
62
|
+
if (!fgets(buff, BUFF_SIZE, stdin)) {
|
63
|
+
if (feof(stdin))
|
64
|
+
break;
|
65
|
+
else
|
66
|
+
error("reading IJ coordinates from stdin");
|
67
|
+
}
|
68
|
+
|
69
|
+
CoordIJ ij;
|
70
|
+
if (!sscanf(buff, "%d %d", &ij.i, &ij.j))
|
71
|
+
error("Parsing IJ coordinates. Expected `i j`.");
|
72
|
+
|
73
|
+
doCell(&ij, origin);
|
74
|
+
}
|
75
|
+
}
|
@@ -161,7 +161,7 @@ static void generate() {
|
|
161
161
|
if (dir == K_AXES_DIGIT) {
|
162
162
|
// 4 and 117 are 'polar' type pentagons, which have
|
163
163
|
// some different behavior.
|
164
|
-
if (i
|
164
|
+
if (_isBaseCellPentagon(i)) {
|
165
165
|
_ijkRotate60cw(&ijk);
|
166
166
|
_ijkRotate60cw(&ijk);
|
167
167
|
} else {
|
@@ -172,7 +172,7 @@ static void generate() {
|
|
172
172
|
|
173
173
|
// Adjust for the deleted k-subsequence distortion
|
174
174
|
int rotAdj = 0;
|
175
|
-
if (i
|
175
|
+
if (_isBaseCellPolarPentagon(i)) {
|
176
176
|
// 'polar' type pentagon with all faces pointing
|
177
177
|
// towards i
|
178
178
|
if (dir == IK_AXES_DIGIT) {
|
@@ -219,4 +219,22 @@ SUITE(BBox) {
|
|
219
219
|
t_assert(bboxIsTransmeridian(&bboxTransmeridian),
|
220
220
|
"Transmeridian bbox is transmeridian");
|
221
221
|
}
|
222
|
+
|
223
|
+
TEST(bboxEquals) {
|
224
|
+
BBox bbox = {1.0, 0.0, 1.0, 0.0};
|
225
|
+
BBox north = bbox;
|
226
|
+
north.north += 0.1;
|
227
|
+
BBox south = bbox;
|
228
|
+
south.south += 0.1;
|
229
|
+
BBox east = bbox;
|
230
|
+
east.east += 0.1;
|
231
|
+
BBox west = bbox;
|
232
|
+
west.west += 0.1;
|
233
|
+
|
234
|
+
t_assert(bboxEquals(&bbox, &bbox), "Equals self");
|
235
|
+
t_assert(!bboxEquals(&bbox, &north), "Not equals different north");
|
236
|
+
t_assert(!bboxEquals(&bbox, &south), "Not equals different south");
|
237
|
+
t_assert(!bboxEquals(&bbox, &east), "Not equals different east");
|
238
|
+
t_assert(!bboxEquals(&bbox, &west), "Not equals different west");
|
239
|
+
}
|
222
240
|
}
|
@@ -23,6 +23,8 @@ H3Index sunnyvale = 0x89283470c27ffff;
|
|
23
23
|
|
24
24
|
H3Index uncompactable[] = {0x89283470803ffff, 0x8928347081bffff,
|
25
25
|
0x8928347080bffff};
|
26
|
+
H3Index uncompactableWithZero[] = {0x89283470803ffff, 0x8928347081bffff, 0,
|
27
|
+
0x8928347080bffff};
|
26
28
|
|
27
29
|
SUITE(compact) {
|
28
30
|
TEST(roundtrip) {
|
@@ -207,6 +209,45 @@ SUITE(compact) {
|
|
207
209
|
free(result);
|
208
210
|
}
|
209
211
|
|
212
|
+
TEST(uncompact_onlyZero) {
|
213
|
+
// maxUncompactSize and uncompact both permit 0 indexes
|
214
|
+
// in the input array, and skip them. When only a zero is
|
215
|
+
// given, it's a no-op.
|
216
|
+
|
217
|
+
H3Index origin = 0;
|
218
|
+
|
219
|
+
int childrenSz = H3_EXPORT(maxUncompactSize)(&origin, 1, 2);
|
220
|
+
H3Index* children = calloc(childrenSz, sizeof(H3Index));
|
221
|
+
int uncompactResult =
|
222
|
+
H3_EXPORT(uncompact)(&origin, 1, children, childrenSz, 2);
|
223
|
+
t_assert(uncompactResult == 0, "uncompact only zero success");
|
224
|
+
|
225
|
+
free(children);
|
226
|
+
}
|
227
|
+
|
228
|
+
TEST(uncompactZero) {
|
229
|
+
// maxUncompactSize and uncompact both permit 0 indexes
|
230
|
+
// in the input array, and skip them.
|
231
|
+
|
232
|
+
int childrenSz =
|
233
|
+
H3_EXPORT(maxUncompactSize)(uncompactableWithZero, 4, 10);
|
234
|
+
H3Index* children = calloc(childrenSz, sizeof(H3Index));
|
235
|
+
int uncompactResult = H3_EXPORT(uncompact)(uncompactableWithZero, 4,
|
236
|
+
children, childrenSz, 10);
|
237
|
+
t_assert(uncompactResult == 0, "uncompact with zero succeeds");
|
238
|
+
|
239
|
+
int found = 0;
|
240
|
+
for (int i = 0; i < childrenSz; i++) {
|
241
|
+
if (children[i] != 0) {
|
242
|
+
found++;
|
243
|
+
}
|
244
|
+
}
|
245
|
+
t_assert(found == childrenSz,
|
246
|
+
"uncompacted with zero to expected number of hexagons");
|
247
|
+
|
248
|
+
free(children);
|
249
|
+
}
|
250
|
+
|
210
251
|
TEST(pentagon) {
|
211
252
|
H3Index pentagon;
|
212
253
|
setH3Index(&pentagon, 1, 4, 0);
|
@@ -0,0 +1,53 @@
|
|
1
|
+
/*
|
2
|
+
* Copyright 2019 Uber Technologies, Inc.
|
3
|
+
*
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
* you may not use this file except in compliance with the License.
|
6
|
+
* You may obtain a copy of the License at
|
7
|
+
*
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
*
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
* See the License for the specific language governing permissions and
|
14
|
+
* limitations under the License.
|
15
|
+
*/
|
16
|
+
/** @file
|
17
|
+
* @brief tests IJK grid functions
|
18
|
+
*
|
19
|
+
* usage: `testCoordIjk`
|
20
|
+
*/
|
21
|
+
|
22
|
+
#include "coordijk.h"
|
23
|
+
#include "test.h"
|
24
|
+
|
25
|
+
SUITE(coordIjk) {
|
26
|
+
TEST(_unitIjkToDigit) {
|
27
|
+
CoordIJK zero = {0};
|
28
|
+
CoordIJK i = {1, 0, 0};
|
29
|
+
CoordIJK outOfRange = {2, 0, 0};
|
30
|
+
CoordIJK unnormalizedZero = {2, 2, 2};
|
31
|
+
|
32
|
+
t_assert(_unitIjkToDigit(&zero) == CENTER_DIGIT, "Unit IJK to zero");
|
33
|
+
t_assert(_unitIjkToDigit(&i) == I_AXES_DIGIT, "Unit IJK to I axis");
|
34
|
+
t_assert(_unitIjkToDigit(&outOfRange) == INVALID_DIGIT,
|
35
|
+
"Unit IJK out of range");
|
36
|
+
t_assert(_unitIjkToDigit(&unnormalizedZero) == CENTER_DIGIT,
|
37
|
+
"Unnormalized unit IJK to zero");
|
38
|
+
}
|
39
|
+
|
40
|
+
TEST(_neighbor) {
|
41
|
+
CoordIJK ijk = {0};
|
42
|
+
|
43
|
+
CoordIJK zero = {0};
|
44
|
+
CoordIJK i = {1, 0, 0};
|
45
|
+
|
46
|
+
_neighbor(&ijk, CENTER_DIGIT);
|
47
|
+
t_assert(_ijkMatches(&ijk, &zero), "Center neighbor is self");
|
48
|
+
_neighbor(&ijk, I_AXES_DIGIT);
|
49
|
+
t_assert(_ijkMatches(&ijk, &i), "I neighbor as expected");
|
50
|
+
_neighbor(&ijk, INVALID_DIGIT);
|
51
|
+
t_assert(_ijkMatches(&ijk, &i), "Invalid neighbor is self");
|
52
|
+
}
|
53
|
+
}
|
@@ -79,6 +79,26 @@ SUITE(h3Api) {
|
|
79
79
|
t_assertBoundary(h3, &boundary);
|
80
80
|
}
|
81
81
|
|
82
|
+
TEST(h3ToGeoBoundary_coslonConstrain) {
|
83
|
+
// Bug test for https://github.com/uber/h3/issues/212
|
84
|
+
H3Index h3 = 0x87dc6d364ffffffL;
|
85
|
+
GeoBoundary boundary;
|
86
|
+
boundary.numVerts = 6;
|
87
|
+
setGeoDegs(&boundary.verts[0], -52.0130533678236091,
|
88
|
+
-34.6232931343713091);
|
89
|
+
setGeoDegs(&boundary.verts[1], -52.0041156384652012,
|
90
|
+
-34.6096733160584549);
|
91
|
+
setGeoDegs(&boundary.verts[2], -51.9929610229502472,
|
92
|
+
-34.6165157145896387);
|
93
|
+
setGeoDegs(&boundary.verts[3], -51.9907410568096608,
|
94
|
+
-34.6369680004259877);
|
95
|
+
setGeoDegs(&boundary.verts[4], -51.9996738734672377,
|
96
|
+
-34.6505896528323660);
|
97
|
+
setGeoDegs(&boundary.verts[5], -52.0108315681413629,
|
98
|
+
-34.6437571897165668);
|
99
|
+
t_assertBoundary(h3, &boundary);
|
100
|
+
}
|
101
|
+
|
82
102
|
TEST(version) {
|
83
103
|
t_assert(H3_VERSION_MAJOR >= 0, "major version is set");
|
84
104
|
t_assert(H3_VERSION_MINOR >= 0, "minor version is set");
|
@@ -28,7 +28,6 @@
|
|
28
28
|
#include "h3Index.h"
|
29
29
|
#include "h3api.h"
|
30
30
|
#include "localij.h"
|
31
|
-
#include "stackAlloc.h"
|
32
31
|
#include "test.h"
|
33
32
|
#include "utility.h"
|
34
33
|
|
@@ -44,8 +43,8 @@ static void h3Distance_kRing_assertions(H3Index h3) {
|
|
44
43
|
int maxK = MAX_DISTANCES[r];
|
45
44
|
|
46
45
|
int sz = H3_EXPORT(maxKringSize)(maxK);
|
47
|
-
|
48
|
-
|
46
|
+
H3Index *neighbors = calloc(sz, sizeof(H3Index));
|
47
|
+
int *distances = calloc(sz, sizeof(int));
|
49
48
|
|
50
49
|
H3_EXPORT(kRingDistances)(h3, maxK, neighbors, distances);
|
51
50
|
|
@@ -61,6 +60,9 @@ static void h3Distance_kRing_assertions(H3Index h3) {
|
|
61
60
|
t_assert(calculatedDistance == distances[i] || calculatedDistance == -1,
|
62
61
|
"kRingDistances matches h3Distance");
|
63
62
|
}
|
63
|
+
|
64
|
+
free(distances);
|
65
|
+
free(neighbors);
|
64
66
|
}
|
65
67
|
|
66
68
|
SUITE(h3Distance) {
|