15template <
typename Key,
typename Value,
typename Compare = less<Key>,
typename Allocator = allocator<fl::pair<Key, Value>>>
20template <
typename Key,
typename Value,
typename Compare = less<Key>,
typename Allocator = allocator<fl::pair<Key, Value>>>
90 return (*mTreeIt).value;
93 return &((*mTreeIt).value);
135 return (*mTreeIt).value;
138 return &((*mTreeIt).value);
178 return (*mTreeRIt).value;
181 return &((*mTreeRIt).value);
213 typename TreeType::const_reverse_iterator
mTreeRIt;
222 return (*mTreeRIt).value;
225 return &((*mTreeRIt).value);
267 return mComp(
x.first,
y.first);
272 MultiMapTree(
const Compare& comp = Compare(),
const Allocator& alloc = Allocator())
273 :
mTree(PairCompareWithId(comp), alloc) {}
283 const Compare& comp = Compare(),
284 const Allocator& alloc = Allocator())
285 :
mTree(PairCompareWithId(comp), alloc) {
328 template<
typename... Args>
337 template <
typename InputIt>
338 void insert(InputIt first, InputIt last) {
339 for (InputIt it = first; it != last; ++it) {
345 void insert(fl::initializer_list<value_type> ilist) {
346 for (
const auto&
value : ilist) {
365 auto it = range.first;
366 while (it != range.second) {
378 while (first != last) {
381 first = ConstIteratorWrapper(
result.mTreeIt);
396 for (
auto it = range.first; it != range.second; ++it) {
403 ValueWithId search_key(
value_type(key, Value()), 0);
404 auto it =
mTree.lower_bound(search_key);
405 if (it !=
mTree.end() && it->value.first == key) {
412 ValueWithId search_key(
value_type(key, Value()), 0);
413 auto it =
mTree.lower_bound(search_key);
414 if (it !=
mTree.end() && it->value.first == key) {
438 ValueWithId search_key(
value_type(key, Value()), 0);
443 ValueWithId search_key(
value_type(key, Value()), 0);
465 return mTree.get_allocator();
470 if (
size() != other.
size())
return false;
471 for (
auto it1 =
begin(), it2 = other.
begin(); it1 !=
end(); ++it1, ++it2) {
472 if (it1->first != it2->first || it1->second != it2->second) {
480 return !(*
this == other);
484 for (
auto it1 =
begin(), it2 = other.
begin(); it1 !=
end() && it2 != other.
end(); ++it1, ++it2) {
485 if (it1->first < it2->first)
return true;
486 if (it2->first < it1->first)
return false;
487 if (it1->second < it2->second)
return true;
488 if (it2->second < it1->second)
return false;
494 return *
this < other || *
this == other;
498 return other < *
this;
502 return other <= *
this;
513template <
typename Key,
typename T,
typename Compare = fl::less<Key>>
ConstIteratorWrapper & operator++()
TreeType::const_iterator mTreeIt
ConstIteratorWrapper & operator--()
ConstIteratorWrapper operator++(int)
const value_type & operator*() const
bool operator!=(const ConstIteratorWrapper &other) const
friend class MultiMapTree
ConstIteratorWrapper operator--(int)
bool operator==(const ConstIteratorWrapper &other) const
const value_type * operator->() const
friend class IteratorWrapper
ConstIteratorWrapper(const IteratorWrapper &it)
ConstIteratorWrapper() FL_NOEXCEPT=default
TreeType::const_reverse_iterator mTreeRIt
ConstReverseIteratorWrapper & operator--()
ConstReverseIteratorWrapper operator--(int)
ConstReverseIteratorWrapper() FL_NOEXCEPT=default
const value_type & operator*() const
ConstReverseIteratorWrapper(const ReverseIteratorWrapper &it)
ConstReverseIteratorWrapper operator++(int)
ConstReverseIteratorWrapper & operator++()
bool operator==(const ConstReverseIteratorWrapper &other) const
const value_type * operator->() const
friend class MultiMapTree
bool operator!=(const ConstReverseIteratorWrapper &other) const
IteratorWrapper & operator--()
friend class ConstIteratorWrapper
friend class MultiMapTree
bool operator!=(const IteratorWrapper &other) const
IteratorWrapper operator--(int)
IteratorWrapper operator++(int)
IteratorWrapper & operator++()
IteratorWrapper() FL_NOEXCEPT=default
value_type * operator->()
bool operator==(const IteratorWrapper &other) const
TreeType::iterator mTreeIt
bool operator==(const ReverseIteratorWrapper &other) const
ReverseIteratorWrapper operator--(int)
ReverseIteratorWrapper & operator++()
friend class ConstReverseIteratorWrapper
bool operator!=(const ReverseIteratorWrapper &other) const
friend class MultiMapTree
ReverseIteratorWrapper() FL_NOEXCEPT=default
TreeType::reverse_iterator mTreeRIt
value_type * operator->()
ReverseIteratorWrapper operator++(int)
ReverseIteratorWrapper & operator--()
bool operator()(const value_type &x, const value_type &y) const
friend class MultiMapTree
bool operator<(const MultiMapTree &other) const
iterator erase(const_iterator first, const_iterator last)
MultiMapTree(const Compare &comp=Compare(), const Allocator &alloc=Allocator())
fl::pair< Key, Value > value_type
bool operator>(const MultiMapTree &other) const
fl::size erase(const Key &key)
ReverseIteratorWrapper reverse_iterator
ptrdiff_t difference_type
const_iterator find(const Key &key) const
void insert(fl::initializer_list< value_type > ilist)
const value_type * const_pointer
bool contains(const Key &key) const
MultiMapTree & operator=(MultiMapTree &&other) FL_NOEXCEPT=default
const_iterator cend() const
iterator emplace(Args &&... args)
const_reverse_iterator rend() const
allocator_type get_allocator() const
fl::size count(const Key &key) const
key_compare key_comp() const
iterator erase(iterator pos)
reverse_iterator rbegin()
MultiMapTree(fl::initializer_list< value_type > init, const Compare &comp=Compare(), const Allocator &alloc=Allocator())
ConstIteratorWrapper const_iterator
iterator upper_bound(const Key &key)
MultiMapTree(MultiMapTree &&other) FL_NOEXCEPT=default
iterator insert(value_type &&value)
bool operator>=(const MultiMapTree &other) const
const value_type & const_reference
void swap(MultiMapTree &other)
ConstReverseIteratorWrapper const_reverse_iterator
const_iterator cbegin() const
RedBlackTree< ValueWithId, PairCompareWithId, Allocator > TreeType
iterator lower_bound(const Key &key)
const_iterator upper_bound(const Key &key) const
bool operator==(const MultiMapTree &other) const
const_iterator lower_bound(const Key &key) const
iterator insert(const value_type &value)
iterator find(const Key &key)
bool operator!=(const MultiMapTree &other) const
fl::size max_size() const
fl::pair< const_iterator, const_iterator > equal_range(const Key &key) const
~MultiMapTree() FL_NOEXCEPT=default
const_reverse_iterator rbegin() const
bool operator<=(const MultiMapTree &other) const
const_iterator end() const
fl::pair< iterator, iterator > equal_range(const Key &key)
MultiMapTree(const MultiMapTree &other) FL_NOEXCEPT=default
void insert(InputIt first, InputIt last)
value_compare value_comp() const
const_iterator begin() const
iterator erase(const_iterator pos)
MultiMapTree & operator=(const MultiMapTree &other) FL_NOEXCEPT=default
constexpr T && forward(typename remove_reference< T >::type &t) FL_NOEXCEPT
constexpr remove_reference< T >::type && move(T &&t) FL_NOEXCEPT
void swap(T &a, T &b) FL_NOEXCEPT
MultiMapTree< Key, T, Compare, fl::allocator_slab< char > > multi_map
constexpr remove_reference< T >::type && move(T &&t) FL_NOEXCEPT
constexpr int type_rank< T >::value
void init(Context &ctx, int w, int h)
expected< T, E > result
Alias for expected (Rust-style naming)
Base definition for an LED controller.
bool operator()(const ValueWithId &a, const ValueWithId &b) const
PairCompareWithId(const Compare &comp=Compare())
ValueWithId(value_type &&v, fl::size id)
const Key & get_key() const
ValueWithId() FL_NOEXCEPT=default