#pragma once #include #define OUT class CircularBuffer { public: CircularBuffer(size_t capacity) : mBRegionPointer(nullptr), mARegionSize(0), mBRegionSize(0), mCapacity(capacity) { mBuffer = new char[mCapacity] ; mBufferEnd = mBuffer + mCapacity ; mARegionPointer = mBuffer ; } ~CircularBuffer() { delete [] mBuffer ; } void BufferReset() { mBRegionPointer = nullptr; mARegionSize = 0; mBRegionSize = 0; memset(mBuffer, 0, mCapacity); mBufferEnd = mBuffer + mCapacity; mARegionPointer = mBuffer; } bool Peek(OUT char* destbuf, size_t bytes) const; bool Read(OUT char* destbuf, size_t bytes); bool Write(const char* data, size_t bytes); /// ¹öÆÛÀÇ Ã¹ºÎºÐ len¸¸Å­ ³¯¸®±â void Remove(size_t len) ; size_t GetFreeSpaceSize() { if ( mBRegionPointer != nullptr ) return GetBFreeSpace() ; else { /// A ¹öÆÛº¸´Ù ´õ ¸¹ÀÌ Á¸ÀçÇϸé, B ¹öÆÛ·Î ½ºÀ§Ä¡ if ( GetAFreeSpace() < GetSpaceBeforeA() ) { AllocateB() ; return GetBFreeSpace() ; } else return GetAFreeSpace() ; } } size_t GetStoredSize() const { return mARegionSize + mBRegionSize ; } size_t GetContiguiousBytes() const { if ( mARegionSize > 0 ) return mARegionSize ; else return mBRegionSize ; } /// ¾²±â°¡ °¡´ÉÇÑ À§Ä¡ (¹öÆÛÀÇ ³¡ºÎºÐ) ¹Ýȯ char* GetBuffer() const { if( mBRegionPointer != nullptr ) return mBRegionPointer + mBRegionSize ; else return mARegionPointer + mARegionSize ; } /// Ä¿¹Ô(aka. IncrementWritten) void Commit(size_t len) { if ( mBRegionPointer != nullptr ) mBRegionSize += len ; else mARegionSize += len ; } /// ¹öÆÛÀÇ Ã¹ºÎºÐ ¸®ÅÏ char* GetBufferStart() const { if ( mARegionSize > 0 ) return mARegionPointer ; else return mBRegionPointer ; } private: void AllocateB() { mBRegionPointer = mBuffer ; } size_t GetAFreeSpace() const { return (mBufferEnd - mARegionPointer - mARegionSize) ; } size_t GetSpaceBeforeA() const { return (mARegionPointer - mBuffer) ; } size_t GetBFreeSpace() const { if (mBRegionPointer == nullptr) return 0 ; return (mARegionPointer - mBRegionPointer - mBRegionSize) ; } private: char* mBuffer ; char* mBufferEnd ; char* mARegionPointer ; size_t mARegionSize ; char* mBRegionPointer ; size_t mBRegionSize ; size_t mCapacity; } ;