Skip to content

Commit 7da0fdd

Browse files
committed
Implemented insert function
1 parent 4f1cc18 commit 7da0fdd

File tree

2 files changed

+53
-0
lines changed

2 files changed

+53
-0
lines changed

src/lib.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -536,6 +536,23 @@ pub trait BitVector:
536536
/// ```
537537
fn prepend<B: BitVector>(&mut self, prefix: &B);
538538

539+
/// Insert all the bits of the `infix` bit vector at the specified `index`.
540+
/// Will panic if there is not enough capacity and this is a fixed variant.
541+
///
542+
/// ```
543+
/// use bva::{BitVector, Bv};
544+
///
545+
/// let mut a = Bv::from(0b1010u8);
546+
/// a.insert(2, &Bv::ones(2));
547+
/// assert_eq!(a, Bv::from(0b101110u16));
548+
/// ```
549+
fn insert<B: BitVector>(&mut self, index: usize, infix: &B) {
550+
// TODO: could be optimized to avoid multiple allocations
551+
let tmp = self.split_off(index);
552+
self.append(infix);
553+
self.append(&tmp);
554+
}
555+
539556
/// Shift the bits by one to the left.
540557
/// The rightmost bit is set to `bit` and the leftmost bit is returned.
541558
///

src/tests/bitvector.rs

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -755,6 +755,42 @@ fn prepend_bv() {
755755
prepend_inner::<Bv>(256);
756756
}
757757

758+
fn insert_inner<B: BitVector>(max_capacity: usize) {
759+
let mut rng = thread_rng();
760+
for capacity in 0..max_capacity {
761+
let infix_len = rng.gen_range(0..=max_capacity - capacity);
762+
let insert_pos = rng.gen_range(0..=capacity);
763+
let bv = random_bv::<B>(capacity);
764+
let infix = random_bv::<B>(infix_len);
765+
let mut bv2 = bv.clone();
766+
bv2.insert(insert_pos, &infix);
767+
for i in 0..insert_pos {
768+
assert_eq!(bv.get(i), bv2.get(i));
769+
}
770+
for i in 0..infix_len {
771+
assert_eq!(infix.get(i), bv2.get(insert_pos + i));
772+
}
773+
for i in 0..bv.len() - insert_pos {
774+
assert_eq!(bv.get(insert_pos + i), bv2.get(insert_pos + infix_len + i));
775+
}
776+
}
777+
}
778+
779+
#[test]
780+
fn insert_bvf() {
781+
bvf_inner_unroll_cap!(insert_inner, {u8, u16, u32, u64, u128}, {1, 2, 3, 4, 5});
782+
}
783+
784+
#[test]
785+
fn insert_bvd() {
786+
insert_inner::<Bvd>(256);
787+
}
788+
789+
#[test]
790+
fn insert_bv() {
791+
insert_inner::<Bv>(256);
792+
}
793+
758794
fn shl_inner<B: BitVector>(max_capacity: usize) {
759795
let mut rng = thread_rng();
760796
for capacity in 0..max_capacity {

0 commit comments

Comments
 (0)