# Change Log

All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](http://keepachangelog.com/)
and this project adheres to [Semantic Versioning](http://semver.org/).

## [Unreleased]

## [v0.8.0] - 2023-11-07

### Added

- Add `Clone` and `PartialEq` implementations to `HistoryBuffer`.
- Added an object pool API. see the `pool::object` module level doc for details
- Add `HistoryBuffer::as_slices()`
- Implemented `retain` for `IndexMap` and `IndexSet`.
- Recover `StableDeref` trait for `pool::object::Object` and `pool::boxed::Box`.
- Add polyfills for ESP32S2
- Added `String::from_utf8` and `String::from_utf8_unchecked`.

### Changed

- updated from edition 2018 to edition 2021
- [breaking-change] `IndexMap` and `IndexSet` now require that keys implement the `core::hash::Hash`
  trait instead of the `hash32::Hash` (v0.2.0) trait
- move `pool::singleton::Box` to the `pool::box` module
- renamed `pool::singleton::Pool` to `BoxPool` and moved it into the `pool::box` module
- move `pool::singleton::arc::Arc` to the `pool::arc` module
- renamed `pool::singleton::arc::Pool` to `ArcPool` and moved it into the `pool::arc` module
- [breaking-change] changed the target support of memory pool API to only support 32-bit x86 and a
  subset of ARM targets. See the module level documentation of the `pool` module for details
- relax trait requirements on `IndexMap` and `IndexSet`.
- export `IndexSet` and `IndexMap` iterator types.
- [breaking-change] export `IndexMapKeys`, `IndexMapValues` and
  `IndexMapValuesMut` iterator types.
- [breaking-change] this crate now uses `portable-atomic` v1.0 instead of `atomic-polyfill` for emulating
  CAS instructions on targets where they're not natively available.
- [breaking-change] `From<&str>` for `String` was replaced with `TryFrom<&str>` because the `From` trait must not fail.
- [breaking-change] Renamed Cargo features
  - `defmt-impl` is now `defmt-03`
  - `ufmt-impl` is now `ufmt`
  - `cas` is removed, atomic polyfilling is now opt-in via the `portable-atomic` feature.
- `Vec::as_mut_slice` is now a public method.

### Fixed

- Fixed a `dropping_references` warning in `LinearMap`.
- Fixed IndexMap entry API returning wrong slot after an insert on vacant entry. (#360)

### Removed

- [breaking-change] this crate no longer has a Minimum Supported Rust Version (MSRV) guarantee and
  should be used with the latest stable version of the Rust toolchain.

- [breaking-change] removed the `Init` and `Uninint` type states from `pool::singleton::Box`
- [breaking-change] removed the following `pool::singleton::Box` methods: `freeze`, `forget` and `init`
- [breaking-change] removed the `pool::singleton::arc::ArcInner` type
- [breaking-change] removed support for attributes from `pool!` and `arc_pool!`

## [v0.7.16] - 2022-08-09

### Added

- add more `PartialEq` implementations to `Vec` where `Vec` is the RHS

### Changed

### Fixed

- clarify in the docs that the capacity `heapless::String` is in bytes, not characters
- Fixed some broken links in the documentation.

## [v0.7.15] - 2022-07-05

### Added

- Added `Vec::insert(index, element)`
- Added `Vec::remove(index)`
- Added `Vec::retain(f)`
- Added `Vec::retain_mut(f)`

## [v0.7.14] - 2022-06-15

### Added

- Added support for AVR architecture.

### Fixed

- `IndexSet` and `IndexMap`'s `default` method now compile time checks that their capacity is a power of two.

## [v0.7.13] - 2022-05-16

### Added

- Added `into_vec` to `BinaryHeap`

## [v0.7.12] - 2022-05-12

### Added

- Added support for AVR architecture.
- Add `entry` API to `IndexMap`
- Implement `IntoIterator` trait for `Indexmap`
- Implement `FromIterator` for `String`
- Add `first` and `last` methods to `IndexMap` and `IndexSet`
- Add `pop_{front_back}_unchecked` methods to `Deque`

### Changed

- Optimize the codegen of `Vec::clone`
- `riscv32i` and `riscv32imc` targets unconditionally (e.g. `build --no-default-features`) depends on `atomic-polyfill`

### Fixed

- Inserting an item that replaces an already present item will no longer
  fail with an error

## [v0.7.11] - 2022-05-09

### Fixed

- Fixed `pool` example in docstring.
- Fixed undefined behavior in `Vec::truncate()`, `Vec::swap_remove_unchecked()`,
  and `Hole::move_to()` (internal to the binary heap implementation).
- Fixed `BinaryHeap` elements are being dropped twice

## [v0.7.10] - 2022-01-21

### Fixed

- `cargo test` can now run on non-`x86` hosts

### Added

- Added `OldestOrdered` iterator for `HistoryBuffer`

### Changed

- `atomic-polyfill` is now enabled and used for `cas` atomic emulation on `riscv` targets

## [v0.7.9] - 2021-12-16

### Fixed

- Fix `IndexMap` and `IndexSet` bounds
- Make `IndexSet::new()` a `const fn`

## [v0.7.8] - 2021-11-11

### Added

- A span of `defmt` versions is now supported (`0.2` and `0.3`)

## [v0.7.7] - 2021-09-22

### Fixed

- Fixed so `Pool` is `Sync` on ARMv6

## [v0.7.6] - 2021-09-21

### Added

- Added `ArcPool`
- Added `Debug` impl for `Deque`

### Fixed

- ZSTs in `Pool` now works correctly
- Some MIRI errors were resolved
- Allow `pool!` on thumbv6
- Fixed possible UB in `Pool` on x86

## [v0.7.5] - 2021-08-16

### Added

- Added `SortedLinkedList`
- Added `Vec::is_empty`, one does not need to go through a slice anymore

### Changed

- `Vec::pop_unchecked` is now public

## [v0.7.4] - 2021-08-06

### Added

- Implement `Default` for `MpMcQueue`, `Queue` and `HistoryBuffer`
- Implement `PartialOrd` and `Ord` for `Vec` and `String`

### Fixed

- Fixed comments in SPSC

## [v0.7.3] - 2021-07-01

### Added

- Added `Deque`

### Changed

- `Box::freeze` is deprecated due to possibility of undefined behavior.

## [v0.7.2] - 2021-06-30

### Added

- Added new `Vec::into_array` method
- Added const-asserts to all data structures

## [v0.7.1] - 2021-05-23

### Changed

- MPMC is now more generic

### Added

- `defmt` for `Vec` and `String`

## [v0.7.0] - 2021-04-23

### Changed

- [breaking-change] Converted all data structures to use the `const generics` MVP
- [breaking-change] `HistoryBuffer` is now working with const constructors and non-`Copy` data
- [breaking-change] `HistoryBuffer::as_slice` and others now only return initialized values
- Added missing `Deref`, `AsRef` and `Debug` for `HistoryBuffer`
- [breaking-change] `MultiCore`/`SingleCore` and `Uxx` is now removed from `spsc::Queue`
- [breaking-change] `spsc::Queue` is now `usize` only
- [breaking-change] `spsc::Queue` now sacrifices one element for correctness (see issue #207), i.e. it creates an `N - 1` sized queue instead of the old that generated an size `N` queue
- [breaking-change] `String` has had `utf8` related methods removed as this can be done via `str`
- [breaking-change] No data structures implement `AsSlice` traits any more, now using `AsRef` and `AsMut` as they work with any size of array now

### Fixed

- `Pool` and `MPMC` now works on `thumbv6m`
- `IndexMap::new()` is now a `const-fn`

## [v0.6.1] - 2021-03-02

### Fixed

- Security issue.

## [v0.6.0] - 2021-02-02

### Changed

- [breaking-change] The version of the `generic-array` dependency has been
  bumped to v0.14.2.

## [v0.5.6] - 2020-09-18

### Added

- Added `as_mut_vec` for `String`
- Added `set_len` for `Vec`
- Performance improvements in `histbuf`

### Fixed

- `Producer` was made `Send` for single core applications

## [v0.5.5] - 2020-05-04

### Added

- Added `HistoryBuffer`
- Added extra methods to `Vec`: `from_slice`, `starts_with`, `ends_with`
- Optional `ufmt` support for `String` and `Vec`
- Added `pool` support for bare-metal `armebv7r-` targets
- Added Sync to `pool` for `x86`

## [v0.5.4] - 2020-04-06

### Added

- Added `StableDeref` implementation for `pool::Box` and `pool::singleton::Box`.

## [v0.5.3] - 2020-01-27

### Added

- Extend the ARMv7-A `Pool` support to the bare-metal `armv7a-` targets.

## [v0.5.2] - 2020-01-15

### Fixed

- Fixed incorrect overflow behavior in computation of capacities
- Fixed edge case in `mpmc::Queue::dqueue` that led to an infinite loop
- IndexMap and LinerMap are now deserialized as maps, rather than as sequences
- Fixed compilation of this crates on built-in targets that don't have CAS instructions

### Changed

- `spsc::Queue` iterators now implement the double ended iterator trait

### Added

- opt-out `cas` feature to disable parts of the API that use CAS instructions.
  Useful if using a custom (i.e. not built-in) rustc target that does not have CAS
  instructions.

- singleton `Pool` support on ARMv7-A devices

## [v0.5.1] - 2019-08-29

### Added

- Added armv8 support
- Added `Queue::peek`
- Added `BinaryHeap::peek_mut`

## [v0.5.0] - 2019-07-12

### Added

- `Pool` now implements the `Sync` trait when targeting ARMv7-R.

- Most data structures can now be constructed in "const context" (e.g. `static
[mut]` variables) using a newtype in `heapless::i`.

- `Pool` has gained a `grow_exact` method to more efficiently use statically
  allocated memory.

- The `pool!` macro now accepts attributes.

- `mpmc::Q*` a family of fixed capacity multiple-producer multiple-consumer
  lock-free queues.

### Changed

- [breaking-change] `binary_heap::Kind` is now a sealed trait.

### Removed

- [breaking-change] The "smaller-atomics" feature has been removed. It is now
  always enabled.

- [breaking-change] The "min-const-fn" feature has been removed. It is now
  always enabled.

- [breaking-change] The MSRV has been bumped to Rust 1.36.0.

- [breaking-change] The version of the `generic-array` dependency has been
  bumped to v0.13.0.

## [v0.4.4] - 2019-05-02

### Added

- Implemented `PartialEq`, `PartialOrd`, `Eq`, `Ord` and `Hash` for `pool::Box`
  and `pool::singleton::Box`.

### Fixed

- Fixed UB in our internal, stable re-implementation of `core::mem::MaybeUninit`
  that occurred when using some of our data structures with types that implement
  `Drop`.

## [v0.4.3] - 2019-04-22

### Added

- Added a memory pool that's lock-free and interrupt-safe on the ARMv7-M
  architecture.

- `IndexMap` have gained `Eq` and `PartialEq` implementations.

## [v0.4.2] - 2019-02-12

### Added

- All containers now implement `Clone`

- `spsc::Queue` now implements `Debug`, `Hash`, `PartialEq` and `Eq`

- `LinearMap` now implements `Debug`, `FromIterator`, `IntoIter`, `PartialEq`,
  `Eq` and `Default`

- `BinaryHeap` now implements `Debug` and `Default`

- `String` now implements `FromStr`, `Hash`, `From<uxx>` and `Default`

- `Vec` now implements `Hash` and `Default`

- A "serde" Cargo feature that when enabled adds a `serde::Serialize` and
  `serde::Deserialize` implementations to each collection.

## [v0.4.1] - 2018-12-16

### Changed

- Add a new type parameter to `spsc::Queue` that indicates whether the queue is
  only single-core safe, or multi-core safe. By default the queue is multi-core
  safe; this preserves the current semantics. New `unsafe` constructors have
  been added to create the single-core variant.

## [v0.4.0] - 2018-10-19

### Changed

- [breaking-change] All Cargo features are disabled by default. This crate now
  compiles on stable by default.

- [breaking-change] RingBuffer has been renamed to spsc::Queue. The ring_buffer
  module has been renamed to spsc.

- [breaking-change] The bounds on spsc::Queue have changed.

### Removed

- [breaking-change] The sealed `Uxx` trait has been removed from the public API.

## [v0.3.7] - 2018-08-19

### Added

- Implemented `IntoIterator` and `FromIterator` for `Vec`
- `ready` methods to `ring_buffer::{Consumer,Producer}`
- An opt-out "const-fn" Cargo feature that turns `const` functions into normal functions when
  disabled.
- An opt-out "smaller-atomics" Cargo feature that removes the ability to shrink the size of
  `RingBuffer` when disabled.

### Changed

- This crate now compiles on stable when both the "const-fn" and "smaller-atomics" features are
  disabled.

### Fixed

- The `RingBuffer.len` function
- Compilation on recent nightlies

## [v0.3.6] - 2018-05-04

### Fixed

- The capacity of `RingBuffer`. It should be the requested capacity plus not twice that plus one.

## [v0.3.5] - 2018-05-03

### Added

- `RingBuffer.enqueue_unchecked` an unchecked version of `RingBuffer.enqueue`

## [v0.3.4] - 2018-04-28

### Added

- `BinaryHeap.pop_unchecked` an unchecked version of `BinaryHeap.pop`

## [v0.3.3] - 2018-04-28

### Added

- `BinaryHeap.push_unchecked` an unchecked version of `BinaryHeap.push`

## [v0.3.2] - 2018-04-27

### Added

- A re-export of `generic_array::ArrayLength`, for convenience.

## [v0.3.1] - 2018-04-23

### Added

- Fixed capacity implementations of `IndexMap` and `IndexSet`.
- A `Extend` implementation to `Vec`
- More `PartialEq` implementations to `Vec`

## [v0.3.0] - 2018-04-22

### Changed

- [breaking-change] The capacity of all data structures must now be specified using type level
  integers (cf. `typenum`). See documentation for details.

- [breaking-change] `BufferFullError` has been removed in favor of (a) returning ownership of the
  item that couldn't be added to the collection (cf. `Vec.push`), or (b) returning the unit type
  when the argument was not consumed (cf. `Vec.extend_from_slice`).

## [v0.2.7] - 2018-04-20

### Added

- Unchecked methods to dequeue and enqueue items into a `RingBuffer` via the `Consumer` and
  `Producer` end points.

### Changed

- `RingBuffer` now has a generic index type, which default to `usize` for backward compatibility.
  Changing the index type to `u8` or `u16` reduces the footprint of the `RingBuffer` but limits its
  maximum capacity (254 and 65534, respectively).

## [v0.2.6] - 2018-04-18

### Added

- A `BinaryHeap` implementation. `BinaryHeap` is a priority queue implemented with a binary heap.

## [v0.2.5] - 2018-04-13

### Fixed

- Dereferencing `heapless::Vec` no longer incurs in a bounds check.

## [v0.2.4] - 2018-03-12

### Fixed

- `LinerMap::new` is now a const fn

## [v0.2.3] - 2018-03-11

### Added

- A `swap_remove` method to `Vec`
- A `LinearMap` implementation. `LinearMap` is a map / dict backed by an array and that performs
  lookups via linear search.

## [v0.2.2] - 2018-03-01

### Added

- Fixed size version of `std::String`

## [v0.2.1] - 2017-12-21

### Added

- `Vec` now implements both `fmt::Debug`, `PartialEq` and `Eq`.

- `resize` and `resize_default` methods to `Vec`.

## [v0.2.0] - 2017-11-22

### Added

- A single producer single consumer mode to `RingBuffer`.

- A `truncate` method to `Vec`.

### Changed

- [breaking-change] Both `Vec::new` and `RingBuffer::new` no longer require an initial value. The
  signature of `new` is now `const fn() -> Self`.

- [breaking-change] The error type of all operations that may fail has changed from `()` to
  `BufferFullError`.

- Both `RingBuffer` and `Vec` now support arrays of _any_ size for their backup storage.

## [v0.1.0] - 2017-04-27

- Initial release

[Unreleased]: https://github.com/rust-embedded/heapless/compare/v0.8.0...HEAD
[v0.8.0]: https://github.com/rust-embedded/heapless/compare/v0.7.16...v0.8.0
[v0.7.16]: https://github.com/rust-embedded/heapless/compare/v0.7.15...v0.7.16
[v0.7.15]: https://github.com/rust-embedded/heapless/compare/v0.7.14...v0.7.15
[v0.7.14]: https://github.com/rust-embedded/heapless/compare/v0.7.13...v0.7.14
[v0.7.13]: https://github.com/rust-embedded/heapless/compare/v0.7.12...v0.7.13
[v0.7.12]: https://github.com/rust-embedded/heapless/compare/v0.7.11...v0.7.12
[v0.7.11]: https://github.com/rust-embedded/heapless/compare/v0.7.10...v0.7.11
[v0.7.10]: https://github.com/rust-embedded/heapless/compare/v0.7.9...v0.7.10
[v0.7.9]: https://github.com/rust-embedded/heapless/compare/v0.7.8...v0.7.9
[v0.7.8]: https://github.com/rust-embedded/heapless/compare/v0.7.7...v0.7.8
[v0.7.7]: https://github.com/rust-embedded/heapless/compare/v0.7.6...v0.7.7
[v0.7.6]: https://github.com/rust-embedded/heapless/compare/v0.7.5...v0.7.6
[v0.7.5]: https://github.com/rust-embedded/heapless/compare/v0.7.4...v0.7.5
[v0.7.4]: https://github.com/rust-embedded/heapless/compare/v0.7.3...v0.7.4
[v0.7.3]: https://github.com/rust-embedded/heapless/compare/v0.7.2...v0.7.3
[v0.7.2]: https://github.com/rust-embedded/heapless/compare/v0.7.1...v0.7.2
[v0.7.1]: https://github.com/rust-embedded/heapless/compare/v0.7.0...v0.7.1
[v0.7.0]: https://github.com/rust-embedded/heapless/compare/v0.6.1...v0.7.0
[v0.6.1]: https://github.com/rust-embedded/heapless/compare/v0.6.0...v0.6.1
[v0.6.0]: https://github.com/rust-embedded/heapless/compare/v0.5.5...v0.6.0
[v0.5.5]: https://github.com/rust-embedded/heapless/compare/v0.5.4...v0.5.5
[v0.5.4]: https://github.com/rust-embedded/heapless/compare/v0.5.3...v0.5.4
[v0.5.3]: https://github.com/rust-embedded/heapless/compare/v0.5.2...v0.5.3
[v0.5.2]: https://github.com/rust-embedded/heapless/compare/v0.5.1...v0.5.2
[v0.5.1]: https://github.com/rust-embedded/heapless/compare/v0.5.0...v0.5.1
[v0.5.0]: https://github.com/rust-embedded/heapless/compare/v0.4.4...v0.5.0
[v0.4.4]: https://github.com/rust-embedded/heapless/compare/v0.4.3...v0.4.4
[v0.4.3]: https://github.com/rust-embedded/heapless/compare/v0.4.2...v0.4.3
[v0.4.2]: https://github.com/rust-embedded/heapless/compare/v0.4.1...v0.4.2
[v0.4.1]: https://github.com/rust-embedded/heapless/compare/v0.4.0...v0.4.1
[v0.4.0]: https://github.com/rust-embedded/heapless/compare/v0.3.7...v0.4.0
[v0.3.7]: https://github.com/rust-embedded/heapless/compare/v0.3.6...v0.3.7
[v0.3.6]: https://github.com/rust-embedded/heapless/compare/v0.3.5...v0.3.6
[v0.3.5]: https://github.com/rust-embedded/heapless/compare/v0.3.4...v0.3.5
[v0.3.4]: https://github.com/rust-embedded/heapless/compare/v0.3.3...v0.3.4
[v0.3.3]: https://github.com/rust-embedded/heapless/compare/v0.3.2...v0.3.3
[v0.3.2]: https://github.com/rust-embedded/heapless/compare/v0.3.1...v0.3.2
[v0.3.1]: https://github.com/rust-embedded/heapless/compare/v0.3.0...v0.3.1
[v0.3.0]: https://github.com/rust-embedded/heapless/compare/v0.2.7...v0.3.0
[v0.2.7]: https://github.com/rust-embedded/heapless/compare/v0.2.6...v0.2.7
[v0.2.6]: https://github.com/rust-embedded/heapless/compare/v0.2.5...v0.2.6
[v0.2.5]: https://github.com/rust-embedded/heapless/compare/v0.2.4...v0.2.5
[v0.2.4]: https://github.com/rust-embedded/heapless/compare/v0.2.3...v0.2.4
[v0.2.3]: https://github.com/rust-embedded/heapless/compare/v0.2.2...v0.2.3
[v0.2.2]: https://github.com/rust-embedded/heapless/compare/v0.2.1...v0.2.2
[v0.2.1]: https://github.com/rust-embedded/heapless/compare/v0.2.0...v0.2.1
[v0.2.0]: https://github.com/rust-embedded/heapless/compare/v0.1.0...v0.2.0
