@@ -47,6 +47,16 @@ impl Xor8FilterBuilder {
4747 } ;
4848 Self { key_hash_entries }
4949 }
50+
51+ fn build_from_xor8 ( xor_filter : & Xor8 ) -> Vec < u8 > {
52+ let mut buf = Vec :: with_capacity ( 8 + 4 + xor_filter. fingerprints . len ( ) + 1 ) ;
53+ buf. put_u64_le ( xor_filter. seed ) ;
54+ buf. put_u32_le ( xor_filter. block_length as u32 ) ;
55+ buf. put_slice ( xor_filter. fingerprints . as_ref ( ) ) ;
56+ // Add footer to tell which kind of filter. 254 indicates a xor8 filter.
57+ buf. put_u8 ( FOOTER_XOR8 ) ;
58+ buf
59+ }
5060}
5161
5262impl Xor16FilterBuilder {
@@ -124,13 +134,8 @@ impl FilterBuilder for Xor8FilterBuilder {
124134 } ) ;
125135
126136 let xor_filter = Xor8 :: from ( & self . key_hash_entries ) ;
127- let mut buf = Vec :: with_capacity ( 8 + 4 + xor_filter. fingerprints . len ( ) + 1 ) ;
128- buf. put_u64_le ( xor_filter. seed ) ;
129- buf. put_u32_le ( xor_filter. block_length as u32 ) ;
130- buf. put_slice ( xor_filter. fingerprints . as_ref ( ) ) ;
131- // Add footer to tell which kind of filter. 254 indicates a xor8 filter.
132- buf. put_u8 ( FOOTER_XOR8 ) ;
133- buf
137+ self . key_hash_entries . clear ( ) ;
138+ Self :: build_from_xor8 ( & xor_filter)
134139 }
135140
136141 fn approximate_len ( & self ) -> usize {
@@ -414,6 +419,25 @@ impl XorFilterReader {
414419 pub fn is_block_based_filter ( & self ) -> bool {
415420 matches ! ( self . filter, XorFilter :: BlockXor16 ( _) )
416421 }
422+
423+ pub fn encode_to_bytes ( & self ) -> Vec < u8 > {
424+ match & self . filter {
425+ XorFilter :: Xor8 ( filter) => Xor8FilterBuilder :: build_from_xor8 ( filter) ,
426+ XorFilter :: Xor16 ( filter) => Xor16FilterBuilder :: build_from_xor16 ( filter) ,
427+ XorFilter :: BlockXor16 ( reader) => {
428+ let mut data = Vec :: with_capacity ( 4 + reader. filters . len ( ) * 1024 ) ;
429+ for ( _, filter) in & reader. filters {
430+ let block = Xor16FilterBuilder :: build_from_xor16 ( filter) ;
431+ data. put_u32_le ( block. len ( ) as u32 ) ;
432+ data. extend ( block) ;
433+ }
434+ // Add footer to tell which kind of filter. 253 indicates a blocked xor16 filter.
435+ data. put_u32_le ( reader. filters . len ( ) as u32 ) ;
436+ data. put_u8 ( FOOTER_BLOCKED_XOR16 ) ;
437+ data
438+ }
439+ }
440+ }
417441}
418442
419443impl Clone for XorFilterReader {
0 commit comments