23template <
typename T,
typename Compare = less<T>,
typename Allocator = allocator_slab<
char>>
54 template<
typename... Args>
59 using NodeAllocator =
typename Allocator::template rebind<RBNode>::other;
70 if (
y->left !=
nullptr) {
73 y->parent =
x->parent;
74 if (
x->parent ==
nullptr) {
76 }
else if (
x ==
x->parent->left) {
88 if (
y->right !=
nullptr) {
91 y->parent =
x->parent;
92 if (
x->parent ==
nullptr) {
94 }
else if (
x ==
x->parent->right) {
104 while (
z->parent !=
nullptr &&
z->parent->parent !=
nullptr &&
z->parent->color ==
Color::kRed) {
105 if (
z->parent ==
z->parent->parent->left) {
106 RBNode*
y =
z->parent->parent->right;
111 z =
z->parent->parent;
113 if (
z ==
z->parent->right) {
122 RBNode*
y =
z->parent->parent->left;
127 z =
z->parent->parent;
129 if (
z ==
z->parent->left) {
143 if (u->parent ==
nullptr) {
145 }
else if (u == u->parent->left) {
148 u->parent->right = v;
151 v->parent = u->parent;
156 while (
x->left !=
nullptr) {
163 while (
x->right !=
nullptr) {
172 if (
x == (xParent ? xParent->left :
nullptr)) {
173 RBNode* w = xParent ? xParent->right :
nullptr;
177 w = xParent ? xParent->right :
nullptr;
181 if (wLeftBlack && wRightBlack) {
184 xParent = xParent ? xParent->parent :
nullptr;
189 w = xParent ? xParent->right :
nullptr;
198 RBNode* w = xParent ? xParent->left :
nullptr;
202 w = xParent ? xParent->left :
nullptr;
206 if (wRightBlack && wLeftBlack) {
209 xParent = xParent ? xParent->parent :
nullptr;
214 w = xParent ? xParent->left :
nullptr;
228 RBNode* current =
mRoot;
229 while (current !=
nullptr) {
231 current = current->left;
233 current = current->right;
242 if (node !=
nullptr) {
246 mAlloc.deallocate(node, 1);
251 if (node ==
nullptr)
return nullptr;
253 RBNode* newNode =
mAlloc.allocate(1);
254 if (newNode ==
nullptr) {
258 mAlloc.construct(newNode, node->color, parent, node->data);
259 newNode->left =
copyTree(node->left, newNode);
260 newNode->right =
copyTree(node->right, newNode);
265 template <
typename U>
267 RBNode* parent =
nullptr;
268 RBNode* current =
mRoot;
270 while (current !=
nullptr) {
273 current = current->left;
275 current = current->right;
281 RBNode* newNode =
mAlloc.allocate(1);
282 if (newNode ==
nullptr) {
288 if (parent ==
nullptr) {
290 }
else if (
mComp(newNode->data, parent->data)) {
291 parent->left = newNode;
293 parent->right = newNode;
304 RBNode* current =
mRoot;
306 while (current !=
nullptr) {
309 current = current->left;
311 current = current->right;
318 RBNode* current =
mRoot;
320 while (current !=
nullptr) {
323 current = current->left;
325 current = current->right;
344 if (
x ==
nullptr)
return nullptr;
345 if (
x->right !=
nullptr) {
346 return mTree->minimum(
x->right);
349 while (
y !=
nullptr &&
x ==
y->right) {
357 if (
x ==
nullptr)
return nullptr;
358 if (
x->left !=
nullptr) {
359 return mTree->maximum(
x->left);
362 while (
y !=
nullptr &&
x ==
y->left) {
374 FASTLED_ASSERT(
mNode !=
nullptr,
"RedBlackTree::iterator: dereferencing end iterator");
378 FASTLED_ASSERT(
mNode !=
nullptr,
"RedBlackTree::iterator: dereferencing end iterator");
379 return &(
mNode->data);
411 return mNode == other.mNode;
415 return mNode != other.mNode;
427 if (
x ==
nullptr)
return nullptr;
428 if (
x->right !=
nullptr) {
429 return mTree->minimum(
x->right);
432 while (
y !=
nullptr &&
x ==
y->right) {
440 if (
x ==
nullptr)
return nullptr;
441 if (
x->left !=
nullptr) {
442 return mTree->maximum(
x->left);
445 while (
y !=
nullptr &&
x ==
y->left) {
461 FASTLED_ASSERT(
mNode !=
nullptr,
"RedBlackTree::iterator: dereferencing end iterator");
465 FASTLED_ASSERT(
mNode !=
nullptr,
"RedBlackTree::iterator: dereferencing end iterator");
466 return &(
mNode->data);
499 return mNode == other.mNode;
503 return mNode != other.mNode;
508 return mNode == other.mNode;
512 return mNode != other.mNode;
517 return lhs.mNode == rhs.mNode;
521 return lhs.mNode != rhs.mNode;
534 if (
x ==
nullptr)
return nullptr;
535 if (
x->right !=
nullptr) {
536 return mTree->minimum(
x->right);
539 while (
y !=
nullptr &&
x ==
y->right) {
547 if (
x ==
nullptr)
return nullptr;
548 if (
x->left !=
nullptr) {
549 return mTree->maximum(
x->left);
552 while (
y !=
nullptr &&
x ==
y->left) {
567 FASTLED_ASSERT(
mNode !=
nullptr,
"RedBlackTree::reverse_iterator: dereferencing end iterator");
571 FASTLED_ASSERT(
mNode !=
nullptr,
"RedBlackTree::reverse_iterator: dereferencing end iterator");
572 return &(
mNode->data);
607 return mNode == other.mNode;
611 return mNode != other.mNode;
623 if (
x ==
nullptr)
return nullptr;
624 if (
x->right !=
nullptr) {
625 return mTree->minimum(
x->right);
628 while (
y !=
nullptr &&
x ==
y->right) {
636 if (
x ==
nullptr)
return nullptr;
637 if (
x->left !=
nullptr) {
638 return mTree->maximum(
x->left);
641 while (
y !=
nullptr &&
x ==
y->left) {
657 FASTLED_ASSERT(
mNode !=
nullptr,
"RedBlackTree::const_reverse_iterator: dereferencing end iterator");
661 FASTLED_ASSERT(
mNode !=
nullptr,
"RedBlackTree::const_reverse_iterator: dereferencing end iterator");
662 return &(
mNode->data);
697 return mNode == other.mNode;
701 return mNode != other.mNode;
706 RedBlackTree(
const Compare& comp = Compare(),
const Allocator& alloc = Allocator())
717 if (
this != &other) {
732 other.mRoot =
nullptr;
738 if (
this != &other) {
744 other.mRoot =
nullptr;
756 if (
mRoot ==
nullptr)
return iterator(
nullptr,
this);
761 if (
mRoot ==
nullptr)
return const_iterator(
nullptr,
this);
770 return iterator(
nullptr,
this);
774 return const_iterator(
nullptr,
this);
783 if (
mRoot ==
nullptr)
return reverse_iterator(
nullptr,
this);
788 return reverse_iterator(
nullptr,
this);
792 if (
mRoot ==
nullptr)
return const_reverse_iterator(
nullptr,
this);
797 return const_reverse_iterator(
nullptr,
this);
828 template<
typename... Args>
835 if (
pos.mNode ==
nullptr)
return end();
837 RBNode* nodeToDelete =
const_cast<RBNode*
>(
pos.mNode);
838 RBNode* successor =
nullptr;
840 if (nodeToDelete->right !=
nullptr) {
841 successor =
minimum(nodeToDelete->right);
843 RBNode* current = nodeToDelete;
844 RBNode* parent = current->parent;
845 while (parent !=
nullptr && current == parent->right) {
847 parent = parent->parent;
852 RBNode*
y = nodeToDelete;
854 RBNode* xParent =
nullptr;
855 Color originalColor =
y->color;
857 if (nodeToDelete->left ==
nullptr) {
858 x = nodeToDelete->right;
859 xParent = nodeToDelete->parent;
860 transplant(nodeToDelete, nodeToDelete->right);
861 }
else if (nodeToDelete->right ==
nullptr) {
862 x = nodeToDelete->left;
863 xParent = nodeToDelete->parent;
867 originalColor =
y->color;
869 if (
y->parent == nodeToDelete) {
871 if (
x)
x->parent =
y;
875 y->right = nodeToDelete->right;
876 y->right->parent =
y;
880 y->left = nodeToDelete->left;
882 y->color = nodeToDelete->color;
885 mAlloc.destroy(nodeToDelete);
886 mAlloc.deallocate(nodeToDelete, 1);
893 return iterator(successor,
this);
898 if (node ==
nullptr)
return 0;
900 erase(const_iterator(node,
this));
918 return node ? iterator(node,
this) :
end();
923 return node ? const_iterator(node,
this) :
end();
944 return n ? iterator(n,
this) :
end();
949 return n ? const_iterator(n,
this) :
end();
954 return n ? iterator(n,
this) :
end();
959 return n ? const_iterator(n,
this) :
end();
974 if (
mSize != other.mSize)
return false;
976 const_iterator it1 =
begin();
977 const_iterator it2 = other.begin();
979 while (it1 !=
end() && it2 != other.end()) {
988 return it1 ==
end() && it2 == other.end();
992 return !(*
this == other);
997template <
typename Key,
typename Value,
typename Compare = less<Key>,
typename Allocator = allocator_slab<
char>>
1020 return mComp(a.first, b.first);
1035 return mComp(
x.first,
y.first);
1064 for (
const auto&
value : ilist) {
1073 template <
typename InputIt>
1075 const Compare& comp = Compare(),
1076 const Allocator& alloc = Allocator())
1079 for (InputIt it = first; it != last; ++it) {
1088 const Compare& comp = Compare(),
1089 const Allocator& alloc = Allocator())
1123 return result.first->second;
1128 FASTLED_ASSERT(it !=
mTree.end(),
"MapRedBlackTree::at: key not found");
1134 FASTLED_ASSERT(it !=
mTree.end(),
"MapRedBlackTree::at: key not found");
1149 template<
typename... Args>
1156 template <
typename InputIt>
1158 for (InputIt it = first; it != last; ++it) {
1166 for (
const auto&
value : ilist) {
1189 template<
typename... Args>
1198 template <
typename M>
1201 if (it !=
mTree.end()) {
1211 template <
typename M>
1214 if (it !=
mTree.end()) {
1225 template <
typename M>
1232 template <
typename M>
1250 template <
typename... Args>
1256 if (it !=
mTree.end() && it->first == key) {
1265 template <
typename... Args>
1271 if (it !=
mTree.end() && it->first == key) {
1281 template <
typename... Args>
1288 template <
typename... Args>
1307 if (first == last) {
1310 if (first ==
mTree.cend()) {
1324 while (current != last) {
1325 current =
mTree.erase(current);
1333 mTree.swap(other.mTree);
1379 return mTree.value_comp().mComp;
1388 return mTree.get_allocator();
1393 if (
mTree.size() != other.mTree.size())
return false;
1395 auto it1 =
mTree.begin();
1396 auto it2 = other.mTree.begin();
1398 while (it1 !=
mTree.end() && it2 != other.mTree.end()) {
1400 if (it1->first != it2->first || it1->second != it2->second) {
1407 return it1 ==
mTree.end() && it2 == other.mTree.end();
1411 return !(*
this == other);
1419 other.mTree.begin(), other.mTree.end());
1424 return !(other < *
this);
1429 return other < *
this;
1434 return !(*
this < other);
1439template <
typename Key,
typename Compare = less<Key>,
typename Allocator = allocator_slab<
char>>
1504 template<
typename... Args>
1515 return mTree.erase(key);
1519 mTree.swap(other.mTree);
1524 return mTree.count(key);
1528 return mTree.find(key);
1532 return mTree.contains(key);
1536 return mTree.equal_range(key);
1540 return mTree.lower_bound(key);
1544 return mTree.upper_bound(key);
1549 return mTree.value_comp();
1554 return mTree == other.mTree;
1558 return mTree != other.mTree;
value_compare(Compare c) FL_NO_EXCEPT
bool operator()(const value_type &x, const value_type &y) const FL_NO_EXCEPT
friend class MapRedBlackTree
fl::size count(const Key &key) const FL_NO_EXCEPT
void insert(InputIt first, InputIt last) FL_NO_EXCEPT
MapRedBlackTree(InputIt first, InputIt last, const Compare &comp=Compare(), const fl::allocator_slab< char > &alloc=fl::allocator_slab< char >()) FL_NO_EXCEPT
const_reverse_iterator crend() const FL_NO_EXCEPT
iterator try_emplace(const_iterator hint, Key &&key, Args &&... args) FL_NO_EXCEPT
bool operator!=(const MapRedBlackTree &other) const FL_NO_EXCEPT
iterator end() FL_NO_EXCEPT
const_reverse_iterator crbegin() const FL_NO_EXCEPT
fl::size size() const FL_NO_EXCEPT
typename TreeType::const_reverse_iterator const_reverse_iterator
const_reverse_iterator rbegin() const FL_NO_EXCEPT
fl::pair< iterator, bool > try_emplace(Key &&key, Args &&... args) FL_NO_EXCEPT
void swap(MapRedBlackTree &other) FL_NO_EXCEPT
fl::pair< iterator, bool > emplace(Args &&... args) FL_NO_EXCEPT
fl::size max_size() const FL_NO_EXCEPT
iterator upper_bound(const Key &key) FL_NO_EXCEPT
allocator_type get_allocator() const FL_NO_EXCEPT
const value_type * const_pointer
~MapRedBlackTree() FL_NO_EXCEPT=default
MapRedBlackTree(const Compare &comp=Compare(), const Allocator &alloc=Allocator()) FL_NO_EXCEPT
ptrdiff_t difference_type
const_iterator upper_bound(const Key &key) const FL_NO_EXCEPT
key_compare key_comp() const FL_NO_EXCEPT
value_compare value_comp() const FL_NO_EXCEPT
const_iterator cend() const FL_NO_EXCEPT
MapRedBlackTree & operator=(fl::initializer_list< value_type > ilist) FL_NO_EXCEPT
const_iterator begin() const FL_NO_EXCEPT
iterator try_emplace(const_iterator hint, const Key &key, Args &&... args) FL_NO_EXCEPT
const_iterator find(const Key &key) const FL_NO_EXCEPT
MapRedBlackTree(fl::initializer_list< value_type > init, const Compare &comp=Compare(), const fl::allocator_slab< char > &alloc=fl::allocator_slab< char >()) FL_NO_EXCEPT
iterator erase(const_iterator first, const_iterator last) FL_NO_EXCEPT
fl::size erase(const Key &key) FL_NO_EXCEPT
bool operator==(const MapRedBlackTree &other) const FL_NO_EXCEPT
const T & at(const Key &key) const FL_NO_EXCEPT
typename TreeType::iterator iterator
T & operator[](const Key &key) FL_NO_EXCEPT
reverse_iterator rend() FL_NO_EXCEPT
const_iterator cbegin() const FL_NO_EXCEPT
bool operator>(const MapRedBlackTree &other) const FL_NO_EXCEPT
fl::pair< iterator, bool > try_emplace(const Key &key, Args &&... args) FL_NO_EXCEPT
RedBlackTree< value_type, PairCompare, Allocator > TreeType
iterator find(const Key &key) FL_NO_EXCEPT
iterator lower_bound(const Key &key) FL_NO_EXCEPT
bool operator>=(const MapRedBlackTree &other) const FL_NO_EXCEPT
bool operator<(const MapRedBlackTree &other) const FL_NO_EXCEPT
fl::pair< iterator, bool > insert(const value_type &value) FL_NO_EXCEPT
fl::pair< const_iterator, const_iterator > equal_range(const Key &key) const FL_NO_EXCEPT
iterator erase(const_iterator pos) FL_NO_EXCEPT
bool empty() const FL_NO_EXCEPT
iterator emplace_hint(const_iterator hint, Args &&... args) FL_NO_EXCEPT
bool operator<=(const MapRedBlackTree &other) const FL_NO_EXCEPT
typename TreeType::const_iterator const_iterator
T & at(const Key &key) FL_NO_EXCEPT
reverse_iterator rbegin() FL_NO_EXCEPT
void clear() FL_NO_EXCEPT
fl::pair< Key, Value > value_type
iterator insert(const_iterator hint, const value_type &value) FL_NO_EXCEPT
fl::pair< iterator, bool > insert_or_assign(const Key &key, M &&obj) FL_NO_EXCEPT
fl::pair< iterator, iterator > equal_range(const Key &key) FL_NO_EXCEPT
MapRedBlackTree(MapRedBlackTree &&other) FL_NO_EXCEPT=default
iterator insert_or_assign(const_iterator hint, Key &&key, M &&obj) FL_NO_EXCEPT
bool contains(const Key &key) const FL_NO_EXCEPT
void insert(fl::initializer_list< value_type > ilist) FL_NO_EXCEPT
MapRedBlackTree(const MapRedBlackTree &other) FL_NO_EXCEPT=default
iterator begin() FL_NO_EXCEPT
fl::pair< iterator, bool > insert(value_type &&value) FL_NO_EXCEPT
const_iterator end() const FL_NO_EXCEPT
iterator insert_or_assign(const_iterator hint, const Key &key, M &&obj) FL_NO_EXCEPT
iterator insert(const_iterator hint, value_type &&value) FL_NO_EXCEPT
fl::pair< iterator, bool > insert_or_assign(Key &&key, M &&obj) FL_NO_EXCEPT
MapRedBlackTree & operator=(const MapRedBlackTree &other) FL_NO_EXCEPT=default
const_iterator lower_bound(const Key &key) const FL_NO_EXCEPT
const_reverse_iterator rend() const FL_NO_EXCEPT
MapRedBlackTree & operator=(MapRedBlackTree &&other) FL_NO_EXCEPT=default
typename TreeType::reverse_iterator reverse_iterator
const value_type & const_reference
bool operator!=(const iterator &other) const FL_NO_EXCEPT
bool operator==(const iterator &other) const FL_NO_EXCEPT
friend class RedBlackTree
const_iterator(const iterator &it) FL_NO_EXCEPT
const RBNode * successor(const RBNode *x) const FL_NO_EXCEPT
const value_type * operator->() const FL_NO_EXCEPT
friend bool operator==(const iterator &lhs, const const_iterator &rhs) FL_NO_EXCEPT
const_iterator & operator++() FL_NO_EXCEPT
const RedBlackTree * mTree
const_iterator operator++(int) FL_NO_EXCEPT
const_iterator(const RBNode *n, const RedBlackTree *t) FL_NO_EXCEPT
const_iterator() FL_NO_EXCEPT
bool operator!=(const const_iterator &other) const FL_NO_EXCEPT
fl::bidirectional_iterator_tag iterator_category
friend bool operator!=(const iterator &lhs, const const_iterator &rhs) FL_NO_EXCEPT
const RBNode * predecessor(const RBNode *x) const FL_NO_EXCEPT
const_iterator operator--(int) FL_NO_EXCEPT
bool operator==(const const_iterator &other) const FL_NO_EXCEPT
const value_type & operator*() const FL_NO_EXCEPT
const_iterator & operator--() FL_NO_EXCEPT
const value_type & operator*() const FL_NO_EXCEPT
const_reverse_iterator() FL_NO_EXCEPT
const_reverse_iterator(const RBNode *n, const RedBlackTree *t) FL_NO_EXCEPT
bool operator==(const const_reverse_iterator &other) const FL_NO_EXCEPT
friend class RedBlackTree
const RBNode * predecessor(const RBNode *x) const FL_NO_EXCEPT
const RBNode * successor(const RBNode *x) const FL_NO_EXCEPT
fl::bidirectional_iterator_tag iterator_category
const_reverse_iterator & operator--() FL_NO_EXCEPT
const_reverse_iterator operator++(int) FL_NO_EXCEPT
const_reverse_iterator operator--(int) FL_NO_EXCEPT
const RedBlackTree * mTree
const_reverse_iterator & operator++() FL_NO_EXCEPT
bool operator!=(const const_reverse_iterator &other) const FL_NO_EXCEPT
const_reverse_iterator(const reverse_iterator &it) FL_NO_EXCEPT
friend class reverse_iterator
const value_type * operator->() const FL_NO_EXCEPT
friend class RedBlackTree
value_type & operator*() const FL_NO_EXCEPT
bool operator!=(const iterator &other) const FL_NO_EXCEPT
iterator operator--(int) FL_NO_EXCEPT
iterator & operator--() FL_NO_EXCEPT
iterator(RBNode *n, const RedBlackTree *t) FL_NO_EXCEPT
bool operator==(const iterator &other) const FL_NO_EXCEPT
const RedBlackTree * mTree
fl::bidirectional_iterator_tag iterator_category
friend class const_iterator
iterator operator++(int) FL_NO_EXCEPT
iterator & operator++() FL_NO_EXCEPT
RBNode * predecessor(RBNode *x) const FL_NO_EXCEPT
RBNode * successor(RBNode *x) const FL_NO_EXCEPT
value_type * operator->() const FL_NO_EXCEPT
RBNode * successor(RBNode *x) const FL_NO_EXCEPT
reverse_iterator & operator--() FL_NO_EXCEPT
friend class RedBlackTree
value_type & operator*() const FL_NO_EXCEPT
reverse_iterator() FL_NO_EXCEPT
const RedBlackTree * mTree
bool operator!=(const reverse_iterator &other) const FL_NO_EXCEPT
friend class const_reverse_iterator
reverse_iterator(RBNode *n, const RedBlackTree *t) FL_NO_EXCEPT
value_type * operator->() const FL_NO_EXCEPT
RBNode * predecessor(RBNode *x) const FL_NO_EXCEPT
fl::bidirectional_iterator_tag iterator_category
bool operator==(const reverse_iterator &other) const FL_NO_EXCEPT
reverse_iterator & operator++() FL_NO_EXCEPT
reverse_iterator operator--(int) FL_NO_EXCEPT
reverse_iterator operator++(int) FL_NO_EXCEPT
const_reverse_iterator rend() const FL_NO_EXCEPT
RedBlackTree & operator=(const RedBlackTree &other) FL_NO_EXCEPT
RBNode * minimum(RBNode *x) const FL_NO_EXCEPT
bool contains(const value_type &value) const FL_NO_EXCEPT
fl::pair< const_iterator, const_iterator > equal_range(const value_type &value) const FL_NO_EXCEPT
RedBlackTree & operator=(RedBlackTree &&other) FL_NO_EXCEPT
~RedBlackTree() FL_NO_EXCEPT
void clear() FL_NO_EXCEPT
RBNode * upperBoundNode(const value_type &value) const FL_NO_EXCEPT
RBNode * findNode(const value_type &value) const FL_NO_EXCEPT
const_reverse_iterator crbegin() const FL_NO_EXCEPT
iterator upper_bound(const value_type &value) FL_NO_EXCEPT
fl::pair< iterator, bool > insertImpl(U &&value) FL_NO_EXCEPT
bool operator!=(const RedBlackTree &other) const FL_NO_EXCEPT
void destroyTree(RBNode *node) FL_NO_EXCEPT
RBNode * copyTree(RBNode *node, RBNode *parent=nullptr) FL_NO_EXCEPT
const_iterator cend() const FL_NO_EXCEPT
reverse_iterator rbegin() FL_NO_EXCEPT
RedBlackTree(RedBlackTree &&other) FL_NO_EXCEPT
void swap(RedBlackTree &other) FL_NO_EXCEPT
void transplant(RBNode *u, RBNode *v) FL_NO_EXCEPT
fl::size max_size() const FL_NO_EXCEPT
iterator erase(const_iterator pos) FL_NO_EXCEPT
const value_type & const_reference
iterator begin() FL_NO_EXCEPT
const_iterator find(const value_type &value) const FL_NO_EXCEPT
const_reverse_iterator rbegin() const FL_NO_EXCEPT
fl::pair< iterator, bool > insert(const value_type &value) FL_NO_EXCEPT
void rotateRight(RBNode *x) FL_NO_EXCEPT
RBNode * lowerBoundNode(const value_type &value) const FL_NO_EXCEPT
fl::pair< iterator, bool > insert(value_type &&value) FL_NO_EXCEPT
const_iterator end() const FL_NO_EXCEPT
bool empty() const FL_NO_EXCEPT
fl::size size() const FL_NO_EXCEPT
const_iterator upper_bound(const value_type &value) const FL_NO_EXCEPT
void deleteFixup(RBNode *x, RBNode *xParent) FL_NO_EXCEPT
fl::pair< iterator, iterator > equal_range(const value_type &value) FL_NO_EXCEPT
void insertFixup(RBNode *z) FL_NO_EXCEPT
compare_type value_comp() const FL_NO_EXCEPT
RedBlackTree(const RedBlackTree &other) FL_NO_EXCEPT
fl::pair< iterator, bool > emplace(Args &&... args) FL_NO_EXCEPT
bool operator==(const RedBlackTree &other) const FL_NO_EXCEPT
void rotateLeft(RBNode *x) FL_NO_EXCEPT
const_iterator lower_bound(const value_type &value) const FL_NO_EXCEPT
reverse_iterator rend() FL_NO_EXCEPT
fl::size erase(const value_type &value) FL_NO_EXCEPT
allocator_type get_allocator() const FL_NO_EXCEPT
const_iterator cbegin() const FL_NO_EXCEPT
const_reverse_iterator crend() const FL_NO_EXCEPT
iterator end() FL_NO_EXCEPT
RBNode * maximum(RBNode *x) const FL_NO_EXCEPT
ptrdiff_t difference_type
const value_type * const_pointer
fl::size count(const value_type &value) const FL_NO_EXCEPT
iterator lower_bound(const value_type &value) FL_NO_EXCEPT
RedBlackTree(const Compare &comp=Compare(), const Allocator &alloc=Allocator()) FL_NO_EXCEPT
typename Allocator::template rebind< RBNode >::other NodeAllocator
const_iterator begin() const FL_NO_EXCEPT
iterator find(const value_type &value) FL_NO_EXCEPT
SetRedBlackTree & operator=(SetRedBlackTree &&other) FL_NO_EXCEPT=default
const value_type * pointer
const_iterator end() const FL_NO_EXCEPT
const_iterator lower_bound(const Key &key) const FL_NO_EXCEPT
fl::pair< const_iterator, bool > emplace(Args &&... args) FL_NO_EXCEPT
void clear() FL_NO_EXCEPT
fl::size size() const FL_NO_EXCEPT
const_iterator upper_bound(const Key &key) const FL_NO_EXCEPT
const_iterator erase(const_iterator pos) FL_NO_EXCEPT
fl::pair< const_iterator, bool > insert(value_type &&value) FL_NO_EXCEPT
key_compare key_comp() const FL_NO_EXCEPT
ptrdiff_t difference_type
bool operator==(const SetRedBlackTree &other) const FL_NO_EXCEPT
typename TreeType::const_reverse_iterator const_reverse_iterator
const value_type & reference
bool operator!=(const SetRedBlackTree &other) const FL_NO_EXCEPT
typename TreeType::const_iterator iterator
const_reverse_iterator rbegin() const FL_NO_EXCEPT
fl::size count(const Key &key) const FL_NO_EXCEPT
typename TreeType::const_reverse_iterator reverse_iterator
bool empty() const FL_NO_EXCEPT
const_iterator find(const Key &key) const FL_NO_EXCEPT
fl::size erase(const Key &key) FL_NO_EXCEPT
RedBlackTree< Key, Compare, Allocator > TreeType
const_reverse_iterator rend() const FL_NO_EXCEPT
typename TreeType::const_iterator const_iterator
SetRedBlackTree(const Compare &comp=Compare(), const Allocator &alloc=Allocator()) FL_NO_EXCEPT
SetRedBlackTree(const SetRedBlackTree &other) FL_NO_EXCEPT=default
allocator_type get_allocator() const FL_NO_EXCEPT
const value_type * const_pointer
fl::pair< const_iterator, bool > insert(const value_type &value) FL_NO_EXCEPT
const_iterator cend() const FL_NO_EXCEPT
const_iterator begin() const FL_NO_EXCEPT
const_iterator cbegin() const FL_NO_EXCEPT
const value_type & const_reference
fl::pair< const_iterator, const_iterator > equal_range(const Key &key) const FL_NO_EXCEPT
fl::size max_size() const FL_NO_EXCEPT
bool contains(const Key &key) const FL_NO_EXCEPT
~SetRedBlackTree() FL_NO_EXCEPT=default
void swap(SetRedBlackTree &other) FL_NO_EXCEPT
SetRedBlackTree(SetRedBlackTree &&other) FL_NO_EXCEPT=default
SetRedBlackTree & operator=(const SetRedBlackTree &other) FL_NO_EXCEPT=default
bool lexicographical_compare(Iterator1 first1, Iterator1 last1, Iterator2 first2, Iterator2 last2) FL_NO_EXCEPT
constexpr remove_reference< T >::type && move(T &&t) FL_NO_EXCEPT
constexpr T && forward(typename remove_reference< T >::type &t) FL_NO_EXCEPT
enable_if_t< is_same< T, U >::value > swap(T &a, U &b) FL_NO_EXCEPT
u8 u8 fract8 blur_amount FL_NO_EXCEPT
constexpr int type_rank< T >::value
void init(Context &ctx, int w, int h) FL_NO_EXCEPT
expected< T, E > result
Alias for expected (Rust-style naming)
Base definition for an LED controller.
bool operator()(const value_type &a, const value_type &b) const FL_NO_EXCEPT
PairCompare(const Compare &comp=Compare()) FL_NO_EXCEPT
RBNode(const value_type &val, Color c=Color::kRed, RBNode *p=nullptr) FL_NO_EXCEPT
RBNode(Color c, RBNode *p, Args &&... args) FL_NO_EXCEPT