32 : m_iReadLast(iReadLast)
33 , m_iWriteLast(iWriteLast)
38 m_iReadLast = iReadLast;
39 m_iWriteLast = iWriteLast;
43 return m_iReadLast == m_iWriteLast;
47 m_iReadLast = m_iWriteLast = 0;
64 ASSERT(m_iWriteLast >= m_iReadLast);
65 return m_iWriteLast - m_iReadLast;
71 m_iReadLast += iCount;
72 ASSERT(m_iReadLast >= 0 && m_iReadLast <= m_iWriteLast);
82 template<
class TYPE = BYTE, ITERATE_t _QTY = 1024>
99 return m_iWriteNext == 0;
103 return m_iWriteNext >= _QTY;
107 ASSERT(m_iWriteNext >= 1);
108 return m_Data[--m_iWriteNext];
112 ASSERT(m_iWriteNext < _QTY);
113 m_Data[m_iWriteNext++] = v;
117 template<
class TYPE = BYTE, ITERATE_t _QTY = 1024>
152 return GetWrapIndex(m_iWriteLast + 1) == m_iReadLast;
158 m_iReadLast = m_iWriteLast;
170 return iWrite - iRead;
175 ITERATE_t iTop = (m_iWriteLast >= m_iReadLast) ? m_iWriteLast : _QTY;
176 return iTop - m_iReadLast;
182 return &m_Data[m_iReadLast];
187 if (iCount > iReadCount)
189 m_iReadLast = GetWrapIndex(m_iReadLast + iCount);
196 return (_QTY - 1) - get_ReadQtyT();
207 ITERATE_t iReadNext = GetWrapIndex(iRead + 1);
208 TYPE val = m_Data[iRead];
209 m_iReadLast = iReadNext;
218 for (; !isEmptyQ() && i < nCountMax; i++)
228 for (; !isEmptyQ() && i < nCountMax; i++)
243 ITERATE_t iWriteNext = GetWrapIndex(iWrite + 1);
244 if (iWriteNext == m_iReadLast)
246 m_Data[iWrite] = val;
247 m_iWriteLast = iWriteNext;
257 ASSERT(iRoom >= 0 && iRoom <= _QTY);
259 ASSERT(iWrite >= 0 && iWrite < _QTY);
261 if (iWrite + iLengthMin > _QTY)
267 m_iWriteLast = iTmp2;
272 m_iWriteLast = iWrite + iLengthMin;
281 for (; !isFullQ() && i < iLength; i++)
291 template <
class TYPE = BYTE>
303 , m_pData(const_cast<
TYPE*>(pData))
316 ASSERT(m_pData !=
nullptr);
317 return(m_pData + m_iReadLast);
321 m_pData =
const_cast<TYPE*
>(pData);
322 InitQ(iReadLast, iWriteLast);
329 return m_pData[m_iReadLast++];
337 if (iDataMaxQty > iQtyAvail)
338 iDataMaxQty = iQtyAvail;
339 if (pData !=
nullptr)
342 CopyElements(pData, m_pData + m_iReadLast, iDataMaxQty);
353 const ITERATE_t iQtyAvail = get_ReadQty();
354 if (iDataMaxQty > iQtyAvail)
355 iDataMaxQty = iQtyAvail;
356 if (pData !=
nullptr)
359 CopyElements(pData, m_pData + m_iReadLast, iDataMaxQty);
361 AdvanceRead(iDataMaxQty);
372 if (this->m_iReadLast <= 0)
377 const TYPE* pTmp = this->m_pData + this->m_iReadLast;
380 this->InitQ(0, iSize);
386 template <
class TYPE = BYTE>
405 , m_iDataSizeAlloc(0)
406 , m_iAutoReadCommit(0)
412 , m_iDataSizeAlloc(iDataAlloc)
413 , m_iAutoReadCommit(iAutoReadCommit)
419 , m_iDataSizeAlloc(iDataMax)
420 , m_iAutoReadCommit(0)
436 if (m_iAutoReadCommit != 0 && this->m_iReadLast >= m_iAutoReadCommit)
438 this->ReadCommitNow();
443 return m_iAutoReadCommit;
450 m_iAutoReadCommit = iAutoReadCommit;
451 if (iAutoReadCommit != 0)
453 this->ReadCommitNow();
461 ASSERT(iReadLo <= this->m_iWriteLast);
462 this->m_iReadLast = iReadLo;
475 SUPER_t::SeekQ(iOffset, eSeekOrigin);
477 return this->m_iReadLast;
484 HRESULT iReadQty = SUPER_t::ReadQty(pData, iDataMaxQty);
493 return iReadQty *
sizeof(
TYPE);
502 return(this->m_iWriteLast >= m_iDataSizeAlloc);
509 ASSERT(this->m_iWriteLast <= m_iDataSizeAlloc);
510 return(m_iDataSizeAlloc - this->m_iWriteLast);
515 ASSERT(this->m_pData !=
nullptr);
516 return(this->m_pData + this->m_iWriteLast);
526 if (iWriteSpace <= 0)
529 iQtyMax = iWriteSpace;
530 if (pData !=
nullptr)
532 WriteQN(pData, iQtyMax);
541 return iReadQty *
sizeof(
TYPE);
548 this->m_iWriteLast += iCount;
549 ASSERT(m_iDataSizeAlloc >= this->m_iWriteLast);
559 ASSERT_N(this->m_iWriteLast + iQtyMax <= m_iDataSizeAlloc);
560 if (pData !=
nullptr)
562 CopyElements(this->m_pData + this->m_iWriteLast, pData, iQtyMax);
564 AdvanceWrite(iQtyMax);
570 template<
class TYPE = BYTE>
650 if (iRoom >= iDesiredCount)
653 ITERATE_t iGrowRequest = iDesiredCount - iRoom;
690 m_aData[iWrite] = val;
752 cMem::CopyOverlap(m_pData + m_iReadLast + iLen, m_pData + m_iReadLast, get_ReadQty());
753 cMem::Copy(m_pData + m_iReadLast, pDataSrc, iLen);
761 if (iLen > (
size_t)m_iDataSizeAlloc)
774 template<
class TYPE = BYTE>
800 cQueueChunk* m_pFirst;
801 cQueueChunk* m_pLast;
805 : m_nGrowSizeChunk(nGrowSizeChunk)
818 return(m_nTotalQty == 0);
824 ASSERT(m_pFirst ==
nullptr);
825 ASSERT(m_pLast ==
nullptr);
836 if (m_pFirst ==
nullptr)
838 return m_pFirst->get_ReadQty();
846 return m_pFirst->get_ReadPtr();
852 while (iCountLeft >= 0)
858 if (iCountLeft < iSize)
868 m_nTotalQty -= iCount;
870 if (m_pFirst ==
nullptr)
878 if (m_pLast ==
nullptr)
880 return m_nGrowSizeChunk;
882 return m_pLast->get_WriteQty();
891 m_pFirst = m_pLast =
new cQueueChunk(m_nGrowSizeChunk);
893 else if (m_pLast->isFullQ())
897 return m_pLast->GetWritePrepared(iDesiredCount);
902 ASSERT(m_pLast !=
nullptr);
904 m_pLast->AdvanceWrite(iCount);
905 m_nTotalQty += iCount;
910 ASSERT(m_pFirst !=
nullptr);
920 for (; !
isEmptyQ() && i < nCountMax; i++)
936 for (; i < nCount; i++)
#define GRAYCORE_LINK
Definition: GrayCore.h:47
#define HRESULT_WIN32_C(x)
a constant LSTATUS/error_status_t with no check, unlike HRESULT_FROM_WIN32()
Definition: HResult.h:79
#define FAILED(x)
Definition: HResult.h:30
#define IS_INDEX_GOOD(i, q)
cast the (likely) int to unsigned to check for negatives.
Definition: Index.h:35
#define TYPE
Definition: StrT.cpp:38
#define MIN(a, b)
Definition: SysTypes.h:457
INT32 HRESULT
_WIN32 style error codes. INT32
Definition: SysTypes.h:465
#define ASSERT(exp)
Definition: cDebugAssert.h:87
#define STATIC_ASSERT(exp, name)
Definition: cDebugAssert.h:24
#define ASSERT_N(exp)
Definition: cDebugAssert.h:70
#define DEBUG_ASSERT(exp, sDesc)
Definition: cDebugAssert.h:93
#define UNITTEST_FRIEND(n)
Define this in the class body to be unit tested. Allow the unit test to access private/protected stuf...
Definition: cUnitTestDecl.h:17
void SetSize(ITERATE_t nNewSize)
Definition: cArray.h:248
TYPE * get_DataWork() const
Definition: cArray.h:682
ITERATE_t get_ReadIndex() const noexcept
Definition: cQueue.h:50
ITERATE_t get_ReadQty() const
Definition: cQueue.h:60
void AdvanceRead(ITERATE_t iCount=1)
Definition: cQueue.h:68
void EmptyQ() noexcept
Definition: cQueue.h:45
void InitQ(ITERATE_t iReadLast=0, ITERATE_t iWriteLast=0) noexcept
Definition: cQueue.h:36
ITERATE_t m_iReadLast
old items removed/read from here.
Definition: cQueue.h:27
ITERATE_t m_iWriteLast
new items added/written here. end of read.
Definition: cQueue.h:28
ITERATE_t get_WriteIndex() const noexcept
Definition: cQueue.h:55
cQueueBase(ITERATE_t iReadLast=0, ITERATE_t iWriteLast=0) noexcept
Definition: cQueue.h:31
bool isEmptyQ() const noexcept
Definition: cQueue.h:41
bool InsertDataHead(const BYTE *pDataSrc, size_t iLen)
Definition: cQueue.h:747
cQueueBytes(size_t nGrowSizeChunk=8 *1024, size_t nGrowSizeMax=cHeap::k_ALLOC_MAX) noexcept
Definition: cQueue.h:737
bool SetAllData(const BYTE *pData, size_t iLen)
Definition: cQueue.h:757
~cQueueBytes()
Definition: cQueue.h:742
cQueueChunk(ITERATE_t nGrowSizeChunk)
Definition: cQueue.h:791
cQueueChunk * m_pNext
Definition: cQueue.h:789
HRESULT WriteQty(const TYPE *pBuf, ITERATE_t nCount)
Definition: cQueue.h:932
ITERATE_t ReadQty(TYPE *pBuf, ITERATE_t nCountMax)
Definition: cQueue.h:916
~cQueueChunked()
Definition: cQueue.h:811
TYPE Read1(void)
Definition: cQueue.h:908
ITERATE_t get_ReadQtyT() const
Definition: cQueue.h:828
void WriteQ(TYPE val)
Definition: cQueue.h:926
TYPE * GetWritePrepared(ITERATE_t iDesiredCount=1)
Definition: cQueue.h:884
ITERATE_t get_ReadQtyC() const
Definition: cQueue.h:833
cQueueChunked(ITERATE_t nGrowSizeChunk)
Definition: cQueue.h:804
const TYPE * get_ReadPtrC() const
Definition: cQueue.h:840
bool isEmptyQ() const
Definition: cQueue.h:816
ITERATE_t get_WriteQty(void) const
Definition: cQueue.h:875
void EmptyQ()
Definition: cQueue.h:820
void AdvanceRead(ITERATE_t iCount=1)
Definition: cQueue.h:848
void AdvanceWrite(ITERATE_t iCount=1)
Definition: cQueue.h:899
cQueueDyn(ITERATE_t nGrowSizeChunk=128, ITERATE_t nGrowSizeMax=(cHeap::k_ALLOC_MAX/sizeof(TYPE))) noexcept
Definition: cQueue.h:606
TYPE * GetWritePrepared(ITERATE_t iDesiredCount=1)
Definition: cQueue.h:669
HRESULT WriteX(const void *pData, size_t nDataSize)
Definition: cQueue.h:716
void WriteQ(cQueueRead< BYTE > &queue)
Definition: cQueue.h:709
bool AllocSizeMaxQ(ITERATE_t iDataAlloc)
Definition: cQueue.h:589
ITERATE_t m_nGrowSizeChunk
number of TYPE elements to grow by in a single re-alloc chunk. 0 = never grow.
Definition: cQueue.h:585
~cQueueDyn()
Definition: cQueue.h:628
void put_GrowSizeChunk(ITERATE_t nGrowSizeChunk) noexcept
Definition: cQueue.h:633
bool MakeWritePrepared(ITERATE_t iDesiredCount=1)
Definition: cQueue.h:645
ITERATE_t m_nGrowSizeMax
Total arbitrary max allowed for m_iDataSizeAlloc. 0 = never grow.
Definition: cQueue.h:586
ITERATE_t get_GrowSizeChunk() const noexcept
Definition: cQueue.h:640
bool WriteQ(TYPE val)
Definition: cQueue.h:679
HRESULT WriteQty(const TYPE *pVal, ITERATE_t iCount)
Definition: cQueue.h:693
cQueueRW(TYPE *pData, ITERATE_t iDataAlloc, ITERATE_t iReadLast, ITERATE_t iWriteLast, ITERATE_t iAutoReadCommit=0)
Definition: cQueue.h:410
ITERATE_t m_iAutoReadCommit
Read data is destroyed once read more than this amount. make more room for writing....
Definition: cQueue.h:400
void WriteQN(const TYPE *pData, ITERATE_t iQtyMax)
Definition: cQueue.h:553
ITERATE_t m_iDataSizeAlloc
The max qty we can write into m_pData. Maybe NOT exactly same as m_pData true OS allocated size?
Definition: cQueue.h:399
void put_AutoReadCommit(ITERATE_t iAutoReadCommit=8 *1024)
Definition: cQueue.h:445
bool isFullQ() const
Definition: cQueue.h:499
HRESULT WriteQty(const TYPE *pData, ITERATE_t iQtyMax)
Definition: cQueue.h:519
HRESULT WriteX(const void *pData, size_t nDataSize)
Definition: cQueue.h:537
void ReadCommitCheck()
Definition: cQueue.h:432
HRESULT ReadQty(TYPE *pData, ITERATE_t iDataMaxQty)
Definition: cQueue.h:480
void AdvanceWrite(ITERATE_t iCount=1)
Definition: cQueue.h:544
TYPE * get_WritePtr() const
Definition: cQueue.h:512
void put_ReadIndex(ITERATE_t iReadLo)
Definition: cQueue.h:457
HRESULT ReadX(void *pData, size_t nDataSize)
Definition: cQueue.h:489
~cQueueRW()
Definition: cQueue.h:424
STREAM_SEEKRET_t SeekQ(STREAM_OFFSET_t iOffset, SEEK_ORIGIN_TYPE eSeekOrigin=SEEK_Set)
Definition: cQueue.h:467
ITERATE_t get_WriteQty() const
Definition: cQueue.h:505
cQueueRW() noexcept
Definition: cQueue.h:403
ITERATE_t get_AutoReadCommit() const
Definition: cQueue.h:441
cQueueRW(const TYPE *pData, ITERATE_t iDataMax)
Definition: cQueue.h:417
const TYPE * get_ReadPtr() const
Definition: cQueue.h:312
~cQueueRead()
Definition: cQueue.h:306
void ReadCommitNow()
Definition: cQueue.h:365
HRESULT ReadQty(TYPE *pData, ITERATE_t iDataMaxQty)
Definition: cQueue.h:347
HRESULT ReadPeek(TYPE *pData, ITERATE_t iDataMaxQty)
Definition: cQueue.h:331
TYPE Read1(void)
Definition: cQueue.h:325
void SetQueueRead(const TYPE *pData, ITERATE_t iReadLast=0, ITERATE_t iWriteLast=0)
Definition: cQueue.h:319
TYPE * m_pData
NOT owned/managed block of memory I read from. not freed on destruct.
Definition: cQueue.h:298
cQueueRead(const TYPE *pData=nullptr, ITERATE_t iReadLast=0, ITERATE_t iWriteLast=0) noexcept
Definition: cQueue.h:301
const TYPE * get_ReadPtr() const
Definition: cQueue.h:178
ITERATE_t get_ReadQtyC() const noexcept
Definition: cQueue.h:172
ITERATE_t ReadQty(TYPE *pBuf, ITERATE_t nCountMax)
Definition: cQueue.h:212
void AdvanceRead(ITERATE_t iCount=1)
Definition: cQueue.h:184
HRESULT WriteQty(const TYPE *pVal, ITERATE_t iLength)
Definition: cQueue.h:250
bool WriteQ(TYPE val)
Definition: cQueue.h:235
TYPE Read1()
Definition: cQueue.h:199
ITERATE_t ReadQtySafe(TYPE *pBuf, ITERATE_t nCountMax)
Definition: cQueue.h:224
ITERATE_t get_WriteQtyT() const noexcept
Definition: cQueue.h:192
ITERATE_t GetWrapIndex(ITERATE_t i) const noexcept
Definition: cQueue.h:130
void EmptyQ() noexcept
Definition: cQueue.h:154
bool isFullQ() const noexcept
Definition: cQueue.h:150
HRESULT WriteQtySafe(const TYPE *pVal, ITERATE_t iLength)
Definition: cQueue.h:277
ITERATE_t get_ReadQtyT() const noexcept
Definition: cQueue.h:160
cQueueStatic() noexcept
Definition: cQueue.h:143
bool isFull() const noexcept
Definition: cQueue.h:101
bool isEmpty() const noexcept
Definition: cQueue.h:97
TYPE Pop()
Definition: cQueue.h:105
void Push(TYPE v)
Definition: cQueue.h:110
cStackStatic() noexcept
Definition: cQueue.h:92
< The main namespace for all Core functions.
Definition: GrayCore.cpp:14
LONG_PTR STREAM_OFFSET_t
Might be 64 or 32 bit. TODO SET USE_FILE_POS64.
Definition: cOSHandle.h:52
void __cdecl CopyElements(TYPE *pDest, const TYPE *pSrc, ITERATE_t nCount)
Definition: cArray.h:72
LONG_PTR STREAM_SEEKRET_t
return from Seek()
Definition: cOSHandle.h:53
int ITERATE_t
like size_t but signed
Definition: Index.h:28
SEEK_ORIGIN_TYPE
Definition: cOSHandle.h:34
@ SEEK_Set
SEEK_SET = FILE_BEGIN = STREAM_SEEK_SET = 0 = relative to the start of the file.
Definition: cOSHandle.h:39
static const size_t k_ALLOC_MAX
256 * 64K = (arbitrary) largest reasonable single malloc.
Definition: cHeap.h:45
static void Copy(void *pDst, const void *pSrc, size_t nSizeBlock) noexcept
Definition: cMem.h:132
static void Zero(void *pData, size_t nSizeBlock) noexcept
Definition: cMem.h:100
static void CopyOverlap(void *pDst, const void *pSrc, size_t nSizeBlock) noexcept
Definition: cMem.h:139