@@ -734,7 +734,103 @@ static inline bool binary_fuse16_populate(uint64_t *keys, uint32_t size,
734734 return true;
735735}
736736
737+ static inline size_t binary_fuse16_serialization_bytes (binary_fuse16_t * filter ) {
738+ return sizeof (filter -> Seed ) + sizeof (filter -> SegmentLength ) +
739+ sizeof (filter -> SegmentLengthMask ) + sizeof (filter -> SegmentCount ) +
740+ sizeof (filter -> SegmentCountLength ) + sizeof (filter -> ArrayLength ) +
741+ sizeof (uint16_t ) * filter -> ArrayLength ;
742+ }
743+
744+ static inline size_t binary_fuse8_serialization_bytes (const binary_fuse8_t * filter ) {
745+ return sizeof (filter -> Seed ) + sizeof (filter -> SegmentLength ) +
746+ sizeof (filter -> SegmentCount ) +
747+ sizeof (filter -> SegmentCountLength ) + sizeof (filter -> ArrayLength ) +
748+ sizeof (uint8_t ) * filter -> ArrayLength ;
749+ }
750+
751+ // serialize a filter to a buffer, the buffer should have a capacity of at least
752+ // binary_fuse16_serialization_bytes(filter) bytes.
753+ // Native endianess only.
754+ static inline void binary_fuse16_serialize (const binary_fuse16_t * filter , char * buffer ) {
755+ memcpy (buffer , & filter -> Seed , sizeof (filter -> Seed ));
756+ buffer += sizeof (filter -> Seed );
757+ memcpy (buffer , & filter -> SegmentLength , sizeof (filter -> SegmentLength ));
758+ buffer += sizeof (filter -> SegmentLength );
759+ memcpy (buffer , & filter -> SegmentCount , sizeof (filter -> SegmentCount ));
760+ buffer += sizeof (filter -> SegmentCount );
761+ memcpy (buffer , & filter -> SegmentCountLength , sizeof (filter -> SegmentCountLength ));
762+ buffer += sizeof (filter -> SegmentCountLength );
763+ memcpy (buffer , & filter -> ArrayLength , sizeof (filter -> ArrayLength ));
764+ buffer += sizeof (filter -> ArrayLength );
765+ memcpy (buffer , filter -> Fingerprints , sizeof (filter -> ArrayLength ) * sizeof (uint16_t ));
766+ }
737767
768+ // serialize a filter to a buffer, the buffer should have a capacity of at least
769+ // binary_fuse8_serialization_bytes(filter) bytes.
770+ // Native endianess only.
771+ static inline void binary_fuse8_serialize (const binary_fuse8_t * filter , char * buffer ) {
772+ memcpy (buffer , & filter -> Seed , sizeof (filter -> Seed ));
773+ buffer += sizeof (filter -> Seed );
774+ memcpy (buffer , & filter -> SegmentLength , sizeof (filter -> SegmentLength ));
775+ buffer += sizeof (filter -> SegmentLength );
776+ memcpy (buffer , & filter -> SegmentCount , sizeof (filter -> SegmentCount ));
777+ buffer += sizeof (filter -> SegmentCount );
778+ memcpy (buffer , & filter -> SegmentCountLength , sizeof (filter -> SegmentCountLength ));
779+ buffer += sizeof (filter -> SegmentCountLength );
780+ memcpy (buffer , & filter -> ArrayLength , sizeof (filter -> ArrayLength ));
781+ buffer += sizeof (filter -> ArrayLength );
782+ memcpy (buffer , filter -> Fingerprints , sizeof (filter -> ArrayLength ) * sizeof (uint8_t ));
783+ }
738784
785+ // deserialize a filter from a buffer, returns true on success, false on failure.
786+ // The output will be reallocated, so the caller should call binary_fuse16_free(filter) before
787+ // if the filter was already allocated. The caller needs to call binary_fuse16_free(filter) after.
788+ // The number of bytes read is binary_fuse16_serialization_bytes(output).
789+ // Native endianess only.
790+ static inline bool binary_fuse16_deserialize (binary_fuse16_t * filter , const char * buffer ) {
791+ memcpy (& filter -> Seed , buffer , sizeof (filter -> Seed ));
792+ buffer += sizeof (filter -> Seed );
793+ memcpy (& filter -> SegmentLength , buffer , sizeof (filter -> SegmentLength ));
794+ buffer += sizeof (filter -> SegmentLength );
795+ filter -> SegmentLengthMask = filter -> SegmentLength - 1 ;
796+ memcpy (& filter -> SegmentCount , buffer , sizeof (filter -> SegmentCount ));
797+ buffer += sizeof (filter -> SegmentCount );
798+ memcpy (& filter -> SegmentCountLength , buffer , sizeof (filter -> SegmentCountLength ));
799+ buffer += sizeof (filter -> SegmentCountLength );
800+ memcpy (& filter -> ArrayLength , buffer , sizeof (filter -> ArrayLength ));
801+ buffer += sizeof (filter -> ArrayLength );
802+ filter -> Fingerprints = (uint16_t * )malloc (filter -> ArrayLength * sizeof (uint16_t ));
803+ if (filter -> Fingerprints == NULL ) {
804+ return false;
805+ }
806+ memcpy (filter -> Fingerprints , buffer , sizeof (filter -> ArrayLength ) * sizeof (uint16_t ));
807+ return true;
808+ }
809+
810+
811+ // deserialize a filter from a buffer, returns true on success, false on failure.
812+ // The output will be reallocated, so the caller should call binary_fuse8_free(filter) before
813+ // if the filter was already allocated. The caller needs to call binary_fuse8_free(filter) after.
814+ // The number of bytes read is binary_fuse8_serialization_bytes(output).
815+ // Native endianess only.
816+ static inline bool binary_fuse8_deserialize (binary_fuse8_t * filter , const char * buffer ) {
817+ memcpy (& filter -> Seed , buffer , sizeof (filter -> Seed ));
818+ buffer += sizeof (filter -> Seed );
819+ memcpy (& filter -> SegmentLength , buffer , sizeof (filter -> SegmentLength ));
820+ buffer += sizeof (filter -> SegmentLength );
821+ filter -> SegmentLengthMask = filter -> SegmentLength - 1 ;
822+ memcpy (& filter -> SegmentCount , buffer , sizeof (filter -> SegmentCount ));
823+ buffer += sizeof (filter -> SegmentCount );
824+ memcpy (& filter -> SegmentCountLength , buffer , sizeof (filter -> SegmentCountLength ));
825+ buffer += sizeof (filter -> SegmentCountLength );
826+ memcpy (& filter -> ArrayLength , buffer , sizeof (filter -> ArrayLength ));
827+ buffer += sizeof (filter -> ArrayLength );
828+ filter -> Fingerprints = (uint8_t * )malloc (filter -> ArrayLength * sizeof (uint8_t ));
829+ if (filter -> Fingerprints == NULL ) {
830+ return false;
831+ }
832+ memcpy (filter -> Fingerprints , buffer , sizeof (filter -> ArrayLength ) * sizeof (uint8_t ));
833+ return true;
834+ }
739835
740836#endif
0 commit comments