26#ifndef QB_UNORDERED_MAP_H
27#define QB_UNORDERED_MAP_H
30#include <ska_hash/unordered_map.hpp>
31#include <unordered_map>
48template <
typename K,
typename V,
typename H = std::hash<K>,
49 typename E = std::equal_to<K>,
50 typename A = std::allocator<std::pair<const K, V>>>
68template <
typename K,
typename V,
typename H = std::hash<K>,
69 typename E = std::equal_to<K>,
70 typename A = std::allocator<std::pair<const K, V>>>
87template <
typename K,
typename V,
typename H = std::hash<K>,
88 typename E = std::equal_to<K>,
89 typename A = std::allocator<std::pair<const K, V>>>
106 constexpr static char
107 charToLower(
const char c) {
108 return (c >=
'A' && c <=
'Z') ? c + (
'a' -
'A') : c;
116 template <std::
size_t N>
130 template <
typename T, T... Nums>
131 constexpr const_str(
const char (&str)[N], std::integer_sequence<T, Nums...>)
132 : s{charToLower(str[Nums])..., 0} {}
141 operator[](std::size_t i)
const {
150 operator const char *()
const {
162 template <std::
size_t N>
163 constexpr static const_str<N>
164 toLower(
const char (&str)[N]) {
165 return {str, std::make_integer_sequence<unsigned, N>()};
176 template <std::
size_t N>
179 return std::string{toLower(str), N - 1};
191 copy.reserve(str.size());
192 std::for_each(str.cbegin(), str.cend(),
193 [©](
const char &c) { copy += charToLower(c); });
206 copy.reserve(str.size());
207 std::for_each(str.cbegin(), str.cend(),
208 [©](
const char &c) { copy += charToLower(c); });
222template <
typename _Map,
typename _Trait =
string_to_lower>
243 emplace(it.first, std::move(it.second));
261 template <typename T, typename... _Args>
264 return static_cast<base_t &
>(*this).emplace(
265 _Trait::convert(std::forward<T>(key)), std::forward<_Args>(args)...);
277 template <
typename T,
typename... _Args>
280 return static_cast<base_t &
>(*this).try_emplace(
281 _Trait::convert(std::forward<T>(key)), std::forward<_Args>(args)...);
292 template <
typename T>
295 return static_cast<base_t &
>(*this).at(_Trait::convert(std::forward<T>(key)));
306 template <
typename T>
309 return static_cast<base_t
const &
>(*this).at(
310 _Trait::convert(std::forward<T>(key)));
320 template <
typename T>
323 return static_cast<base_t &
>(*this)[_Trait::convert(std::forward<T>(key))];
333 template <
typename T>
336 return static_cast<base_t &
>(*this).find(_Trait::convert(std::forward<T>(key)));
347 template <
typename T>
350 return static_cast<base_t
const &
>(*this).find(
351 _Trait::convert(std::forward<T>(key)));
361 template <
typename T>
364 return find(std::forward<T>(key)) != this->cend();
374 template <
typename T>
377 return static_cast<base_t &
>(*this).erase(_Trait::convert(std::forward<T>(key)));
382 using base_t::cbegin;
399 template <
typename T>
402 return _Trait::convert(std::forward<T>(key));
412template <
typename Value,
typename _Trait =
string_to_lower>
421template <
typename Value,
typename _Trait =
string_to_lower>
A case-insensitive map implementation.
Definition unordered_map.h:223
const auto & at(T &&key) const
Access a value by key, with the key converted to lowercase (const version)
Definition unordered_map.h:308
icase_basic_map & operator=(icase_basic_map const &)=default
Copy assignment operator.
auto find(T &&key) const
Find a key-value pair by key, with the key converted to lowercase (const version)
Definition unordered_map.h:349
auto find(T &&key)
Find a key-value pair by key, with the key converted to lowercase.
Definition unordered_map.h:335
static std::string convert_key(T &&key) noexcept
Convert a key to lowercase.
Definition unordered_map.h:401
icase_basic_map(icase_basic_map &&) noexcept=default
Move constructor.
bool has(T &&key) const
Check if a key exists in the map.
Definition unordered_map.h:363
icase_basic_map(icase_basic_map const &)=default
Copy constructor.
auto try_emplace(T &&key, _Args &&...args)
Try to emplace a new key-value pair with the key converted to lowercase.
Definition unordered_map.h:279
auto erase(T &&key)
Erase a key-value pair by key, with the key converted to lowercase.
Definition unordered_map.h:376
icase_basic_map()=default
Default constructor.
auto emplace(T &&key, _Args &&...args)
Emplace a new key-value pair with the key converted to lowercase.
Definition unordered_map.h:263
icase_basic_map & operator=(icase_basic_map &&) noexcept=default
Move assignment operator.
auto & operator[](T &&key)
Access or insert a value by key, with the key converted to lowercase.
Definition unordered_map.h:322
auto & at(T &&key)
Access a value by key, with the key converted to lowercase.
Definition unordered_map.h:294
Utility class for case-insensitive string operations.
Definition unordered_map.h:99
static std::string convert(const char(&str)[N])
Converts a character array to lowercase.
Definition unordered_map.h:178
static std::string convert(std::string const &str)
Converts a string to lowercase.
Definition unordered_map.h:189
static std::string convert(std::string_view const &str)
Converts a string_view to lowercase.
Definition unordered_map.h:204
std::unordered_map< K, V, H, E, A > unordered_map
The primary unordered map implementation.
Definition unordered_map.h:90
icase_basic_map< std::map< std::string, Value >, _Trait > icase_map
Case-insensitive ordered map using std::map.
Definition unordered_map.h:413
icase_basic_map< qb::unordered_map< std::string, Value >, _Trait > icase_unordered_map
Case-insensitive unordered map using qb::unordered_map.
Definition unordered_map.h:422
ska::flat_hash_map< K, V, H, E, A > unordered_flat_map
A high-performance flat hash map implementation.
Definition unordered_map.h:51