Fw/DataStructures/docs/RedBlackTreeSet.md
RedBlackTreeSet is a final class template
defined in Fw/DataStructures.
It represents a set based on a red-black tree with internal storage.
RedBlackTreeSet has the following template parameters.
| Kind | Name | Purpose |
|---|---|---|
typename | T | The type of an element in the set |
FwSizeType | C | The capacity, i.e., the maximum number of elements that the set can store |
RedBlackTreeSet statically asserts that C > 0.
RedBlackTreeSet is publicly derived from
SetBase<T>.
<a name="Public-Types"></a>
RedBlackTreeSet defines the following public types:
| Name | Definition |
|---|---|
ConstIterator | Alias of SetConstIterator<T> |
Entry | Alias of SetOrMapImplEntry<T, Nil> |
The type Nil is defined in this file.
RedBlackTreeSet has the following private member variables.
| Name | Type | Purpose | Default Value |
|---|---|---|---|
m_extSet | ExternalRedBlackTreeSet<T> | The external set implementation | C++ default initialization |
m_entries | Entry[C] | The array providing the backing memory for m_extSet | C++ default initialization |
The type Entry is defined in this section.
classDiagram
RedBlackTreeSet *-- ExternalRedBlackTreeSet
RedBlackTreeSet()
Initialize m_extSet with ExternalRedBlackTreeSet<T>(m_entries, C).
Example:
RedBlackTreeSet<U32, 10> set;
RedBlackTreeSet(const RedBlackTreeSet<T, C>& set)
Initialize m_extSet with ExternalRedBlackTreeSet<T>(m_entries, C).
Set *this = set.
Example:
using Set = RedBlackTreeSet<U32, 10>;
Set s1;
// Insert an item
const U32 element = 42;
const auto status = s1.insert(element);
ASSERT_EQ(status, Success::SUCCESS);
// Call the copy constructor
Set s2;
ASSERT_EQ(s2.getSize(), 1);
~RedBlackTreeSet() override
Defined as = default.
RedBlackTreeSet<T, C>& operator=(const RedBlackTreeSet<T, C>& set)
Return m_extSet.copyDataFrom(set).
Example:
using Set = RedBlackTreeSet<U32, 10>;
Set s1;
// Insert an item
U32 element = 42;
const auto status = s1.insert(element);
ASSERT_EQ(status, Success::SUCCESS);
// Call the default constructor
Set s2;
ASSERT_EQ(s2.getSize(), 0);
// Call the copy assignment operator
s2 = s1;
ASSERT_EQ(s2.getSize(), 1);
status = s2.find(element);
ASSERT_EQ(status, Success::SUCCESS);
ConstIterator begin() const
Return m_extSet.begin().
Example:
using Set = RedBlackTreeSet<U32, 10>;
Set set;
// Insert an element in the set
const auto status = map.insert(42);
ASSERT_EQ(status, Fw::Success::SUCCESS);
// Get a set const iterator object
auto it = set.begin();
// Use the iterator to access the underlying map const entry
ASSERT_EQ(*it, 42);
void clear() override
Call m_extSet.clear().
Example:
using Set = RedBlackTreeSet<U32, 10>;
Set set;
const auto status = set.insert(42);
ASSERT_EQ(set.getSize(), 1);
set.clear();
ASSERT_EQ(set.getSize(), 0);
ConstIterator end() const
Return m_extSet.end().
Example:
using Set = RedBlackTreeSet<U32, 10>;
// Call the constructor providing backing storage
Set set;
// Insert an element in the set
auto status = set.insert(42);
ASSERT_EQ(status, Fw::Success::SUCCESS);
// Get a set const iterator object
auto iter = set.begin();
// Check that iter is not at the end
ASSERT_NE(iter, set.end());
// Increment iter
it++;
// Check that iter is at the end
ASSERT_EQ(iter, set.end());
Success find(const K& element, V& value) override
Return m_extSet.find(element).
Example:
using Set = RedBlackTreeSet<U32, 10>;
Set set;
auto status = set.find(42);
ASSERT_EQ(status, Success::FAILURE);
status = set.insert(42);
ASSERT_EQ(status, Success::SUCCESS);
status = set.find(42);
ASSERT_EQ(status, Success::SUCCESS);
FwSizeType getCapacity() const override
Return m_extSet.getCapacity().
Example:
using Set = RedBlackTreeSet<U32, 10>;
Set set;
ASSERT_EQ(set.getCapacity(), 10);
FwSizeType getSize() const override
Return m_extSet.getSize().
Example:
using Set = RedBlackTreeSet<U32, 10>;
Set set;
auto size = set.getSize();
ASSERT_EQ(size, 0);
const auto status = set.insert(42);
ASSERT_EQ(status, Success::SUCCESS);
size = set.getSize();
ASSERT_EQ(size, 1);
Success insert(const T& element) override
Return m_extSet.insert(element).
Example:
using Set = RedBlackTreeSet<U32, 10>;
Set set;
auto size = set.getSize();
ASSERT_EQ(size, 0);
const auto status = set.insert(42);
ASSERT_EQ(status, Success::SUCCESS);
size = set.getSize();
ASSERT_EQ(size, 1);
Success remove(const T& element) override
Return m_extSet.remove(element).
Example:
using Set = RedBlackTreeSet<U32, 10>;
Set set;
auto size = set.getSize();
ASSERT_EQ(size, 0);
auto status = set.insert(42);
ASSERT_EQ(status, Success::SUCCESS);
size = set.getSize();
ASSERT_EQ(size, 1);
// Element does not exist
status = set.remove(0);
ASSERT_EQ(status, Success::FAILURE);
ASSERT_EQ(size, 1);
// Element exists
status = set.remove(42);
ASSERT_EQ(status, Success::SUCCESS);
ASSERT_EQ(size, 0);