Stroika Library 3.0d18
 
Loading...
Searching...
No Matches
Mapping_HashTable.h
1/*
2 * Copyright(c) Sophist Solutions, Inc. 1990-2025. All rights reserved
3 */
4#ifndef _Stroika_Foundation_Containers_Concrete_Mapping_HashTable_h_
5#define _Stroika_Foundation_Containers_Concrete_Mapping_HashTable_h_
6
7#include "Stroika/Foundation/StroikaPreComp.h"
8
10#include "Stroika/Foundation/Containers/DataStructures/HashTable.h"
11#include "Stroika/Foundation/Containers/Mapping.h"
13#include "Stroika/Foundation/Cryptography/Digest/HashBase.h"
14
15/**
16 * \note Code-Status: <a href="Code-Status.md#Beta">Beta</a>
17 */
18
20
21 /**
22 * \brief Mapping_HashTable<KEY_TYPE, MAPPED_VALUE_TYPE, TRAITS> is a HashTable based concrete implementation of the Mapping<KEY_TYPE, MAPPED_VALUE_TYPE> container pattern.
23 *
24 * \note Runtime performance/complexity:
25 * o size () is constant complexity
26 *
27 * \note \em Thread-Safety <a href="Thread-Safety.md#C++-Standard-Thread-Safety">C++-Standard-Thread-Safety</a>
28 */
29 template <typename KEY_TYPE, typename MAPPED_VALUE_TYPE>
31 : public Private::HashTableBasedContainer<Mapping_HashTable<KEY_TYPE, MAPPED_VALUE_TYPE>, Mapping<KEY_TYPE, MAPPED_VALUE_TYPE>> {
32 private:
34
35 public:
36 using KeyEqualsCompareFunctionType = typename inherited::KeyEqualsCompareFunctionType;
37 using key_type = typename inherited::key_type;
38 using value_type = typename inherited::value_type;
39 using mapped_type = typename inherited::mapped_type;
40
41 public:
42 template <Cryptography::Digest::IHashFunction<KEY_TYPE> HASHER = hash<KEY_TYPE>, IEqualsComparer<KEY_TYPE> KEY_EQUALS_COMPARER = equal_to<KEY_TYPE>,
43 typename LAYOUT_OPTIONS = DataStructures::HashTable_Support::SeparateChainingOptions<KEY_TYPE, MAPPED_VALUE_TYPE>>
44 using DefaultTraits =
46
47 public:
48 /**
49 * \brief HashTable is DataStructures::HashTable<...> that can be used inside Mapping_HashTable
50 */
51 template <DataStructures::HashTable_Support::IValidTraits<KEY_TYPE, MAPPED_VALUE_TYPE> HASH_TABLE_TRAITS>
53
54 public:
55 /**
56 * Convenient shorthand - not 100% sure why I couldn't just do this with default template arg to HASHTABLE, but didn't compile on gcc/clang?
57 */
58 template <typename K = KEY_TYPE>
59 requires (Cryptography::Digest::IHashFunction<std::hash<K>, K> and IEqualsComparer<std::equal_to<K>, K>)
60 using DEFAULT_HASHTABLE = DataStructures::HashTable<KEY_TYPE, MAPPED_VALUE_TYPE, DefaultTraits<std::hash<K>, equal_to<K>>>;
61
62 public:
63 /**
64 * @todo UPDATE THESE DOCS - REVIEW AND COMPARE - BUT THIS IS LITERALLY QUTIE WRONG
65 * \see docs on Mapping<> constructor, except that KEY_EQUALS_COMPARER is replaced with KEY_INORDER_COMPARER and EqualsComparer is replaced by IInOrderComparer
66 * and added Mapping_HashTable (STDHASHMAP<>&& src)
67 */
69 requires (Cryptography::Digest::IHashFunction<std::hash<KEY_TYPE>, KEY_TYPE> and IEqualsComparer<std::equal_to<KEY_TYPE>, KEY_TYPE>);
70 template <DataStructures::HashTable_Support::IValidTraits<KEY_TYPE, MAPPED_VALUE_TYPE> HASH_TABLE_TRAITS>
71 requires (HASH_TABLE_TRAITS::kAddOrExtendOrReplace == AddOrExtendOrReplaceMode::eAddReplaces)
73 template <Cryptography::Digest::IHashFunction<KEY_TYPE> HASH, IEqualsComparer<KEY_TYPE> KEY_EQUALS_COMPARER>
74 explicit Mapping_HashTable (HASH&& hasher, KEY_EQUALS_COMPARER&& keyComparer);
75 Mapping_HashTable (Mapping_HashTable&&) noexcept = default;
76 Mapping_HashTable (const Mapping_HashTable&) noexcept = default;
77 Mapping_HashTable (const initializer_list<KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>>& src)
78#if !qCompilerAndStdLib_requires_breaks_soemtimes_but_static_assert_ok_Buggy
79 requires (default_initializable<Mapping_HashTable>)
80#endif
81 ;
82 template <typename HASH, IEqualsComparer<KEY_TYPE> KEY_EQUALS_COMPARER>
84 Mapping_HashTable (HASH&& hasher, KEY_EQUALS_COMPARER&& keyComparer, const initializer_list<KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>>& src);
85 template <IIterableOfTo<KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>> ITERABLE_OF_ADDABLE>
86 requires (
87#if qCompilerAndStdLib_default_initializable_broken_Buggy
88 is_default_constructible_v<Mapping_HashTable<KEY_TYPE, MAPPED_VALUE_TYPE>>
89#else
90 default_initializable<Mapping_HashTable<KEY_TYPE, MAPPED_VALUE_TYPE>>
91#endif
92 and not derived_from<remove_cvref_t<ITERABLE_OF_ADDABLE>, Mapping_HashTable<KEY_TYPE, MAPPED_VALUE_TYPE>>)
93 explicit Mapping_HashTable (ITERABLE_OF_ADDABLE&& src)
94#if qCompilerAndStdLib_RequiresNotMatchInlineOutOfLineForTemplateClassBeingDefined_Buggy
96 {
97 this->AddAll (forward<ITERABLE_OF_ADDABLE> (src));
98 AssertRepValidType_ ();
99 }
100#endif
101 ;
102 template <typename HASH, IEqualsComparer<KEY_TYPE> KEY_EQUALS_COMPARER, IIterableOfTo<KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>> ITERABLE_OF_ADDABLE>
103 Mapping_HashTable (HASH&& hasher, KEY_EQUALS_COMPARER&& keyComparer, ITERABLE_OF_ADDABLE&& src)
105 not derived_from<remove_cvref_t<ITERABLE_OF_ADDABLE>, Mapping_HashTable<KEY_TYPE, MAPPED_VALUE_TYPE>>)
106#if qCompilerAndStdLib_RequiresNotMatchInlineOutOfLineForTemplateClassBeingDefined_Buggy
107 : Mapping_HashTable{forward<HASH> (hasher), forward<KEY_EQUALS_COMPARER> (keyComparer)}
108 {
109 this->AddAll (forward<ITERABLE_OF_ADDABLE> (src));
110 AssertRepValidType_ ();
111 }
112#endif
113 ;
114 template <IInputIterator<KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>> ITERATOR_OF_ADDABLE>
115 Mapping_HashTable (ITERATOR_OF_ADDABLE&& start, ITERATOR_OF_ADDABLE&& end)
116#if !qCompilerAndStdLib_requires_breaks_soemtimes_but_static_assert_ok_Buggy
117 requires (default_initializable<Mapping_HashTable>)
118#endif
119 ;
120 template <typename HASH, IEqualsComparer<KEY_TYPE> KEY_EQUALS_COMPARER, IInputIterator<KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>> ITERATOR_OF_ADDABLE>
121 Mapping_HashTable (HASH&& hasher, KEY_EQUALS_COMPARER&& keyComparer, ITERATOR_OF_ADDABLE&& start, ITERATOR_OF_ADDABLE&& end)
123
124 public:
125 /**
126 */
127 nonvirtual Mapping_HashTable& operator= (Mapping_HashTable&&) noexcept = default;
128 nonvirtual Mapping_HashTable& operator= (const Mapping_HashTable&) = default;
129
130 private:
131 using IImplRepBase_ = Private::HashTableBasedContainerIRep<typename Mapping<KEY_TYPE, MAPPED_VALUE_TYPE>::_IRep>;
132 template <qCompilerAndStdLib_ConstraintDiffersInTemplateRedeclaration_BWA (DataStructures::HashTable_Support::IValidTraits<KEY_TYPE, MAPPED_VALUE_TYPE>) HASH_TABLE_TRAITS>
133#if !qCompilerAndStdLib_template_ConstraintDiffersInTemplateRedeclaration_Buggy
134 requires (HASH_TABLE_TRAITS::kAddOrExtendOrReplace == AddOrExtendOrReplaceMode::eAddReplaces)
135#endif
136 class Rep_;
137
138 private:
139 nonvirtual void AssertRepValidType_ () const;
140
141 private:
142 friend inherited;
143 };
144
145}
146
147/*
148 ********************************************************************************
149 ******************************* Implementation Details *************************
150 ********************************************************************************
151 */
152#include "Mapping_HashTable.inl"
153
154#endif /*_Stroika_Foundation_Containers_Concrete_Mapping_HashTable_h_ */
Mapping_HashTable<KEY_TYPE, MAPPED_VALUE_TYPE, TRAITS> is a HashTable based concrete implementation o...
implement hash table support in a lightweight standard template library style. Use traits to describe...
Definition HashTable.h:132
Common::ComparisonRelationDeclaration< Common::ComparisonRelationType::eEquals, function< bool(ArgByValueType< key_type >, ArgByValueType< key_type >)> > KeyEqualsCompareFunctionType
nonvirtual unsigned int AddAll(ITERABLE_OF_ADDABLE &&items, AddReplaceMode addReplaceMode=AddReplaceMode::eAddReplaces)
HashTableBasedContainer is a Stroika implementation detail, but its public methods are fair game and ...
static constexpr default_sentinel_t end() noexcept
Support for ranged for, and STL syntax in general.
check argument FUNCTION is callable with a HASHABLE_T, and produces (something convertible to) size_t
Definition HashBase.h:28