#include "CircularBuffer.h" #include bool CircularBuffer::Peek(OUT char* destbuf, size_t bytes) const { assert(mBuffer != nullptr); if (mARegionSize + mBRegionSize < bytes) return false; size_t cnt = bytes; size_t aRead = 0; /// A, B ¿µ¿ª µÑ´Ù µ¥ÀÌÅÍ°¡ ÀÖ´Â °æ¿ì´Â A¸ÕÀú Àд´٠if (mARegionSize > 0) { aRead = (cnt > mARegionSize) ? mARegionSize : cnt; memcpy(destbuf, mARegionPointer, aRead); cnt -= aRead; } /// Àб⠿䱸ÇÑ µ¥ÀÌÅÍ°¡ ´õ ÀÖ´Ù¸é B ¿µ¿ª¿¡¼­ Àд´٠if (cnt > 0 && mBRegionSize > 0) { assert(cnt <= mBRegionSize); /// ³²Àº°Å ¸¶Àú ´Ù Àбâ size_t bRead = cnt; memcpy(destbuf + aRead, mBRegionPointer, bRead); cnt -= bRead; } assert(cnt == 0); return true; } bool CircularBuffer::Read(OUT char* destbuf, size_t bytes) { assert(mBuffer != nullptr); if (mARegionSize + mBRegionSize < bytes) return false; size_t cnt = bytes; size_t aRead = 0; /// A, B ¿µ¿ª µÑ´Ù µ¥ÀÌÅÍ°¡ ÀÖ´Â °æ¿ì´Â A¸ÕÀú Àд´٠if (mARegionSize > 0) { aRead = (cnt > mARegionSize) ? mARegionSize : cnt; memcpy(destbuf, mARegionPointer, aRead); mARegionSize -= aRead; mARegionPointer += aRead; cnt -= aRead; } /// Àб⠿䱸ÇÑ µ¥ÀÌÅÍ°¡ ´õ ÀÖ´Ù¸é B ¿µ¿ª¿¡¼­ Àд´٠if (cnt > 0 && mBRegionSize > 0) { assert(cnt <= mBRegionSize); /// ³²Àº°Å ¸¶Àú ´Ù Àбâ size_t bRead = cnt; memcpy(destbuf + aRead, mBRegionPointer, bRead); mBRegionSize -= bRead; mBRegionPointer += bRead; cnt -= bRead; } assert(cnt == 0); /// A ¹öÆÛ°¡ ºñ¾ú´Ù¸é B¹öÆÛ¸¦ ¸Ç ¾ÕÀ¸·Î ´ç±â°í A ¹öÆÛ·Î ÁöÁ¤ if (mARegionSize == 0) { if (mBRegionSize > 0) { if (mBRegionPointer != mBuffer) memmove(mBuffer, mBRegionPointer, mBRegionSize); mARegionPointer = mBuffer; mARegionSize = mBRegionSize; mBRegionPointer = nullptr; mBRegionSize = 0; } else { /// B¿¡ ¾Æ¹«°Íµµ ¾ø´Â °æ¿ì ±×³É A·Î ½ºÀ§Ä¡ mBRegionPointer = nullptr; mBRegionSize = 0; mARegionPointer = mBuffer; mARegionSize = 0; } } return true; } bool CircularBuffer::Write(const char* data, size_t bytes) { assert(mBuffer != nullptr); /// Read¿Í ¹Ý´ë·Î B°¡ ÀÖ´Ù¸é B¿µ¿ª¿¡ ¸ÕÀú ¾´´Ù if (mBRegionPointer != nullptr) { if (GetBFreeSpace() < bytes) return false; memcpy(mBRegionPointer + mBRegionSize, data, bytes); mBRegionSize += bytes; return true; } /// A¿µ¿ªº¸´Ù ´Ù¸¥ ¿µ¿ªÀÇ ¿ë·®ÀÌ ´õ Ŭ °æ¿ì ±× ¿µ¿ªÀ» B·Î ¼³Á¤ÇÏ°í ±â·Ï if (GetAFreeSpace() < GetSpaceBeforeA()) { AllocateB(); if (GetBFreeSpace() < bytes) return false; memcpy(mBRegionPointer + mBRegionSize, data, bytes); mBRegionSize += bytes; return true; } /// A¿µ¿ªÀÌ ´õ Å©¸é ´ç¿¬È÷ A¿¡ ¾²±â else { if (GetAFreeSpace() < bytes) return false; memcpy(mARegionPointer + mARegionSize, data, bytes); mARegionSize += bytes; return true; } } void CircularBuffer::Remove(size_t len) { size_t cnt = len ; /// Read¿Í ¸¶Âù°¡Áö·Î A°¡ ÀÖ´Ù¸é A¿µ¿ª¿¡¼­ ¸ÕÀú »èÁ¦ if ( mARegionSize > 0 ) { size_t aRemove = (cnt > mARegionSize) ? mARegionSize : cnt ; mARegionSize -= aRemove ; mARegionPointer += aRemove ; cnt -= aRemove ; } // Á¦°ÅÇÒ ¿ë·®ÀÌ ´õ ³²Àº°æ¿ì B¿¡¼­ Á¦°Å if ( cnt > 0 && mBRegionSize > 0 ) { size_t bRemove = (cnt > mBRegionSize) ? mBRegionSize : cnt ; mBRegionSize -= bRemove ; mBRegionPointer += bRemove ; cnt -= bRemove ; } /// A¿µ¿ªÀÌ ºñ¿öÁö¸é B¸¦ A·Î ½ºÀ§Ä¡ if ( mARegionSize == 0 ) { if ( mBRegionSize > 0 ) { /// ¾ÕÀ¸·Î ´ç°Ü ºÙÀ̱â if ( mBRegionPointer != mBuffer ) memmove(mBuffer, mBRegionPointer, mBRegionSize) ; mARegionPointer = mBuffer ; mARegionSize = mBRegionSize ; mBRegionPointer = nullptr ; mBRegionSize = 0 ; } else { mBRegionPointer = nullptr ; mBRegionSize = 0 ; mARegionPointer = mBuffer ; mARegionSize = 0 ; } } }