mirror of
https://github.com/felt/tippecanoe.git
synced 2026-10-02 16:35:40 +02:00
Progress on 128-bit indices
This commit is contained in:
+23
-5
@@ -64,6 +64,11 @@ void serialize_ulong_long(FILE *out, unsigned long long zigzag, std::atomic<long
|
||||
fwrite_check(buf, sizeof(char), s - buf, out, fpos, fname);
|
||||
}
|
||||
|
||||
void serialize_u128(FILE *out, __uint128_t zigzag, std::atomic<long long> *fpos, const char *fname) {
|
||||
serialize_ulong_long(out, (unsigned long long) zigzag, fpos, fname);
|
||||
serialize_ulong_long(out, (unsigned long long) (zigzag >> 64), fpos, fname);
|
||||
}
|
||||
|
||||
void serialize_byte(FILE *out, signed char n, std::atomic<long long> *fpos, const char *fname) {
|
||||
fwrite_check(&n, sizeof(signed char), 1, out, fpos, fname);
|
||||
}
|
||||
@@ -92,6 +97,11 @@ void serialize_ulong_long(std::string &out, unsigned long long zigzag) {
|
||||
out.append(buf, s - buf);
|
||||
}
|
||||
|
||||
void serialize_u128(std::string &out, __uint128_t zigzag) {
|
||||
serialize_ulong_long(out, (unsigned long long) zigzag);
|
||||
serialize_ulong_long(out, (unsigned long long) (zigzag >> 64));
|
||||
}
|
||||
|
||||
void serialize_long_long(std::string &out, long long n) {
|
||||
unsigned long long zigzag = protozero::encode_zigzag64(n);
|
||||
|
||||
@@ -142,6 +152,14 @@ void deserialize_ulong_long(const char **f, unsigned long long *zigzag) {
|
||||
}
|
||||
}
|
||||
|
||||
void deserialize_u128(const char **f, __uint128_t *zigzag) {
|
||||
unsigned long long tmp, tmp2;
|
||||
deserialize_ulong_long(f, &tmp);
|
||||
deserialize_ulong_long(f, &tmp2);
|
||||
|
||||
*zigzag = tmp | ((__uint128_t) tmp2) << 64;
|
||||
}
|
||||
|
||||
void deserialize_uint(const char **f, unsigned *n) {
|
||||
unsigned long long v;
|
||||
deserialize_ulong_long(f, &v);
|
||||
@@ -209,10 +227,10 @@ std::string serialize_feature(serial_feature *sf, long long wx, long long wy) {
|
||||
write_geometry(sf->geometry, s, wx, wy);
|
||||
|
||||
if (sf->index != 0) {
|
||||
serialize_ulong_long(s, sf->index);
|
||||
serialize_u128(s, sf->index);
|
||||
}
|
||||
if (sf->label_point != 0) {
|
||||
serialize_ulong_long(s, sf->label_point);
|
||||
serialize_u128(s, sf->label_point);
|
||||
}
|
||||
if (sf->extent != 0) {
|
||||
serialize_long_long(s, sf->extent);
|
||||
@@ -264,10 +282,10 @@ serial_feature deserialize_feature(std::string const &geoms, unsigned z, unsigne
|
||||
sf.geometry = decode_geometry(&cp, z, tx, ty, sf.bbox, initial_x[sf.segment], initial_y[sf.segment]);
|
||||
|
||||
if (sf.layer & (1 << FLAG_INDEX)) {
|
||||
deserialize_ulong_long(&cp, &sf.index);
|
||||
deserialize_u128(&cp, &sf.index);
|
||||
}
|
||||
if (sf.layer & (1 << FLAG_LABEL_POINT)) {
|
||||
deserialize_ulong_long(&cp, &sf.label_point);
|
||||
deserialize_u128(&cp, &sf.label_point);
|
||||
}
|
||||
if (sf.layer & (1 << FLAG_EXTENT)) {
|
||||
deserialize_long_long(&cp, &sf.extent);
|
||||
@@ -682,7 +700,7 @@ int serialize_feature(struct serialization_state *sst, serial_feature &sf, std::
|
||||
*(sst->area_sum) += extent;
|
||||
}
|
||||
|
||||
unsigned long long bbox_index;
|
||||
__uint128_t bbox_index;
|
||||
long long midx, midy;
|
||||
|
||||
if (sf.t == VT_POINT) {
|
||||
|
||||
Reference in New Issue
Block a user