Stroika Library 3.0d16
 
Loading...
Searching...
No Matches
KeyedCollection_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 ****** KeyedCollection_Factory<T, KEY_TYPE, TRAITS, KEY_EQUALS_COMPARER> *******
13 ********************************************************************************
14 */
15 template <typename T, typename KEY_TYPE, typename TRAITS, typename KEY_EQUALS_COMPARER>
17 : fFactory_{f}
18 {
19 }
20 template <typename T, typename KEY_TYPE, typename TRAITS, typename KEY_EQUALS_COMPARER>
25 template <typename T, typename KEY_TYPE, typename TRAITS, typename KEY_EQUALS_COMPARER>
27 : fFactory_{nullptr}
28 {
29 }
30 template <typename T, typename KEY_TYPE, typename TRAITS, typename KEY_EQUALS_COMPARER>
32 {
33 return AccessDefault_ ();
34 }
35 template <typename T, typename KEY_TYPE, typename TRAITS, typename KEY_EQUALS_COMPARER>
37 const KEY_EQUALS_COMPARER& keyComparer) const -> ConstructedType
38 {
39 if (this->fFactory_ == nullptr) [[likely]] {
40 if constexpr (default_initializable<Concrete::KeyedCollection_stdhashset<T, KEY_TYPE, TRAITS>> and
41 same_as<KEY_EQUALS_COMPARER, equal_to<KEY_TYPE>>) {
43 }
44 else if constexpr (default_initializable<Concrete::SortedKeyedCollection_stdset<T, KEY_TYPE, TRAITS>> and
45 same_as<KEY_EQUALS_COMPARER, equal_to<KEY_TYPE>>) {
46 return Concrete::SortedKeyedCollection_stdset<T, KEY_TYPE, TRAITS>{keyExtractor}; // if using == as equals comparer, just map to < for in-order comparison
47 }
48 else {
49 /*
50 * Note - though this is not an efficient implementation of KeyedCollection<> for large sizes, its probably the most
51 * efficient representation which adds no requirements to KEY_TYPE, such as operator< (or a traits less) or
52 * a hash function. And its quite reasonable for small KeyedCollection's - which are often the case.
53 *
54 * Note, array CAN be slower than LinkedList as the size grows (array faster when small due to better locality).
55 * But the whole thing bogs down no matter what, when larger, cuz you really need some indexed data structure like a tree.
56 */
57 return Concrete::KeyedCollection_Array<T, KEY_TYPE, TRAITS>{keyExtractor, keyComparer};
58 }
59 }
60 else {
61 return this->fFactory_ (keyExtractor, keyComparer);
62 }
63 }
64 template <typename T, typename KEY_TYPE, typename TRAITS, typename KEY_EQUALS_COMPARER>
66 {
67 AccessDefault_ () = f.has_value () ? *f : KeyedCollection_Factory{Hints{}};
68 }
69 template <typename T, typename KEY_TYPE, typename TRAITS, typename KEY_EQUALS_COMPARER>
71 {
72 static KeyedCollection_Factory sDefault_{Hints{}};
73 return sDefault_;
74 }
75
76}
KeyedCollection_Array<T> is an Array-based concrete implementation of the KeyedCollection<T> containe...
KeyedCollection_stdhashset<KEY_TYPE,MAPPED_VALUE_TYPE> is an std::map-based concrete implementation o...
SortedKeyedCollection_stdset<KEY_TYPE,MAPPED_VALUE_TYPE> is an std::map-based concrete implementation...
Singleton factory object - Used to create the default backend implementation of a KeyedCollection<> c...
nonvirtual ConstructedType operator()(const KeyExtractorType &keyExtractor, const KEY_EQUALS_COMPARER &keyComparer) const
static void Register(const optional< KeyedCollection_Factory > &f=nullopt)
a cross between Mapping<KEY, T> and Collection<T> and Set<T>