map/fixed: add custom comparator support
This commit is contained in:
parent
6fba251a38
commit
1cd107d27e
@ -13,13 +13,19 @@
|
|||||||
#include <array>
|
#include <array>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
|
#include <functional>
|
||||||
|
|
||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
|
|
||||||
|
|
||||||
namespace cruft::map {
|
namespace cruft::map {
|
||||||
/// A flat map structure with a static capacity store and dynamic size.
|
/// A flat map structure with a static capacity store and dynamic size.
|
||||||
template <std::size_t SizeV, typename KeyT, typename ValueT>
|
template <
|
||||||
|
std::size_t SizeV,
|
||||||
|
typename KeyT,
|
||||||
|
typename ValueT,
|
||||||
|
typename ComparatorT = std::equal_to<>
|
||||||
|
>
|
||||||
class fixed {
|
class fixed {
|
||||||
public:
|
public:
|
||||||
static constexpr auto elements = SizeV;
|
static constexpr auto elements = SizeV;
|
||||||
@ -64,8 +70,9 @@ namespace cruft::map {
|
|||||||
///////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////
|
||||||
mapped_type& at (KeyT const &key) &
|
mapped_type& at (KeyT const &key) &
|
||||||
{
|
{
|
||||||
|
ComparatorT cmp {};
|
||||||
for (auto &i: *this)
|
for (auto &i: *this)
|
||||||
if (i.first == key)
|
if (cmp (i.first, key))
|
||||||
return i.second;
|
return i.second;
|
||||||
|
|
||||||
throw std::out_of_range ("Element out of range");
|
throw std::out_of_range ("Element out of range");
|
||||||
@ -75,8 +82,9 @@ namespace cruft::map {
|
|||||||
//---------------------------------------------------------------------
|
//---------------------------------------------------------------------
|
||||||
mapped_type const& at (KeyT const &key) const&
|
mapped_type const& at (KeyT const &key) const&
|
||||||
{
|
{
|
||||||
|
ComparatorT cmp {};
|
||||||
for (auto &i: *this)
|
for (auto &i: *this)
|
||||||
if (i.first == key)
|
if (cmp (i.first, key))
|
||||||
return i.second;
|
return i.second;
|
||||||
|
|
||||||
throw std::out_of_range ("Element out of range");
|
throw std::out_of_range ("Element out of range");
|
||||||
@ -86,8 +94,9 @@ namespace cruft::map {
|
|||||||
//---------------------------------------------------------------------
|
//---------------------------------------------------------------------
|
||||||
std::pair<iterator,bool> insert (value_type const &keyval)
|
std::pair<iterator,bool> insert (value_type const &keyval)
|
||||||
{
|
{
|
||||||
|
ComparatorT cmp {};
|
||||||
for (auto &i: *this) {
|
for (auto &i: *this) {
|
||||||
if (i.first == keyval.first) {
|
if (cmp (i.first, keyval.first)) {
|
||||||
return { &i, false };
|
return { &i, false };
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -106,8 +115,9 @@ namespace cruft::map {
|
|||||||
//---------------------------------------------------------------------
|
//---------------------------------------------------------------------
|
||||||
mapped_type& operator[] (KeyT const &key)
|
mapped_type& operator[] (KeyT const &key)
|
||||||
{
|
{
|
||||||
|
ComparatorT cmp {};
|
||||||
for (auto &i: *this)
|
for (auto &i: *this)
|
||||||
if (i.first == key)
|
if (cmp (i.first, key))
|
||||||
return i.second;
|
return i.second;
|
||||||
|
|
||||||
if (m_size >= capacity ())
|
if (m_size >= capacity ())
|
||||||
|
Loading…
x
Reference in New Issue
Block a user