13 template<
typename T,
typename Allocator = std::allocator<T>>
17 mCapacityBegin = mAlloc.allocate(pInitialCapacity);
19 mCapacityEnd = mCapacityBegin + pInitialCapacity;
20 mCurrent = mCapacityBegin;
21 mSizeEnd = mCapacityBegin;
27 mAlloc.deallocate(mCapacityBegin, mCapacityEnd - mCapacityBegin);
32 size_t size = pOther.
Size();
33 mCapacityBegin = mAlloc.allocate(size);
34 mCapacityEnd = mCapacityBegin + size;
35 mCurrent = mCapacityBegin;
36 mSizeEnd = mCapacityBegin;
38 for (
const auto& other : pOther) {
44 : mCurrent(pOther.mCurrent),
45 mSizeEnd(pOther.mSizeEnd),
46 mCapacityBegin(pOther.mCapacityBegin),
47 mCapacityEnd(pOther.mCapacityEnd),
48 mAlloc(std::move(pOther.mAlloc)) {
49 pOther.mCapacityBegin =
nullptr;
55 size_t size = pOther.
Size();
56 mCapacityBegin = mAlloc.allocate(size);
57 mCapacityEnd = mCapacityBegin + size;
58 mCurrent = mCapacityBegin;
59 mSizeEnd = mCapacityBegin;
61 for (
const auto& other : pOther) {
70 mCurrent = pOther.mCurrent;
71 mSizeEnd = pOther.mSizeEnd;
72 mCapacityBegin = pOther.mCapacityBegin;
73 mCapacityEnd = pOther.mCapacityEnd;
74 mAlloc = std::move(pOther.mAlloc);
75 pOther.mCapacityBegin =
nullptr;
82 template<
typename... Args>
86 const T&
Back()
const;
90 void Resize(
size_t pNewCapacity);
123 uintptr_t thisDiff = (uintptr_t) mPtr - (uintptr_t) (mParent->mCurrent);
124 uintptr_t otherDiff = (uintptr_t) pOther.mPtr - (uintptr_t) (mParent->mCurrent);
125 if ((mEnd && !pOther.mEnd) || (pOther.mBegin && !mBegin)) {
126 return std::strong_ordering::greater;
128 if ((mBegin && pOther.mBegin) || (pOther.mEnd && !mEnd)) {
129 return std::strong_ordering::less;
131 return thisDiff <=> otherDiff;
142 assert(mEnd ==
false &&
"Called ++ on an end iterator");
144 mPtr = mParent->advance(mPtr);
145 if (mParent->mCurrent == mPtr) mEnd =
true;
150 assert(mBegin ==
false &&
"Called -- on an begin iterator");
152 mPtr = mParent->retreat(mPtr);
153 if (mParent->mCurrent == mPtr) mBegin =
true;
173 std::ptrdiff_t thisDiff = mPtr - mParent->mCurrent;
174 std::ptrdiff_t otherDiff = pOther.mPtr - mParent->mCurrent;
175 std::ptrdiff_t fullDiff = mParent->mSizeEnd - mParent->mCapacityBegin;
176 if (thisDiff < 0 || (mEnd && thisDiff == 0)) {
177 thisDiff += fullDiff;
179 if (otherDiff < 0 || (pOther.mEnd && thisDiff == 0)) {
180 otherDiff += fullDiff;
182 return thisDiff - otherDiff;
187 assert(*
this - mParent->begin() + pNum <= mParent->
end() - mParent->begin() &&
"tried to move iterator after end!");
191 if (mPtr >= mParent->mSizeEnd) {
192 mPtr = mPtr - mParent->mSizeEnd + mParent->mCapacityBegin;
194 if (mParent->mCurrent == mPtr) mEnd =
true;
211 assert(*
this - mParent->begin() - pNum >= 0 &&
"tried to move iterator before begin!");
215 if (mPtr < mParent->mCapacityBegin) {
216 mPtr = (T*) ((uintptr_t) mPtr + (uintptr_t) mParent->mSizeEnd - (uintptr_t) mParent->mCapacityBegin);
218 if (mParent->mCurrent == mPtr) mBegin =
true;
232 return *(mParent->begin() + pNum);
240 <<
"mPtr: " << pObj.mPtr
241 <<
" mBegin: " << pObj.mBegin
242 <<
" mEnd: " << pObj.mEnd
243 <<
" mParent: " << pObj.mParent;
254 static_assert(std::random_access_iterator<RingBufferIterator>);
278 [[nodiscard]] T* advance(T* pElem)
const;
279 [[nodiscard]] T* retreat(T* pElem)
const;
284static_assert(std::ranges::random_access_range<ArcdpsExtension::RingBuffer<uint64_t>>);
285static_assert(std::ranges::random_access_range<const ArcdpsExtension::RingBuffer<uint64_t>>);
287template<
typename T,
typename Allocator>
290 new (elem) T(pElement);
293template<
typename T,
typename Allocator>
296 new (elem) T(pElement);
299template<
typename T,
typename Allocator>
302 if (mSizeEnd == mCapacityBegin) {
304 return mCapacityBegin;
307 if (mSizeEnd != mCapacityEnd) {
308 T* current = mSizeEnd;
314 T* current = mCurrent;
315 mCurrent = advance(mCurrent);
321template<
typename T,
typename Allocator>
323 auto val = pElem + 1;
324 if (val >= mSizeEnd)
return mCapacityBegin;
328template<
typename T,
typename Allocator>
331 if (val <= mCapacityBegin) val = mSizeEnd;
336template<
typename T,
typename Allocator>
337template<
typename... Args>
340 new (elem) T(args...);
343template<
typename T,
typename Allocator>
345 return *retreat(mCurrent);
348template<
typename T,
typename Allocator>
350 return *retreat(mCurrent);
353template<
typename T,
typename Allocator>
355 for (
auto it = begin(); it != end(); ++it) {
359 mCurrent = mSizeEnd = mCapacityBegin;
362template<
typename T,
typename Allocator>
364 return mSizeEnd - mCapacityBegin;
367template<
typename T,
typename Allocator>
370 T* current = mCurrent;
371 T* sizeEnd = mSizeEnd;
372 T* capacityBegin = mCapacityBegin;
373 T* capacityEnd = mCapacityEnd;
376 mCapacityBegin = mAlloc.allocate(pNewCapacity);
378 mCapacityEnd = mCapacityBegin + pNewCapacity;
379 mCurrent = mCapacityBegin;
380 mSizeEnd = mCapacityBegin;
386 while (sizeEnd != capacityBegin) {
387 PushBack(std::move(*val));
391 if (val >= sizeEnd) val = capacityBegin;
392 if (val == current)
break;
396 mAlloc.deallocate(capacityBegin, capacityEnd - capacityBegin);
399template<
typename T,
typename Allocator>
401 const auto var = begin() + pNum;
405template<
typename T,
typename Allocator>
407 auto var = begin() + pNum;
Definition SimpleRingBuffer.h:95
RingBufferIterator operator++(int)
Definition SimpleRingBuffer.h:158
reference operator*() const
Definition SimpleRingBuffer.h:135
T & reference
Definition SimpleRingBuffer.h:100
difference_type operator-(const RingBufferIterator &pOther) const
Definition SimpleRingBuffer.h:172
T value_type
Definition SimpleRingBuffer.h:98
pointer operator->() const
Definition SimpleRingBuffer.h:138
RingBufferIterator(const RingBufferIterator &pOther)=default
std::random_access_iterator_tag iterator_category
Definition SimpleRingBuffer.h:101
RingBufferIterator & operator--()
Definition SimpleRingBuffer.h:149
std::strong_ordering operator<=>(const RingBufferIterator &pOther) const
Definition SimpleRingBuffer.h:122
RingBufferIterator operator+(const difference_type pNum) const
Definition SimpleRingBuffer.h:198
RingBufferIterator operator-(const difference_type pNum) const
Definition SimpleRingBuffer.h:222
std::ptrdiff_t difference_type
Definition SimpleRingBuffer.h:97
std::random_access_iterator_tag iterator_concept
Definition SimpleRingBuffer.h:102
RingBufferIterator(pointer pPtr, bool pBegin, bool pEnd, const RingBuffer< T, Allocator > *pParent)
Definition SimpleRingBuffer.h:106
RingBufferIterator operator--(int)
Definition SimpleRingBuffer.h:164
RingBufferIterator & operator-=(const difference_type pNum)
Definition SimpleRingBuffer.h:210
RingBufferIterator & operator++()
Definition SimpleRingBuffer.h:141
RingBufferIterator(RingBufferIterator &&pOther) noexcept=default
RingBufferIterator & operator=(const RingBufferIterator &pOther)=default
RingBufferIterator & operator+=(const difference_type pNum)
Definition SimpleRingBuffer.h:186
friend RingBufferIterator operator+(const difference_type pLhs, const RingBufferIterator &pRhs)
Definition SimpleRingBuffer.h:204
friend std::ostream & operator<<(std::ostream &pOs, const RingBufferIterator &pObj)
Definition SimpleRingBuffer.h:238
T * pointer
Definition SimpleRingBuffer.h:99
RingBufferIterator & operator=(RingBufferIterator &&pOther) noexcept=default
reference operator[](const difference_type pNum) const
Definition SimpleRingBuffer.h:231
bool operator==(const RingBufferIterator &) const =default
RingBufferIterator()=default
Definition SimpleRingBuffer.h:14
void Resize(size_t pNewCapacity)
Definition SimpleRingBuffer.h:368
virtual ~RingBuffer()
Definition SimpleRingBuffer.h:24
const T & operator[](size_t pNum) const
Definition SimpleRingBuffer.h:400
const RingBufferIterator rend() const
Definition SimpleRingBuffer.h:266
RingBufferIterator end()
Definition SimpleRingBuffer.h:258
RingBuffer & operator=(RingBuffer &&pOther) noexcept
Definition SimpleRingBuffer.h:67
RingBuffer & operator=(const RingBuffer &pOther)
Definition SimpleRingBuffer.h:52
size_t Size() const
Definition SimpleRingBuffer.h:363
RingBufferIterator begin()
Definition SimpleRingBuffer.h:257
const RingBufferIterator cbegin() const
Definition SimpleRingBuffer.h:261
const RingBufferIterator crbegin() const
Definition SimpleRingBuffer.h:267
RingBuffer(const RingBuffer &pOther)
Definition SimpleRingBuffer.h:31
RingBufferIterator rend()
Definition SimpleRingBuffer.h:264
void PushBack(T &&pElement)
Definition SimpleRingBuffer.h:288
const RingBufferIterator cend() const
Definition SimpleRingBuffer.h:262
void Clear()
Definition SimpleRingBuffer.h:354
const RingBufferIterator crend() const
Definition SimpleRingBuffer.h:268
const RingBufferIterator begin() const
Definition SimpleRingBuffer.h:259
void EmplaceBack(const Args &... args)
Definition SimpleRingBuffer.h:338
const RingBufferIterator end() const
Definition SimpleRingBuffer.h:260
RingBufferIterator rbegin()
Definition SimpleRingBuffer.h:263
const RingBufferIterator rbegin() const
Definition SimpleRingBuffer.h:265
RingBuffer(RingBuffer &&pOther) noexcept
Definition SimpleRingBuffer.h:43
RingBuffer(size_t pInitialCapacity)
Definition SimpleRingBuffer.h:16
T & Back()
Definition SimpleRingBuffer.h:344
Definition ArcdpsExtension.h:10