Stroika Library 3.0d16
 
Loading...
Searching...
No Matches
SortedMultiSet_SkipList.h
Go to the documentation of this file.
1/*
2 * Copyright(c) Sophist Solutions, Inc. 1990-2025. All rights reserved
3 */
4
5#ifndef _Stroika_Foundation_Containers_Concrete_SortedMultiSet_SkipList_h_
6#define _Stroika_Foundation_Containers_Concrete_SortedMultiSet_SkipList_h_ 1
7
8#include "Stroika/Foundation/StroikaPreComp.h"
9
10#include "Stroika/Foundation/Containers/DataStructures/SkipList.h"
13
14/**
15 * \file
16 *
17 * \note Code-Status: <a href="Code-Status.md#Beta">Beta</a>
18 *
19 */
20
22
23 using Common::IThreeWayComparer;
24
25 /**
26 *
27 *
28 * \note Runtime performance/complexity:
29 * Very good low overhead implementation
30 *
31 * o size () is constant complexity
32 * o Uses Memory::BlockAllocatorOrStdAllocatorAsAppropriate
33 *
34 * \note This implementation doesn't store multiple copies of 'T' objects - it just counts those that compare equal.
35 *
36 * \note \em Thread-Safety <a href="Thread-Safety.md#C++-Standard-Thread-Safety">C++-Standard-Thread-Safety</a>
37 *
38 */
39 template <typename T, typename TRAITS = DefaultTraits::MultiSet<T>>
40 class SortedMultiSet_SkipList : public Private::SkipListBasedContainer<SortedMultiSet_SkipList<T, TRAITS>, SortedMultiSet<T, TRAITS>, true> {
41 private:
43
44 public:
45 using TraitsType = typename inherited::TraitsType;
46 using CounterType = typename inherited::CounterType;
47 using ElementEqualityComparerType = typename inherited::ElementEqualityComparerType;
48 using ElementThreeWayComparerType = typename inherited::ElementThreeWayComparerType;
49 using value_type = typename inherited::value_type;
50
51 public:
52 /**
53 * AddOrExtendOrReplaceMode::eAddReplaces because.....
54 */
55 template <IThreeWayComparer<T> COMPARER = compare_three_way>
57
58 /**
59 * \brief SKIPLIST is SkipList that can be used inside SortedMapping_SkipList
60 */
61 template <IThreeWayComparer<T> COMPARER = compare_three_way>
63
64 public:
65 /**
66 */
68 template <IThreeWayComparer<T> COMPARER>
69 explicit SortedMultiSet_SkipList (COMPARER&& comparer);
71 SortedMultiSet_SkipList (const SortedMultiSet_SkipList&) noexcept = default;
72 SortedMultiSet_SkipList (const initializer_list<T>& src);
73 template <IThreeWayComparer<T> COMPARER>
74 SortedMultiSet_SkipList (COMPARER&& comparer, const initializer_list<T>& src);
75 SortedMultiSet_SkipList (const initializer_list<value_type>& src);
76 template <IThreeWayComparer<T> COMPARER>
77 SortedMultiSet_SkipList (COMPARER&& comparer, const initializer_list<value_type>& src);
78 template <IIterableOfTo<typename TRAITS::CountedValueType> ITERABLE_OF_ADDABLE>
79 requires (not derived_from<remove_cvref_t<ITERABLE_OF_ADDABLE>, SortedMultiSet_SkipList<T, TRAITS>>)
80 explicit SortedMultiSet_SkipList (ITERABLE_OF_ADDABLE&& src)
81#if qCompilerAndStdLib_RequiresNotMatchInlineOutOfLineForTemplateClassBeingDefined_Buggy
83 {
84 this->AddAll (forward<ITERABLE_OF_ADDABLE> (src));
85 AssertRepValidType_ ();
86 }
87#endif
88 ;
89 template <IThreeWayComparer<T> COMPARER, IIterableOfTo<typename TRAITS::CountedValueType> ITERABLE_OF_ADDABLE>
90 SortedMultiSet_SkipList (COMPARER&& comparer, ITERABLE_OF_ADDABLE&& src);
91 template <IInputIterator<typename TRAITS::CountedValueType> ITERATOR_OF_ADDABLE>
92 SortedMultiSet_SkipList (ITERATOR_OF_ADDABLE&& start, ITERATOR_OF_ADDABLE&& end);
93 template <IThreeWayComparer<T> COMPARER, IInputIterator<typename TRAITS::CountedValueType> ITERATOR_OF_ADDABLE>
94 SortedMultiSet_SkipList (COMPARER&& comparer, ITERATOR_OF_ADDABLE&& start, ITERATOR_OF_ADDABLE&& end);
95
96 public:
97 /**
98 */
99 nonvirtual SortedMultiSet_SkipList& operator= (SortedMultiSet_SkipList&&) noexcept = default;
100 nonvirtual SortedMultiSet_SkipList& operator= (const SortedMultiSet_SkipList&) = default;
101
102 private:
103 using IImplRepBase_ = Private::SkipListBasedContainerIRep<typename SortedMultiSet<T, TRAITS>::_IRep>;
104 template <qCompilerAndStdLib_ConstraintDiffersInTemplateRedeclaration_BWA (IThreeWayComparer<T>) COMPARER>
105 class Rep_;
106
107 private:
108 nonvirtual void AssertRepValidType_ () const;
109
110 private:
111 friend inherited;
112 };
113
114}
115
116/*
117 ********************************************************************************
118 ******************************* Implementation Details *************************
119 ********************************************************************************
120 */
121#include "SortedMultiSet_SkipList.inl"
122
123#endif /*_Stroika_Foundation_Containers_Concrete_SortedMultiSet_SkipList_h_*/
SkipListBasedContainer is a Stroika implementation detail, but its public methods are fair game and f...