mirror of
https://github.com/felt/tippecanoe.git
synced 2026-10-04 09:25:41 +02:00
Add to-memory versions of the serialization functions
This commit is contained in:
+55
-8
@@ -27,6 +27,8 @@
|
|||||||
#define SHIFT_RIGHT(a) ((((a) + COORD_OFFSET) >> geometry_scale) - (COORD_OFFSET >> geometry_scale))
|
#define SHIFT_RIGHT(a) ((((a) + COORD_OFFSET) >> geometry_scale) - (COORD_OFFSET >> geometry_scale))
|
||||||
#define SHIFT_LEFT(a) ((((a) + (COORD_OFFSET >> geometry_scale)) << geometry_scale) - COORD_OFFSET)
|
#define SHIFT_LEFT(a) ((((a) + (COORD_OFFSET >> geometry_scale)) << geometry_scale) - COORD_OFFSET)
|
||||||
|
|
||||||
|
// write to file
|
||||||
|
|
||||||
size_t fwrite_check(const void *ptr, size_t size, size_t nitems, FILE *stream, const char *fname) {
|
size_t fwrite_check(const void *ptr, size_t size, size_t nitems, FILE *stream, const char *fname) {
|
||||||
size_t w = fwrite(ptr, size, nitems, stream);
|
size_t w = fwrite(ptr, size, nitems, stream);
|
||||||
if (w != nitems) {
|
if (w != nitems) {
|
||||||
@@ -74,10 +76,53 @@ void serialize_byte(FILE *out, signed char n, std::atomic<long long> *fpos, cons
|
|||||||
}
|
}
|
||||||
|
|
||||||
void serialize_uint(FILE *out, unsigned n, std::atomic<long long> *fpos, const char *fname) {
|
void serialize_uint(FILE *out, unsigned n, std::atomic<long long> *fpos, const char *fname) {
|
||||||
fwrite_check(&n, sizeof(unsigned), 1, out, fname);
|
serialize_ulong_long(out, n, fpos, fname);
|
||||||
*fpos += sizeof(unsigned);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// write to memory
|
||||||
|
|
||||||
|
size_t fwrite_check(const void *ptr, size_t size, size_t nitems, std::string &stream) {
|
||||||
|
stream += std::string((char *) ptr, size * nitems);
|
||||||
|
return nitems;
|
||||||
|
}
|
||||||
|
|
||||||
|
void serialize_ulong_long(std::string &out, unsigned long long zigzag, std::atomic<long long> *fpos) {
|
||||||
|
while (1) {
|
||||||
|
unsigned char b = zigzag & 0x7F;
|
||||||
|
if ((zigzag >> 7) != 0) {
|
||||||
|
b |= 0x80;
|
||||||
|
out += b;
|
||||||
|
*fpos += 1;
|
||||||
|
zigzag >>= 7;
|
||||||
|
} else {
|
||||||
|
out += b;
|
||||||
|
*fpos += 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void serialize_long_long(std::string &out, long long n, std::atomic<long long> *fpos) {
|
||||||
|
unsigned long long zigzag = protozero::encode_zigzag64(n);
|
||||||
|
|
||||||
|
serialize_ulong_long(out, zigzag, fpos);
|
||||||
|
}
|
||||||
|
|
||||||
|
void serialize_int(std::string &out, int n, std::atomic<long long> *fpos) {
|
||||||
|
serialize_long_long(out, n, fpos);
|
||||||
|
}
|
||||||
|
|
||||||
|
void serialize_byte(std::string &out, signed char n, std::atomic<long long> *fpos) {
|
||||||
|
out += n;
|
||||||
|
*fpos += sizeof(signed char);
|
||||||
|
}
|
||||||
|
|
||||||
|
void serialize_uint(std::string &out, unsigned n, std::atomic<long long> *fpos) {
|
||||||
|
serialize_ulong_long(out, n, fpos);
|
||||||
|
}
|
||||||
|
|
||||||
|
// read from memory
|
||||||
|
|
||||||
void deserialize_int(char **f, int *n) {
|
void deserialize_int(char **f, int *n) {
|
||||||
long long ll;
|
long long ll;
|
||||||
deserialize_long_long(f, &ll);
|
deserialize_long_long(f, &ll);
|
||||||
@@ -109,8 +154,9 @@ void deserialize_ulong_long(char **f, unsigned long long *zigzag) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void deserialize_uint(char **f, unsigned *n) {
|
void deserialize_uint(char **f, unsigned *n) {
|
||||||
memcpy(n, *f, sizeof(unsigned));
|
unsigned long long v;
|
||||||
*f += sizeof(unsigned);
|
deserialize_ulong_long(f, &v);
|
||||||
|
*n = v;
|
||||||
}
|
}
|
||||||
|
|
||||||
void deserialize_byte(char **f, signed char *n) {
|
void deserialize_byte(char **f, signed char *n) {
|
||||||
@@ -118,6 +164,8 @@ void deserialize_byte(char **f, signed char *n) {
|
|||||||
*f += sizeof(signed char);
|
*f += sizeof(signed char);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// read from file
|
||||||
|
|
||||||
int deserialize_long_long_io(FILE *f, long long *n, std::atomic<long long> *geompos) {
|
int deserialize_long_long_io(FILE *f, long long *n, std::atomic<long long> *geompos) {
|
||||||
unsigned long long zigzag = 0;
|
unsigned long long zigzag = 0;
|
||||||
int ret = deserialize_ulong_long_io(f, &zigzag, geompos);
|
int ret = deserialize_ulong_long_io(f, &zigzag, geompos);
|
||||||
@@ -157,10 +205,9 @@ int deserialize_int_io(FILE *f, int *n, std::atomic<long long> *geompos) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int deserialize_uint_io(FILE *f, unsigned *n, std::atomic<long long> *geompos) {
|
int deserialize_uint_io(FILE *f, unsigned *n, std::atomic<long long> *geompos) {
|
||||||
if (fread(n, sizeof(unsigned), 1, f) != 1) {
|
unsigned long long v;
|
||||||
return 0;
|
deserialize_ulong_long_io(f, &v, geompos);
|
||||||
}
|
*n = v;
|
||||||
*geompos += sizeof(unsigned);
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+6
-1
@@ -18,7 +18,12 @@ void serialize_long_long(FILE *out, long long n, std::atomic<long long> *fpos, c
|
|||||||
void serialize_ulong_long(FILE *out, unsigned long long n, std::atomic<long long> *fpos, const char *fname);
|
void serialize_ulong_long(FILE *out, unsigned long long n, std::atomic<long long> *fpos, const char *fname);
|
||||||
void serialize_byte(FILE *out, signed char n, std::atomic<long long> *fpos, const char *fname);
|
void serialize_byte(FILE *out, signed char n, std::atomic<long long> *fpos, const char *fname);
|
||||||
void serialize_uint(FILE *out, unsigned n, std::atomic<long long> *fpos, const char *fname);
|
void serialize_uint(FILE *out, unsigned n, std::atomic<long long> *fpos, const char *fname);
|
||||||
void serialize_string(FILE *out, const char *s, std::atomic<long long> *fpos, const char *fname);
|
|
||||||
|
void serialize_int(std::string &out, int n, std::atomic<long long> *fpos);
|
||||||
|
void serialize_long_long(std::string &out, long long n, std::atomic<long long> *fpos);
|
||||||
|
void serialize_ulong_long(std::string &out, unsigned long long n, std::atomic<long long> *fpos);
|
||||||
|
void serialize_byte(std::string &out, signed char n, std::atomic<long long> *fpos);
|
||||||
|
void serialize_uint(std::string &out, unsigned n, std::atomic<long long> *fpos);
|
||||||
|
|
||||||
void deserialize_int(char **f, int *n);
|
void deserialize_int(char **f, int *n);
|
||||||
void deserialize_long_long(char **f, long long *n);
|
void deserialize_long_long(char **f, long long *n);
|
||||||
|
|||||||
Reference in New Issue
Block a user