14 template<
typename T,
typename Allocator = std::allocator<T>>
18 mCapacityBegin = mAlloc.allocate(pInitialCapacity);
20 mCapacityEnd = mCapacityBegin + pInitialCapacity;
21 mCurrent = mCapacityBegin;
22 mSizeEnd = mCapacityBegin;
28 mAlloc.deallocate(mCapacityBegin, mCapacityEnd - mCapacityBegin);
33 size_t size = pOther.
Size();
34 mCapacityBegin = mAlloc.allocate(size);
35 mCapacityEnd = mCapacityBegin + size;
36 mCurrent = mCapacityBegin;
37 mSizeEnd = mCapacityBegin;
39 for (
const auto& other : pOther) {
45 : mCurrent(pOther.mCurrent),
46 mSizeEnd(pOther.mSizeEnd),
47 mCapacityBegin(pOther.mCapacityBegin),
48 mCapacityEnd(pOther.mCapacityEnd),
49 mAlloc(std::move(pOther.mAlloc)) {
50 pOther.mCapacityBegin =
nullptr;
56 size_t size = pOther.
Size();
57 mCapacityBegin = mAlloc.allocate(size);
58 mCapacityEnd = mCapacityBegin + size;
59 mCurrent = mCapacityBegin;
60 mSizeEnd = mCapacityBegin;
62 for (
const auto& other : pOther) {
71 mCurrent = pOther.mCurrent;
72 mSizeEnd = pOther.mSizeEnd;
73 mCapacityBegin = pOther.mCapacityBegin;
74 mCapacityEnd = pOther.mCapacityEnd;
75 mAlloc = std::move(pOther.mAlloc);
76 pOther.mCapacityBegin =
nullptr;
83 template<
typename... Args>
87 const T&
Back()
const;
91 void Resize(
size_t pNewCapacity);
124 uintptr_t thisDiff = (uintptr_t) mPtr - (uintptr_t) (mParent->mCurrent);
125 uintptr_t otherDiff = (uintptr_t) pOther.mPtr - (uintptr_t) (mParent->mCurrent);
126 if ((mEnd && !pOther.mEnd) || (pOther.mBegin && !mBegin)) {
127 return std::strong_ordering::greater;
129 if ((mBegin && pOther.mBegin) || (pOther.mEnd && !mEnd)) {
130 return std::strong_ordering::less;
132 return thisDiff <=> otherDiff;
143 assert(mEnd ==
false &&
"Called ++ on an end iterator");
145 mPtr = mParent->advance(mPtr);
146 if (mParent->mCurrent == mPtr) mEnd =
true;
151 assert(mBegin ==
false &&
"Called -- on an begin iterator");
153 mPtr = mParent->retreat(mPtr);
154 if (mParent->mCurrent == mPtr) mBegin =
true;
174 std::ptrdiff_t thisDiff = mPtr - mParent->mCurrent;
175 std::ptrdiff_t otherDiff = pOther.mPtr - mParent->mCurrent;
176 std::ptrdiff_t fullDiff = mParent->mSizeEnd - mParent->mCapacityBegin;
177 if (thisDiff < 0 || (mEnd && thisDiff == 0)) {
178 thisDiff += fullDiff;
180 if (otherDiff < 0 || (pOther.mEnd && thisDiff == 0)) {
181 otherDiff += fullDiff;
183 return thisDiff - otherDiff;
188 assert(*
this - mParent->begin() + pNum <= mParent->
end() - mParent->begin() &&
"tried to move iterator after end!");
192 if (mPtr >= mParent->mSizeEnd) {
193 mPtr = mPtr - mParent->mSizeEnd + mParent->mCapacityBegin;
195 if (mParent->mCurrent == mPtr) mEnd =
true;
212 assert(*
this - mParent->begin() - pNum >= 0 &&
"tried to move iterator before begin!");
216 if (mPtr < mParent->mCapacityBegin) {
217 mPtr = (T*) ((uintptr_t) mPtr + (uintptr_t) mParent->mSizeEnd - (uintptr_t) mParent->mCapacityBegin);
219 if (mParent->mCurrent == mPtr) mBegin =
true;
233 return *(mParent->begin() + pNum);
241 <<
"mPtr: " << pObj.mPtr
242 <<
" mBegin: " << pObj.mBegin
243 <<
" mEnd: " << pObj.mEnd
244 <<
" mParent: " << pObj.mParent;
255 static_assert(std::random_access_iterator<RingBufferIterator>);
279 [[nodiscard]] T* advance(T* pElem)
const;
280 [[nodiscard]] T* retreat(T* pElem)
const;
285static_assert(std::ranges::random_access_range<ArcdpsExtension::RingBuffer<uint64_t>>);
286static_assert(std::ranges::random_access_range<const ArcdpsExtension::RingBuffer<uint64_t>>);
288template<
typename T,
typename Allocator>
291 new (elem) T(pElement);
294template<
typename T,
typename Allocator>
297 new (elem) T(pElement);
300template<
typename T,
typename Allocator>
303 if (mSizeEnd == mCapacityBegin) {
305 return mCapacityBegin;
308 if (mSizeEnd != mCapacityEnd) {
309 T* current = mSizeEnd;
315 T* current = mCurrent;
316 mCurrent = advance(mCurrent);
322template<
typename T,
typename Allocator>
324 auto val = pElem + 1;
325 if (val >= mSizeEnd)
return mCapacityBegin;
329template<
typename T,
typename Allocator>
332 if (val <= mCapacityBegin) val = mSizeEnd;
337template<
typename T,
typename Allocator>
338template<
typename... Args>
341 new (elem) T(args...);
344template<
typename T,
typename Allocator>
346 return *retreat(mCurrent);
349template<
typename T,
typename Allocator>
351 return *retreat(mCurrent);
354template<
typename T,
typename Allocator>
356 for (
auto it = begin(); it != end(); ++it) {
360 mCurrent = mSizeEnd = mCapacityBegin;
363template<
typename T,
typename Allocator>
365 return mSizeEnd - mCapacityBegin;
368template<
typename T,
typename Allocator>
371 T* current = mCurrent;
372 T* sizeEnd = mSizeEnd;
373 T* capacityBegin = mCapacityBegin;
374 T* capacityEnd = mCapacityEnd;
377 mCapacityBegin = mAlloc.allocate(pNewCapacity);
379 mCapacityEnd = mCapacityBegin + pNewCapacity;
380 mCurrent = mCapacityBegin;
381 mSizeEnd = mCapacityBegin;
387 while (sizeEnd != capacityBegin) {
388 PushBack(std::move(*val));
392 if (val >= sizeEnd) val = capacityBegin;
393 if (val == current)
break;
397 mAlloc.deallocate(capacityBegin, capacityEnd - capacityBegin);
400template<
typename T,
typename Allocator>
402 const auto var = begin() + pNum;
406template<
typename T,
typename Allocator>
408 auto var = begin() + pNum;
Definition SimpleRingBuffer.h:96
RingBufferIterator operator++(int)
Definition SimpleRingBuffer.h:159
reference operator*() const
Definition SimpleRingBuffer.h:136
T & reference
Definition SimpleRingBuffer.h:101
difference_type operator-(const RingBufferIterator &pOther) const
Definition SimpleRingBuffer.h:173
T value_type
Definition SimpleRingBuffer.h:99
pointer operator->() const
Definition SimpleRingBuffer.h:139
RingBufferIterator(const RingBufferIterator &pOther)=default
std::random_access_iterator_tag iterator_category
Definition SimpleRingBuffer.h:102
RingBufferIterator & operator--()
Definition SimpleRingBuffer.h:150
std::strong_ordering operator<=>(const RingBufferIterator &pOther) const
Definition SimpleRingBuffer.h:123
RingBufferIterator operator+(const difference_type pNum) const
Definition SimpleRingBuffer.h:199
RingBufferIterator operator-(const difference_type pNum) const
Definition SimpleRingBuffer.h:223
std::ptrdiff_t difference_type
Definition SimpleRingBuffer.h:98
std::random_access_iterator_tag iterator_concept
Definition SimpleRingBuffer.h:103
RingBufferIterator(pointer pPtr, bool pBegin, bool pEnd, const RingBuffer< T, Allocator > *pParent)
Definition SimpleRingBuffer.h:107
RingBufferIterator operator--(int)
Definition SimpleRingBuffer.h:165
RingBufferIterator & operator-=(const difference_type pNum)
Definition SimpleRingBuffer.h:211
RingBufferIterator & operator++()
Definition SimpleRingBuffer.h:142
RingBufferIterator(RingBufferIterator &&pOther) noexcept=default
RingBufferIterator & operator=(const RingBufferIterator &pOther)=default
RingBufferIterator & operator+=(const difference_type pNum)
Definition SimpleRingBuffer.h:187
friend RingBufferIterator operator+(const difference_type pLhs, const RingBufferIterator &pRhs)
Definition SimpleRingBuffer.h:205
friend std::ostream & operator<<(std::ostream &pOs, const RingBufferIterator &pObj)
Definition SimpleRingBuffer.h:239
T * pointer
Definition SimpleRingBuffer.h:100
RingBufferIterator & operator=(RingBufferIterator &&pOther) noexcept=default
reference operator[](const difference_type pNum) const
Definition SimpleRingBuffer.h:232
bool operator==(const RingBufferIterator &) const =default
RingBufferIterator()=default
Definition SimpleRingBuffer.h:15
void Resize(size_t pNewCapacity)
Definition SimpleRingBuffer.h:369
virtual ~RingBuffer()
Definition SimpleRingBuffer.h:25
const T & operator[](size_t pNum) const
Definition SimpleRingBuffer.h:401
const RingBufferIterator rend() const
Definition SimpleRingBuffer.h:267
RingBufferIterator end()
Definition SimpleRingBuffer.h:259
RingBuffer & operator=(RingBuffer &&pOther) noexcept
Definition SimpleRingBuffer.h:68
RingBuffer & operator=(const RingBuffer &pOther)
Definition SimpleRingBuffer.h:53
size_t Size() const
Definition SimpleRingBuffer.h:364
RingBufferIterator begin()
Definition SimpleRingBuffer.h:258
const RingBufferIterator cbegin() const
Definition SimpleRingBuffer.h:262
const RingBufferIterator crbegin() const
Definition SimpleRingBuffer.h:268
RingBuffer(const RingBuffer &pOther)
Definition SimpleRingBuffer.h:32
RingBufferIterator rend()
Definition SimpleRingBuffer.h:265
void PushBack(T &&pElement)
Definition SimpleRingBuffer.h:289
const RingBufferIterator cend() const
Definition SimpleRingBuffer.h:263
void Clear()
Definition SimpleRingBuffer.h:355
const RingBufferIterator crend() const
Definition SimpleRingBuffer.h:269
const RingBufferIterator begin() const
Definition SimpleRingBuffer.h:260
void EmplaceBack(const Args &... args)
Definition SimpleRingBuffer.h:339
const RingBufferIterator end() const
Definition SimpleRingBuffer.h:261
RingBufferIterator rbegin()
Definition SimpleRingBuffer.h:264
const RingBufferIterator rbegin() const
Definition SimpleRingBuffer.h:266
RingBuffer(RingBuffer &&pOther) noexcept
Definition SimpleRingBuffer.h:44
RingBuffer(size_t pInitialCapacity)
Definition SimpleRingBuffer.h:17
T & Back()
Definition SimpleRingBuffer.h:345
Definition ArcdpsExtension.h:10