Loading...
Searching...
No Matches
sorted_string_map.hpp
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
// SPDX-FileCopyrightText: 2022 - 2025 Kohei Yoshida
//
// SPDX-License-Identifier: MIT
#pragma once
#include "./cref_wrapper.hpp"
#include <string_view>
#include <unordered_map>
namespace mdds {
namespace ssmap {
namespace detail {
template<typename ValueT>
struct map_entry
{
std::string_view key;
ValueT value;
};
} // namespace detail
template<typename ValueT>
class linear_key_finder
{
using value_type = ValueT;
using size_type = typename std::string_view::size_type;
using entry_type = detail::map_entry<ValueT>;
const entry_type* m_entries;
const entry_type* m_entries_end;
public:
linear_key_finder(const entry_type* entries, const entry_type* entries_end) noexcept;
std::string_view operator()(const value_type& v) const;
};
template<typename ValueT>
class hash_key_finder
{
using value_type = ValueT;
using size_type = typename std::string_view::size_type;
using entry_type = detail::map_entry<ValueT>;
using keystore_type = std::unordered_map<
mdds::detail::cref_wrapper<value_type>, size_type, typename mdds::detail::cref_wrapper<value_type>::hash>;
const entry_type* m_entries;
keystore_type m_keys;
public:
hash_key_finder(const entry_type* entries, const entry_type* entries_end);
std::string_view operator()(const value_type& v) const;
};
} // namespace ssmap
template<typename ValueT, template<typename> class KeyFinderT = ssmap::linear_key_finder>
class sorted_string_map
{
using func_find_key_type = KeyFinderT<ValueT>;
public:
using value_type = ValueT;
using size_type = typename std::string_view::size_type;
using entry_type = ssmap::detail::map_entry<ValueT>;
sorted_string_map(const entry_type* entries, size_type entry_size, value_type null_value);
const value_type& find(const char* input, size_type len) const;
const value_type& find(std::string_view input) const;
std::string_view find_key(const value_type& v) const;
size_type size() const;
private:
const entry_type* m_entries;
const value_type m_null_value;
const size_type m_entry_size;
const entry_type* m_entries_end;
func_find_key_type m_func_find_key;
};
} // namespace mdds
#include "sorted_string_map_def.inl"
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
mdds::detail::cref_wrapper
Definition cref_wrapper.hpp:20
mdds::sorted_string_map::find
const value_type & find(std::string_view input) const
mdds::sorted_string_map::find_key
std::string_view find_key(const value_type &v) const
mdds::sorted_string_map::sorted_string_map
sorted_string_map(const entry_type *entries, size_type entry_size, value_type null_value)
mdds::sorted_string_map::size
size_type size() const
mdds::sorted_string_map::entry_type
ssmap::detail::map_entry< ValueT > entry_type
Definition sorted_string_map.hpp:101
mdds::sorted_string_map::find
const value_type & find(const char *input, size_type len) const
mdds::ssmap::linear_key_finder
Definition sorted_string_map.hpp:34
mdds::detail::cref_wrapper::hash
Definition cref_wrapper.hpp:43
mdds::ssmap::detail::map_entry
Definition sorted_string_map.hpp:21