This crate provides 2 kinds of reference: immutable and mutable.
All of them represented in one enum RefKind
, which allows to store immutable and mutable references together.
But the most importantly, this crate allows to retrieve many mutable references out of the collection by creating a new collection which holds these references.
For that very case, crate defines Many
trait which is implemented
for peekable iterators, slices and other common collections.
But nothing stops you to implement this trait for other collections as well!
```rust use core::array;
use ref_kind::{Many, RefKind, MoveError};
// Create an array of square of integers from 0 to 9 let mut array: [; 10] = array::fromfn(|i| i * i);
// Create collection of mutable references on all of the array elements
let mut many: [; 10] = array
.itermut()
.map(|sq| Some(RefKind::from(sq)))
.collect::
// Move out mutable reference by index 1
// It is no longer in the many
let one = many.movemut(1).unwrap();
asserteq!(*one, 1);
// Move out immutable reference by index 4
// many
now contains immutable reference, not mutable one
let four = many.moveref(4).unwrap();
asserteq!(*four, 16);
// Move it again: no panic here because immutable reference was copied
let fouragain = many.moveref(4).unwrap();
asserteq!(four, fouragain);
// This call will return an error because many
contains no reference by index 1
let oneagain = many.trymoveref(1);
asserteq!(one_again, Err(MoveError::BorrowedMutably));
```
#![no_std]
supportThis crate is a no_std
crate. It depends only on the core
crate.
std
feature of the crate is enabled by default, so to use it in no_std
environment,
you should disable default features of this crate in Cargo.toml:
toml
[dependencies]
ref_kind = { version = "0.5.0", default-features = false }
#![forbid(unsafe_code)]
This crate contains no unsafe
code.
This crate has the following Cargo features:
| Feature name | Description |
| ------------ | ------------------------------------------------------------------------------------- |
| alloc
| Implements Many
trait for VecDeque
and BTreeMap
in alloc
crate |
| std
| Implements Many
trait for HashMap
in standard library, depends on alloc
feature |
| hashbrown
| Implements Many
trait for HashMap
in hashbrown
crate |
Feature std
is enabled by default.
You can disable it by using default-features = false
in Cargo.toml.
These features were added to this crate to make it usable
with common Rust collections, such as Vec
and HashMap
.
Licensed under either of
at your option.