Stroika Library 3.0d16
 
Loading...
Searching...
No Matches
Association_Factory.inl
1/*
2 * Copyright(c) Sophist Solutions, Inc. 1990-2025. All rights reserved
3 */
7
8namespace Stroika::Foundation::Containers::Factory {
9
10 /*
11 ********************************************************************************
12 ******** Association_Factory<KEY_TYPE, VALUE_TYPE, KEY_EQUALS_COMPARER> ********
13 ********************************************************************************
14 */
15 template <typename KEY_TYPE, typename VALUE_TYPE, IEqualsComparer<KEY_TYPE> KEY_EQUALS_COMPARER>
17 : fFactory_{f}
18 {
19 }
20 template <typename KEY_TYPE, typename VALUE_TYPE, IEqualsComparer<KEY_TYPE> KEY_EQUALS_COMPARER>
25 DISABLE_COMPILER_CLANG_WARNING_START ("clang diagnostic ignored \"-Wunused-lambda-capture\"");
26 template <typename KEY_TYPE, typename VALUE_TYPE, IEqualsComparer<KEY_TYPE> KEY_EQUALS_COMPARER>
28 : Association_Factory{[hints] () -> FactoryFunctionType {
29 if constexpr (same_as<KEY_EQUALS_COMPARER, equal_to<KEY_TYPE>> and totally_ordered<KEY_TYPE>) {
30 // OK to ignore hints, cuz this is the best choice regardless of hints
31 return [] (const KEY_EQUALS_COMPARER&) {
32 return Concrete::SortedAssociation_stdmultimap<KEY_TYPE, VALUE_TYPE>{}; // OK to omit comparer, because we have less-than defined and using default equal_to<>
33 };
34 }
35 else {
36 if (hints.fOptimizeForLookupSpeedOverUpdateSpeed.value_or (true)) {
37 // array has better memory cache locality properties so lookups probably faster
38 return [] (const KEY_EQUALS_COMPARER& keyEqualsComparer) {
39 return Concrete::Association_Array<KEY_TYPE, VALUE_TYPE>{keyEqualsComparer};
40 };
41 }
42 else {
43 return [] (const KEY_EQUALS_COMPARER& keyEqualsComparer) {
44 return Concrete::Association_LinkedList<KEY_TYPE, VALUE_TYPE>{keyEqualsComparer};
45 };
46 }
47 }
48 }()}
49 {
50 }
51 DISABLE_COMPILER_CLANG_WARNING_END ("clang diagnostic ignored \"-Wunused-lambda-capture\"");
52 template <typename KEY_TYPE, typename VALUE_TYPE, IEqualsComparer<KEY_TYPE> KEY_EQUALS_COMPARER>
54 {
55 return AccessDefault_ ();
56 }
57 template <typename KEY_TYPE, typename VALUE_TYPE, IEqualsComparer<KEY_TYPE> KEY_EQUALS_COMPARER>
58 inline auto Association_Factory<KEY_TYPE, VALUE_TYPE, KEY_EQUALS_COMPARER>::operator() (const KEY_EQUALS_COMPARER& keyEqualsComparer) const
60 {
61 return this->fFactory_ (keyEqualsComparer);
62 }
63 template <typename KEY_TYPE, typename VALUE_TYPE, IEqualsComparer<KEY_TYPE> KEY_EQUALS_COMPARER>
64 inline void Association_Factory<KEY_TYPE, VALUE_TYPE, KEY_EQUALS_COMPARER>::Register (const optional<Association_Factory>& f)
65 {
66 AccessDefault_ () = f.has_value () ? *f : Association_Factory{Hints{}};
67 }
68 template <typename KEY_TYPE, typename VALUE_TYPE, IEqualsComparer<KEY_TYPE> KEY_EQUALS_COMPARER>
70 {
71 static Association_Factory sDefault_{Hints{}};
72 return sDefault_;
73 }
74
75}
An Association pairs key values with (possibly multiple or none) mapped_type values....
SortedAssociation_stdmultimap<KEY_TYPE,MAPPED_VALUE_TYPE> is an std::map-based concrete implementatio...
Singleton factory object - Used to create the default backend implementation of a Association<> conta...