You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

50 lines
1.6 KiB

# Ad-hoc owning iterator types
This crate defines the macro `iter!` which produces ad-hoc iterator types that own their values and have compile-time known exact sizes.
# Usage
This macro can be used exactly like `vec!`, except it produces an `impl Iterator` that does not allocate.
This `impl Iterator` yields the values directly, **not references** to the values.
This can be useful for when you want a ad-hoc iterator of a non-copy type, as sized slices and arrays currently do not implement `IntoIterator` in a way that moves their values, instead they yield references, causing the need for cloning.
The `iter!` macro's iterator types move their values on calls to `next()` instead of returning references, and drop the non-consumed values when the iterator is dropped itself.
## Example
Concatenating a 'slice' of `String` without cloning.
``` rust
let whole: String = iter![String::from("Hell"),
String::from("o "),
String::from("world"),
String::from("!")]
.collect();
assert_eq!("Hello world!", &whole[..]);
```
## Functions
The iterator types also have a few associated functions.
### The length of the whole iterator
```rust
pub const fn len(&self) -> usize
```
### The rest of the iterator that has not been consumed.
```rust
pub fn rest(&self) -> &[T]
```
### The whole array.
All values that have not been consumed are initialised, values that have been consumed are uninitialised.
```rust
pub fn array(&self) -> &[MaybeUninit<T>; Self::LEN]
```
### How many items have since been consumed.
```rust
pub const fn consumed(&self) -> usize
```
# License
MIT