mirror of
https://github.com/felt/tippecanoe.git
synced 2026-10-02 08:25:40 +02:00
Externalizing polygon shard detection (#146)
* Start of externalizing polygon shard detection * Completely untested external quicksort * Add unit test for external quicksort * Remember to clean up temporary files * Sort and scan the vertices * Bring over more vertex logic * Make nodes from vertices * Checkpoint on switching over to global shared nodes * Do the thing * Revert unintended change to coalesced linestring behavior * Take shared nodes into account in early simplification * Let it do more sorting in memory * Fix overnoding of collinear linestrings * Remove duplicate nodes, since only duplicate vertices now matter * Remember to delete temporary files * Fix out of bounds memory access below, apparently * Fix the actual undefined behavior * Still running out of memory in one case. Find out where. * Forgot the conditional * Try again to make it not run out of memory * Update version and changelog
This commit is contained in:
@@ -1,6 +1,9 @@
|
||||
#define CATCH_CONFIG_MAIN
|
||||
#include "catch/catch.hpp"
|
||||
#include "text.hpp"
|
||||
#include "sort.hpp"
|
||||
#include <unistd.h>
|
||||
#include <limits.h>
|
||||
|
||||
TEST_CASE("UTF-8 enforcement", "[utf8]") {
|
||||
REQUIRE(check_utf8("") == std::string(""));
|
||||
@@ -18,3 +21,47 @@ TEST_CASE("UTF-8 truncation", "[trunc]") {
|
||||
REQUIRE(truncate16("0123456789😀😬😁😂😃😄😅😆", 17) == std::string("0123456789😀😬😁"));
|
||||
REQUIRE(truncate16("0123456789あいうえおかきくけこさ", 16) == std::string("0123456789あいうえおか"));
|
||||
}
|
||||
|
||||
int intcmp(const void *v1, const void *v2) {
|
||||
return *((int *) v1) - *((int *) v2);
|
||||
}
|
||||
|
||||
TEST_CASE("External quicksort", "fqsort") {
|
||||
std::vector<FILE *> inputs;
|
||||
|
||||
size_t written = 0;
|
||||
for (size_t i = 0; i < 5; i++) {
|
||||
std::string tmpname = "/tmp/in.XXXXXXX";
|
||||
int fd = mkstemp((char *) tmpname.c_str());
|
||||
unlink(tmpname.c_str());
|
||||
FILE *f = fdopen(fd, "w+b");
|
||||
inputs.emplace_back(f);
|
||||
size_t iterations = 2000 + rand() % 200;
|
||||
for (size_t j = 0; j < iterations; j++) {
|
||||
int n = rand();
|
||||
fwrite((void *) &n, sizeof(int), 1, f);
|
||||
written++;
|
||||
}
|
||||
rewind(f);
|
||||
}
|
||||
|
||||
std::string tmpname = "/tmp/out.XXXXXX";
|
||||
int fd = mkstemp((char *) tmpname.c_str());
|
||||
unlink(tmpname.c_str());
|
||||
FILE *f = fdopen(fd, "w+b");
|
||||
|
||||
fqsort(inputs, sizeof(int), intcmp, f, 256);
|
||||
rewind(f);
|
||||
|
||||
int prev = INT_MIN;
|
||||
int here;
|
||||
size_t nread = 0;
|
||||
while (fread((void *) &here, sizeof(int), 1, f)) {
|
||||
REQUIRE(here >= prev);
|
||||
prev = here;
|
||||
nread++;
|
||||
}
|
||||
|
||||
fclose(f);
|
||||
REQUIRE(nread == written);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user