Stroika Library 3.0d24
 
Loading...
Searching...
No Matches
Queue_Array.inl
1/*
2 * Copyright(c) Sophist Solutions, Inc. 1990-2026. All rights reserved
3 */
4#include "Stroika/Foundation/Containers/DataStructures/Array.h"
6#include "Stroika/Foundation/Containers/Private/IteratorImplHelper.h"
9
11
12 template <typename T>
13 class Queue_Array<T>::Rep_ : public Queue<T>::_IRep, public Memory::UseBlockAllocationIfAppropriate<Rep_> {
14 private:
15 using inherited = typename Queue<T>::_IRep;
16
17 public:
18 Rep_ () = default;
19 Rep_ (const Rep_& from) = default;
20
21 public:
22 nonvirtual Rep_& operator= (const Rep_&) = delete;
23
24 // Iterable<T>::_IRep overrides
25 public:
26 virtual shared_ptr<typename Iterable<T>::_IRep> Clone () const override
27 {
29 return Memory::MakeSharedPtr<Rep_> (*this);
30 }
31 virtual Iterator<value_type> MakeIterator () const override
32 {
34 return Iterator<value_type>{make_unique<IteratorRep_> (&fData_, &fChangeCounts_)};
35 }
36 // Safe despite this being a queue: RemoveHead () shifts (GetAt (0) then Remove (0u)) rather than
37 // advancing a head index, so element 0 is always the front and there is no wrap. A circular-buffer
38 // rewrite of this rep would have to drop this override (or return only the pre-wrap run).
39 virtual optional<span<const value_type>> PeekContiguousStorage () const override
40 {
42 return span<const value_type>{fData_.data (), fData_.size ()};
43 }
44 virtual size_t size () const override
45 {
47 return fData_.size ();
48 }
49 virtual bool empty () const override
50 {
52 return fData_.empty ();
53 }
54 virtual void Apply (const function<void (ArgByValueType<value_type> item)>& doToElement, Execution::SequencePolicy seq) const override
55 {
57 fData_.Apply (doToElement, seq);
58 }
59 virtual Iterator<value_type> Find ([[maybe_unused]] bool findFirst, const function<bool (ArgByValueType<value_type> item)>& that,
61 {
63 if (auto i = fData_.Find (that)) {
64 return Iterator<value_type>{make_unique<IteratorRep_> (&fChangeCounts_, i)};
65 }
66 return nullptr;
67 }
68
69 // Queue<T>::_IRep overrides
70 public:
71 virtual shared_ptr<typename Queue<T>::_IRep> CloneEmpty () const override
72 {
73 return Memory::MakeSharedPtr<Rep_> ();
74 }
75 virtual void AddTail (ArgByValueType<value_type> item) override
76 {
78 fData_.push_back (item);
79 fChangeCounts_.PerformedChange ();
80 }
81 virtual value_type RemoveHead () override
82 {
84 T item = fData_.GetAt (0);
85 fData_.Remove (0u);
86 fChangeCounts_.PerformedChange ();
87 return item;
88 }
89 virtual optional<value_type> RemoveHeadIf () override
90 {
92 if (fData_.empty ()) {
93 return optional<value_type>{};
94 }
95 T item = fData_.GetAt (0);
96 fData_.Remove (0u);
97 fChangeCounts_.PerformedChange ();
98 return item;
99 }
100 virtual value_type Head () const override
101 {
103 return fData_.GetAt (0);
104 }
105 virtual optional<value_type> HeadIf () const override
106 {
108 if (fData_.empty ()) {
109 return optional<value_type>{};
110 }
111 return fData_.GetAt (0);
112 }
113
114 private:
115 using DataStructureImplType_ = DataStructures::Array<value_type>;
116 using IteratorRep_ = Private::IteratorImplHelper_<value_type, DataStructureImplType_>;
117
118 private:
119 DataStructureImplType_ fData_;
120 qStroika_ATTRIBUTE_NO_UNIQUE_ADDRESS_VCFORCE Private::ContainerDebugChangeCounts_ fChangeCounts_;
121 };
122
123 /*
124 ********************************************************************************
125 ********************************** Queue_Array<T> ******************************
126 ********************************************************************************
127 */
128 template <typename T>
130 : inherited{Memory::MakeSharedPtr<Rep_> ()}
131 {
132 AssertRepValidType_ ();
133 }
134 template <typename T>
135 inline Queue_Array<T>::Queue_Array (const initializer_list<value_type>& src)
136 : Queue_Array{}
137 {
138 this->reserve (src.size ());
140 AssertRepValidType_ ();
141 }
142#if !qCompilerAndStdLib_RequiresNotMatchInlineOutOfLineForTemplateClassBeingDefined_Buggy
143 template <typename T>
144 template <IIterableOfTo<T> ITERABLE_OF_ADDABLE>
145 requires (not derived_from<remove_cvref_t<ITERABLE_OF_ADDABLE>, Queue_Array<T>>)
146 inline Queue_Array<T>::Queue_Array (ITERABLE_OF_ADDABLE&& src)
147 : Queue_Array{}
148 {
150 this->reserve (src.size ());
151 }
152 AddAllToTail (forward<ITERABLE_OF_ADDABLE> (src));
153 AssertRepValidType_ ();
154 }
155#endif
156 template <typename T>
157 template <IInputIterator<T> ITERATOR_OF_ADDABLE>
158 inline Queue_Array<T>::Queue_Array (ITERATOR_OF_ADDABLE&& start, ITERATOR_OF_ADDABLE&& end)
159 : Queue_Array{}
160 {
162 if (start != end) {
163 this->reserve (end - start);
164 }
165 }
167 AssertRepValidType_ ();
168 }
169 template <typename T>
170 inline void Queue_Array<T>::AssertRepValidType_ () const
171 {
173 typename inherited::template _SafeReadRepAccessor<Rep_> tmp{this}; // for side-effect of AssertMemeber
174 }
175 }
176
177}
#define qStroika_Foundation_Debug_AssertionsChecked
The qStroika_Foundation_Debug_AssertionsChecked flag determines if assertions are checked and validat...
Definition Assertions.h:49
#define qStroika_ATTRIBUTE_NO_UNIQUE_ADDRESS_VCFORCE
[[msvc::no_unique_address]] isn't always broken in MSVC. Annotate with this on things where its not b...
Definition StdCompat.h:443
Queue_Array<T> is an Array-based concrete implementation of the Queue<T> container pattern.
Definition Queue_Array.h:36
nonvirtual value_type Head() const
Definition Queue.inl:73
nonvirtual void AddAllToTail(ITERABLE_OF_ADDABLE &&s)
nonvirtual optional< value_type > RemoveHeadIf()
Definition Queue.inl:99
nonvirtual value_type RemoveHead()
Definition Queue.inl:88
nonvirtual void AddTail(ArgByValueType< value_type > item)
Definition Queue.inl:63
unique_lock< AssertExternallySynchronizedChecker > WriteContext
Instantiate AssertExternallySynchronizedChecker::WriteContext to designate an area of code where prot...
shared_lock< const AssertExternallySynchronizedChecker > ReadContext
Instantiate AssertExternallySynchronizedChecker::ReadContext to designate an area of code where prote...
nonvirtual Iterator< T > Find(THAT_FUNCTION &&that) const
Run the argument bool-returning function (or lambda) on the elements of the container,...
nonvirtual CONTAINER_OF_T As(CONTAINER_OF_T_CONSTRUCTOR_ARGS... args) const
nonvirtual size_t size() const
Returns the number of items contained.
Definition Iterable.inl:311
nonvirtual void Apply(const function< void(ArgByValueType< T > item)> &doToElement) const
Run the argument function (or lambda) on each element of the container.
nonvirtual bool empty() const
Returns true iff size() == 0.
Definition Iterable.inl:317
static constexpr default_sentinel_t end() noexcept
Support for ranged for, and STL syntax in general.
nonvirtual Iterator< T > MakeIterator() const
Create an iterator object which can be used to traverse the 'Iterable'.
Definition Iterable.inl:305
Concept checks if the given type T has a const size() method which can be called to return a size_t.
Definition Concepts.h:286
SequencePolicy
equivalent which of 4 types being used std::execution::sequenced_policy, parallel_policy,...