Stroika Library 3.0d16
 
Loading...
Searching...
No Matches
Mapping_stdhashmap.h
1/*
2 * Copyright(c) Sophist Solutions, Inc. 1990-2025. All rights reserved
3 */
4#ifndef _Stroika_Foundation_Containers_Concrete_Mapping_stdhashmap_h_
5#define _Stroika_Foundation_Containers_Concrete_Mapping_stdhashmap_h_
6
7#include "Stroika/Foundation/StroikaPreComp.h"
8
9#include <unordered_map>
10
12#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_stdhashmap<KEY_TYPE, MAPPED_VALUE_TYPE, TRAITS> is an std::map-based concrete implementation of the Mapping<KEY_TYPE, MAPPED_VALUE_TYPE, typename TRAITS::MappingTraitsType> container pattern.
23 *
24 * @aliases Could have been called Mapping_stdunorderedmap - but that name would not be nearly as suggestive.
25 * the name std::unordered_map is something of an move towards the approach taken by Stroika - focusing
26 * on data access patterns, rather than implementation data structure. But the API - truly has hash-table
27 * written all over it (so the name is really misleading in std).
28 *
29 * \note \em Implementation Details
30 * This module is essentially identical to SortedMapping_stdhashmap, but making it dependent on SortedMapping<> creates
31 * problems with circular dependencies - especially give how the default Mapping CTOR calls the factory class
32 * which maps back to the _stdhashmap<> variant.
33 *
34 * There maybe another (better) way, but this works.
35 *
36 * \note Runtime performance/complexity:
37 * o size () is constant complexity
38 *
39 * \note \em Thread-Safety <a href="Thread-Safety.md#C++-Standard-Thread-Safety">C++-Standard-Thread-Safety</a>
40 */
41 template <typename KEY_TYPE, typename MAPPED_VALUE_TYPE>
42 class Mapping_stdhashmap : public Mapping<KEY_TYPE, MAPPED_VALUE_TYPE> {
43 private:
45
46 public:
47 using KeyEqualsCompareFunctionType = typename inherited::KeyEqualsCompareFunctionType;
48 using key_type = typename inherited::key_type;
49 using value_type = typename inherited::value_type;
50 using mapped_type = typename inherited::mapped_type;
51
52 public:
53 /**
54 * \brief STDHASHMAP is std::map<> that can be used inside Mapping_stdhashmap
55 *
56 * @todo - STK appraoch to blockallocation not working for unordred map cuz allocates many at a time
57 */
58 template <typename HASH = std::hash<key_type>, typename KEY_EQUALS_COMPARER = std::equal_to<key_type>>
59 using STDHASHMAP = unordered_map<KEY_TYPE, MAPPED_VALUE_TYPE, HASH, KEY_EQUALS_COMPARER>;
60 //template <typename HASH = std::hash<key_type>, typename KEY_EQUALS_COMPARER = std::equal_to<key_type>>
61 //using STDHASHMAP = unordered_map<KEY_TYPE, MAPPED_VALUE_TYPE, HASH, KEY_EQUALS_COMPARER, Memory::BlockAllocatorOrStdAllocatorAsAppropriate<pair<const key_type, mapped_type>, sizeof (value_type) <= 1024>>;
62
63 public:
64 /**
65 * @todo UPDATE THESE DOCS - REVIEW AND COMPARE - BUT THIS IS LITERALLY QUTIE WRONG
66 * \see docs on Mapping<> constructor, except that KEY_EQUALS_COMPARER is replaced with KEY_INORDER_COMPARER and EqualsComparer is replaced by IInOrderComparer
67 * and added Mapping_stdhashmap (STDHASHMAP<>&& src)
68 */
70 requires (Cryptography::Digest::IHashFunction<std::hash<KEY_TYPE>, KEY_TYPE> and IEqualsComparer<std::equal_to<KEY_TYPE>, KEY_TYPE>);
72#if !qCompilerAndStdLib_requires_breaks_soemtimes_but_static_assert_ok_Buggy
73 requires (default_initializable<Mapping_stdhashmap>)
74#endif
75 ;
76 template <typename HASH, IEqualsComparer<KEY_TYPE> KEY_EQUALS_COMPARER>
77 requires (Cryptography::Digest::IHashFunction<HASH, KEY_TYPE>)
78 explicit Mapping_stdhashmap (HASH&& hasher, KEY_EQUALS_COMPARER&& keyComparer);
79 Mapping_stdhashmap (Mapping_stdhashmap&&) noexcept = default;
80 Mapping_stdhashmap (const Mapping_stdhashmap&) noexcept = default;
81 Mapping_stdhashmap (const initializer_list<KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>>& src)
82#if !qCompilerAndStdLib_requires_breaks_soemtimes_but_static_assert_ok_Buggy
83 requires (default_initializable<Mapping_stdhashmap>)
84#endif
85 ;
86 template <typename HASH, IEqualsComparer<KEY_TYPE> KEY_EQUALS_COMPARER>
87 requires (Cryptography::Digest::IHashFunction<HASH, KEY_TYPE>)
88 Mapping_stdhashmap (HASH&& hasher, KEY_EQUALS_COMPARER&& keyComparer, const initializer_list<KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>>& src);
89 template <IIterableOfTo<KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>> ITERABLE_OF_ADDABLE>
90 requires (
91#if qCompilerAndStdLib_default_initializable_broken_Buggy
92 is_default_constructible_v<Mapping_stdhashmap<KEY_TYPE, MAPPED_VALUE_TYPE>>
93#else
94 default_initializable<Mapping_stdhashmap<KEY_TYPE, MAPPED_VALUE_TYPE>>
95#endif
96 and not derived_from<remove_cvref_t<ITERABLE_OF_ADDABLE>, Mapping_stdhashmap<KEY_TYPE, MAPPED_VALUE_TYPE>>)
97 explicit Mapping_stdhashmap (ITERABLE_OF_ADDABLE&& src)
98#if qCompilerAndStdLib_RequiresNotMatchInlineOutOfLineForTemplateClassBeingDefined_Buggy
100 {
101 this->AddAll (forward<ITERABLE_OF_ADDABLE> (src));
102 AssertRepValidType_ ();
103 }
104#endif
105 ;
106 template <typename HASH, IEqualsComparer<KEY_TYPE> KEY_EQUALS_COMPARER, IIterableOfTo<KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>> ITERABLE_OF_ADDABLE>
107 Mapping_stdhashmap (HASH&& hasher, KEY_EQUALS_COMPARER&& keyComparer, ITERABLE_OF_ADDABLE&& src)
108 requires (Cryptography::Digest::IHashFunction<HASH, KEY_TYPE> and
109 not derived_from<remove_cvref_t<ITERABLE_OF_ADDABLE>, Mapping_stdhashmap<KEY_TYPE, MAPPED_VALUE_TYPE>>)
110#if qCompilerAndStdLib_RequiresNotMatchInlineOutOfLineForTemplateClassBeingDefined_Buggy
111 : Mapping_stdhashmap{forward<HASH> (hasher), forward<KEY_EQUALS_COMPARER> (keyComparer)}
112 {
113 this->AddAll (forward<ITERABLE_OF_ADDABLE> (src));
114 AssertRepValidType_ ();
115 }
116#endif
117 ;
118 template <IInputIterator<KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>> ITERATOR_OF_ADDABLE>
119 Mapping_stdhashmap (ITERATOR_OF_ADDABLE&& start, ITERATOR_OF_ADDABLE&& end)
120
121#if !qCompilerAndStdLib_requires_breaks_soemtimes_but_static_assert_ok_Buggy
122 requires (default_initializable<Mapping_stdhashmap>)
123#endif
124 ;
125 template <typename HASH, IEqualsComparer<KEY_TYPE> KEY_EQUALS_COMPARER, IInputIterator<KeyValuePair<KEY_TYPE, MAPPED_VALUE_TYPE>> ITERATOR_OF_ADDABLE>
126 Mapping_stdhashmap (HASH&& hasher, KEY_EQUALS_COMPARER&& keyComparer, ITERATOR_OF_ADDABLE&& start, ITERATOR_OF_ADDABLE&& end)
127 requires (Cryptography::Digest::IHashFunction<HASH, KEY_TYPE>);
128
129 public:
130 /**
131 */
132 nonvirtual Mapping_stdhashmap& operator= (Mapping_stdhashmap&&) noexcept = default;
133 nonvirtual Mapping_stdhashmap& operator= (const Mapping_stdhashmap&) = default;
134
135 private:
136 using IImplRepBase_ = typename Mapping<KEY_TYPE, MAPPED_VALUE_TYPE>::_IRep;
137 template <typename HASH, qCompilerAndStdLib_ConstraintDiffersInTemplateRedeclaration_BWA (IEqualsComparer<KEY_TYPE>) KEY_EQUALS_COMPARER>
138 class Rep_;
139
140 private:
141 nonvirtual void AssertRepValidType_ () const;
142 };
143
144}
145
146/*
147 ********************************************************************************
148 ******************************* Implementation Details *************************
149 ********************************************************************************
150 */
151#include "Mapping_stdhashmap.inl"
152
153#endif /*_Stroika_Foundation_Containers_Concrete_Mapping_stdhashmap_h_ */
Mapping_stdhashmap<KEY_TYPE, MAPPED_VALUE_TYPE, TRAITS> is an std::map-based concrete implementation ...
unordered_map< KEY_TYPE, MAPPED_VALUE_TYPE, HASH, KEY_EQUALS_COMPARER > STDHASHMAP
STDHASHMAP is std::map<> that can be used inside Mapping_stdhashmap.
Common::ComparisonRelationDeclaration< Common::ComparisonRelationType::eEquals, function< bool(ArgByValueType< key_type >, ArgByValueType< key_type >)> > KeyEqualsCompareFunctionType
Definition Mapping.h:159
nonvirtual unsigned int AddAll(ITERABLE_OF_ADDABLE &&items, AddReplaceMode addReplaceMode=AddReplaceMode::eAddReplaces)
typename inherited::value_type value_type
Definition Mapping.h:139
static constexpr default_sentinel_t end() noexcept
Support for ranged for, and STL syntax in general.