bitpack-vec 0.0.2

A vector for arbitrary bitwidth integers, densely packed.
Documentation
# bitpack-vec

[![Rust](https://github.com/RyanMarcus/bitpack-vec/actions/workflows/rust.yml/badge.svg)](https://github.com/RyanMarcus/bitpack-vec/actions/workflows/rust.yml) [![docs.rs](https://img.shields.io/docsrs/bitpack-vec/latest)](https://docs.rs/bitpack-vec/)

A dense bitpacked vector type for unnsigned integers.

```rust
use bitpack_vec::BitpackVec;
let mut bv = BitpackVec::new(5);  // 5-bit integers

for i in 0..12 {
    bv.push(i);
}

assert_eq!(bv.at(6), 6);
assert_eq!(bv.at(9), 9);

use deepsize::DeepSizeOf;
assert_eq!(bv.as_raw().len(), 1);  // underlying vector length is just 1 (60 bits)

// total in-memory size (not strictly specified by Rust):
assert_eq!(
    bv.deep_size_of(), 
    std::mem::size_of::<Vec<u64>>()  // size of the vector structure
    + std::mem::size_of::<usize>() // the length counter (separate from the Vec's)
    + std::mem::size_of::<u8>() // the bitwidth of the structure
    + 15 // padding
);
```

* `O(1)` random access to single elements
* `O(1)` pop
* `O(1)` set
* Amortized `O(1)` push (same as Rust `Vec`)
* Any bitlength from 1 to 63
* Serde serializable

This package does an "as you'd expect" bitpacking of integers, with no fancy SIMD or additional compression. Values are stored in a `Vec<u64>`, so no more than 63 bits should be wasted. Values can overlap `u64` values.

Compared to other bitpacking packages for Rust:

* [`bitpacking`]https://docs.rs/bitpacking/latest/bitpacking/ uses SIMD compression to pack values into blocks, but entire blocks must be decompressed in order to access values. If you don't care about random access, `bitpacking` is probably what you want.
* [`vorbis_bitpack`]https://docs.rs/vorbis_bitpack/latest/vorbis_bitpack/ allows for streaming compression and decompression of packed integers, using the Vorbis format. No random access, but has streaming readers / writers.
* [`parquet`]https://docs.rs/parquet implements a number of Apache-backed formats (feather, arrow, parquet), many of which support bitpacking and other types of compression.

## License

This code is available under the terms of the GPL-3.0 (or later) license.