더북(TheBook)

코드 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;
}

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.