Skip to content

Commit cb4e7fe

Browse files
committed
create store module
1 parent 7306cbc commit cb4e7fe

File tree

6 files changed

+100
-95
lines changed

6 files changed

+100
-95
lines changed

src/bitmap/container.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
use crate::bitmap::sorted_u16_vec::SortedU16Vec;
21
use std::fmt;
32
use std::ops::{
43
BitAnd, BitAndAssign, BitOr, BitOrAssign, BitXor, BitXorAssign, RangeInclusive, Sub, SubAssign,
@@ -22,7 +21,7 @@ pub struct Iter<'a> {
2221

2322
impl Container {
2423
pub fn new(key: u16) -> Container {
25-
Container { key, store: Store::Array(SortedU16Vec::new()) }
24+
Container { key, store: Store::new() }
2625
}
2726
}
2827

@@ -97,12 +96,12 @@ impl Container {
9796
match &self.store {
9897
Store::Bitmap(ref bits) => {
9998
if bits.len() <= ARRAY_LIMIT {
100-
self.store = bits.to_array_store()
99+
self.store = Store::Array(bits.to_array_store())
101100
}
102101
}
103102
Store::Array(ref vec) => {
104103
if vec.len() as u64 > ARRAY_LIMIT {
105-
self.store = vec.to_bitmap_store()
104+
self.store = Store::Bitmap(vec.to_bitmap_store())
106105
}
107106
}
108107
};

src/bitmap/mod.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,11 @@ mod util;
55

66
// Order of these modules matters as it determines the `impl` blocks order in
77
// the docs
8-
mod bitmap_8k;
98
mod cmp;
109
mod inherent;
1110
mod iter;
1211
mod ops;
1312
mod serialization;
14-
mod sorted_u16_vec;
1513

1614
use self::cmp::Pairs;
1715
pub use self::iter::IntoIter;

src/bitmap/serialization.rs

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,9 @@
11
use bytemuck::cast_slice_mut;
22
use byteorder::{LittleEndian, ReadBytesExt, WriteBytesExt};
3-
use std::convert::TryInto;
43
use std::io;
5-
use std::io::ErrorKind;
64

75
use super::container::Container;
8-
use super::store::Store;
9-
use crate::bitmap::bitmap_8k::Bitmap8K;
6+
use crate::bitmap::store::{ArrayStore, BitmapStore, Store};
107
use crate::RoaringBitmap;
118

129
const SERIAL_COOKIE_NO_RUNCONTAINER: u32 = 12346;
@@ -155,16 +152,12 @@ impl RoaringBitmap {
155152
let mut values = vec![0; len as usize];
156153
reader.read_exact(cast_slice_mut(&mut values))?;
157154
values.iter_mut().for_each(|n| *n = u16::from_le(*n));
158-
let array =
159-
values.try_into().map_err(|e| io::Error::new(ErrorKind::InvalidData, e))?;
160-
Store::Array(array)
155+
Store::Array(ArrayStore::from_vec_unchecked(values))
161156
} else {
162157
let mut values = Box::new([0; 1024]);
163158
reader.read_exact(cast_slice_mut(&mut values[..]))?;
164159
values.iter_mut().for_each(|n| *n = u64::from_le(*n));
165-
let bitmap = Bitmap8K::try_from(len, values)
166-
.map_err(|e| io::Error::new(ErrorKind::InvalidData, e))?;
167-
Store::Bitmap(bitmap)
160+
Store::Bitmap(BitmapStore::from_unchecked(len, values))
168161
};
169162

170163
containers.push(Container { key, store });

src/bitmap/sorted_u16_vec.rs renamed to src/bitmap/store/array_store.rs

Lines changed: 48 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,19 @@
1-
use crate::bitmap::bitmap_8k::{bit, key, Bitmap8K, BITMAP_LENGTH};
2-
use crate::bitmap::store::Store;
3-
use crate::bitmap::store::Store::Bitmap;
41
use std::cmp::Ordering;
52
use std::cmp::Ordering::*;
63
use std::convert::{TryFrom, TryInto};
74
use std::fmt::{Display, Formatter};
85
use std::ops::{BitAnd, BitAndAssign, BitOr, BitXor, BitXorAssign, RangeInclusive, Sub, SubAssign};
96

7+
use super::bitmap_store::{bit, key, BitmapStore, BITMAP_LENGTH};
8+
109
#[derive(Clone, Eq, PartialEq)]
11-
pub struct SortedU16Vec {
10+
pub struct ArrayStore {
1211
vec: Vec<u16>,
1312
}
1413

15-
impl SortedU16Vec {
16-
pub fn new() -> SortedU16Vec {
17-
SortedU16Vec { vec: vec![] }
14+
impl ArrayStore {
15+
pub fn new() -> ArrayStore {
16+
ArrayStore { vec: vec![] }
1817
}
1918

2019
///
@@ -25,11 +24,11 @@ impl SortedU16Vec {
2524
/// # Panics
2625
///
2726
/// When debug_assertions are enabled and the above invariants are not met
28-
pub fn from_vec_unchecked(vec: Vec<u16>) -> SortedU16Vec {
27+
pub fn from_vec_unchecked(vec: Vec<u16>) -> ArrayStore {
2928
if cfg!(debug_assertions) {
3029
vec.try_into().unwrap()
3130
} else {
32-
SortedU16Vec { vec }
31+
ArrayStore { vec }
3332
}
3433
}
3534

@@ -131,14 +130,14 @@ impl SortedU16Vec {
131130
}
132131
}
133132

134-
pub fn to_bitmap_store(&self) -> Store {
133+
pub fn to_bitmap_store(&self) -> BitmapStore {
135134
let mut bits = Box::new([0; BITMAP_LENGTH]);
136135
let len = self.len() as u64;
137136

138137
for &index in self.iter() {
139138
bits[key(index)] |= 1 << bit(index);
140139
}
141-
Bitmap(Bitmap8K::from_unchecked(len, bits))
140+
BitmapStore::from_unchecked(len, bits)
142141
}
143142

144143
pub fn len(&self) -> u64 {
@@ -166,9 +165,9 @@ impl SortedU16Vec {
166165
}
167166
}
168167

169-
impl Default for SortedU16Vec {
168+
impl Default for ArrayStore {
170169
fn default() -> Self {
171-
SortedU16Vec::new()
170+
ArrayStore::new()
172171
}
173172
}
174173

@@ -199,7 +198,7 @@ impl Display for Error {
199198

200199
impl std::error::Error for Error {}
201200

202-
impl TryFrom<Vec<u16>> for SortedU16Vec {
201+
impl TryFrom<Vec<u16>> for ArrayStore {
203202
type Error = Error;
204203

205204
fn try_from(value: Vec<u16>) -> Result<Self, Self::Error> {
@@ -215,12 +214,12 @@ impl TryFrom<Vec<u16>> for SortedU16Vec {
215214
}
216215
}
217216

218-
Ok(SortedU16Vec { vec })
217+
Ok(ArrayStore { vec: value })
219218
}
220219
}
221220

222-
impl BitOr<Self> for &SortedU16Vec {
223-
type Output = SortedU16Vec;
221+
impl BitOr<Self> for &ArrayStore {
222+
type Output = ArrayStore;
224223

225224
fn bitor(self, rhs: Self) -> Self::Output {
226225
let mut vec = {
@@ -255,12 +254,12 @@ impl BitOr<Self> for &SortedU16Vec {
255254
vec.extend_from_slice(&self.vec[i..]);
256255
vec.extend_from_slice(&rhs.vec[j..]);
257256

258-
SortedU16Vec { vec }
257+
ArrayStore { vec }
259258
}
260259
}
261260

262-
impl BitAnd<Self> for &SortedU16Vec {
263-
type Output = SortedU16Vec;
261+
impl BitAnd<Self> for &ArrayStore {
262+
type Output = ArrayStore;
264263

265264
fn bitand(self, rhs: Self) -> Self::Output {
266265
let mut vec = Vec::new();
@@ -282,11 +281,11 @@ impl BitAnd<Self> for &SortedU16Vec {
282281
}
283282
}
284283

285-
SortedU16Vec { vec }
284+
ArrayStore { vec }
286285
}
287286
}
288287

289-
impl BitAndAssign<&Self> for SortedU16Vec {
288+
impl BitAndAssign<&Self> for ArrayStore {
290289
fn bitand_assign(&mut self, rhs: &Self) {
291290
let mut i = 0;
292291
self.vec.retain(|x| {
@@ -296,14 +295,14 @@ impl BitAndAssign<&Self> for SortedU16Vec {
296295
}
297296
}
298297

299-
impl BitAndAssign<&Bitmap8K> for SortedU16Vec {
300-
fn bitand_assign(&mut self, rhs: &Bitmap8K) {
298+
impl BitAndAssign<&BitmapStore> for ArrayStore {
299+
fn bitand_assign(&mut self, rhs: &BitmapStore) {
301300
self.vec.retain(|x| rhs.contains(*x));
302301
}
303302
}
304303

305-
impl Sub<Self> for &SortedU16Vec {
306-
type Output = SortedU16Vec;
304+
impl Sub<Self> for &ArrayStore {
305+
type Output = ArrayStore;
307306

308307
fn sub(self, rhs: Self) -> Self::Output {
309308
let mut vec = Vec::new();
@@ -330,11 +329,11 @@ impl Sub<Self> for &SortedU16Vec {
330329
// Store remaining elements of the left array
331330
vec.extend_from_slice(&self.vec[i..]);
332331

333-
SortedU16Vec { vec }
332+
ArrayStore { vec }
334333
}
335334
}
336335

337-
impl SubAssign<&Self> for SortedU16Vec {
336+
impl SubAssign<&Self> for ArrayStore {
338337
fn sub_assign(&mut self, rhs: &Self) {
339338
let mut i = 0;
340339
self.vec.retain(|x| {
@@ -344,14 +343,14 @@ impl SubAssign<&Self> for SortedU16Vec {
344343
}
345344
}
346345

347-
impl SubAssign<&Bitmap8K> for SortedU16Vec {
348-
fn sub_assign(&mut self, rhs: &Bitmap8K) {
346+
impl SubAssign<&BitmapStore> for ArrayStore {
347+
fn sub_assign(&mut self, rhs: &BitmapStore) {
349348
self.vec.retain(|x| !rhs.contains(*x));
350349
}
351350
}
352351

353-
impl BitXor<Self> for &SortedU16Vec {
354-
type Output = SortedU16Vec;
352+
impl BitXor<Self> for &ArrayStore {
353+
type Output = ArrayStore;
355354

356355
fn bitxor(self, rhs: Self) -> Self::Output {
357356
let mut vec = Vec::new();
@@ -382,11 +381,11 @@ impl BitXor<Self> for &SortedU16Vec {
382381
vec.extend_from_slice(&self.vec[i..]);
383382
vec.extend_from_slice(&rhs.vec[j..]);
384383

385-
SortedU16Vec { vec }
384+
ArrayStore { vec }
386385
}
387386
}
388387

389-
impl BitXorAssign<&Self> for SortedU16Vec {
388+
impl BitXorAssign<&Self> for ArrayStore {
390389
fn bitxor_assign(&mut self, rhs: &Self) {
391390
let mut i1 = 0usize;
392391
let mut iter2 = rhs.vec.iter();
@@ -418,25 +417,26 @@ impl BitXorAssign<&Self> for SortedU16Vec {
418417
#[cfg(test)]
419418
mod tests {
420419
use super::*;
420+
use crate::bitmap::store::Store;
421421

422422
fn into_vec(s: Store) -> Vec<u16> {
423423
match s {
424424
Store::Array(vec) => vec.vec,
425-
Store::Bitmap(bits) => into_vec(bits.to_array_store()),
425+
Store::Bitmap(bits) => bits.to_array_store().vec,
426426
}
427427
}
428428

429429
fn into_bitmap_store(s: Store) -> Store {
430430
match s {
431-
Store::Array(vec) => vec.to_bitmap_store(),
432-
Bitmap(..) => s,
431+
Store::Array(vec) => Store::Bitmap(vec.to_bitmap_store()),
432+
Store::Bitmap(..) => s,
433433
}
434434
}
435435

436436
#[test]
437437
#[allow(clippy::reversed_empty_ranges)]
438438
fn test_array_insert_invalid_range() {
439-
let mut store = Store::Array(SortedU16Vec::from_vec_unchecked(vec![1, 2, 8, 9]));
439+
let mut store = Store::Array(ArrayStore::from_vec_unchecked(vec![1, 2, 8, 9]));
440440

441441
// Insert a range with start > end.
442442
let new = store.insert_range(6..=1);
@@ -447,7 +447,7 @@ mod tests {
447447

448448
#[test]
449449
fn test_array_insert_range() {
450-
let mut store = Store::Array(SortedU16Vec::from_vec_unchecked(vec![1, 2, 8, 9]));
450+
let mut store = Store::Array(ArrayStore::from_vec_unchecked(vec![1, 2, 8, 9]));
451451

452452
let new = store.insert_range(4..=5);
453453
assert_eq!(new, 2);
@@ -457,7 +457,7 @@ mod tests {
457457

458458
#[test]
459459
fn test_array_insert_range_left_overlap() {
460-
let mut store = Store::Array(SortedU16Vec::from_vec_unchecked(vec![1, 2, 8, 9]));
460+
let mut store = Store::Array(ArrayStore::from_vec_unchecked(vec![1, 2, 8, 9]));
461461

462462
let new = store.insert_range(2..=5);
463463
assert_eq!(new, 3);
@@ -467,7 +467,7 @@ mod tests {
467467

468468
#[test]
469469
fn test_array_insert_range_right_overlap() {
470-
let mut store = Store::Array(SortedU16Vec::from_vec_unchecked(vec![1, 2, 8, 9]));
470+
let mut store = Store::Array(ArrayStore::from_vec_unchecked(vec![1, 2, 8, 9]));
471471

472472
let new = store.insert_range(4..=8);
473473
assert_eq!(new, 4);
@@ -477,7 +477,7 @@ mod tests {
477477

478478
#[test]
479479
fn test_array_insert_range_full_overlap() {
480-
let mut store = Store::Array(SortedU16Vec::from_vec_unchecked(vec![1, 2, 8, 9]));
480+
let mut store = Store::Array(ArrayStore::from_vec_unchecked(vec![1, 2, 8, 9]));
481481

482482
let new = store.insert_range(1..=9);
483483
assert_eq!(new, 5);
@@ -488,7 +488,7 @@ mod tests {
488488
#[test]
489489
#[allow(clippy::reversed_empty_ranges)]
490490
fn test_bitmap_insert_invalid_range() {
491-
let store = Store::Array(SortedU16Vec::from_vec_unchecked(vec![1, 2, 8, 9]));
491+
let store = Store::Array(ArrayStore::from_vec_unchecked(vec![1, 2, 8, 9]));
492492
let mut store = into_bitmap_store(store);
493493

494494
// Insert a range with start > end.
@@ -500,7 +500,7 @@ mod tests {
500500

501501
#[test]
502502
fn test_bitmap_insert_same_key_overlap() {
503-
let store = Store::Array(SortedU16Vec::from_vec_unchecked(vec![1, 2, 3, 62, 63]));
503+
let store = Store::Array(ArrayStore::from_vec_unchecked(vec![1, 2, 3, 62, 63]));
504504
let mut store = into_bitmap_store(store);
505505

506506
let new = store.insert_range(1..=62);
@@ -511,7 +511,7 @@ mod tests {
511511

512512
#[test]
513513
fn test_bitmap_insert_range() {
514-
let store = Store::Array(SortedU16Vec::from_vec_unchecked(vec![1, 2, 130]));
514+
let store = Store::Array(ArrayStore::from_vec_unchecked(vec![1, 2, 130]));
515515
let mut store = into_bitmap_store(store);
516516

517517
let new = store.insert_range(4..=128);
@@ -526,7 +526,7 @@ mod tests {
526526

527527
#[test]
528528
fn test_bitmap_insert_range_left_overlap() {
529-
let store = Store::Array(SortedU16Vec::from_vec_unchecked(vec![1, 2, 130]));
529+
let store = Store::Array(ArrayStore::from_vec_unchecked(vec![1, 2, 130]));
530530
let mut store = into_bitmap_store(store);
531531

532532
let new = store.insert_range(1..=128);
@@ -541,7 +541,7 @@ mod tests {
541541

542542
#[test]
543543
fn test_bitmap_insert_range_right_overlap() {
544-
let store = Store::Array(SortedU16Vec::from_vec_unchecked(vec![1, 2, 130]));
544+
let store = Store::Array(ArrayStore::from_vec_unchecked(vec![1, 2, 130]));
545545
let mut store = into_bitmap_store(store);
546546

547547
let new = store.insert_range(4..=132);
@@ -555,7 +555,7 @@ mod tests {
555555

556556
#[test]
557557
fn test_bitmap_insert_range_full_overlap() {
558-
let store = Store::Array(SortedU16Vec::from_vec_unchecked(vec![1, 2, 130]));
558+
let store = Store::Array(ArrayStore::from_vec_unchecked(vec![1, 2, 130]));
559559
let mut store = into_bitmap_store(store);
560560

561561
let new = store.insert_range(1..=134);

0 commit comments

Comments
 (0)