diff --git a/docs/_index.md b/docs/_index.md
index efc0a7d6..7dca7869 100644
--- a/docs/_index.md
+++ b/docs/_index.md
@@ -4,10 +4,6 @@ weight: 998
type: hextra-home
---
-{{< callout type="warning">}}
-**This documentation is still under development, and very much incomplete.**
-{{< /callout >}}
-
diff --git a/docs/containers/Views/array-view.md b/docs/containers/Views/array-view.md
index 094e36cc..079c3f46 100644
--- a/docs/containers/Views/array-view.md
+++ b/docs/containers/Views/array-view.md
@@ -301,36 +301,52 @@ Returns the maximum possible size of the view.
## Non-member functions
**Lexicographically comparisons**
-
-`operator ==`
-**Returns**
-Returns `true` if the contents of the array views are equal, otherwise `false`.
+```cpp
+operator ==
+```
+**Description**
+`true` if the contents of the lists are equal, otherwise `false`.
---
-`operator !=`
-**Returns**
-`true` if the contents of the array views are not equal, otherwise `false`.
+```cpp
+operator !=
+```
+**Description**
+`true` if the contents of the lists are not equal, otherwise `false`.
-`operator <`
-**Returns**
-`true` if the contents of the lhs are lexicographically less than the
-contents of the rhs, otherwise `false`.
+---
-`operator <=`
-**Returns**
-`true` if the contents of the lhs are lexicographically less than or equal to the
-contents of the rhs, otherwise `false`.
+```cpp
+operator <
+```
+**Description**
+`true` if the contents of the lhs are lexicographically less than the contents of the rhs, otherwise `false`.
-`operator >`
-**Returns**
-`true` if the contents of the lhs are lexicographically greater than the
-contents of the rhs, otherwise `false`.
+---
+
+```cpp
+operator <=
+```
+**Description**
+`true` if the contents of the lhs are lexicographically less than or equal to the contents of the rhs, otherwise `false`.
+
+---
+
+```cpp
+operator >
+```
+**Description**
+`true` if the contents of the lhs are lexicographically greater than the contents of the rhs, otherwise `false`.
+
+---
+
+```cpp
+operator >=
+```
+**Description**
+`true` if the contents of the lhs are lexicographically greater than or equal to the contents of the rhs, otherwise `false`.
-`operator >=`
-**Returns**
-`true` if the contents of the lhs are lexicographically greater than or equal to the
-contents of the rhs, otherwise `false`.
## Hash
There are specialisations of `etl::hash` for `array_view`.
diff --git a/docs/containers/arrays/array.md b/docs/containers/arrays/array.md
index 3fd23a7a..e2cda55d 100644
--- a/docs/containers/arrays/array.md
+++ b/docs/containers/arrays/array.md
@@ -269,31 +269,48 @@ first/last are not checked for valid range.
## Non-member functions
**Lexicographically comparisons**
+```cpp
+operator ==
+```
+**Description**
+`true` if the contents of the lists are equal, otherwise `false`.
-`operator ==`
-**Returns**
-`true` if the contents of the arrays are equal, otherwise `false`.
+---
-`operator !=`
-**Returns**
-`true` if the contents of the arrays are not equal, otherwise `false`.
+```cpp
+operator !=
+```
+**Description**
+`true` if the contents of the lists are not equal, otherwise `false`.
-`operator <`
-**Returns**
-`true` if the contents of the lhs are lexicographically less than the
-contents of the rhs, otherwise `false`.
+---
-`operator <=`
-**Returns**
-`true` if the contents of the lhs are lexicographically less than or equal to the
-contents of the rhs, otherwise `false`.
+```cpp
+operator <
+```
+**Description**
+`true` if the contents of the lhs are lexicographically less than the contents of the rhs, otherwise `false`.
-`operator >`
-**Returns**
-`true` if the contents of the lhs are lexicographically greater than the
-contents of the rhs, otherwise `false`.
+---
-`operator >=`
-**Returns**
-`true` if the contents of the lhs are lexicographically greater than or equal to the
-contents of the rhs, otherwise `false`.
+```cpp
+operator <=
+```
+**Description**
+`true` if the contents of the lhs are lexicographically less than or equal to the contents of the rhs, otherwise `false`.
+
+---
+
+```cpp
+operator >
+```
+**Description**
+`true` if the contents of the lhs are lexicographically greater than the contents of the rhs, otherwise `false`.
+
+---
+
+```cpp
+operator >=
+```
+**Description**
+`true` if the contents of the lhs are lexicographically greater than or equal to the contents of the rhs, otherwise `false`.
diff --git a/docs/containers/deque.md b/docs/containers/deque.md
index 9d42a3b7..a4960607 100644
--- a/docs/containers/deque.md
+++ b/docs/containers/deque.md
@@ -556,17 +556,48 @@ etl::deque&
## Non-member functions
-- `==`
- `true` if the contents of the vectors are equal, otherwise `false`.
-- `!=`
- `true` if the contents of the vectors are not equal, otherwise `false`.
--
- `<`
- `true` if the contents of the lhs are lexicographically less than the contents of the rhs, otherwise `false`.
--
- `<=`
- `true` if the contents of the lhs are lexicographically less than or equal to the contents of the rhs, otherwise `false`.
-- `>`
- `true` if the contents of the lhs are lexicographically greater than the contents of the rhs, otherwise `false`.
-- `>=`
- `true` if the contents of the lhs are lexicographically greater than or equal to the contents of the rhs, otherwise `false`.
+```cpp
+operator ==
+```
+**Description**
+`true` if the contents of the lists are equal, otherwise `false`.
+
+---
+
+```cpp
+operator !=
+```
+**Description**
+`true` if the contents of the lists are not equal, otherwise `false`.
+
+---
+
+```cpp
+operator <
+```
+**Description**
+`true` if the contents of the lhs are lexicographically less than the contents of the rhs, otherwise `false`.
+
+---
+
+```cpp
+operator <=
+```
+**Description**
+`true` if the contents of the lhs are lexicographically less than or equal to the contents of the rhs, otherwise `false`.
+
+---
+
+```cpp
+operator >
+```
+**Description**
+`true` if the contents of the lhs are lexicographically greater than the contents of the rhs, otherwise `false`.
+
+---
+
+```cpp
+operator >=
+```
+**Description**
+`true` if the contents of the lhs are lexicographically greater than or equal to the contents of the rhs, otherwise `false`.
diff --git a/docs/containers/forward-list.md b/docs/containers/forward-list.md
index 7f42e078..133f4297 100644
--- a/docs/containers/forward-list.md
+++ b/docs/containers/forward-list.md
@@ -106,7 +106,7 @@ template
etl::forward_list(TIterator begin, TIterator end)
```
-Emits an `etl::forward_list_iterator` if the iterators are invalid. Emits an `etl::forward_list_full` if the list becomes full.
+Raises an `etl::forward_list_iterator` if the iterators are invalid. Raises an `etl::forward_list_full` if the list becomes full.
If asserts or exceptions are disabled then undefined behaviour occurs.
## For shared pool lists
@@ -127,18 +127,18 @@ template
etl::forward_list(TIterator begin, TIterator end, etl::pool& pool)
```
-Emits an `etl::forward_list_iterator` if the iterators are invalid. If asserts or exceptions are disabled then undefined behaviour occurs.
+Raises an `etl::forward_list_iterator` if the iterators are invalid. If asserts or exceptions are disabled then undefined behaviour occurs.
## Copy constructor
**Implicit pool**
Uses the pool from other.
```cpp
-etl::forward_list(etl::forward_list& other);
+etl::forward_list(etl::forward_list& other)
```
**Explicit pool**
```cpp
-etl::forward_list(etl::forward_list& other, etl::pool& pool);
+etl::forward_list(etl::forward_list& other, etl::pool& pool)
```
## Element access
@@ -164,224 +164,299 @@ Returns end() if the list is empty.
---
+```cpp
iterator end()
const_iterator end() const
const_iterator cend() const
+```
**Description**
Returns an iterator to the end of the forward list.
---
+```cpp
iterator before_begin()
const_iterator before_begin() const
const_iterator cbefore_begin() const
+```
**Description**
Returns an iterator to before the beginning of the forward list.
## Capacity
+```cpp
bool empty() const
+```
**Description**
-Returns true if the size of the forward list is zero, otherwise false.
+Returns `true` if the size of the forward list is zero, otherwise `false`.
---
+```cpp
bool full() const
+```
**Description**
-Returns true if the size of the forward list is SIZE, otherwise false.
+Returns `true` if the size of the forward list is SIZE, otherwise `false`.
---
+```cpp
size_t size() const
+```
**Description**
Returns the size of the forward list.
---
+```cpp
size_t available() const
+```
**Description**
Returns the remaining available capacity in the forward list.
---
+```cpp
size_t max_size() const
+```
**Description**
Returns the maximum possible size of the forward list .
## Modifiers
+```cpp
template
-void assign(TIterator begin, TIterator end);
-void assign(size_t n, parameter_t value);
+void assign(TIterator begin, TIterator end)
+
+void assign(size_t n, parameter_t value)
+```
**Description**
Fills the forward list with the values.
-Emits an etl::forward_list_iterator if the iterators are invalid. Emits an etl::forward_list_full if the list becomes full. If asserts or exceptions are disabled then undefined behaviour occurs.
+Raises an `etl::forward_list_iterator` if the iterators are invalid.
+Raises an `etl::forward_list_full` if the list becomes full.
+If asserts or exceptions are disabled then undefined behaviour occurs.
---
-void push_front(parameter_t value);
+```cpp
+void push_front(parameter_t value)
+```
**Description**
-Pushes a value to the front of the forward list. If the forward list is full and ETL_CHECK_PUSH_POP is defined then emits an etl::forward_list_full error, otherwise undefined behaviour occurs.
+Pushes a value to the front of the forward list. If the forward list is full and ETL_CHECK_PUSH_POP is defined then raises an etl::forward_list_full error, otherwise undefined behaviour occurs.
---
-<=20.35.9
-C++03
+```cpp
+emplace_front
+```
+**Description**
+Constructs an item at the front of the the list 'in place'.
+If the forward list is full and `ETL_CHECK_PUSH_POP` is defined then raises an `etl::forward_list_full` error, otherwise undefined behaviour occurs.
+
+### C++03
+```cpp
template
void emplace_front(const T1& value1)
----
-
template
void emplace_front(const T1& value1, const T2& value2)
----
-
template
void emplace_front(const T1& value1, const T2& value2,
const T3& value3)
----
-
template
void emplace_front(const T1& value1, const T2& value2,
const T3& value3, const T4& value4)
+```
+Before: `20.35.0`
----
+## C++11 and above
-C++11 and above
+```cpp
template
void emplace_front(Args&& ... args)
-Constructs an item at the front of the the list 'in place'.
-Supports up to four constructor parameters.
-If the forward list is full and ETL_CHECK_PUSH_POP is defined then emits an etl::forward_list_full error, otherwise undefined behaviour occurs.
+```
+**Description**
+Constructs an item at the front of the the list 'in place'.
+If the forward list is full and `ETL_CHECK_PUSH_POP` is defined then raises an `etl::forward_list_full` error, otherwise undefined behaviour occurs.
----
-
->=20.35.10
-C++03
+### C++03
+```cpp
template
reference emplace_front(const T1& value1)
----
-
template
reference emplace_front(const T1& value1, const T2& value2)
----
-
template
reference emplace_front(const T1& value1, const T2& value2,
const T3& value3)
----
-
template
reference emplace_front(const T1& value1, const T2& value2,
const T3& value3, const T4& value4)
-
+```
+From 20.35.10
---
-C++11 and above
+### C++11 and above
+```cpp
template
reference emplace_front(Args&& …args)
-Constructs an item at the front of the the list 'in place'.
-Supports up to four constructor parameters.
-If the forward list is full and ETL_CHECK_PUSH_POP is defined then emits an etl::forward_list_full error, otherwise undefined behaviour occurs.
+```
---
-void pop_front();
-Pop a value from the front of the forward list.
-If the forward list is empty and ETL_CHECK_PUSH_POP is defined then emits an etl::forward_list_empty error, otherwise undefined behaviour occurs.
+```cpp
+void pop_front()
+```
+**Description**
+Pop a value from the front of the forward list.
+If the forward list is empty and `ETL_CHECK_PUSH_POP` is defined then raises an `etl::forward_list_empty` error, otherwise undefined behaviour occurs.
---
-<=20.19.0
+```cpp
template
-void insert_after(iterator position, TIterator begin, TIterator end);
+void insert_after(iterator position, TIterator begin, TIterator end)
+```
+**Description**
+Inserts the range [`begin`, `end`) into the forward list after the specified position.
+Before: `20.20.0`
---
-iterator insert_after(iterator position, parameter_t value);
-void insert_after(iterator position, size_t n, parameter_t value);
+```cpp
+iterator insert_after(iterator position, parameter_t value)
+void insert_after(iterator position, size_t n, parameter_t value)
+```
+**Description**
+Inserts `value` in to the forward list after the specified position.
---
->=20.20.0
+```cpp
template
-iterator insert_after(const_iterator position, TIterator begin, TIterator end);
+iterator insert_after(const_iterator position, TIterator begin, TIterator end)
+```
+**Description**
+Inserts the range [`begin`, `end`) into the forward list after the specified position.
+Since: `20.20.0`
---
-iterator insert_after(const_iterator position, parameter_t value);
+```cpp
+iterator insert_after(const_iterator position, parameter_t value)
+```
+**Description**
+Inserts `value` in to the forward list after the specified position.
---
-iterator insert_after(const_iterator position, size_t n, parameter_t value);
+```cpp
+iterator insert_after(const_iterator position, size_t n, parameter_t value)
+```
Inserts values in to the forward list after the specified position.
-If the forward list is full then emits an etl::forward_list_full error. If asserts or exceptions are disabled then undefined behaviour occurs.
+If the forward list is full then raises an `etl::forward_list_full error`.
+If asserts or exceptions are disabled then undefined behaviour occurs.
---
-<=20.19.0
-iterator erase_after(iterator position);
-
----
-
-iterator erase_after(iterator position, const_iterator end);
-
----
-
->=20.20.0
-iterator erase_after(iterator position);
-
----
-
-iterator erase_after(const_iterator position);
-
----
-
-iterator erase_after(const_iterator position, const_iterator end);
+```cpp
+iterator erase_after(iterator position)
+```
Erases elements after the specified position.
-The second version erases up to, but not including end.
+Before: `20.20.0`
---
-void resize(size_t n);
+```cpp
+iterator erase_after(iterator position, const_iterator end)
+```
+**Description**
+Erases the range (`position`, `end`)
+Before: `20.20.0`
---
-void resize(size_t n, parameter_t value);
-Resizes the forward list. If the new size is larger then the first assigns default constructed values, the second assigns the supplied value.
-If n is larger than the capacity then emits an etl::forward_list_full error, if asserts or exceptions are not enabled then undefined behaviour occurs.
+```cpp
+iterator erase_after(const_iterator position)
+```
+**Description**
+Erases elements after the specified position.
+Since: `20.20.0`
---
-void clear();
+```cpp
+iterator erase_after(const_iterator position, const_iterator end)
+```
+**Description**
+Erases the range (`position`, `end`)
+Since: `20.20.0`
+
+---
+
+```cpp
+void resize(size_t n)
+```
+**Description**
+Resizes the forward list.
+If the new size is larger then the first assigns default constructed values.
+If n is larger than the capacity then raises an `etl::forward_list_full error`, if asserts or exceptions are not enabled then undefined behaviour occurs.
+
+---
+
+```cpp
+void resize(size_t n, parameter_t value)
+```
+**Description**
+Resizes the forward list.
+If the new size is larger then the first assigns the supplied value.
+If n is larger than the capacity then raises an `etl::forward_list_full error`, if asserts or exceptions are not enabled then undefined behaviour occurs.
+
+---
+
+```cpp
+void clear()
+```
+**Description**
Clears the forward list to a size of zero.
## Operations
-void remove(const T& value);
+```cpp
+void remove(const T& value)
+```
+**Description**
Removes from the container all the elements that compare equal to value.
---
+```cpp
template
-void remove_if(TPredicate predicate);
+void remove_if(TPredicate predicate)
+```
+**Description**
Removes from the container all the elements that satisfy predicate.
---
-void unique();
+```cpp
+void unique()
+```
+**Description**
+Removes all but the first element from every group of consecutive elements.
---
+```cpp
template
-void unique(TPredicate predicate);
-The first version removes all but the first element from every group of consecutive elements.
-The second removes all but the first element from every group of consecutive elements that satisfy the binary predicate.
+void unique(TPredicate predicate)
+```
+**Description**
+Removes all but the first element from every group of consecutive elements that satisfy the binary predicate.
---
diff --git a/docs/containers/intrusive-forward-list.md b/docs/containers/intrusive-forward-list.md
new file mode 100644
index 00000000..cf79d69a
--- /dev/null
+++ b/docs/containers/intrusive-forward-list.md
@@ -0,0 +1,340 @@
+---
+title: "intrusive_forward_list"
+---
+
+{{< callout type="info">}}
+ Header: `intrusive_forward_list.h`
+ Similar to: `std::forward_list`
+{{< /callout >}}
+
+An intrusive forward list.
+
+```cpp
+template
+etl::intrusive_forward_list
+```
+
+`TValue` is the type that contains the actual values. It is derived from `Tlink`. `Tlink` is the link type for this list.
+See Intrusive links.
+
+Before `20.37.0` the default link type was `etl::forward_link<0>`.
+
+## Member types
+
+```cpp
+link_type TLink
+value_type TValue
+pointer value_type*
+const_pointer const value_type*
+reference value_type&
+const_reference const value_type&
+size_type size_t
+```
+
+## Constructors
+
+```pcc
+etl::intrusive_forward_list();
+```
+**Description**
+Default constructor.
+
+---
+
+```cpp
+template
+etl::intrusive_forward_list(TIterator begin, TIterator end);
+```
+**Description**
+Creates the list from the range [`begin`, `end`) of node links.
+
+---
+
+```cpp
+template
+intrusive_forward_list(TLink& first, TLinks&... links);
+```cpp
+**Description**
+Creates the list from node link references.
+
+## Element access
+
+```cpp
+TValue& front()
+const T& front() const
+```
+**Description**
+Returns a reference or const reference to the first element.
+
+---
+
+```cpp
+TValue& back()
+const T& back() const
+```
+**Description**
+Returns a reference or const reference to the last element.
+
+## Iterators
+
+```cpp
+iterator begin()
+const_iterator begin() const
+const_iterator cbegin() const
+```
+**Description**
+Returns an iterator to the beginning of the list.
+
+---
+
+```cpp
+iterator end()
+const_iterator end() const
+const_iterator cend() const
+```
+**Description**
+Returns an iterator to the end of the list.
+
+---
+
+```cpp
+iterator rbegin()
+const_iterator rbegin() const
+const_iterator crbegin() const
+```
+**Description**
+Returns a reverse iterator to the beginning of the list.
+
+---
+
+```cpp
+iterator rend()
+const_iterator rend() const
+const_iterator crend() const
+```
+**Description**
+Returns a reverse iterator to the end of the list.
+
+## Capacity
+
+```cpp
+bool empty() const
+```
+**Description**
+Returns true if the size of the list is zero, otherwise false.
+
+---
+
+```cpp
+size_t size() const
+```
+**Description**
+Returns the size of the list.
+
+## Modifiers
+
+```cpp
+template
+void assign(TIterator begin, TIterator end);
+```
+**Description**
+Fills the list with the values.
+
+---
+
+```cpp
+void push_front(value_type& value);
+```
+**Description**
+Pushes a value to the front of the list.
+
+---
+
+```cpp
+void pop_front();
+```
+**Description**
+Pop a value from the front of the list.
+Emits an `etl::intrusive_forward_list_empty` if the list is empty.
+If asserts or exceptions are disabled then undefined behaviour occurs.
+
+---
+
+```cpp
+template
+void insert_after(iterator position, TIterator begin, TIterator end);
+```
+**Description**
+
+---
+
+```cpp
+iterator insert_after(iterator position, value_type& value);
+```
+**Description**
+Inserts values in to the list.
+position is not checked for validity.
+
+---
+
+```cpp
+template
+iterator erase_after(TIterator begin, TIterator end);
+```
+**Description**
+Erases values in the range [`begin`, `end`).
+Iterators are not checked for validity.
+
+---
+
+```cpp
+iterator erase_after(iterator position);
+```
+**Description**
+Erases values in the list.
+Iterators are not checked for validity.
+
+---
+
+```cpp
+void clear()
+```
+**Description**
+Clears the list to a size of zero. No elements are destructed.
+
+---
+
+```cpp
+void splice_after(iterator position, list_type& list);
+void splice_after(iterator position, list_type& list, iterator isource);
+void splice_after(iterator position, list_type& list, iterator begin_, iterator end_);
+```
+**Description**
+Splices elements from a list into this list.
+Iterators are not checked for validity.
+
+---
+
+```cpp
+void merge(list_type& list);
+```
+**Description**
+Merges the sorted elements of 'list' into this list. Merges are stable.
+If a debug compile and asserts or exceptions are enabled than an etl::intrusive_list_unsorted is emitted if either list is unsorted, otherwise undefined behaviour occurs.
+
+---
+
+```cpp
+template
+void merge(list_type& list, Tcompare compare)
+```
+**Description**
+Merges the sorted elements of list into this list. Comparison functor is supplied in compare. Merges are stable.
+If a debug compile and asserts or exceptions are enabled than an etl::intrusive_list_unsorted is emitted if either list is unsorted, otherwise undefined behaviour occurs.
+
+## Operations
+
+```cpp
+void remove(const T& value);
+```
+**Description**
+Removes from the container all the elements that compare equal to value.
+
+---
+
+```cpp
+template
+void remove_if(TPredicate predicate);
+```
+**Description**
+Removes from the container all the elements that satisfy predicate.
+
+---
+
+```cpp
+void unique();
+```
+**Description**
+Removes all but the first element from every group of consecutive elements.
+
+---
+
+```cpp
+template
+void unique(TPredicate predicate);
+```
+**Description**
+Removes all but the first element from every group of consecutive elements that satisfy the binary `predicate`.
+
+---
+
+```cpp
+void sort();
+```
+**Description**
+Sorts using the < operator.
+
+---
+
+```cpp
+template
+void sort(TCompare compare);
+```
+**Description**
+Sorts using the supplied `compare` function.
+
+---
+
+```cpp
+void reverse();
+```
+**Description**
+Reverses the order of the list.
+
+## Non-member functions
+
+```cpp
+operator ==
+```
+**Description**
+`true` if the contents of the lists are equal, otherwise `false`.
+
+---
+
+```cpp
+operator !=
+```
+**Description**
+`true` if the contents of the lists are not equal, otherwise `false`.
+
+---
+
+```cpp
+operator <
+```
+**Description**
+`true` if the contents of the lhs are lexicographically less than the contents of the rhs, otherwise `false`.
+
+---
+
+```cpp
+operator <=
+```
+**Description**
+`true` if the contents of the lhs are lexicographically less than or equal to the contents of the rhs, otherwise `false`.
+
+---
+
+```cpp
+operator >
+```
+**Description**
+`true` if the contents of the lhs are lexicographically greater than the contents of the rhs, otherwise `false`.
+
+---
+
+```cpp
+operator >=
+```
+**Description**
+`true` if the contents of the lhs are lexicographically greater than or equal to the contents of the rhs, otherwise `false`.
diff --git a/docs/containers/intrusive-list.md b/docs/containers/intrusive-list.md
index a58cad9a..57f6aae3 100644
--- a/docs/containers/intrusive-list.md
+++ b/docs/containers/intrusive-list.md
@@ -36,6 +36,7 @@ size_type size_t
```cpp
etl::intrusive_list()
```
+Default constructor.
---
@@ -44,7 +45,7 @@ template
etl::intrusive_list(TIterator begin, TIterator end)
```
**Description**
-Default constructor.
+Creates the list from the range [`begin`, `end`) of node links.
---
@@ -314,30 +315,40 @@ operator ==
**Description**
`true` if the contents of the lists are equal, otherwise `false`.
+---
+
```cpp
operator !=
```
**Description**
`true` if the contents of the lists are not equal, otherwise `false`.
+---
+
```cpp
operator <
```
**Description**
`true` if the contents of the lhs are lexicographically less than the contents of the rhs, otherwise `false`.
+---
+
```cpp
operator <=
```
**Description**
`true` if the contents of the lhs are lexicographically less than or equal to the contents of the rhs, otherwise `false`.
+---
+
```cpp
operator >
```
**Description**
`true` if the contents of the lhs are lexicographically greater than the contents of the rhs, otherwise `false`.
+---
+
```cpp
operator >=
```
diff --git a/docs/containers/list.md b/docs/containers/list.md
index 5423444b..75050fbf 100644
--- a/docs/containers/list.md
+++ b/docs/containers/list.md
@@ -17,8 +17,9 @@ etl::list_ext
Inherits from `etl::ilist`.
`etl::ilist` may be used as a size independent pointer or reference type for any `etl::list` instance.
-**Note:**
-Does not support the member function swap.
+{{< callout type="warning">}}
+ Does not support the member function `swap`.
+{{< /callout >}}
## Shared Pools
@@ -291,81 +292,23 @@ If the list is full then emits an `etl::list_full error`.
---
-**C++03**
+```cpp
+emplace_front
+```
+
+### C++03
+
```cpp
template
void emplace_front(const T1& value1)
-```
-**Description**
-Emplaces a value at the front, constructed using the supplied arguments.
-Before: `20.35.10`
----
-
-```cpp
-template
-reference emplace_front(const T1& value1)
-```
-**Description**
-Emplaces a value at the front, constructed using the supplied arguments.
-From: `20.35.10`
-
----
-
-```cpp
template
void emplace_front(const T1& value1, const T2& value2)
-```
-**Description**
-Emplaces a value at the front, constructed using the supplied arguments.
-Before: `20.35.10`
----
-
-```cpp
-template
-reference emplace_front(const T1& value1, const T2& value2)
-```
-**Description**
-Emplaces a value at the front, constructed using the supplied arguments.
-From: `20.35.10`
-
----
-
-```cpp
template
void emplace_front(const T1& value1, const T2& value2,
const T3& value3)
-```
-**Description**
-Emplaces a value at the front, constructed using the supplied arguments.
-Before: `20.35.10`
----
-
-```cpp
-template
-reference emplace_front(const T1& value1, const T2& value2,
- const T3& value3)
-```
-**Description**
-Emplaces a value at the front, constructed using the supplied arguments.
-From: `20.35.10`
-
----
-
-```cpp
-template
-reference emplace_front(const T1& value1, const T2& value2,
- const T3& value3, const T4& value4)
-```
-**Description**
-Emplaces a value at the front, constructed using the supplied arguments.
-From: `20.35.10`
-
----
-
-```cpp
template
void emplace_front(const T1& value1, const T2& value2,
const T3& value3, const T4& value4)
@@ -374,9 +317,26 @@ void emplace_front(const T1& value1, const T2& value2,
Emplaces a value at the front, constructed using the supplied arguments.
Before: `20.35.10`
----
+```cpp
+template
+reference emplace_front(const T1& value1)
-**C++11 and above**
+template
+reference emplace_front(const T1& value1, const T2& value2)
+
+template
+reference emplace_front(const T1& value1, const T2& value2,
+ const T3& value3)
+
+template
+reference emplace_front(const T1& value1, const T2& value2,
+ const T3& value3, const T4& value4)
+```
+**Description**
+Emplaces a value at the front, constructed using the supplied arguments.
+Since: `20.35.10`
+
+### C++11 and above
```cpp
template
reference emplace_front(Args&& …args)
@@ -396,93 +356,48 @@ If the list is full and `ETL_CHECK_PUSH_POP` is defined then emits an `etl::list
---
+```cpp
+emplace_back
+```
+**Description**
+Emplaces a value at the back, constructed using the supplied arguments.
+
**C++03**
```cpp
template
void emplace_back(const T1& value1)
-```
-**Description**
-Emplaces a value at the back, constructed using the supplied arguments.
-Before: `20.35.10`
----
-
-```cpp
-template
-reference emplace_back(const T1& value1)
-```
-**Description**
-Emplaces a value at the back, constructed using the supplied arguments.
-From: `20.35.10`
-
----
-
-```cpp
template
void emplace_back(const T1& value1, const T2& value2)
-```
-**Description**
-Emplaces a value at the back, constructed using the supplied arguments.
-Before: `20.35.10`
----
-
-
-```cpp
-template
-reference emplace_back(const T1& value1, const T2& value2)
-```
-**Description**
-Emplaces a value at the back, constructed using the supplied arguments.
-From: `20.35.10`
-
----
-
-```cpp
template
void emplace_back(const T1& value1, const T2& value2,
const T3& value3)
-```
-**Description**
-Emplaces a value at the back, constructed using the supplied arguments.
-Before: `20.35.10`
----
-
-```cpp
-template
-reference emplace_back(const T1& value1, const T2& value2,
- const T3& value3)
-```
-**Description**
-Emplaces a value at the back, constructed using the supplied arguments.
-From: `20.35.10`
-
----
-
-```cpp
template
void emplace_back(const T1& value1, const T2& value2,
const T3& value3, const T4& value4)
```
-**Description**
-Emplaces a value at the back, constructed using the supplied arguments.
Before: `20.35.10`
----
-
```cpp
+template
+reference emplace_back(const T1& value1)
+
+template
+reference emplace_back(const T1& value1, const T2& value2)
+
+template
+reference emplace_back(const T1& value1, const T2& value2,
+ const T3& value3)
+
template
reference emplace_back(const T1& value1, const T2& value2,
const T3& value3, const T4& value4)
```
-**Description**
-Emplaces a value at the back, constructed using the supplied arguments.
-From: `20.35.10`
+Since: `20.35.10`
----
-
-**C++11 and above**
+### C++11 and above
```cpp
template
reference emplace_back(Args&& ... args)
@@ -554,69 +469,43 @@ Inserts values in to the list. If the list is full then emits an `etl::list_full
---
-**C++03**
```cpp
-void emplace(iterator position, const T1& value1)
+emplace
```
**Description**
-Before: `20.20.0`
-
----
+Constructs an item at the insert point in the list 'in place'.
+### C++03
```cpp
+void emplace(iterator position, const T1& value1)
+
void emplace(iterator position, const T1& value1, const T2& value2)
-```
----
-
-```cpp
void emplace(iterator position, const T1& value1, const T2& value2, const T3& value3)
-```
----
-
-```cpp
void emplace(iterator position, const T1& value1, const T2& value2, const T3& value3, const T4& value4)
```
-
+Before: `20.20.0`
```cpp
iterator emplace(const_iterator position, const T1& value1)
+
+iterator emplace(const_iterator position, const T1& value1, const T2& value2)
+
+iterator emplace(const_iterator position, const T1& value1, const T2& value2, const T3& value3)
+
+iterator emplace(const_iterator position, const T1& value1, const T2& value2, const T3& value3, const T4& value4)
```
**Description**
From: `20.20.0`
----
-
-```cpp
-iterator emplace(const_iterator position, const T1& value1, const T2& value2)
-```
-
----
-
-```cpp
-iterator emplace(const_iterator position, const T1& value1, const T2& value2, const T3& value3)
-```
-
----
-
-```cpp
-iterator emplace(const_iterator position, const T1& value1, const T2& value2, const T3& value3, const T4& value4)
-```
-**Description**
-Constructs an item at the insert point in the list 'in place'.
-Supports up to four constructor parameters.
-
----
-
-**C++11**
+### C++11
```cpp
void emplace(iterator position, Args&& ... args)
```
**Description**
+Constructs an item at the insert point in the the list 'in place'.
Before: `20.20.0`
----
-
```cpp
void emplace(const_iterator position, Args&& ... args)
```
@@ -785,23 +674,52 @@ Reverses the order of the list.
## Non-member functions
-`==`
- `true` if the contents of the lists are equal, otherwise `false`.
+```cpp
+operator ==
+```
+**Description**
+`true` if the contents of the lists are equal, otherwise `false`.
-`!=`
- `true` if the contents of the lists are not equal, otherwise `false`.
+---
-`<`
- `true` if the contents of the lhs are lexicographically less than the contents of the rhs, otherwise `false`.
+```cpp
+operator !=
+```
+**Description**
+`true` if the contents of the lists are not equal, otherwise `false`.
-`<=`
- `true` if the contents of the lhs are lexicographically less than or equal to the contents of the rhs, otherwise `false`.
+---
-`>`
- `true` if the contents of the lhs are lexicographically greater than the contents of the rhs, otherwise `false`.
+```cpp
+operator <
+```
+**Description**
+`true` if the contents of the lhs are lexicographically less than the contents of the rhs, otherwise `false`.
+
+---
+
+```cpp
+operator <=
+```
+**Description**
+`true` if the contents of the lhs are lexicographically less than or equal to the contents of the rhs, otherwise `false`.
+
+---
+
+```cpp
+operator >
+```
+**Description**
+`true` if the contents of the lhs are lexicographically greater than the contents of the rhs, otherwise `false`.
+
+---
+
+```cpp
+operator >=
+```
+**Description**
+`true` if the contents of the lhs are lexicographically greater than or equal to the contents of the rhs, otherwise `false`.
-`>=`
- `true` if the contents of the lhs are lexicographically greater than or equal to the contents of the rhs, otherwise `false`.
## Shared pool example
diff --git a/docs/containers/maps/const-multimap.md b/docs/containers/maps/const-multimap.md
index 59d4de03..19867bd4 100644
--- a/docs/containers/maps/const-multimap.md
+++ b/docs/containers/maps/const-multimap.md
@@ -184,14 +184,51 @@ Checks if the container contains the key.
## Non-member functions
**Lexicographically comparisons**
-| Operator | Description |
-| -------- | ----------------------------------------------------------------------------------- |
-| `==` | `true` if the contents of the maps are equal, otherwise `false`. |
-| `!=` | `true` if the contents of the maps are not equal, otherwise `false`. |
-| `<` | `true` if the contents of the lhs is less-than the rhs, otherwise `false`. |
-| `<=` | `true` if the contents of the lhs is less-than-equal the rhs, otherwise `false`. |
-| `>` | `true` if the contents of the lhs is greater-than the rhs, otherwise `false`. |
-| `>=` | `true` if the contents of the lhs is greater-than-equal the rhs, otherwise `false`. |
+```cpp
+operator ==
+```
+**Description**
+`true` if the contents of the lists are equal, otherwise `false`.
+
+---
+
+```cpp
+operator !=
+```
+**Description**
+`true` if the contents of the lists are not equal, otherwise `false`.
+
+---
+
+```cpp
+operator <
+```
+**Description**
+`true` if the contents of the lhs are lexicographically less than the contents of the rhs, otherwise `false`.
+
+---
+
+```cpp
+operator <=
+```
+**Description**
+`true` if the contents of the lhs are lexicographically less than or equal to the contents of the rhs, otherwise `false`.
+
+---
+
+```cpp
+operator >
+```
+**Description**
+`true` if the contents of the lhs are lexicographically greater than the contents of the rhs, otherwise `false`.
+
+---
+
+```cpp
+operator >=
+```
+**Description**
+`true` if the contents of the lhs are lexicographically greater than or equal to the contents of the rhs, otherwise `false`.
## Technical stuff
diff --git a/docs/containers/maps/flat-multimap.md b/docs/containers/maps/flat-multimap.md
new file mode 100644
index 00000000..b6f6832d
--- /dev/null
+++ b/docs/containers/maps/flat-multimap.md
@@ -0,0 +1,500 @@
+---
+title: "flat_multimap"
+---
+
+{{< callout type="info">}}
+ Header: `flat_multimap.h`
+ Similar to: `std::multimap`
+{{< /callout >}}
+
+A fixed capacity multimap based on a sorted vector.
+The container is an associative lookup table with O(N) insertion and erase, and O(log N) search.
+This container is best used for tables that are occasionally updated and spend most of their time being searched.
+Uses `etl::less` as the default key comparison method.
+
+```cpp
+etl::flat_multimap
+```
+
+Inherits from `etl::iflat_map`.
+`etl::iflat_map` may be used as a size independent pointer or reference type for any `etl::flat_multimap` instance.
+
+## Template deduction guides
+C++17 and above
+
+```cpp
+template
+etl::flat_multimap(TPairs...)
+```
+
+### Example
+```cpp
+etl::flat_multimap data{ etl::pair{0, 1}, etl::pair{2, 3}, etl::pair{4, 5}, etl::pair{6, 7} };
+```
+Defines data as an `flat_multimap` of `int`/`int` pairs, of length 4, containing the supplied data.
+
+## make_flat_map
+C++11 and above
+```cpp
+template ,
+ typename... TPairs>
+constexpr auto make_flat_map(TValues&&... values)
+```
+
+### Example
+```cpp
+auto data = etl::make_flat_map(etl::pair{0, 1}, etl::pair{2, 3},
+ etl::pair{4, 5}, etl::pair{6, 7});
+```
+
+## Member types
+
+```cpp
+key_type TKey
+mapped_type TMapped
+value_type pair
+ The type is either std::pair (default) or etl::pair (ETL_NO_STL)
+size_type std::size_t
+difference_type std::ptrdiff_t
+reference T&
+const_reference const T&
+rvalue_reference T&&
+pointer T*
+const_pointer const T*
+iterator Random access iterator
+const_iterator Constant random access iterator
+reverse_iterator reverse_iterator
+const_reverse_iterator reverse_iterator
+```
+
+## Static Constants
+
+`MAX_SIZE` The maximum size of the flat map.
+
+## Constructors
+
+```cpp
+etl::flat_multimap()
+```
+**Description**
+Default constructor.
+
+---
+
+```cpp
+etl::flat_multimap(const flat_multimap& other)
+```
+**Description**
+Copy constructor.
+
+---
+
+```cpp
+etl::flat_multimap(flat_multimap&& other)
+```
+**Description**
+Move constructor.
+
+---
+
+```cpp
+template
+etl::flat_multimap(TIterator begin, TIterator end);
+```
+**Description**
+Construct from the range [`begin`, `end`).
+
+## Element access
+
+```cpp
+TMapped& at(const_key_reference key)
+const TMapped& at(const_key_reference key) const
+```
+**Description**
+Returns a reference or const reference to the indexed element.
+Emits an `etl::flat_map_out_of_range` if the key is not in the table.
+If asserts or exceptions are not enabled then undefined behaviour occurs.
+
+---
+
+```cpp
+TMapped& operator[](const_key_reference key)
+const TMapped& operator[](const_key_reference key) const
+```
+**Description**
+Returns a reference or const reference to the indexed element.
+If the key is not in the table then a new entry is created.
+
+## Iterators
+
+```cpp
+iterator begin()
+const_iterator begin() const
+const_iterator cbegin() const
+```
+**Description**
+Returns an iterator to the beginning of the map.
+
+---
+
+```cpp
+iterator end()
+const_iterator end() const
+const_iterator cend() const
+```
+**Description**
+Returns an iterator to the end of the map.
+
+---
+
+```cpp
+iterator rbegin()
+const_iterator rbegin() const
+const_iterator crbegin() const
+```
+**Description**
+Returns a reverse iterator to the beginning of the map.
+
+---
+
+```cpp
+iterator rend()
+const_iterator rend() const
+const_iterator crend() const
+```
+**Description**
+Returns a reverse iterator to the end of the map.
+
+## Capacity
+
+```cpp
+bool empty() const
+```
+**Description**
+Returns `true` if the size of the map is zero, otherwise `false`.
+
+---
+
+```cpp
+bool full() const
+```
+**Description**
+Returns `true` if the size of the lookup is `SIZE`, otherwise `false`.
+
+---
+
+```cpp
+size_t size() const
+```
+**Description**
+Returns the size of the lookup.
+
+---
+
+```cpp
+size_t max_size() const
+```
+**Description**
+Returns the maximum possible size of the map.
+
+---
+
+```cpp
+size_t available() const
+```
+**Description**
+Returns the remaining available capacity in the map.
+
+## Modifiers
+
+```cpp
+flat_multimap& operator = (const flat_multimap& rhs)
+flat_multimap& operator = (flat_multimap&& rhs)
+```
+**Description**
+Copies or moves the data from another flat map.
+
+---
+
+```cpp
+pair insert(const value_type& value)
+pair insert(value_type&& value)
+iterator insert(iterator position, const value_type& value)
+iterator insert(iterator position, value_type&& value)
+```
+**Description**
+Inserts a value into the map.
+
+```cpp
+template
+void insert(TIterator first, TIterator last)
+```
+**Description**
+Inserts values in to the map.
+If the map is full then emits an `etl::flat_map_full`. If asserts or exceptions are not enabled then undefined behaviour occurs.
+The return type is either `std::pair` (default) or `etl::pair` (`ETL_NO_STL`)
+
+---
+
+```cpp
+pair emplace((const value_type& value))
+pair emplace(const key_type& key, const mapped_type& value)
+```
+**Description**
+Inserts key/value pairs into the map by constructing directly into storage.
+The return type is either `std::pair` (default) or `etl::pair` (`ETL_NO_STL`)
+
+---
+
+**C++03**
+The emplace functions differ from that of std::map in that, due to C++03 not supporting 'perfect forwarding', the values for constructing mapped types must be listed as parameters and not nested in a 'mapped' value parameter.
+The return type is either `std::pair` (default) or `etl::pair` (`ETL_NO_STL`)
+
+```cpp
+template
+pair emplace(const key_type& key, const T1& value1)
+```
+**Description**
+Emplaces a value constructed from `key` and 1 argument into the map.
+
+```cpp
+template
+pair emplace(const key_type& key, const T1& value1, const T2& value2)
+```
+**Description**
+Emplaces a value constructed from `key` and 2 arguments into the map.
+
+```cpp
+template
+pair emplace(const key_type& key, const T1& value1, const T2& value2, const T3& value3)
+```
+**Description**
+Emplaces a value constructed from `key` and 3 arguments into the map.
+
+```cpp
+template
+pair emplace(const key_type& key, const T1& value1, const T2& value2, const T3& value3, const T4& value4)
+```
+**Description**
+Emplaces a value constructed from `key` and 4 arguments into the map.
+
+---
+
+**C++11**
+```cpp
+template
+pair emplace(const key_type& key, Args&& ... args)
+```
+**Description**
+Emplaces a value constructed from the `key` and arguments into the map.
+
+---
+
+```cpp
+size_t erase(key_value_parameter_t key)
+void erase(iterator i_element)
+void erase(iterator first, iterator last)
+```
+**Description**
+Erase elements from the map.
+
+---
+
+```cpp
+iterator erase(const_iterator i_element)
+iterator erase(const_iteratorfirst, const_iteratorlast)
+```
+**Description**
+Erase elements from the map.
+From: `20.20.0`
+
+---
+
+```cpp
+template
+size_t erase(K&& key)
+```
+**Description**
+Erases values in the map.
+Returns an iterator to the next element in the map.
+Iterator parameters are not checked for validity.
+From: `20.21.0`
+
+---
+
+```cpp
+void clear();
+```
+**Description**
+Clears the map to a size of zero.
+
+## Search
+
+```cpp
+iterator find(key_value_parameter_t key)
+const_iterator find(key_value_parameter_t key) const
+```
+**Description**
+Searches for an element with the key `key`.
+Returns an iterator to the element, or `end()` if not found.
+
+```cpp
+iterator lower_bound(key_value_parameter_t key)
+const_iterator lower_bound(key_value_parameter_t key) const
+```
+**Description**
+Searches for an element with the key not less than `key`.
+Returns an iterator to the element, or `end()` if not found.
+
+```cpp
+iterator upper_bound(key_value_parameter_t key)
+const_iterator upper_bound(key_value_parameter_t key) const
+```
+**Description**
+Searches for an element with the key greater than `key`.
+Returns an iterator to the element, or `end()` if not found.
+
+```cpp
+pair equal_range(key_value_parameter_t key)
+pair equal_range(key_value_parameter_t key) const
+```
+**Description**
+Returns the range of elements with a key equal to `key`.
+The return type is either `std::pair` (default) or `etl::pair` (`ETL_NO_STL`)
+
+---
+
+**For comparators that define is_transparent.**
+
+```cpp
+template
+iterator find(const K& key)
+```
+**Description**
+Searches for an element with the key `key`.
+Returns an iterator to the element, or `end()` if not found.
+From: `20.21.0`
+Since: C++11
+
+```cpp
+template
+const_iterator find(const K& key) const
+```
+**Description**
+Searches for an element with the key `key`.
+Returns an iterator to the element, or `end()` if not found.
+From: `20.21.0`
+Since: C++11
+
+---
+
+```cpp
+template
+iterator lower_bound(const K& key)
+```
+**Description**
+Searches for an element with the key not less than `key`.
+Returns an iterator to the element, or `end()` if not found.
+From: `20.21.0`
+Since: C++11
+
+```cpp
+template
+const_iterator lower_bound(const K& key) const
+```
+**Description**
+Searches for an element with the key not less than `key`.
+Returns an iterator to the element, or `end()` if not found.
+From: `20.21.0`
+Since: C++11
+
+---
+
+```cpp
+template
+iterator upper_bound(const K& key)
+```
+**Description**
+Searches for an element with the key greater than `key`.
+Returns an iterator to the element, or `end()` if not found.
+From: `20.21.0`
+Since: C++11
+
+```cpp
+template
+const_iterator upper_bound(const K& key) const
+```
+**Description**
+Searches for an element with the key greater than `key`.
+Returns an iterator to the element, or `end()` if not found.
+From: `20.21.0`
+Since: C++11
+
+---
+
+```cpp
+template
+pair equal_range(const K& key)
+```
+**Description**
+Returns the range of elements with a key equal to `key`.
+The return type is either `std::pair` (default) or `etl::pair` (`ETL_NO_STL`)
+From: `20.21.0`
+Since: C++11
+
+```cpp
+template
+pair equal_range(const K& key) const
+```
+**Description**
+Returns the range of elements with a key equal to `key`.
+The return type is either `std::pair` (default) or `etl::pair` (`ETL_NO_STL`)
+From: `20.21.0`
+Since: C++11
+
+---
+
+```cpp
+bool contains(key_value_parameter_t key) const
+```
+Check if the container contains the key.
+From: `20.21.0`
+
+
+---
+
+```cpp
+template
+bool contains(const K& k) const
+```
+Check if the container contains the key.
+For comparators that define `is_transparent`.
+From: `20.21.0`
+Since: C++11
+
+## Non-member functions
+
+**Lexicographically comparisons**
+
+```cpp
+operator ==
+```
+`true` if the contents of the maps are equal, otherwise `false`.
+
+---
+
+```cpp
+operator !=
+```
+`true` if the contents of the maps are not equal, otherwise `false`.
+
+## Technical stuff
+
+Flat maps are usually implemented internally as a sorted vector of key/value pairs. Whilst this makes searching fast, it can have a detrimental effect when items are inserted into a container that stores complex, non-trivial keys or values.
+As inserting requires that all of the items to the right of the insert position must be shifted this can become an expensive operation for larger containers.
+
+To improve insertion performance ETL flat maps are implemented as vectors of pointers to key/value pairs, sorted by key value. An insertion will involve a copy of a range of pointers; an operation that can be very fast.
+
+The downside is that access to an item via an iterator will involve one indirection and the overhead of the container will be one pointer per item. A normal flat map implementation does not have this overhead.
diff --git a/docs/containers/maps/map.md b/docs/containers/maps/map.md
new file mode 100644
index 00000000..5266d0d2
--- /dev/null
+++ b/docs/containers/maps/map.md
@@ -0,0 +1,425 @@
+---
+title: "map"
+---
+
+{{< callout type="info">}}
+ Header: `map.h`
+ Similar to: `std::map`
+{{< /callout >}}
+
+A fixed capacity map.
+Uses `std::less` as the default key comparison method.
+
+```cpp
+etl::map
+```
+
+Inherits from `etl::imap`.
+`etl::imap` may be used as a size independent pointer or reference type for any etl::map instance.
+
+## Template deduction guides
+C++17 and above
+
+```cpp
+template
+etl::map(TPairs...)
+```
+
+### Example
+```cpp
+etl::map data{ etl::pair{0, 1}, etl::pair{2, 3}, etl::pair{4, 5}, etl::pair{6, 7} }
+```
+Defines data as an map of `int`/`int` pairs, of length 4, containing the supplied data.
+
+## Make template
+**C++11 and above**
+```cpp
+template ,
+ typename... TPairs>
+constexpr auto make_flat_map(TValues&&... values)
+```
+
+### Example
+```cpp
+auto data = etl::make_map(etl::pair{0, 1}, etl::pair{2, 3},
+ etl::pair{4, 5}, etl::pair{6, 7});
+```
+
+## Member types
+
+```cpp
+key_type TKey
+mapped_type TMapped
+value_type etl or std::pair
+size_type size_t
+difference_type ptrdiff_t
+reference value_type&
+const_reference const value_type&
+pointer value_type*
+const_pointer const value_type*
+iterator Random access iterator
+const_iterator Constant random access iterator
+reverse_iterator etl or std::reverse_iterator
+const_reverse_iterator etl or std::reverse_iterator
+```
+
+## Constructor
+
+```cpp
+etl::map();
+```
+**Description**
+Default constructor.
+
+
+```cpp
+template
+etl::map(TIterator begin, TIterator end);
+```
+**Description**
+Construct from the range [`begin`, `end`).
+
+## Element access
+
+```cpp
+TMapped& at(key_parameter_t key)
+const TMapped& at(key_parameter_t key) const
+```
+**Description**
+Returns a reference or const reference to the indexed element.
+Asserts an `etl::map_out_of_range` if the key is not in the table.
+If assert or exceptions are not enabled then undefined behaviour occurs.
+
+---
+
+```cpp
+TMapped& operator[](key_parameter_t key)
+const TMapped& operator[](key_parameter_t key) const
+```
+**Description**
+Returns a reference or const reference to the indexed element.
+If the key does not exist then one is created using the default constructor.
+If the map is full then asserts an `etl::map_full`. If asserts or exceptions are not enabled then undefined behaviour occurs.
+
+---
+
+```cpp
+iterator find(key_parameter_t key);
+const_iterator find(key_parameter_t key) const
+```
+**Description**
+Searches the container for an element with a key equivalent to key and returns an iterator to it if found, otherwise it returns an iterator to `etl::map::end()`.
+
+---
+
+```cpp
+size_type count(key_parameter_t key) const
+```
+**Description**
+Count elements with a specific key.
+Searches the container for elements with a key equivalent to key and returns the number of matches
+
+---
+
+```cpp
+iterator lower_bound(key_parameter_t key);
+const_iterator lower_bound(key_parameter_t key) const
+```
+**Description**
+Returns an iterator pointing to the first element in the container whose `key` is not considered to go before key (i.e., either it is equivalent or goes after).
+
+---
+
+```cpp
+iterator upper_bound(key_parameter_t key);
+const_iterator upper_bound(key_parameter_t key) const
+```
+**Description**
+Returns an iterator pointing to the first element in the container whose key is considered to go after `key`.
+
+---
+
+```cpp
+pair equal_range(key_parameter_t key) const
+pair equal_range(key_parameter_t key)
+```
+**Description**
+Returns the bounds of a range that includes all the elements in the container which have a key equivalent to `key`.
+The return type is either `std::pair` (default) or `etl::pair` (`ETL_NO_STL`)
+
+---
+
+**For comparators that define `is_transparent`.**
+
+```cpp
+template
+iterator find(const K& key)
+```
+**Description**
+Searches the container for an element with a key equivalent to key and returns an iterator to it if found, otherwise it returns an iterator to `etl::map::end()`.
+Since: `20.21.0`
+C++11 or above.
+
+---
+
+```cpp
+template
+const_iterator find(const K& key) const
+```
+**Description**
+Searches the container for an element with a key equivalent to `key` and returns a const iterator to it if found, otherwise it returns a const iterator to `etl::map::end()`.
+
+---
+
+```cpp
+template
+iterator lower_bound(const K& key)
+```
+**Description**
+Returns an iterator pointing to the first element in the container whose key is not considered to go before `key` (i.e., either it is equivalent or goes after).
+Since: `20.21.0`
+C++11 or above.
+
+---
+
+```cpp
+template
+const_iterator lower_bound(const K& key) const
+```
+**Description**
+Returns a const iterator pointing to the first element in the container whose key is not considered to go before `key` (i.e., either it is equivalent or goes after).
+Since: `20.21.0`
+C++11 or above.
+
+---
+
+```cpp
+template
+iterator upper_bound(const K& key)
+```
+**Description**
+Returns an iterator pointing to the first element in the container whose key is considered to go after `key`.
+Since: `20.21.0`
+C++11 or above.
+
+---
+
+```cpp
+template
+const_iterator upper_bound(const K& key) const
+```
+**Description**
+Returns a const iterator pointing to the first element in the container whose key is considered to go after `key`.
+Since: `20.21.0`
+C++11 or above.
+
+---
+
+```cpp
+template
+pair equal_range(const K& key)
+```
+**Description**
+Returns the bounds of a range that includes all the elements in the container which have a key equivalent to `key`.
+The return type is either `std::pair` (default) or `etl::pair` (`ETL_NO_STL`)
+Since: `20.21.0`
+C++11 or above.
+
+---
+
+```cpp
+template
+pair equal_range(const K& key) const
+```
+**Description**
+Returns the bounds of a range that includes all the elements in the container which have a key equivalent to `key`.
+The return type is either `std::pair` (default) or `etl::pair` (`ETL_NO_STL`)
+
+---
+
+```cpp
+bool contains(key_value_parameter_t key) const
+```
+**Description**
+Check if the container contains the key.
+Since: `20.21.0`
+
+---
+
+```cpp
+template
+bool contains(const K& k) const
+```
+**Description**
+Check if the container contains the key.
+Since: `20.21.0`
+C++11 or above.
+For comparators that define is_transparent.
+
+## Iterators
+
+```cpp
+iterator begin()
+const_iterator begin() const
+const_iterator cbegin() const
+```
+**Description**
+Returns an iterator to the beginning of the map.
+
+---
+
+```cpp
+iterator end()
+const_iterator end() const
+const_iterator cend() const
+```
+**Description**
+Returns an iterator to the end of the map.
+
+---
+
+```cpp
+iterator rbegin()
+const_iterator rbegin() const
+const_iterator crbegin() const
+```
+**Description**
+Returns a reverse iterator to the beginning of the map.
+
+---
+
+```cpp
+iterator rend()
+const_iterator rend() const
+const_iterator crend() const
+```
+**Description**
+Returns a reverse iterator to the end of the map.
+
+## Capacity
+
+```cpp
+bool empty() const
+```
+**Description**
+Returns true if the size of the map is zero, otherwise false.
+
+---
+
+```cpp
+bool full() const
+```
+**Description**
+Returns true if the size of the map is SIZE, otherwise false.
+
+---
+
+```cpp
+size_t size() const
+```
+**Description**
+Returns the size of the map.
+
+---
+
+```cpp
+size_t max_size() const
+```
+**Description**
+Returns the maximum possible size of the map.
+
+---
+
+```cpp
+size_t available() const
+```
+**Description**
+Returns the remaining available capacity in the map.
+
+---
+
+## Modifiers
+
+```cpp
+template
+void insert(TIterator begin, TIterator end)
+```
+**Description**
+Before: `20.20.0`
+---
+
+
+```cpp
+template
+iterator insert(TIterator begin, TIterator end)
+```
+**Description**
+Since: `20.20.0`
+
+---
+
+```cpp
+iterator insert(mapped_parameter_t value)
+```
+**Description**
+Inserts values in to the map.
+If the map is full then asserts an etl::map_full error. If asserts or exceptions are not enabled then undefined behaviour occurs.
+
+---
+
+```cpp
+template
+iterator erase(TIterator begin, TIterator end)
+```
+**Description**
+
+---
+
+```cpp
+iterator erase(TIterator element)
+```
+**Description**
+Erases values in the map.
+Iterator are not checked for validity.
+
+---
+
+```cpp
+size_t erase(const key_type& key)
+```
+**Description**
+
+---
+
+20.21.0
+```cpp
+template
+size_t erase(K&& key)
+```
+**Description**
+
+---
+
+```cpp
+void clear()
+```
+**Description**
+Clears the map to a size of zero.
+
+## Non-member functions
+
+```cpp
+operator ==
+```
+**Description**
+`true` if the contents of the maps are equal, otherwise `false`.
+
+---
+
+```cpp
+operator !=
+```
+**Description**
+`true` if the contents of the maps are not equal, otherwise `false`.
diff --git a/docs/containers/maps/multimap.md b/docs/containers/maps/multimap.md
new file mode 100644
index 00000000..96190528
--- /dev/null
+++ b/docs/containers/maps/multimap.md
@@ -0,0 +1,425 @@
+---
+title: "multimap"
+---
+
+{{< callout type="info">}}
+ Header: `multimap.h`
+ Similar to: `std::multimap`
+{{< /callout >}}
+
+A fixed capacity multimap.
+Uses `std::less` as the default key comparison method.
+
+```cpp
+etl::multimap
+```
+
+Inherits from `etl::imap`.
+`etl::imap` may be used as a size independent pointer or reference type for any etl::multimap instance.
+
+## Template deduction guides
+C++17 and above
+
+```cpp
+template
+etl::multimap(TPairs...)
+```
+
+### Example
+```cpp
+etl::multimap data{ etl::pair{0, 1}, etl::pair{2, 3}, etl::pair{4, 5}, etl::pair{6, 7} }
+```
+Defines data as an multimap of `int`/`int` pairs, of length 4, containing the supplied data.
+
+## Make template
+**C++11 and above**
+```cpp
+template ,
+ typename... TPairs>
+constexpr auto make_flat_map(TValues&&... values)
+```
+
+### Example
+```cpp
+auto data = etl::make_map(etl::pair{0, 1}, etl::pair{2, 3},
+ etl::pair{4, 5}, etl::pair{6, 7});
+```
+
+## Member types
+
+```cpp
+key_type TKey
+mapped_type TMapped
+value_type etl or std::pair
+size_type size_t
+difference_type ptrdiff_t
+reference value_type&
+const_reference const value_type&
+pointer value_type*
+const_pointer const value_type*
+iterator Random access iterator
+const_iterator Constant random access iterator
+reverse_iterator etl or std::reverse_iterator
+const_reverse_iterator etl or std::reverse_iterator
+```
+
+## Constructor
+
+```cpp
+etl::multimap();
+```
+**Description**
+Default constructor.
+
+
+```cpp
+template
+etl::multimap(TIterator begin, TIterator end);
+```
+**Description**
+Construct from the range [`begin`, `end`).
+
+## Element access
+
+```cpp
+TMapped& at(key_parameter_t key)
+const TMapped& at(key_parameter_t key) const
+```
+**Description**
+Returns a reference or const reference to the indexed element.
+Asserts an `etl::map_out_of_range` if the key is not in the table.
+If assert or exceptions are not enabled then undefined behaviour occurs.
+
+---
+
+```cpp
+TMapped& operator[](key_parameter_t key)
+const TMapped& operator[](key_parameter_t key) const
+```
+**Description**
+Returns a reference or const reference to the indexed element.
+If the key does not exist then one is created using the default constructor.
+If the multimap is full then asserts an `etl::map_full`. If asserts or exceptions are not enabled then undefined behaviour occurs.
+
+---
+
+```cpp
+iterator find(key_parameter_t key);
+const_iterator find(key_parameter_t key) const
+```
+**Description**
+Searches the container for an element with a key equivalent to key and returns an iterator to it if found, otherwise it returns an iterator to `etl::multimap::end()`.
+
+---
+
+```cpp
+size_type count(key_parameter_t key) const
+```
+**Description**
+Count elements with a specific key.
+Searches the container for elements with a key equivalent to key and returns the number of matches
+
+---
+
+```cpp
+iterator lower_bound(key_parameter_t key);
+const_iterator lower_bound(key_parameter_t key) const
+```
+**Description**
+Returns an iterator pointing to the first element in the container whose `key` is not considered to go before key (i.e., either it is equivalent or goes after).
+
+---
+
+```cpp
+iterator upper_bound(key_parameter_t key);
+const_iterator upper_bound(key_parameter_t key) const
+```
+**Description**
+Returns an iterator pointing to the first element in the container whose key is considered to go after `key`.
+
+---
+
+```cpp
+pair equal_range(key_parameter_t key) const
+pair equal_range(key_parameter_t key)
+```
+**Description**
+Returns the bounds of a range that includes all the elements in the container which have a key equivalent to `key`.
+The return type is either `std::pair` (default) or `etl::pair` (`ETL_NO_STL`)
+
+---
+
+**For comparators that define `is_transparent`.**
+
+```cpp
+template
+iterator find(const K& key)
+```
+**Description**
+Searches the container for an element with a key equivalent to key and returns an iterator to it if found, otherwise it returns an iterator to `etl::multimap::end()`.
+Since: `20.21.0`
+C++11 or above.
+
+---
+
+```cpp
+template
+const_iterator find(const K& key) const
+```
+**Description**
+Searches the container for an element with a key equivalent to `key` and returns a const iterator to it if found, otherwise it returns a const iterator to `etl::multimap::end()`.
+
+---
+
+```cpp
+template
+iterator lower_bound(const K& key)
+```
+**Description**
+Returns an iterator pointing to the first element in the container whose key is not considered to go before `key` (i.e., either it is equivalent or goes after).
+Since: `20.21.0`
+C++11 or above.
+
+---
+
+```cpp
+template
+const_iterator lower_bound(const K& key) const
+```
+**Description**
+Returns a const iterator pointing to the first element in the container whose key is not considered to go before `key` (i.e., either it is equivalent or goes after).
+Since: `20.21.0`
+C++11 or above.
+
+---
+
+```cpp
+template
+iterator upper_bound(const K& key)
+```
+**Description**
+Returns an iterator pointing to the first element in the container whose key is considered to go after `key`.
+Since: `20.21.0`
+C++11 or above.
+
+---
+
+```cpp
+template
+const_iterator upper_bound(const K& key) const
+```
+**Description**
+Returns a const iterator pointing to the first element in the container whose key is considered to go after `key`.
+Since: `20.21.0`
+C++11 or above.
+
+---
+
+```cpp
+template
+pair equal_range(const K& key)
+```
+**Description**
+Returns the bounds of a range that includes all the elements in the container which have a key equivalent to `key`.
+The return type is either `std::pair` (default) or `etl::pair` (`ETL_NO_STL`)
+Since: `20.21.0`
+C++11 or above.
+
+---
+
+```cpp
+template
+pair equal_range(const K& key) const
+```
+**Description**
+Returns the bounds of a range that includes all the elements in the container which have a key equivalent to `key`.
+The return type is either `std::pair` (default) or `etl::pair` (`ETL_NO_STL`)
+
+---
+
+```cpp
+bool contains(key_value_parameter_t key) const
+```
+**Description**
+Check if the container contains the key.
+Since: `20.21.0`
+
+---
+
+```cpp
+template
+bool contains(const K& k) const
+```
+**Description**
+Check if the container contains the key.
+Since: `20.21.0`
+C++11 or above.
+For comparators that define is_transparent.
+
+## Iterators
+
+```cpp
+iterator begin()
+const_iterator begin() const
+const_iterator cbegin() const
+```
+**Description**
+Returns an iterator to the beginning of the multimap.
+
+---
+
+```cpp
+iterator end()
+const_iterator end() const
+const_iterator cend() const
+```
+**Description**
+Returns an iterator to the end of the multimap.
+
+---
+
+```cpp
+iterator rbegin()
+const_iterator rbegin() const
+const_iterator crbegin() const
+```
+**Description**
+Returns a reverse iterator to the beginning of the multimap.
+
+---
+
+```cpp
+iterator rend()
+const_iterator rend() const
+const_iterator crend() const
+```
+**Description**
+Returns a reverse iterator to the end of the multimap.
+
+## Capacity
+
+```cpp
+bool empty() const
+```
+**Description**
+Returns true if the size of the multimap is zero, otherwise false.
+
+---
+
+```cpp
+bool full() const
+```
+**Description**
+Returns true if the size of the multimap is SIZE, otherwise false.
+
+---
+
+```cpp
+size_t size() const
+```
+**Description**
+Returns the size of the multimap.
+
+---
+
+```cpp
+size_t max_size() const
+```
+**Description**
+Returns the maximum possible size of the multimap.
+
+---
+
+```cpp
+size_t available() const
+```
+**Description**
+Returns the remaining available capacity in the multimap.
+
+---
+
+## Modifiers
+
+```cpp
+template
+void insert(TIterator begin, TIterator end)
+```
+**Description**
+Before: `20.20.0`
+---
+
+
+```cpp
+template
+iterator insert(TIterator begin, TIterator end)
+```
+**Description**
+Since: `20.20.0`
+
+---
+
+```cpp
+iterator insert(mapped_parameter_t value)
+```
+**Description**
+Inserts values in to the multimap.
+If the multimap is full then asserts an etl::map_full error. If asserts or exceptions are not enabled then undefined behaviour occurs.
+
+---
+
+```cpp
+template
+iterator erase(TIterator begin, TIterator end)
+```
+**Description**
+
+---
+
+```cpp
+iterator erase(TIterator element)
+```
+**Description**
+Erases values in the multimap.
+Iterator are not checked for validity.
+
+---
+
+```cpp
+size_t erase(const key_type& key)
+```
+**Description**
+
+---
+
+20.21.0
+```cpp
+template
+size_t erase(K&& key)
+```
+**Description**
+
+---
+
+```cpp
+void clear()
+```
+**Description**
+Clears the multimap to a size of zero.
+
+## Non-member functions
+
+```cpp
+operator ==
+```
+**Description**
+`true` if the contents of the maps are equal, otherwise `false`.
+
+---
+
+```cpp
+operator !=
+```
+**Description**
+`true` if the contents of the maps are not equal, otherwise `false`.
diff --git a/docs/containers/queues/circular-buffer.md b/docs/containers/queues/circular-buffer.md
index 389f5910..687ac4b9 100644
--- a/docs/containers/queues/circular-buffer.md
+++ b/docs/containers/queues/circular-buffer.md
@@ -286,7 +286,20 @@ The internal pointers to the external buffers are swapped.
## Non-member functions
-`==` `true` if the contents of the vectors are equal, otherwise `false`.
-`!=` `true` if the contents of the vectors are not equal, otherwise `false`.
+```cpp
+operator ==
+```
+**Description**
+`true` if the contents of the lists are equal, otherwise `false`.
+
+---
+
+```cpp
+operator !=
+```
+**Description**
+`true` if the contents of the lists are not equal, otherwise `false`.
+
+---
`swap` Swaps two circular buffers. A circular buffer with internal storage copies items, while one with an external buffer will swap pointers.
diff --git a/docs/containers/sets/flat_multiset.md b/docs/containers/sets/flat_multiset.md
new file mode 100644
index 00000000..890fcd52
--- /dev/null
+++ b/docs/containers/sets/flat_multiset.md
@@ -0,0 +1,500 @@
+---
+title: "flat_multiset"
+---
+
+{{< callout type="info">}}
+ Header: `flat_multiset.h`
+ Similar to: `std::multiset`
+{{< /callout >}}
+
+A fixed capacity multiset based on a sorted vector.
+The container is an associative lookup table with O(N) insertion and erase, and O(log N) search.
+This container is best used for tables that are occasionally updated and spend most of their time being searched.
+Uses `etl::less` as the default key comparison method.
+
+```cpp
+etl::flat_multiset
+```
+
+Inherits from `etl::iflat_set`.
+`etl::iflat_set` may be used as a size independent pointer or reference type for any `etl::flat_multiset` instance.
+
+## Template deduction guides
+C++17 and above
+
+```cpp
+template
+etl::flat_multiset(T...)
+```
+
+### Example
+```cpp
+etl::flat_multiset data{ 0, 1, 2, 3 };
+```
+Defines data as an `flat_multiset` of `int`, of length 4, containing the supplied data.
+
+## make_flat_set
+C++11 and above
+```cpp
+template >
+constexpr auto make_flat_set(TValues&&... values)
+```
+
+### Example
+```cpp
+auto data = etl::make_flat_set({0, 1, 2, 3 });
+```
+
+## Member types
+
+```cpp
+key_type T
+value_type T
+size_type std::size_t
+difference_type std::ptrdiff_t
+reference reference
+const_reference const_reference
+rvalue_reference reference&
+pointer T*
+const_pointer const T*
+iterator Random access iterator
+const_iterator Constant random access iterator
+reverse_iterator reverse_iterator
+const_reverse_iterator reverse_iterator
+```
+
+## Static Constants
+
+`MAX_SIZE` The maximum size of the flat set.
+
+## Constructors
+
+```cpp
+etl::flat_multiset()
+```
+**Description**
+Default constructor.
+
+---
+
+```cpp
+etl::flat_multiset(const flat_multiset& other)
+```
+**Description**
+Copy constructor.
+
+---
+
+```cpp
+etl::flat_multiset(flat_multiset&& other)
+```
+**Description**
+Move constructor.
+
+---
+
+```cpp
+template
+etl::flat_multiset(TIterator begin, TIterator end);
+```
+**Description**
+Construct from the range [`begin`, `end`).
+
+## Element access
+
+```cpp
+reference at(const_reference key)
+const_reference at(const_reference key) const
+```
+**Description**
+Returns a reference or const reference to the indexed element.
+Emits an `etl::flat_set_out_of_range` if the key is not in the table.
+If asserts or exceptions are not enabled then undefined behaviour occurs.
+
+---
+
+```cpp
+reference operator[](const_reference key)
+const_reference operator[](const_reference key) const
+```
+**Description**
+Returns a reference or const reference to the indexed element.
+If the key is not in the table then a new entry is created.
+
+## Iterators
+
+```cpp
+iterator begin()
+const_iterator begin() const
+const_iterator cbegin() const
+```
+**Description**
+Returns an iterator to the beginning of the set.
+
+---
+
+```cpp
+iterator end()
+const_iterator end() const
+const_iterator cend() const
+```
+**Description**
+Returns an iterator to the end of the set.
+
+---
+
+```cpp
+iterator rbegin()
+const_iterator rbegin() const
+const_iterator crbegin() const
+```
+**Description**
+Returns a reverse iterator to the beginning of the set.
+
+---
+
+```cpp
+iterator rend()
+const_iterator rend() const
+const_iterator crend() const
+```
+**Description**
+Returns a reverse iterator to the end of the set.
+
+## Capacity
+
+```cpp
+bool empty() const
+```
+**Description**
+Returns `true` if the size of the set is zero, otherwise `false`.
+
+---
+
+```cpp
+bool full() const
+```
+**Description**
+Returns `true` if the size of the lookup is `SIZE`, otherwise `false`.
+
+---
+
+```cpp
+size_t size() const
+```
+**Description**
+Returns the size of the lookup.
+
+---
+
+```cpp
+size_t max_size() const
+```
+**Description**
+Returns the maximum possible size of the set.
+
+---
+
+```cpp
+size_t available() const
+```
+**Description**
+Returns the remaining available capacity in the set.
+
+## Modifiers
+
+```cpp
+flat_multiset& operator = (const flat_multiset& rhs)
+flat_multiset& operator = (flat_multiset&& rhs)
+```
+**Description**
+Copies or moves the data from another flat set.
+
+---
+
+```cpp
+pair insert(const_reference value)
+pair insert(rvalue_reference value)
+iterator insert(iterator position, const_reference value)
+iterator insert(iterator position, rvalue_reference value)
+```
+**Description**
+Inserts a value into the set.
+
+```cpp
+template
+void insert(TIterator first, TIterator last)
+```
+**Description**
+Inserts values in to the set.
+If the set is full then emits an `etl::flat_set_full`. If asserts or exceptions are not enabled then undefined behaviour occurs.
+The return type is either `std::pair` (default) or `etl::pair` (`ETL_NO_STL`)
+
+---
+
+```cpp
+pair emplace((const_reference value))
+pair emplace(const key_type& key, const mapped_type& value)
+```
+**Description**
+Inserts key/value pairs into the set by constructing directly into storage.
+The return type is either `std::pair` (default) or `etl::pair` (`ETL_NO_STL`)
+
+---
+
+**C++03**
+The emplace functions differ from that of std::set in that, due to C++03 not supporting 'perfect forwarding'.
+
+```cpp
+template
+pair emplace(const key_type& key, const T1& value1)
+```
+**Description**
+Emplaces a value constructed from `key` and 1 argument into the set.
+
+```cpp
+template
+pair emplace(const key_type& key, const T1& value1, const T2& value2)
+```
+**Description**
+Emplaces a value constructed from `key` and 2 arguments into the set.
+
+```cpp
+template
+pair emplace(const key_type& key, const T1& value1, const T2& value2, const T3& value3)
+```
+**Description**
+Emplaces a value constructed from `key` and 3 arguments into the set.
+
+```cpp
+template
+pair emplace(const key_type& key, const T1& value1, const T2& value2, const T3& value3, const T4& value4)
+```
+**Description**
+Emplaces a value constructed from `key` and 4 arguments into the set.
+
+---
+
+**C++11**
+```cpp
+template
+pair emplace(const key_type& key, Args&& ... args)
+```
+**Description**
+Emplaces a value constructed from the `key` and arguments into the set.
+
+---
+
+```cpp
+size_t erase(key_value_parameter_t key)
+void erase(iterator i_element)
+void erase(iterator first, iterator last)
+```
+**Description**
+Erase elements from the set.
+
+---
+
+```cpp
+iterator erase(const_iterator i_element)
+iterator erase(const_iteratorfirst, const_iteratorlast)
+```
+**Description**
+Erase elements from the set.
+From: `20.20.0`
+
+---
+
+```cpp
+template
+size_t erase(K&& key)
+```
+**Description**
+Erases values in the set.
+Returns an iterator to the next element in the set.
+Iterator parameters are not checked for validity.
+From: `20.21.0`
+
+---
+
+```cpp
+void clear();
+```
+**Description**
+Clears the set to a size of zero.
+
+## Search
+
+```cpp
+iterator find(key_value_parameter_t key)
+const_iterator find(key_value_parameter_t key) const
+```
+**Description**
+Searches for an element with the key `key`.
+Returns an iterator to the element, or `end()` if not found.
+
+---
+
+```cpp
+iterator lower_bound(key_value_parameter_t key)
+const_iterator lower_bound(key_value_parameter_t key) const
+```
+**Description**
+Searches for an element with the key not less than `key`.
+Returns an iterator to the element, or `end()` if not found.
+
+---
+
+```cpp
+iterator upper_bound(key_value_parameter_t key)
+const_iterator upper_bound(key_value_parameter_t key) const
+```
+**Description**
+Searches for an element with the key greater than `key`.
+Returns an iterator to the element, or `end()` if not found.
+
+---
+
+```cpp
+pair equal_range(key_value_parameter_t key)
+pair equal_range(key_value_parameter_t key) const
+```
+**Description**
+Returns the range of elements with a key equal to `key`.
+The return type is either `std::pair` (default) or `etl::pair` (`ETL_NO_STL`)
+
+---
+
+**For comparators that define is_transparent.**
+
+```cpp
+template
+iterator find(const K& key)
+```
+**Description**
+Searches for an element with the key `key`.
+Returns an iterator to the element, or `end()` if not found.
+From: `20.21.0`
+Since: C++11
+
+```cpp
+template
+const_iterator find(const K& key) const
+```
+**Description**
+Searches for an element with the key `key`.
+Returns an iterator to the element, or `end()` if not found.
+From: `20.21.0`
+Since: C++11
+
+---
+
+```cpp
+template
+iterator lower_bound(const K& key)
+```
+**Description**
+Searches for an element with the key not less than `key`.
+Returns an iterator to the element, or `end()` if not found.
+From: `20.21.0`
+Since: C++11
+
+```cpp
+template
+const_iterator lower_bound(const K& key) const
+```
+**Description**
+Searches for an element with the key not less than `key`.
+Returns an iterator to the element, or `end()` if not found.
+From: `20.21.0`
+Since: C++11
+
+---
+
+```cpp
+template
+iterator upper_bound(const K& key)
+```
+**Description**
+Searches for an element with the key greater than `key`.
+Returns an iterator to the element, or `end()` if not found.
+From: `20.21.0`
+Since: C++11
+
+```cpp
+template
+const_iterator upper_bound(const K& key) const
+```
+**Description**
+Searches for an element with the key greater than `key`.
+Returns an iterator to the element, or `end()` if not found.
+From: `20.21.0`
+Since: C++11
+
+---
+
+```cpp
+template
+pair equal_range(const K& key)
+```
+**Description**
+Returns the range of elements with a key equal to `key`.
+The return type is either `std::pair` (default) or `etl::pair` (`ETL_NO_STL`)
+From: `20.21.0`
+Since: C++11
+
+```cpp
+template
+pair equal_range(const K& key) const
+```
+**Description**
+Returns the range of elements with a key equal to `key`.
+The return type is either `std::pair` (default) or `etl::pair` (`ETL_NO_STL`)
+From: `20.21.0`
+Since: C++11
+
+---
+
+```cpp
+bool contains(key_value_parameter_t key) const
+```
+Check if the container contains the key.
+From: `20.21.0`
+
+
+---
+
+```cpp
+template
+bool contains(const K& k) const
+```
+Check if the container contains the key.
+For comparators that define `is_transparent`.
+From: `20.21.0`
+Since: C++11
+
+## Non-member functions
+
+**Lexicographically comparisons**
+
+```cpp
+operator ==
+```
+`true` if the contents of the maps are equal, otherwise `false`.
+
+---
+
+```cpp
+operator !=
+```
+`true` if the contents of the maps are not equal, otherwise `false`.
+
+## Technical stuff
+
+Flat maps are usually implemented internally as a sorted vector of key/value pairs. Whilst this makes searching fast, it can have a detrimental effect when items are inserted into a container that stores complex, non-trivial keys or values.
+As inserting requires that all of the items to the right of the insert position must be shifted this can become an expensive operation for larger containers.
+
+To improve insertion performance ETL flat maps are implemented as vectors of pointers to key/value pairs, sorted by key value. An insertion will involve a copy of a range of pointers; an operation that can be very fast.
+
+The downside is that access to an item via an iterator will involve one indirection and the overhead of the container will be one pointer per item. A normal flat set implementation does not have this overhead.
diff --git a/docs/containers/sets/flat_set.md b/docs/containers/sets/flat_set.md
index 3c1a5e91..6f9c0540 100644
--- a/docs/containers/sets/flat_set.md
+++ b/docs/containers/sets/flat_set.md
@@ -244,15 +244,18 @@ The return type is either `std::pair` (default) or `etl::pair` (`ETL_NO_STL`)
---
**C++03**
-The emplace functions differ from that of std::set in that, due to C++03 not supporting 'perfect forwarding'.
+The emplace functions differ from that of `std::set` due to C++03 not supporting 'perfect forwarding'.
```cpp
template
pair emplace(const key_type& key, const T1& value1)
```
**Description**
+
Emplaces a value constructed from `key` and 1 argument into the set.
+---
+
```cpp
template
pair emplace(const key_type& key, const T1& value1, const T2& value2)
@@ -260,6 +263,8 @@ pair emplace(const key_type& key, const T1& value1, const T2& va
**Description**
Emplaces a value constructed from `key` and 2 arguments into the set.
+---
+
```cpp
template
pair emplace(const key_type& key, const T1& value1, const T2& value2, const T3& value3)
@@ -267,6 +272,8 @@ pair emplace(const key_type& key, const T1& value1, const T2& va
**Description**
Emplaces a value constructed from `key` and 3 arguments into the set.
+---
+
```cpp
template
pair emplace(const key_type& key, const T1& value1, const T2& value2, const T3& value3, const T4& value4)
@@ -277,6 +284,7 @@ Emplaces a value constructed from `key` and 4 arguments into the set.
---
**C++11**
+
```cpp
template
pair emplace(const key_type& key, Args&& ... args)
@@ -334,6 +342,8 @@ const_iterator find(key_value_parameter_t key) const
Searches for an element with the key `key`.
Returns an iterator to the element, or `end()` if not found.
+---
+
```cpp
iterator lower_bound(key_value_parameter_t key)
const_iterator lower_bound(key_value_parameter_t key) const
@@ -342,6 +352,8 @@ const_iterator lower_bound(key_value_parameter_t key) const
Searches for an element with the key not less than `key`.
Returns an iterator to the element, or `end()` if not found.
+---
+
```cpp
iterator upper_bound(key_value_parameter_t key)
const_iterator upper_bound(key_value_parameter_t key) const
@@ -350,6 +362,8 @@ const_iterator upper_bound(key_value_parameter_t key) const
Searches for an element with the key greater than `key`.
Returns an iterator to the element, or `end()` if not found.
+---
+
```cpp
pair equal_range(key_value_parameter_t key)
pair equal_range(key_value_parameter_t key) const
@@ -372,6 +386,8 @@ Returns an iterator to the element, or `end()` if not found.
From: `20.21.0`
Since: C++11
+---
+
```cpp
template
const_iterator find(const K& key) const
@@ -394,6 +410,8 @@ Returns an iterator to the element, or `end()` if not found.
From: `20.21.0`
Since: C++11
+---
+
```cpp
template
const_iterator lower_bound(const K& key) const
@@ -416,6 +434,8 @@ Returns an iterator to the element, or `end()` if not found.
From: `20.21.0`
Since: C++11
+---
+
```cpp
template
const_iterator upper_bound(const K& key) const
@@ -438,6 +458,8 @@ The return type is either `std::pair` (default) or `etl::pair` (`ETL_NO_STL`)
From: `20.21.0`
Since: C++11
+---
+
```cpp
template
pair equal_range(const K& key) const
diff --git a/docs/containers/sets/multiset.md b/docs/containers/sets/multiset.md
new file mode 100644
index 00000000..9bf091c8
--- /dev/null
+++ b/docs/containers/sets/multiset.md
@@ -0,0 +1,416 @@
+---
+title: "multiset"
+---
+
+{{< callout type="info">}}
+ Header: `multiset.h`
+ Similar to: `std::multiset`
+{{< /callout >}}
+
+A fixed capacity multiset.
+Uses etl or `std::less` as the default key comparison method.
+
+```cpp
+etl::multiset
+```
+
+Inherits from `etl::iset`.
+`etl::iset` may be used as a size independent pointer or reference type for any `etl::multiset` instance.
+
+## Template deduction guides
+C++17 and above
+
+```cpp
+template
+etl::multiset(TPairs...)
+```
+
+### Example
+```cpp
+etl::multiset data{ 0, 1, 2, 3, 4, 5, 6, 7 };
+```
+Defines data as an multiset of `int`, of length 8, containing the supplied data.
+
+## Make template
+**C++11 and above**
+
+```cpp
+template ,
+ typename... TPairs>
+constexpr auto make_set(TValues&&... values)
+```
+
+### Example
+```cpp
+auto data = etl::make_set(0, 1, 2, 3, 4, 5, 6, 7);
+```
+
+## Member types
+
+```cpp
+value_type T
+size_type size_t
+difference_type ptrdiff_t
+reference value_type&
+const_reference const value_type&
+pointer value_type*
+const_pointer const value_type*
+iterator Random access iterator
+const_iterator Constant random access iterator
+reverse_iterator ETL_OR_STD::reverse_iterator
+const_reverse_iterator ETL_OR_STD::reverse_iterator
+```
+
+## Constructors
+
+```cpp
+etl::multiset()
+```
+**Description**
+
+---
+
+```cpp
+template
+etl::multiset(TIterator begin, TIterator end)
+```
+**Description**
+If the map is full then emits an `etl::reference_flat_set_full`.
+If asserts or exceptions are not enabled then undefined behaviour occurs.
+
+## Element access
+
+```cpp
+iterator find(const value_type& v)
+const_iterator find(const value_type& v) const
+```
+**Description**
+Searches the container for an element with a value of `v` and returns an iterator to it if found, otherwise it returns an iterator to `etl::multiset::end()`.
+
+---
+
+```cpp
+size_type count(const value_type& v) const
+```
+**Description**
+Count elements with a specific key.
+Searches the container for elements with a value of `v` and returns the number of matches
+
+---
+
+```cpp
+iterator lower_bound(const value_type& v)
+const_iterator lower_bound(const value_type& v) const
+```
+**Description**
+Searches for an element with the key not less than `v`.
+Returns an iterator to the element, or `end()` if not found.
+
+---
+
+```cpp
+iterator upper_bound(const value_type& v)
+const_iterator upper_bound (const value_type& v) const
+```
+**Description**
+Searches for an element with the key greater than `v`.
+Returns an iterator to the element, or `end()` if not found.
+
+---
+
+```cpp
+pair equal_range(const value_type& v) const
+pair equal_range(const value_type& v)
+```
+**Description**
+Returns the range of elements with a key equal to `v`.
+The return type is either `std::pair` (default) or `etl::pair` (`ETL_NO_STL`)
+
+---
+
+**For comparators that define `is_transparent`.**
+
+```cpp
+template
+iterator find(const K& key)
+```
+**Description**
+Since: `20.21.0`
+C++11 or above.
+
+
+---
+
+```cpp
+template
+const_iterator find(const K& key) const
+```
+**Description**
+Since: `20.21.0`
+C++11 or above.
+
+---
+
+```cpp
+template
+iterator lower_bound(const K& key)
+```
+**Description**
+Searches for an element with the key not less than `key`.
+Returns an iterator to the element, or `end()` if not found.
+Since: `20.21.0`
+C++11 or above.
+
+---
+
+```cpp
+template
+const_iterator lower_bound(const K& key) const
+```
+**Description**
+Searches for an element with the key not less than `key`.
+Returns a const iterator to the element, or `end()` if not found.
+Since: `20.21.0`
+C++11 or above.
+
+---
+
+```cpp
+template
+iterator upper_bound(const K& key)
+```
+**Description**
+Searches for an element with the key greater than `key`.
+Returns an iterator to the element, or `end()` if not found.
+Since: `20.21.0`
+C++11 or above.
+
+---
+
+```cpp
+template
+const_iterator upper_bound(const K& key) const
+```
+**Description**
+Searches for an element with the key greater than `key`.
+Returns a const iterator to the element, or `end()` if not found.
+Since: `20.21.0`
+C++11 or above.
+
+---
+
+```cpp
+template
+pair equal_range(const K& key)
+```
+**Description**
+Returns the range of elements with a key equal to `key`.
+The return type is either `std::pair` (default) or `etl::pair` (`ETL_NO_STL`)
+Since: `20.21.0`
+C++11 or above.
+
+---
+
+```cpp
+template
+pair equal_range(const K& key) const
+```
+**Description**
+Returns the range of elements with a key equal to `key`.
+The return type is either `std::pair` (default) or `etl::pair` (`ETL_NO_STL`)
+Since: `20.21.0`
+C++11 or above.
+
+---
+
+```cpp
+bool contains(key_value_parameter_t key) const
+```
+**Description**
+Check if the container contains the key.
+Since: `20.21.0`
+
+---
+
+For comparators that define is_transparent.
+```cpp
+template
+```
+**Description**
+Since: `20.21.0`
+C++11 or above.
+
+---
+
+```cpp
+bool contains(const K& k) const
+```
+Check if the container contains the key.
+Since: `20.21.0`
+C++11 or above.
+
+## Iterators
+
+```cpp
+iterator begin()
+const_iterator begin() const
+const_iterator cbegin() const
+```
+**Description**
+Returns an iterator to the beginning of the map.
+
+---
+
+```cpp
+iterator end()
+const_iterator end() const
+const_iterator cend() const
+```
+**Description**
+Returns an iterator to the end of the map.
+
+---
+
+```cpp
+iterator rbegin()
+const_iterator rbegin() const
+const_iterator crbegin() const
+```
+**Description**
+Returns a reverse iterator to the beginning of the map.
+
+---
+
+```cpp
+iterator rbegin()
+const_iterator rbegin() const
+const_iterator crbegin() const
+```
+**Description**
+Returns a reverse iterator to the beginning of the map.
+
+## Capacity
+
+```cpp
+bool empty() const
+```
+**Description**
+Returns true if the size of the map is zero, otherwise false.
+
+---
+
+```cpp
+bool full() const
+```
+**Description**
+Returns true if the size of the map is SIZE, otherwise false.
+
+---
+
+```cpp
+size_t size() const
+```
+**Description**
+Returns the size of the map.
+
+---
+
+```cpp
+size_t max_size() const
+```
+**Description**
+Returns the maximum possible size of the map.
+
+---
+
+```cpp
+size_t available() const
+```
+**Description**
+Returns the remaining available capacity in the map.
+
+## Modifiers
+
+<=20.19.0
+```cpp
+template
+void insert(TIterator begin, TIterator end)
+```
+**Description**
+
+---
+
+>=20.20.0
+```cpp
+template
+iterator insert(TIterator begin, TIterator end)
+```
+**Description**
+
+---
+
+```cpp
+iterator insert(parameter_t value)
+```
+**Description**
+Inserts values in to the map.
+If the multiset is full then emits an `etl::multiset_full`.
+If asserts or exceptions are not enabled then undefined behaviour occurs.
+
+---
+
+```cpp
+template
+iterator erase(TIterator begin, TIterator end)
+```
+**Description**
+
+---
+
+```cpp
+iterator erase(TIterator element)
+```
+**Description**
+Erases values in the multiset.
+Iterators are not checked for validity.
+
+---
+
+```cpp
+size_t erase(const key_type& key)
+```
+**Description**
+
+----
+
+20.21.0
+```cpp
+template
+size_t erase(K&& key)
+```
+**Description**
+
+---
+
+```cpp
+void clear()
+```
+**Description**
+Clears the map to a size of zero.
+
+## Non-member functions
+
+```cpp
+operator ==
+```
+**Description**
+`true` if the contents of the sets are equal, otherwise `false`.
+
+---
+
+```cpp
+operator !=
+```
+**Description**
+`true` if the contents of the sets are not equal, otherwise `false`.
diff --git a/docs/containers/sets/set.md b/docs/containers/sets/set.md
new file mode 100644
index 00000000..cec118bd
--- /dev/null
+++ b/docs/containers/sets/set.md
@@ -0,0 +1,415 @@
+---
+title: "set"
+---
+
+{{< callout type="info">}}
+ Header: `set.h`
+ Similar to: `std::set`
+{{< /callout >}}
+
+A fixed capacity set.
+Uses etl or `std::less` as the default key comparison method.
+
+```cpp
+etl::set
+```
+
+Inherits from `etl::iset