@@ -7,15 +7,14 @@ use std::io;
7
7
use std:: path:: Path ;
8
8
9
9
use bincode:: { deserialize, serialize, Infinite } ;
10
- use mmap_bitvec:: { BitVecSlice , BitVector , MmapBitVec } ;
10
+ use mmap_bitvec:: combinatorial:: { rank, unrank} ;
11
+ use mmap_bitvec:: { BitVector , MmapBitVec } ;
11
12
use murmurhash3:: murmurhash3_x64_128;
12
13
use serde:: de:: DeserializeOwned ;
13
14
use serde:: Serialize ;
14
15
#[ cfg( feature = "legacy" ) ]
15
16
use serde_json;
16
17
17
- use crate :: marker:: { from_marker, to_marker} ;
18
-
19
18
#[ derive( Debug , Deserialize , Serialize ) ]
20
19
pub ( crate ) struct BFieldParams < T > {
21
20
n_hashes : u8 , // k
@@ -59,7 +58,7 @@ impl<T: Clone + DeserializeOwned + Serialize> BFieldMember<T> {
59
58
} ;
60
59
61
60
let header: Vec < u8 > = serialize ( & bf_params, Infinite ) . unwrap ( ) ;
62
- let bv = MmapBitVec :: create ( filename, size, & BF_MAGIC , & header) ?;
61
+ let bv = MmapBitVec :: create ( filename, size, BF_MAGIC , & header) ?;
63
62
64
63
Ok ( BFieldMember {
65
64
bitvec : bv,
@@ -136,11 +135,11 @@ impl<T: Clone + DeserializeOwned + Serialize> BFieldMember<T> {
136
135
// TODO: need to do a check that `value` < allowable range based on
137
136
// self.params.marker_width and self.params.n_marker_bits
138
137
let k = self . params . n_marker_bits ;
139
- self . insert_raw ( key, to_marker ( value, k) ) ;
138
+ self . insert_raw ( key, rank ( value as usize , k) ) ;
140
139
}
141
140
142
141
#[ inline]
143
- fn insert_raw ( & mut self , key : & [ u8 ] , marker : BitVecSlice ) {
142
+ fn insert_raw ( & mut self , key : & [ u8 ] , marker : u128 ) {
144
143
let marker_width = self . params . marker_width as usize ;
145
144
let hash = murmurhash3_x64_128 ( key, 0 ) ;
146
145
let aligned_marker = align_bits ( marker, marker_width) ;
@@ -160,7 +159,7 @@ impl<T: Clone + DeserializeOwned + Serialize> BFieldMember<T> {
160
159
/// the correct value; `false` if masking occured or if it was already
161
160
/// indeterminate.
162
161
pub fn mask_or_insert ( & mut self , key : & [ u8 ] , value : BFieldVal ) -> bool {
163
- let correct_marker = to_marker ( value, self . params . n_marker_bits ) ;
162
+ let correct_marker = rank ( value as usize , self . params . n_marker_bits ) ;
164
163
let k = u32:: from ( self . params . n_marker_bits ) ;
165
164
let existing_marker = self . get_raw ( key, k) ;
166
165
@@ -198,16 +197,16 @@ impl<T: Clone + DeserializeOwned + Serialize> BFieldMember<T> {
198
197
let putative_marker = self . get_raw ( key, k) ;
199
198
match putative_marker. count_ones ( ) . cmp ( & k) {
200
199
Ordering :: Greater => BFieldLookup :: Indeterminate ,
201
- Ordering :: Equal => BFieldLookup :: Some ( from_marker ( putative_marker) ) ,
200
+ Ordering :: Equal => BFieldLookup :: Some ( unrank ( putative_marker) as u32 ) ,
202
201
Ordering :: Less => BFieldLookup :: None ,
203
202
}
204
203
}
205
204
206
205
#[ inline]
207
- fn get_raw ( & self , key : & [ u8 ] , k : u32 ) -> BitVecSlice {
206
+ fn get_raw ( & self , key : & [ u8 ] , k : u32 ) -> u128 {
208
207
let marker_width = self . params . marker_width as usize ;
209
208
let hash = murmurhash3_x64_128 ( key, 0 ) ;
210
- let mut merged_marker = BitVecSlice :: max_value ( ) ;
209
+ let mut merged_marker = u128 :: max_value ( ) ;
211
210
let mut positions: [ usize ; 16 ] = [ 0 ; 16 ] ; // support up to 16 hashes
212
211
for marker_ix in 0usize ..self . params . n_hashes as usize {
213
212
let pos = marker_pos ( hash, marker_ix, self . bitvec . size ( ) , marker_width) ;
@@ -217,7 +216,8 @@ impl<T: Clone + DeserializeOwned + Serialize> BFieldMember<T> {
217
216
if cfg ! ( feature = "prefetching" ) {
218
217
unsafe {
219
218
let byte_idx_st = ( pos >> 3 ) as usize ;
220
- let ptr: * const u8 = self . bitvec . mmap . as_ptr ( ) . offset ( byte_idx_st as isize ) ;
219
+ #[ allow( unused_variables) ]
220
+ let ptr: * const u8 = self . bitvec . mmap . as_ptr ( ) . add ( byte_idx_st) ;
221
221
#[ cfg( feature = "prefetching" ) ]
222
222
intrinsics:: prefetch_read_data ( ptr, 3 ) ;
223
223
}
@@ -247,17 +247,17 @@ impl<T: Clone + DeserializeOwned + Serialize> BFieldMember<T> {
247
247
248
248
#[ cfg( not( feature = "legacy" ) ) ]
249
249
#[ inline]
250
- fn align_bits ( b : BitVecSlice , _: usize ) -> BitVecSlice {
250
+ fn align_bits ( b : u128 , _: usize ) -> u128 {
251
251
// everything is normal if we're not in legacy mode (this is a noop)
252
252
b
253
253
}
254
254
255
255
#[ cfg( feature = "legacy" ) ]
256
256
#[ inline]
257
- fn align_bits ( b : BitVecSlice , len : usize ) -> BitVecSlice {
257
+ fn align_bits ( b : u128 , len : usize ) -> u128 {
258
258
// we need to reverse the bits (everything is backwards at both the byte
259
259
// and the marker level in the existing nim implementation)
260
- let mut new_b = 0 as BitVecSlice ;
260
+ let mut new_b = 0u128 ;
261
261
for i in 0 ..len {
262
262
new_b |= ( b & ( 1 << ( len - i - 1 ) ) ) >> ( len - i - 1 ) << i;
263
263
}
0 commit comments