코드 4-1 출력 메모리 스트림
class OutputMemoryStream { public: OutputMemoryStream() : mBuffer(nullptr), mHead(0), mCapacity(0) { ReallocBuffer(32); } ~OutputMemoryStream() { std::free(mBuffer); } // 스트림의 데이터 시작 위치 포인터를 구함 const char* GetBufferPtr() const { return mBuffer; } uint32_t GetLength() const { return mHead; } void Write(const void* inData, size_t inByteCount); void Write(uint32_t inData) { Write(&inData, sizeof(inData)); } void Write(int32_t inData) { Write(&inData, sizeof(inData)); } private: void ReallocBuffer(uint32_t inNewLength); char* mBuffer; uint32_t mHead; uint32_t mCapacity; }; void OutputMemoryStream::ReallocBuffer(uint32_t inNewLength) { mBuffer = static_cast<char*>(std::realloc(mBuffer, inNewLength)); // realloc 호출이 실패한 경우 처리 // … mCapacity = inNewLength; } void OutputMemoryStream::Write(const void* inData, size_t inByteCount) { // 공간을 일단 충분히 확보 uint32_t resultHead = mHead + static_cast<uint32_t>(inByteCount); if (resultHead > mCapacity) ReallocBuffer(std::max(mCapacity * 2, resultHead)); // 버퍼의 제일 앞에 복사 std::memcpy(mBuffer + mHead, inData, inByteCount); // mHead를 전진시켜 다음 기록에 대비 mHead = resultHead; }