Skip to content

Commit 6c5d79c

Browse files
authored
(de-)serialize new ->Size member (#71)
include tests, which unfortunately do not neatly fit into generic framework
1 parent a9c951d commit 6c5d79c

File tree

2 files changed

+77
-2
lines changed

2 files changed

+77
-2
lines changed

include/binaryfusefilter.h

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,10 @@ static inline uint8_t binary_fuse_mod3(uint8_t x) {
279279
// many duplicated keys.
280280
static inline bool binary_fuse8_populate(uint64_t *keys, uint32_t size,
281281
binary_fuse8_t *filter) {
282+
if (size != filter->Size) {
283+
return false;
284+
}
285+
282286
uint64_t rng_counter = 0x726b2b9d438b9d4d;
283287
filter->Seed = binary_fuse_rng_splitmix64(&rng_counter);
284288
uint64_t *reverseOrder = (uint64_t *)calloc((size + 1), sizeof(uint64_t));
@@ -569,6 +573,10 @@ static inline void binary_fuse16_free(binary_fuse16_t *filter) {
569573
// many duplicated keys.
570574
static inline bool binary_fuse16_populate(uint64_t *keys, uint32_t size,
571575
binary_fuse16_t *filter) {
576+
if (size != filter->Size) {
577+
return false;
578+
}
579+
572580
uint64_t rng_counter = 0x726b2b9d438b9d4d;
573581
filter->Seed = binary_fuse_rng_splitmix64(&rng_counter);
574582
uint64_t *reverseOrder = (uint64_t *)calloc((size + 1), sizeof(uint64_t));
@@ -747,14 +755,14 @@ static inline bool binary_fuse16_populate(uint64_t *keys, uint32_t size,
747755
}
748756

749757
static inline size_t binary_fuse16_serialization_bytes(binary_fuse16_t *filter) {
750-
return sizeof(filter->Seed) + sizeof(filter->SegmentLength) +
758+
return sizeof(filter->Seed) + sizeof(filter->Size) + sizeof(filter->SegmentLength) +
751759
sizeof(filter->SegmentLengthMask) + sizeof(filter->SegmentCount) +
752760
sizeof(filter->SegmentCountLength) + sizeof(filter->ArrayLength) +
753761
sizeof(uint16_t) * filter->ArrayLength;
754762
}
755763

756764
static inline size_t binary_fuse8_serialization_bytes(const binary_fuse8_t *filter) {
757-
return sizeof(filter->Seed) + sizeof(filter->SegmentLength) +
765+
return sizeof(filter->Seed) + sizeof(filter->Size) + sizeof(filter->SegmentLength) +
758766
sizeof(filter->SegmentCount) +
759767
sizeof(filter->SegmentCountLength) + sizeof(filter->ArrayLength) +
760768
sizeof(uint8_t) * filter->ArrayLength;
@@ -766,6 +774,8 @@ static inline size_t binary_fuse8_serialization_bytes(const binary_fuse8_t *filt
766774
static inline void binary_fuse16_serialize(const binary_fuse16_t *filter, char *buffer) {
767775
memcpy(buffer, &filter->Seed, sizeof(filter->Seed));
768776
buffer += sizeof(filter->Seed);
777+
memcpy(buffer, &filter->Size, sizeof(filter->Size));
778+
buffer += sizeof(filter->Size);
769779
memcpy(buffer, &filter->SegmentLength, sizeof(filter->SegmentLength));
770780
buffer += sizeof(filter->SegmentLength);
771781
memcpy(buffer, &filter->SegmentCount, sizeof(filter->SegmentCount));
@@ -783,6 +793,8 @@ static inline void binary_fuse16_serialize(const binary_fuse16_t *filter, char *
783793
static inline void binary_fuse8_serialize(const binary_fuse8_t *filter, char *buffer) {
784794
memcpy(buffer, &filter->Seed, sizeof(filter->Seed));
785795
buffer += sizeof(filter->Seed);
796+
memcpy(buffer, &filter->Size, sizeof(filter->Size));
797+
buffer += sizeof(filter->Size);
786798
memcpy(buffer, &filter->SegmentLength, sizeof(filter->SegmentLength));
787799
buffer += sizeof(filter->SegmentLength);
788800
memcpy(buffer, &filter->SegmentCount, sizeof(filter->SegmentCount));
@@ -802,6 +814,8 @@ static inline void binary_fuse8_serialize(const binary_fuse8_t *filter, char *bu
802814
static inline const char* binary_fuse16_deserialize_header(binary_fuse16_t* filter, const char* buffer) {
803815
memcpy(&filter->Seed, buffer, sizeof(filter->Seed));
804816
buffer += sizeof(filter->Seed);
817+
memcpy(&filter->Size, buffer, sizeof(filter->Size));
818+
buffer += sizeof(filter->Size);
805819
memcpy(&filter->SegmentLength, buffer, sizeof(filter->SegmentLength));
806820
buffer += sizeof(filter->SegmentLength);
807821
filter->SegmentLengthMask = filter->SegmentLength - 1;
@@ -837,6 +851,8 @@ static inline bool binary_fuse16_deserialize(binary_fuse16_t * filter, const cha
837851
static inline const char* binary_fuse8_deserialize_header(binary_fuse8_t* filter, const char* buffer) {
838852
memcpy(&filter->Seed, buffer, sizeof(filter->Seed));
839853
buffer += sizeof(filter->Seed);
854+
memcpy(&filter->Size, buffer, sizeof(filter->Size));
855+
buffer += sizeof(filter->Size);
840856
memcpy(&filter->SegmentLength, buffer, sizeof(filter->SegmentLength));
841857
buffer += sizeof(filter->SegmentLength);
842858
filter->SegmentLengthMask = filter->SegmentLength - 1;

tests/unit.c

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,35 @@ bool testbufferedxor16(size_t size) {
191191
bool testbinaryfuse8(size_t size, size_t repeated_size) {
192192
printf("testing binary fuse8 with size %zu and %zu duplicates\n", size, repeated_size);
193193
binary_fuse8_t filter;
194+
195+
// size serialization test
196+
binary_fuse8_allocate((uint32_t)size, &filter);
197+
uint64_t *big_set = (uint64_t *)malloc(sizeof(uint64_t) * size);
198+
for (size_t i = 0; i < size; i++) {
199+
big_set[i] = i;
200+
}
201+
if (!binary_fuse8_populate(big_set, (uint32_t)size, &filter)) {
202+
return false;
203+
}
204+
free(big_set);
205+
206+
size_t buffer_size = binary_fuse8_serialization_bytes(&filter);
207+
char *buffer = (char *)malloc(buffer_size);
208+
binary_fuse8_serialize(&filter, buffer);
209+
binary_fuse8_free(&filter);
210+
binary_fuse8_deserialize(&filter, buffer);
211+
212+
if (filter.Size != size) {
213+
printf("size not (de-)serialized correctly, found %d, expected %zu.",
214+
filter.Size, size);
215+
free(buffer);
216+
binary_fuse8_free(&filter);
217+
return false;
218+
}
219+
free(buffer);
220+
binary_fuse8_free(&filter);
221+
// end of size serialization test
222+
194223
return test(size, repeated_size, &filter,
195224
binary_fuse8_allocate_gen,
196225
binary_fuse8_free_gen,
@@ -205,6 +234,36 @@ bool testbinaryfuse8(size_t size, size_t repeated_size) {
205234
bool testbinaryfuse16(size_t size, size_t repeated_size) {
206235
printf("testing binary fuse16 with size %zu and %zu duplicates\n", size, repeated_size);
207236
binary_fuse16_t filter;
237+
238+
// size serialization test
239+
binary_fuse16_allocate((uint32_t)size, &filter);
240+
uint64_t *big_set = (uint64_t *)malloc(sizeof(uint64_t) * size);
241+
for (size_t i = 0; i < size; i++) {
242+
big_set[i] = i;
243+
}
244+
if (!binary_fuse16_populate(big_set, (uint32_t)size, &filter)) {
245+
return false;
246+
}
247+
free(big_set);
248+
249+
size_t buffer_size = binary_fuse16_serialization_bytes(&filter);
250+
char *buffer = (char *)malloc(buffer_size);
251+
binary_fuse16_serialize(&filter, buffer);
252+
binary_fuse16_free(&filter);
253+
binary_fuse16_deserialize(&filter, buffer);
254+
255+
if (filter.Size != size) {
256+
printf("size not (de-)serialized correctly, found %d, expected %zu.",
257+
filter.Size, size);
258+
free(buffer);
259+
binary_fuse16_free(&filter);
260+
return false;
261+
}
262+
263+
free(buffer);
264+
binary_fuse16_free(&filter);
265+
// end of size serialization test
266+
208267
return test(size, repeated_size, &filter,
209268
binary_fuse16_allocate_gen,
210269
binary_fuse16_free_gen,

0 commit comments

Comments
 (0)