blob: 798cf3c44bb85ff3fd01084f1b939fc21fa589bd [file] [log] [blame] [view]
# Proxy Bit-Reference
This structure simulates `&/mut bool` within `BitSlice` regions. It is analogous
to the C++ type [`std::bitset<N>::reference`][0].
This type wraps a [`BitPtr`] and caches a `bool` in one of the remaining padding
bytes. It is then able to freely give out references to its cached `bool`, and
commits the cached value back to the proxied location when dropped.
## Original
This is semantically equivalent to `&'a bool` or `&'a mut bool`.
## Quirks
Because this type has both a lifetime and a destructor, it can introduce an
uncommon syntax error condition in Rust. When an expression that produces this
type is in the final expression of a block, including if that expression is used
as a condition in a `match`, `if let`, or `if`, then the compiler will attempt
to extend the drop scope of this type to the outside of the block. This causes a
lifetime mismatch error if the source region from which this proxy is produced
begins its lifetime inside the block.
If you get a compiler error that this type causes something to be dropped while
borrowed, you can end the borrow by putting any expression-ending syntax element
after the offending expression that produces this type, including a semicolon or
an item definition.
## Examples
```rust
use bitvec::prelude::*;
let bits = bits![mut 0; 2];
let (left, right) = bits.split_at_mut(1);
let mut first = left.get_mut(0).unwrap();
let second = right.get_mut(0).unwrap();
// Writing through a dereference requires a `mut` binding.
*first = true;
// Writing through the explicit method call does not.
second.commit(true);
drop(first); // It’s not a reference, so NLL does not apply!
assert_eq!(bits, bits![1; 2]);
```
[0]: https://en.cppreference.com/w/cpp/utility/bitset/reference