Loading...
Searching...
No Matches
flat_multimap.h
Go to the documentation of this file.
/******************************************************************************
The MIT License(MIT)
Embedded Template Library.
https://github.com/ETLCPP/etl
https://www.etlcpp.com
Copyright(c) 2015 John Wellbelove
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files(the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and / or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions :
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
******************************************************************************/
#ifndef ETL_FLAT_MULTMAP_INCLUDED
#define ETL_FLAT_MULTMAP_INCLUDED
#include "platform.h"
#include "initializer_list.h"
#include "nth_type.h"
#include "placement_new.h"
#include "pool.h"
#include "reference_flat_multimap.h"
#include "type_traits.h"
#include "utility.h"
#include "private/comparator_is_transparent.h"
//*****************************************************************************
//*****************************************************************************
namespace etl
{
//***************************************************************************
//***************************************************************************
template <typename TKey, typename TMapped, typename TKeyCompare = etl::less<TKey> >
class iflat_multimap : public etl::ireference_flat_multimap<TKey, TMapped, TKeyCompare>
{
public:
typedef ETL_OR_STD::pair<const TKey, TMapped> value_type;
private:
typedef etl::ireference_flat_multimap<TKey, TMapped, TKeyCompare> refmap_t;
typedef typename refmap_t::lookup_t lookup_t;
typedef etl::ipool storage_t;
public:
typedef TKey key_type;
typedef TMapped mapped_type;
typedef TKeyCompare key_compare;
typedef value_type& reference;
typedef const value_type& const_reference;
#if ETL_USING_CPP11
typedef value_type&& rvalue_reference;
#endif
typedef value_type* pointer;
typedef const value_type* const_pointer;
typedef size_t size_type;
typedef const key_type& const_key_reference;
#if ETL_USING_CPP11
typedef key_type&& rvalue_key_reference;
#endif
typedef typename refmap_t::iterator iterator;
typedef typename refmap_t::const_iterator const_iterator;
typedef ETL_OR_STD::reverse_iterator<iterator> reverse_iterator;
typedef ETL_OR_STD::reverse_iterator<const_iterator> const_reverse_iterator;
typedef typename etl::iterator_traits<iterator>::difference_type difference_type;
private:
//*********************************************************************
//*********************************************************************
class compare
{
public:
bool operator()(const value_type& element, key_type key) const
{
return comp(element.first, key);
}
bool operator()(key_type key, const value_type& element) const
{
return comp(key, element.first);
}
key_compare comp;
};
public:
//*********************************************************************
//*********************************************************************
iterator begin()
{
return refmap_t::begin();
}
//*********************************************************************
//*********************************************************************
const_iterator begin() const
{
return refmap_t::begin();
}
//*********************************************************************
//*********************************************************************
iterator end()
{
return refmap_t::end();
}
//*********************************************************************
//*********************************************************************
const_iterator end() const
{
return refmap_t::end();
}
//*********************************************************************
//*********************************************************************
const_iterator cbegin() const
{
return refmap_t::cbegin();
}
//*********************************************************************
//*********************************************************************
const_iterator cend() const
{
return refmap_t::cend();
}
//*********************************************************************
//*********************************************************************
reverse_iterator rbegin()
{
return refmap_t::rbegin();
}
//*********************************************************************
//*********************************************************************
const_reverse_iterator rbegin() const
{
return refmap_t::rbegin();
}
//*********************************************************************
//*********************************************************************
reverse_iterator rend()
{
return refmap_t::rend();
}
//*********************************************************************
//*********************************************************************
const_reverse_iterator rend() const
{
return refmap_t::rend();
}
//*********************************************************************
//*********************************************************************
const_reverse_iterator crbegin() const
{
return refmap_t::crbegin();
}
//*********************************************************************
//*********************************************************************
const_reverse_iterator crend() const
{
return refmap_t::crend();
}
//*********************************************************************
//*********************************************************************
template <typename TIterator>
void assign(TIterator first, TIterator last)
{
#if ETL_IS_DEBUG_BUILD
difference_type d = etl::distance(first, last);
ETL_ASSERT(d <= difference_type(capacity()), ETL_ERROR(flat_multimap_full));
#endif
clear();
while (first != last)
{
insert(*first);
++first;
}
}
//*********************************************************************
//*********************************************************************
ETL_OR_STD::pair<iterator, bool> insert(const value_type& value)
{
ETL_ASSERT(!refmap_t::full(), ETL_ERROR(flat_multimap_full));
ETL_OR_STD::pair<iterator, bool> result(end(), false);
iterator i_element = upper_bound(value.first);
value_type* pvalue = storage.allocate<value_type>();
::new (pvalue) value_type(value);
ETL_INCREMENT_DEBUG_COUNT;
result = refmap_t::insert_at(i_element, *pvalue);
return result;
}
#if ETL_USING_CPP11
//*********************************************************************
//*********************************************************************
ETL_OR_STD::pair<iterator, bool> insert(rvalue_reference value)
{
ETL_ASSERT(!refmap_t::full(), ETL_ERROR(flat_multimap_full));
ETL_OR_STD::pair<iterator, bool> result(end(), false);
iterator i_element = upper_bound(value.first);
value_type* pvalue = storage.allocate<value_type>();
::new (pvalue) value_type(etl::move(value));
ETL_INCREMENT_DEBUG_COUNT;
result = refmap_t::insert_at(i_element, *pvalue);
return result;
}
#endif
//*********************************************************************
//*********************************************************************
iterator insert(const_iterator /*position*/, const value_type& value)
{
return insert(value).first;
}
#if ETL_USING_CPP11
//*********************************************************************
//*********************************************************************
iterator insert(const_iterator /*position*/, rvalue_reference value)
{
return insert(etl::move(value)).first;
}
#endif
//*********************************************************************
//*********************************************************************
template <class TIterator>
void insert(TIterator first, TIterator last)
{
while (first != last)
{
insert(*first);
++first;
}
}
//*************************************************************************
//*************************************************************************
ETL_OR_STD::pair<iterator, bool> emplace(const value_type& value)
{
return insert(value);
}
//*************************************************************************
//*************************************************************************
ETL_OR_STD::pair<iterator, bool> emplace(const key_type& key, const mapped_type& mapped)
{
ETL_ASSERT(!full(), ETL_ERROR(flat_multimap_full));
// Create it.
value_type* pvalue = storage.allocate<value_type>();
::new ((void*)etl::addressof(pvalue->first)) key_type(key);
::new ((void*)etl::addressof(pvalue->second)) mapped_type(mapped);
iterator i_element = upper_bound(key);
ETL_INCREMENT_DEBUG_COUNT;
return refmap_t::insert_at(i_element, *pvalue);
}
#if ETL_USING_CPP11 && ETL_NOT_USING_STLPORT
//*************************************************************************
//*************************************************************************
template <typename... Args>
ETL_OR_STD::pair<iterator, bool> emplace(const key_type& key, Args&&... args)
{
ETL_ASSERT(!full(), ETL_ERROR(flat_multimap_full));
// Create it.
value_type* pvalue = storage.allocate<value_type>();
::new ((void*)etl::addressof(pvalue->first)) key_type(key);
::new ((void*)etl::addressof(pvalue->second)) mapped_type(etl::forward<Args>(args)...);
iterator i_element = upper_bound(key);
ETL_INCREMENT_DEBUG_COUNT;
return refmap_t::insert_at(i_element, *pvalue);
}
#else
//*************************************************************************
//*************************************************************************
template <typename T1>
ETL_OR_STD::pair<iterator, bool> emplace(const key_type& key, const T1& value1)
{
ETL_ASSERT(!full(), ETL_ERROR(flat_multimap_full));
// Create it.
value_type* pvalue = storage.allocate<value_type>();
::new ((void*)etl::addressof(pvalue->first)) key_type(key);
::new ((void*)etl::addressof(pvalue->second)) mapped_type(value1);
iterator i_element = upper_bound(key);
ETL_INCREMENT_DEBUG_COUNT;
return refmap_t::insert_at(i_element, *pvalue);
}
//*************************************************************************
//*************************************************************************
template <typename T1, typename T2>
ETL_OR_STD::pair<iterator, bool> emplace(const key_type& key, const T1& value1, const T2& value2)
{
ETL_ASSERT(!full(), ETL_ERROR(flat_multimap_full));
// Create it.
value_type* pvalue = storage.allocate<value_type>();
::new ((void*)etl::addressof(pvalue->first)) key_type(key);
::new ((void*)etl::addressof(pvalue->second)) mapped_type(value1, value2);
iterator i_element = upper_bound(key);
ETL_INCREMENT_DEBUG_COUNT;
return refmap_t::insert_at(i_element, *pvalue);
}
//*************************************************************************
//*************************************************************************
template <typename T1, typename T2, typename T3>
ETL_OR_STD::pair<iterator, bool> emplace(const key_type& key, const T1& value1, const T2& value2, const T3& value3)
{
ETL_ASSERT(!full(), ETL_ERROR(flat_multimap_full));
// Create it.
value_type* pvalue = storage.allocate<value_type>();
::new ((void*)etl::addressof(pvalue->first)) key_type(key);
::new ((void*)etl::addressof(pvalue->second)) mapped_type(value1, value2, value3);
iterator i_element = upper_bound(key);
ETL_INCREMENT_DEBUG_COUNT;
return refmap_t::insert_at(i_element, *pvalue);
}
//*************************************************************************
//*************************************************************************
template <typename T1, typename T2, typename T3, typename T4>
ETL_OR_STD::pair<iterator, bool> emplace(const key_type& key, const T1& value1, const T2& value2, const T3& value3, const T4& value4)
{
ETL_ASSERT(!full(), ETL_ERROR(flat_multimap_full));
// Create it.
value_type* pvalue = storage.allocate<value_type>();
::new ((void*)etl::addressof(pvalue->first)) key_type(key);
::new ((void*)etl::addressof(pvalue->second)) mapped_type(value1, value2, value3, value4);
iterator i_element = upper_bound(key);
ETL_INCREMENT_DEBUG_COUNT;
return refmap_t::insert_at(i_element, *pvalue);
}
#endif
//*********************************************************************
//*********************************************************************
size_t erase(const_key_reference key)
{
ETL_OR_STD::pair<iterator, iterator> range = equal_range(key);
if (range.first == end())
{
return 0;
}
else
{
size_t d = static_cast<size_t>(etl::distance(range.first, range.second));
erase(range.first, range.second);
return d;
}
}
#if ETL_USING_CPP11
//*********************************************************************
template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value, int> = 0>
size_t erase(K&& key)
{
ETL_OR_STD::pair<iterator, iterator> range = equal_range(etl::forward<K>(key));
if (range.first == end())
{
return 0;
}
else
{
size_t d = static_cast<size_t>(etl::distance(range.first, range.second));
erase(range.first, range.second);
return d;
}
}
#endif
//*********************************************************************
//*********************************************************************
iterator erase(iterator i_element)
{
i_element->~value_type();
storage.release(etl::addressof(*i_element));
ETL_DECREMENT_DEBUG_COUNT;
return refmap_t::erase(i_element);
}
//*********************************************************************
//*********************************************************************
iterator erase(const_iterator i_element)
{
i_element->~value_type();
storage.release(etl::addressof(*i_element));
ETL_DECREMENT_DEBUG_COUNT;
return refmap_t::erase(i_element);
}
//*********************************************************************
//*********************************************************************
iterator erase(const_iterator first, const_iterator last)
{
const_iterator itr = first;
while (itr != last)
{
itr->~value_type();
storage.release(etl::addressof(*itr));
++itr;
ETL_DECREMENT_DEBUG_COUNT;
}
return refmap_t::erase(first, last);
}
//*************************************************************************
//*************************************************************************
void clear()
{
if ETL_IF_CONSTEXPR (etl::is_trivially_destructible<value_type>::value)
{
storage.release_all();
}
else
{
iterator itr = begin();
while (itr != end())
{
itr->~value_type();
storage.release(etl::addressof(*itr));
++itr;
}
}
ETL_RESET_DEBUG_COUNT;
refmap_t::clear();
}
//*********************************************************************
//*********************************************************************
iterator find(const_key_reference key)
{
return refmap_t::find(key);
}
#if ETL_USING_CPP11
//*********************************************************************
template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value, int> = 0>
iterator find(const K& key)
{
return refmap_t::find(key);
}
#endif
//*********************************************************************
//*********************************************************************
const_iterator find(const_key_reference key) const
{
return refmap_t::find(key);
}
#if ETL_USING_CPP11
//*********************************************************************
template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value, int> = 0>
const_iterator find(const K& key) const
{
return refmap_t::find(key);
}
#endif
//*********************************************************************
//*********************************************************************
size_t count(const_key_reference key) const
{
return refmap_t::count(key);
}
#if ETL_USING_CPP11
//*********************************************************************
template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value, int> = 0>
size_t count(const K& key) const
{
return refmap_t::count(key);
}
#endif
//*********************************************************************
//*********************************************************************
iterator lower_bound(const_key_reference key)
{
return refmap_t::lower_bound(key);
}
#if ETL_USING_CPP11
//*********************************************************************
template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value, int> = 0>
iterator lower_bound(const K& key)
{
return refmap_t::lower_bound(key);
}
#endif
//*********************************************************************
//*********************************************************************
const_iterator lower_bound(const_key_reference key) const
{
return refmap_t::lower_bound(key);
}
#if ETL_USING_CPP11
//*********************************************************************
template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value, int> = 0>
const_iterator lower_bound(const K& key) const
{
return refmap_t::lower_bound(key);
}
#endif
//*********************************************************************
//*********************************************************************
iterator upper_bound(const_key_reference key)
{
return refmap_t::upper_bound(key);
}
#if ETL_USING_CPP11
//*********************************************************************
template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value, int> = 0>
iterator upper_bound(const K& key)
{
return refmap_t::upper_bound(key);
}
#endif
//*********************************************************************
//*********************************************************************
const_iterator upper_bound(const_key_reference key) const
{
return refmap_t::upper_bound(key);
}
#if ETL_USING_CPP11
//*********************************************************************
template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value, int> = 0>
const_iterator upper_bound(const K& key) const
{
return refmap_t::upper_bound(key);
}
#endif
//*********************************************************************
//*********************************************************************
ETL_OR_STD::pair<iterator, iterator> equal_range(const_key_reference key)
{
return refmap_t::equal_range(key);
}
#if ETL_USING_CPP11
//*********************************************************************
template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value, int> = 0>
ETL_OR_STD::pair<iterator, iterator> equal_range(const K& key)
{
return refmap_t::equal_range(key);
}
#endif
//*********************************************************************
//*********************************************************************
ETL_OR_STD::pair<const_iterator, const_iterator> equal_range(const_key_reference key) const
{
return refmap_t::equal_range(key);
}
#if ETL_USING_CPP11
//*********************************************************************
template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value, int> = 0>
ETL_OR_STD::pair<const_iterator, const_iterator> equal_range(const K& key) const
{
return refmap_t::equal_range(key);
}
#endif
//*************************************************************************
//*************************************************************************
bool contains(const_key_reference key) const
{
return find(key) != end();
}
#if ETL_USING_CPP11
//*************************************************************************
template <typename K, typename KC = TKeyCompare, etl::enable_if_t<comparator_is_transparent<KC>::value, int> = 0>
bool contains(const K& k) const
{
return find(k) != end();
}
#endif
//*************************************************************************
//*************************************************************************
iflat_multimap& operator=(const iflat_multimap& rhs)
{
if (&rhs != this)
{
assign(rhs.cbegin(), rhs.cend());
}
return *this;
}
#if ETL_USING_CPP11
//*************************************************************************
//*************************************************************************
iflat_multimap& operator=(iflat_multimap&& rhs)
{
move_container(etl::move(rhs));
return *this;
}
#endif
//*************************************************************************
//*************************************************************************
size_type size() const
{
return refmap_t::size();
}
//*************************************************************************
//*************************************************************************
bool empty() const
{
return refmap_t::empty();
}
//*************************************************************************
//*************************************************************************
bool full() const
{
return refmap_t::full();
}
//*************************************************************************
//*************************************************************************
size_type capacity() const
{
return refmap_t::capacity();
}
//*************************************************************************
//*************************************************************************
size_type max_size() const
{
return refmap_t::max_size();
}
//*************************************************************************
//*************************************************************************
size_t available() const
{
return refmap_t::available();
}
protected:
//*********************************************************************
//*********************************************************************
iflat_multimap(lookup_t& lookup_, storage_t& storage_)
: refmap_t(lookup_)
, storage(storage_)
{
}
#if ETL_USING_CPP11
//*************************************************************************
//*************************************************************************
void move_container(iflat_multimap&& rhs)
{
if (&rhs != this)
{
this->clear();
etl::iflat_multimap<TKey, TMapped, TKeyCompare>::iterator first = rhs.begin();
etl::iflat_multimap<TKey, TMapped, TKeyCompare>::iterator last = rhs.end();
// Move all of the elements.
while (first != last)
{
typename etl::iflat_multimap<TKey, TMapped, TKeyCompare>::iterator temp = first;
++temp;
this->insert(etl::move(*first));
first = temp;
}
}
}
#endif
private:
// Disable copy construction.
iflat_multimap(const iflat_multimap&);
storage_t& storage;
ETL_DECLARE_DEBUG_COUNT;
//*************************************************************************
//*************************************************************************
#if defined(ETL_POLYMORPHIC_FLAT_MULTIMAP) || defined(ETL_POLYMORPHIC_CONTAINERS)
public:
virtual ~iflat_multimap() {}
#else
protected:
~iflat_multimap() {}
#endif
};
//***************************************************************************
//***************************************************************************
template <typename TKey, typename TMapped, typename TKeyCompare>
bool operator==(const etl::iflat_multimap<TKey, TMapped, TKeyCompare>& lhs, const etl::iflat_multimap<TKey, TMapped, TKeyCompare>& rhs)
{
return (lhs.size() == rhs.size()) && etl::equal(lhs.begin(), lhs.end(), rhs.begin());
}
//***************************************************************************
//***************************************************************************
template <typename TKey, typename TMapped, typename TKeyCompare>
bool operator!=(const etl::iflat_multimap<TKey, TMapped, TKeyCompare>& lhs, const etl::iflat_multimap<TKey, TMapped, TKeyCompare>& rhs)
{
return !(lhs == rhs);
}
//***************************************************************************
//***************************************************************************
template <typename TKey, typename TValue, const size_t MAX_SIZE_, typename TCompare = etl::less<TKey> >
class flat_multimap : public etl::iflat_multimap<TKey, TValue, TCompare>
{
public:
static ETL_CONSTANT size_t MAX_SIZE = MAX_SIZE_;
//*************************************************************************
//*************************************************************************
flat_multimap()
: etl::iflat_multimap<TKey, TValue, TCompare>(lookup, storage)
{
}
//*************************************************************************
//*************************************************************************
flat_multimap(const flat_multimap& other)
: etl::iflat_multimap<TKey, TValue, TCompare>(lookup, storage)
{
this->assign(other.cbegin(), other.cend());
}
#if ETL_USING_CPP11
//*************************************************************************
//*************************************************************************
flat_multimap(flat_multimap&& other)
: etl::iflat_multimap<TKey, TValue, TCompare>(lookup, storage)
{
if (&other != this)
{
this->move_container(etl::move(other));
}
}
#endif
//*************************************************************************
//*************************************************************************
template <typename TIterator>
flat_multimap(TIterator first, TIterator last)
: etl::iflat_multimap<TKey, TValue, TCompare>(lookup, storage)
{
this->assign(first, last);
}
#if ETL_HAS_INITIALIZER_LIST
//*************************************************************************
//*************************************************************************
flat_multimap(std::initializer_list< typename etl::iflat_multimap<TKey, TValue, TCompare>::value_type> init)
: etl::iflat_multimap<TKey, TValue, TCompare>(lookup, storage)
{
this->assign(init.begin(), init.end());
}
#endif
//*************************************************************************
//*************************************************************************
~flat_multimap()
{
this->clear();
}
//*************************************************************************
//*************************************************************************
flat_multimap& operator=(const flat_multimap& rhs)
{
if (&rhs != this)
{
this->assign(rhs.cbegin(), rhs.cend());
}
return *this;
}
#if ETL_USING_CPP11
//*************************************************************************
//*************************************************************************
flat_multimap& operator=(flat_multimap&& rhs)
{
if (&rhs != this)
{
this->move_container(etl::move(rhs));
}
return *this;
}
#endif
private:
typedef typename etl::iflat_multimap<TKey, TValue, TCompare>::value_type node_t;
// The pool of nodes.
etl::pool<node_t, MAX_SIZE> storage;
// The vector that stores pointers to the nodes.
etl::vector<node_t*, MAX_SIZE> lookup;
};
template <typename TKey, typename TValue, const size_t MAX_SIZE_, typename TCompare>
ETL_CONSTANT size_t flat_multimap<TKey, TValue, MAX_SIZE_, TCompare>::MAX_SIZE;
//*************************************************************************
//*************************************************************************
#if ETL_USING_CPP17 && ETL_HAS_INITIALIZER_LIST
template <typename... TPairs>
flat_multimap(TPairs...)
-> flat_multimap<typename etl::nth_type_t<0, TPairs...>::first_type, typename etl::nth_type_t<0, TPairs...>::second_type, sizeof...(TPairs)>;
#endif
//*************************************************************************
//*************************************************************************
#if ETL_USING_CPP11 && ETL_HAS_INITIALIZER_LIST
template <typename TKey, typename TMapped, typename TKeyCompare = etl::less<TKey>, typename... TPairs>
constexpr auto make_flat_multimap(TPairs&&... pairs) -> etl::flat_multimap<TKey, TMapped, sizeof...(TPairs), TKeyCompare>
{
return {etl::forward<TPairs>(pairs)...};
}
#endif
} // namespace etl
#endif
etl::flat_multimap_full
Definition reference_flat_multimap.h:68
etl::ireference_flat_multimap
Definition reference_flat_multimap.h:85
etl::ireference_flat_multimap< TKey, TMapped, TKeyCompare >::crbegin
const_reverse_iterator crbegin() const
Definition reference_flat_multimap.h:429
etl::ireference_flat_multimap< TKey, TMapped, TKeyCompare >::count
size_t count(key_parameter_t key) const
Definition reference_flat_multimap.h:708
etl::ireference_flat_multimap< TKey, TMapped, TKeyCompare >::equal_range
ETL_OR_STD::pair< iterator, iterator > equal_range(key_parameter_t key)
Definition reference_flat_multimap.h:807
etl::ireference_flat_multimap< TKey, TMapped, TKeyCompare >::lower_bound
iterator lower_bound(key_parameter_t key)
Definition reference_flat_multimap.h:731
etl::ireference_flat_multimap< TKey, TMapped, TKeyCompare >::rbegin
reverse_iterator rbegin()
Definition reference_flat_multimap.h:386
etl::ireference_flat_multimap< TKey, TMapped, TKeyCompare >::crend
const_reverse_iterator crend() const
Definition reference_flat_multimap.h:440
etl::ireference_flat_multimap< TKey, TMapped, TKeyCompare >::upper_bound
iterator upper_bound(key_parameter_t key)
Definition reference_flat_multimap.h:769
etl::ireference_flat_multimap< TKey, TMapped, TKeyCompare >::empty
bool empty() const
Definition reference_flat_multimap.h:878
etl::ireference_flat_multimap< TKey, TMapped, TKeyCompare >::cbegin
const_iterator cbegin() const
Definition reference_flat_multimap.h:367
etl::ireference_flat_multimap< TKey, TMapped, TKeyCompare >::size
size_type size() const
Definition reference_flat_multimap.h:869
etl::ireference_flat_multimap< TKey, TMapped, TKeyCompare >::insert_at
ETL_OR_STD::pair< iterator, bool > insert_at(iterator i_element, value_type &value)
Definition reference_flat_multimap.h:934
etl::ireference_flat_multimap< TKey, TMapped, TKeyCompare >::available
size_t available() const
Definition reference_flat_multimap.h:914
etl::ireference_flat_multimap::full
bool full() const
Definition reference_flat_multimap.h:887
etl::ireference_flat_multimap< TKey, TMapped, TKeyCompare >::erase
size_t erase(key_parameter_t key)
Definition reference_flat_multimap.h:535
etl::ireference_flat_multimap< TKey, TMapped, TKeyCompare >::begin
iterator begin()
Definition reference_flat_multimap.h:329
etl::ireference_flat_multimap< TKey, TMapped, TKeyCompare >::end
iterator end()
Definition reference_flat_multimap.h:348
etl::ireference_flat_multimap< TKey, TMapped, TKeyCompare >::find
iterator find(key_parameter_t key)
Definition reference_flat_multimap.h:614
etl::ireference_flat_multimap< TKey, TMapped, TKeyCompare >::cend
const_iterator cend() const
Definition reference_flat_multimap.h:376
etl::ireference_flat_multimap< TKey, TMapped, TKeyCompare >::max_size
size_type max_size() const
Definition reference_flat_multimap.h:905
etl::ireference_flat_multimap< TKey, TMapped, TKeyCompare >::clear
void clear()
Definition reference_flat_multimap.h:604
etl::ireference_flat_multimap< TKey, TMapped, TKeyCompare >::capacity
size_type capacity() const
Definition reference_flat_multimap.h:896
etl::ireference_flat_multimap< TKey, TMapped, TKeyCompare >::rend
reverse_iterator rend()
Definition reference_flat_multimap.h:407
comparator_is_transparent.h
etl::const_iterator
ETL_ASSERT
#define ETL_ASSERT(b, e)
Definition error_handler.h:511
etl::iflat_multimap::begin
const_iterator begin() const
Definition flat_multimap.h:137
etl::iflat_multimap::crbegin
const_reverse_iterator crbegin() const
Definition flat_multimap.h:222
etl::iflat_multimap::rbegin
reverse_iterator rbegin()
Definition flat_multimap.h:183
etl::iflat_multimap::end
iterator end()
Definition flat_multimap.h:146
etl::flat_multimap::operator=
flat_multimap & operator=(const flat_multimap &rhs)
Assignment operator.
Definition flat_multimap.h:1020
etl::iflat_multimap::capacity
size_type capacity() const
Definition flat_multimap.h:826
etl::iflat_multimap::size
size_type size() const
Definition flat_multimap.h:799
etl::iflat_multimap::cbegin
const_iterator cbegin() const
Definition flat_multimap.h:164
etl::iflat_multimap::emplace
ETL_OR_STD::pair< iterator, bool > emplace(const key_type &key, const T1 &value1, const T2 &value2)
Emplaces a value to the map.
Definition flat_multimap.h:418
etl::iflat_multimap::available
size_t available() const
Definition flat_multimap.h:844
etl::iflat_multimap::equal_range
ETL_OR_STD::pair< const_iterator, const_iterator > equal_range(const_key_reference key) const
Definition flat_multimap.h:739
etl::flat_multimap::flat_multimap
flat_multimap(TIterator first, TIterator last)
Definition flat_multimap.h:992
etl::iflat_multimap::rbegin
const_reverse_iterator rbegin() const
Definition flat_multimap.h:193
etl::iflat_multimap::full
bool full() const
Definition flat_multimap.h:817
etl::iflat_multimap::upper_bound
const_iterator upper_bound(const_key_reference key) const
Definition flat_multimap.h:701
etl::iflat_multimap::max_size
size_type max_size() const
Definition flat_multimap.h:835
etl::iflat_multimap::erase
size_t erase(const_key_reference key)
Definition flat_multimap.h:475
etl::iflat_multimap::count
size_t count(const_key_reference key) const
Definition flat_multimap.h:625
etl::iflat_multimap::rend
const_reverse_iterator rend() const
Definition flat_multimap.h:211
etl::iflat_multimap::erase
iterator erase(const_iterator i_element)
Definition flat_multimap.h:527
etl::iflat_multimap::iflat_multimap
iflat_multimap(lookup_t &lookup_, storage_t &storage_)
Constructor.
Definition flat_multimap.h:854
etl::iflat_multimap::insert
iterator insert(const_iterator, const value_type &value)
Definition flat_multimap.h:314
etl::iflat_multimap::emplace
ETL_OR_STD::pair< iterator, bool > emplace(const value_type &value)
Emplaces a value to the map.
Definition flat_multimap.h:354
etl::iflat_multimap::end
const_iterator end() const
Definition flat_multimap.h:155
etl::iflat_multimap::operator=
iflat_multimap & operator=(const iflat_multimap &rhs)
Assignment operator.
Definition flat_multimap.h:773
etl::flat_multimap::flat_multimap
flat_multimap()
Constructor.
Definition flat_multimap.h:957
etl::iflat_multimap::crend
const_reverse_iterator crend() const
Definition flat_multimap.h:231
etl::iflat_multimap::emplace
ETL_OR_STD::pair< iterator, bool > emplace(const key_type &key, const mapped_type &mapped)
Emplaces a value to the map.
Definition flat_multimap.h:362
etl::iflat_multimap::contains
bool contains(const_key_reference key) const
Check if the map contains the key.
Definition flat_multimap.h:756
etl::iflat_multimap::begin
iterator begin()
Definition flat_multimap.h:128
etl::iflat_multimap::cend
const_iterator cend() const
Definition flat_multimap.h:173
etl::iflat_multimap::clear
void clear()
Clears the flat_multimap.
Definition flat_multimap.h:560
etl::iflat_multimap::emplace
ETL_OR_STD::pair< iterator, bool > emplace(const key_type &key, const T1 &value1, const T2 &value2, const T3 &value3, const T4 &value4)
Emplaces a value to the map.
Definition flat_multimap.h:454
etl::iflat_multimap::rend
reverse_iterator rend()
Definition flat_multimap.h:202
etl::iflat_multimap::erase
iterator erase(const_iterator first, const_iterator last)
Definition flat_multimap.h:542
etl::flat_multimap::~flat_multimap
~flat_multimap()
Destructor.
Definition flat_multimap.h:1012
etl::iflat_multimap::equal_range
ETL_OR_STD::pair< iterator, iterator > equal_range(const_key_reference key)
Definition flat_multimap.h:720
etl::iflat_multimap::assign
void assign(TIterator first, TIterator last)
Definition flat_multimap.h:245
etl::iflat_multimap::upper_bound
iterator upper_bound(const_key_reference key)
Definition flat_multimap.h:682
etl::iflat_multimap::emplace
ETL_OR_STD::pair< iterator, bool > emplace(const key_type &key, const T1 &value1, const T2 &value2, const T3 &value3)
Emplaces a value to the map.
Definition flat_multimap.h:436
etl::iflat_multimap::insert
ETL_OR_STD::pair< iterator, bool > insert(const value_type &value)
Definition flat_multimap.h:267
etl::iflat_multimap::find
const_iterator find(const_key_reference key) const
Definition flat_multimap.h:606
etl::iflat_multimap::lower_bound
const_iterator lower_bound(const_key_reference key) const
Definition flat_multimap.h:663
etl::iflat_multimap::~iflat_multimap
~iflat_multimap()
Destructor.
Definition flat_multimap.h:909
etl::flat_multimap::flat_multimap
flat_multimap(const flat_multimap &other)
Copy constructor.
Definition flat_multimap.h:965
etl::iflat_multimap::empty
bool empty() const
Definition flat_multimap.h:808
etl::iflat_multimap::insert
void insert(TIterator first, TIterator last)
Definition flat_multimap.h:342
etl::iflat_multimap::emplace
ETL_OR_STD::pair< iterator, bool > emplace(const key_type &key, const T1 &value1)
Emplaces a value to the map.
Definition flat_multimap.h:400
etl::iflat_multimap::find
iterator find(const_key_reference key)
Definition flat_multimap.h:587
etl::iflat_multimap::lower_bound
iterator lower_bound(const_key_reference key)
Definition flat_multimap.h:644
etl::iflat_multimap::erase
iterator erase(iterator i_element)
Definition flat_multimap.h:515
etl::flat_multimap
Definition flat_multimap.h:949
etl::iflat_multimap
Definition flat_multimap.h:63
etl::addressof
ETL_CONSTEXPR17 etl::enable_if<!etl::is_same< T, etl::nullptr_t >::value, T >::type * addressof(T &t)
Definition addressof.h:52
etl::ipool::allocate
T * allocate()
Definition ipool.h:334
etl::ipool
Definition ipool.h:110
initializer_list.h
etl
Definition absolute.h:40
etl::operator==
ETL_CONSTEXPR14 bool operator==(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1078
etl::operator!=
ETL_CONSTEXPR14 bool operator!=(const etl::array< T, SIZE > &lhs, const etl::array< T, SIZE > &rhs)
Definition array.h:1090
etl::end
TContainer::iterator end(TContainer &container)
Definition iterator.h:1166
placement_new.h
platform.h
pool.h
reference_flat_multimap.h
etl::value_type
etl::iterator
iterator
Definition iterator.h:482
type_traits.h
utility.h