Stroika Library 3.0d16
 
Loading...
Searching...
No Matches
SortedMultiSet_stdmap.h
Go to the documentation of this file.
1/*
2 * Copyright(c) Sophist Solutions, Inc. 1990-2025. All rights reserved
3 */
4
5// Moved #includes outside #include guard to avoid deadly embrace
6
7#include "Stroika/Foundation/StroikaPreComp.h"
8
9#include <map>
10
12
13#ifndef _Stroika_Foundation_Containers_Concrete_SortedMultiSet_stdmap_h_
14#define _Stroika_Foundation_Containers_Concrete_SortedMultiSet_stdmap_h_ 1
15
16/**
17 * \file
18 *
19 * \note Code-Status: <a href="Code-Status.md#Beta">Beta</a>
20 *
21 */
22
24
25 using Common::IInOrderComparer;
26
27 /**
28 *
29 *
30 * \note Runtime performance/complexity:
31 * Very good low overhead implementation
32 *
33 * o size () is constant complexity
34 * o Uses Memory::BlockAllocatorOrStdAllocatorAsAppropriate
35 *
36 * \note This implementation doesn't store multiple copies of 'T' objects - it just counts those that compare equal.
37 *
38 * \note \em Thread-Safety <a href="Thread-Safety.md#C++-Standard-Thread-Safety">C++-Standard-Thread-Safety</a>
39 *
40 */
41 template <typename T, typename TRAITS = DefaultTraits::MultiSet<T>>
42 class SortedMultiSet_stdmap : public SortedMultiSet<T, TRAITS> {
43 private:
45
46 public:
47 using TraitsType = typename inherited::TraitsType;
48 using CounterType = typename inherited::CounterType;
49 using ElementEqualityComparerType = typename inherited::ElementEqualityComparerType;
50 using ElementThreeWayComparerType = typename inherited::ElementThreeWayComparerType;
51 using value_type = typename inherited::value_type;
52
53 public:
54 /**
55 * \brief STDMAP is std::map<> that can be used inside MultiSet_stdmap
56 */
57 template <IInOrderComparer<T> INORDER_COMPARER = less<T>>
58 using STDMAP =
59 map<T, CounterType, INORDER_COMPARER, Memory::BlockAllocatorOrStdAllocatorAsAppropriate<pair<const T, CounterType>, sizeof (value_type) <= 256>>;
60
61 public:
62 /**
63 */
65 template <IInOrderComparer<T> INORDER_COMPARER>
66 explicit SortedMultiSet_stdmap (INORDER_COMPARER&& inorderComparer);
67 SortedMultiSet_stdmap (SortedMultiSet_stdmap&&) noexcept = default;
68 SortedMultiSet_stdmap (const SortedMultiSet_stdmap&) noexcept = default;
69 SortedMultiSet_stdmap (const initializer_list<T>& src);
70 template <IInOrderComparer<T> INORDER_COMPARER>
71 SortedMultiSet_stdmap (INORDER_COMPARER&& inorderComparer, const initializer_list<T>& src);
72 SortedMultiSet_stdmap (const initializer_list<value_type>& src);
73 template <IInOrderComparer<T> INORDER_COMPARER>
74 SortedMultiSet_stdmap (INORDER_COMPARER&& inorderComparer, const initializer_list<value_type>& src);
75 template <IIterableOfTo<typename TRAITS::CountedValueType> ITERABLE_OF_ADDABLE>
76 requires (not derived_from<remove_cvref_t<ITERABLE_OF_ADDABLE>, SortedMultiSet_stdmap<T, TRAITS>>)
77 explicit SortedMultiSet_stdmap (ITERABLE_OF_ADDABLE&& src)
78#if qCompilerAndStdLib_RequiresNotMatchInlineOutOfLineForTemplateClassBeingDefined_Buggy
80 {
81 this->AddAll (forward<ITERABLE_OF_ADDABLE> (src));
82 AssertRepValidType_ ();
83 }
84#endif
85 ;
86 template <IInOrderComparer<T> INORDER_COMPARER, IIterableOfTo<typename TRAITS::CountedValueType> ITERABLE_OF_ADDABLE>
87 SortedMultiSet_stdmap (INORDER_COMPARER&& inorderComparer, ITERABLE_OF_ADDABLE&& src);
88 template <IInputIterator<typename TRAITS::CountedValueType> ITERATOR_OF_ADDABLE>
89 SortedMultiSet_stdmap (ITERATOR_OF_ADDABLE&& start, ITERATOR_OF_ADDABLE&& end);
90 template <IInOrderComparer<T> INORDER_COMPARER, IInputIterator<typename TRAITS::CountedValueType> ITERATOR_OF_ADDABLE>
91 SortedMultiSet_stdmap (INORDER_COMPARER&& inorderComparer, ITERATOR_OF_ADDABLE&& start, ITERATOR_OF_ADDABLE&& end);
92
93 public:
94 /**
95 */
96 nonvirtual SortedMultiSet_stdmap& operator= (SortedMultiSet_stdmap&&) noexcept = default;
97 nonvirtual SortedMultiSet_stdmap& operator= (const SortedMultiSet_stdmap&) = default;
98
99 private:
100 using IImplRepBase_ = typename SortedMultiSet<T, TRAITS>::_IRep;
101 template <qCompilerAndStdLib_ConstraintDiffersInTemplateRedeclaration_BWA (IInOrderComparer<T>) INORDER_COMPARER>
102 class Rep_;
103
104 private:
105 nonvirtual void AssertRepValidType_ () const;
106 };
107
108}
109
110/*
111 ********************************************************************************
112 ******************************* Implementation Details *************************
113 ********************************************************************************
114 */
115#include "SortedMultiSet_stdmap.inl"
116
117#endif /*_Stroika_Foundation_Containers_Concrete_SortedMultiSet_stdmap_h_*/
map< T, CounterType, INORDER_COMPARER, Memory::BlockAllocatorOrStdAllocatorAsAppropriate< pair< const T, CounterType >, sizeof(value_type)<=256 > > STDMAP
STDMAP is std::map<> that can be used inside MultiSet_stdmap.
nonvirtual void AddAll(ITERATOR_OF_ADDABLE &&start, ITERATOR_OF_ADDABLE2 &&end)
Common::ComparisonRelationDeclaration< Common::ComparisonRelationType::eEquals, function< bool(ArgByValueType< T >, ArgByValueType< T >)> > ElementEqualityComparerType
Definition MultiSet.h:161
static constexpr default_sentinel_t end() noexcept
Support for ranged for, and STL syntax in general.