heapnotize 1.1.0

A smart pointer type for memory allocation on the stack.
Documentation
# Heapnotize

A Rust library providing memory allocation on the stack.

Heapnotize can be used to store values somewhere in memory while keeping a
reference to them. Like [`Box`](https://doc.rust-lang.org/std/boxed/index.html),
it can be used for nested types for which indirection is required. Unlike `Box`,
this library is implemented with `#[no_std]` and thus it can help with memory
management on microcontrollers.

The two main data types of Heapnotize are `Rack` and `Unit`. `Rack` is used to
allocate predefined chunk of the stack for a predefined type. `Unit` provides an
ownership for values stored there. `Unit` also ensures that once it goes out of
scope, the value it refers to will be properly dropped.

Documentation:

* [API reference (docs.rs)]https://docs.rs/heapnotize
* [Repository (github.com)]https://github.com/zlosynth/heapnotize
* [Crate (crates.io)]https://crates.io/crates/heapnotize

## Usage

Add the following to your `Cargo.toml`:

``` toml
[dependencies]
heapnotize = "1.1"
```

In order to store values on the stack, we first need to initialize the `Rack`
with a specific capacity. Available capacities are currently powers of 2 from 1
up to 1024. The whole size will be allocated when a `Rack` is created. After
that, it is possible to store values on the rack and get a handle on them as
`Unit` object. It is the possible to derefence the `Unit` to get access to the
value. Once the `Unit` gets out of scope, the value would be freed from the
rack:

``` rust
fn main() {
    let rack = Rack64::new();
    let unit = rack.must_add(10);
    assert_eq!(*unit, 10);
}
```

Where Heapnotize may become really handy is when dealing with recursive types,
where a type contains a value of the same time. Rust cannot know how much memory
a recursive type requires on compile time, therefore, indirection must be used.
This is nicely covered in [The
Book](https://doc.rust-lang.org/book/ch15-01-box.html#enabling-recursive-types-with-boxes)
where `Box` is used to enable this, that however requires use of the heap.
The following example shows how to handle recursive types on the stack using
`Rack` and `Unit`:

``` rust
enum List<'a> {
    Cons(i32, Unit<'a, List<'a>>),
    Nil,
}

use List::{Cons, Nil};

fn main() {
    let rack = Rack64::new();
    let list = Cons(1, rack.must_add(Cons(2, rack.must_add(Cons(3, rack.must_add(Nil))))));
}
```

See the [documentation](https://docs.rs/heapnotize) to learn more.

# License

Heapnotize is distributed under the terms of the General Public License
version 3. See [LICENSE](LICENSE) for details.

# Changelog

Read the [CHANGELOG.md](CHANGELOG.md) to learn about changes introduced in each
release.