# **
*bitman*
**
*rips your variables to bits
*
## Overview
*bitman* provides a way to read and write the individual bits of your variables as well as the ability to define fields within your variable that can be read or written as any type you choose.
## Project Vision
Our vision for *bitman* is a set of simple, intuitive tools to allow efficient interactions with the underlying bits and subfields of types that normally do not provide that access.
## Usage
*bitman* is designed to be as easy to use as possible without sacrificing
speed. To make that happen, we added a to_bits() method to all of Rust's
primitive integers. Let's take a look at how creating a Bits works by looking at a u8 named my_u8:
- my_u8.to_bits() takes the u8 and returns a Bits type. Bits creates a wrapper
around the u8 with more methods available. As such, the my_u8.to_bits() call is pretty low cost initially. It simply copies the u8 into the Bits type.
(Note: for more expressive errors, try to_named_bits())
- my_u8.to_bits() also extracts a vec\ from the internal u8. The
resulting vec\ is then stored in the Bits variable to aid in faster bit retrieval. (NOTE: Currently, this optimization is disabled. I'm working out bugs in the threading code that were causing a race condition. Code using this will still work fine but won't be as fast as it will be once the optimization is re-enabled.)
Writing to or reading from bits in a Bits is done with an index. I'll create a Bits instance from a u8 to demonstrate:
```rust
use bitman::AnyIntegerType;
let mut my_u8 = 0u8;
let mut my_bits = my_u8.to_bits(); // to_bits() makes it easy to make a Bits.
my_bits[0] = true; // Setting a bit is easy as pie.
assert_eq!(my_bits[0], true); // Reading a single bit is easy too!
assert_eq!(my_bits.as_integer(), 128); // Need to read the integer? Easy peasy!
```
It really is that simple!
You can even assign from slices of bools to slices from Bits and it just works
without affecting any other bits!
```rust
my_bits[0..2].copy_from_slice(&[true, false]);
```
Of course, you can assign from slices of Bits to slices of Bits as well!
```rust
my_bits[2..4].copy_from_slice(my_bits[0..2]);
```
Bits types are also iterable, so you can easily iterate over each Bit within a Bits:
```rust
for bit in my_bits {
println!("{:?}", bit);
}
```
Of course, you can also iterate over the Bits mutably if you need to:
```rust
for mut bit in my_bits {
bit = !bit;
}
```
## Developer Information
Automated Tooling
-----------------
We automatically run git cliff on every commit using a git hook to generate a CHANGELOG.md file. This ensures the changelog stays up-to-date as we develop.
We have added a git hook to kick off git cliff on every commit. See .git/hooks/post-commit for the hook code.
## Roadmap
Multithreading
--------------
During the creation of *bitman*, we wrote it to be fully multithreaded. That
multithreading made the library substantially faster by queueing any changes
and updating them in the background. However, the locking mechanism that
enabled automatically switching from one data source (the vector of bits) to
the other (bits dynamically extracted from the integer itself) and back ended
up proving problematic and will need to be scrapped and reimplemented to avoid
race conditions when both the integer and the vector of bits are updated at
the same time. These changes should not affect the interface of *bitman* and
therefor will not be a breaking change or in any way affect any code using
*bitman*.
Vector & Array Support
----------------------
One of the original design goals for *bitman* was to support vectors and
arrays of primitive integers in addition to individual primitive integers.
During the development of *bitman*, that goal had to be set aside as it will
require more planning than we currently had time to do. However, we still
plan to add that functionality to *bitman*. These changes should only add
to the interface of *bitman* and therefor will not be a breaking change or
in any way affect any code using *bitman*.
Serde Support
-------------
We realize how valuable automatic serialization and deserialization of both
Bits instances as a whole as well as the integer representations of Bits
instances would be. Unfortunately, we simply haven't had the time to write
that code yet. It should only add to the interface of *bitman* and
therefor will not be a breaking change or in any way affect any code using
*bitman*.
Cross Boundary Assignment
-------------------------
Wouldn't it be nice if you could assign a u8 to the middle of a u16? We
think so too. Unfortunately, that wasn't something we were able to add to
*bitman* before the current release. Once our vector and array support
is completed, this will also enable assignment to multiple items within a
vector or array.