Stroika Library 3.0d16
 
Loading...
Searching...
No Matches
MultiSet_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 **************** MultiSet_Factory<T, TRAITS, EQUALS_COMPARER> ******************
13 ********************************************************************************
14 */
15 template <typename T, typename TRAITS, IEqualsComparer<T> EQUALS_COMPARER>
16 constexpr MultiSet_Factory<T, TRAITS, EQUALS_COMPARER>::MultiSet_Factory (const FactoryFunctionType& f)
17 : fFactory_{f}
18 {
19 }
20 template <typename T, typename TRAITS, IEqualsComparer<T> EQUALS_COMPARER>
25 DISABLE_COMPILER_CLANG_WARNING_START ("clang diagnostic ignored \"-Wunused-lambda-capture\"");
26 template <typename T, typename TRAITS, IEqualsComparer<T> EQUALS_COMPARER>
27 constexpr MultiSet_Factory<T, TRAITS, EQUALS_COMPARER>::MultiSet_Factory ([[maybe_unused]] const Hints& hints)
28 : MultiSet_Factory{[hints] () -> FactoryFunctionType {
29 if constexpr (same_as<EQUALS_COMPARER, equal_to<T>> and totally_ordered<T>) {
30 return [] ([[maybe_unused]] const EQUALS_COMPARER& equalsComparer) { return Concrete::SortedMultiSet_stdmap<T, TRAITS>{}; };
31 }
32 else {
33 if (hints.fOptimizeForLookupSpeedOverUpdateSpeed.value_or (true)) {
34 // array has better memory locality properties so lookups faster
35 return [] (const EQUALS_COMPARER& equalsComparer) { return Concrete::MultiSet_Array<T, TRAITS>{equalsComparer}; };
36 }
37 else {
38 return [] (const EQUALS_COMPARER& equalsComparer) { return Concrete::MultiSet_LinkedList<T, TRAITS>{equalsComparer}; };
39 }
40 }
41 }()}
42 {
43 }
44 DISABLE_COMPILER_CLANG_WARNING_END ("clang diagnostic ignored \"-Wunused-lambda-capture\"");
45 template <typename T, typename TRAITS, IEqualsComparer<T> EQUALS_COMPARER>
47 {
48 return AccessDefault_ ();
49 }
50 template <typename T, typename TRAITS, IEqualsComparer<T> EQUALS_COMPARER>
51 inline auto MultiSet_Factory<T, TRAITS, EQUALS_COMPARER>::operator() (const EQUALS_COMPARER& equalsComparer) const -> ConstructedType
52 {
53 return this->fFactory_ (equalsComparer);
54 }
55 template <typename T, typename TRAITS, IEqualsComparer<T> EQUALS_COMPARER>
56 void MultiSet_Factory<T, TRAITS, EQUALS_COMPARER>::Register (const optional<MultiSet_Factory>& f)
57 {
58 AccessDefault_ () = f.has_value () ? *f : MultiSet_Factory{Hints{}};
59 }
60 template <typename T, typename TRAITS, IEqualsComparer<T> EQUALS_COMPARER>
62 {
63 static MultiSet_Factory sDefault_{Hints{}};
64 return sDefault_;
65 }
66
67}
Singleton factory object - Used to create the default backend implementation of a MultiSet<> containe...