/* * Copyright 2008, Ingo Weinhold, ingo_weinhold@gmx.de. * Distributed under the terms of the MIT License. */ #ifndef HISTORY_BUFFER_H #define HISTORY_BUFFER_H #include #include "TerminalLine.h" struct HistoryLine; struct TerminalLine; class HistoryBuffer { public: HistoryBuffer(); ~HistoryBuffer(); status_t Init(int32 width, int32 capacity); void Clear(); int32 Width() const { return fWidth; } int32 Capacity() const { return fCapacity; } int32 Size() const { return fSize; } inline HistoryLine* LineAt(int32 index) const; TerminalLine* GetTerminalLineAt(int32 index, TerminalLine* buffer) const; void AddLine(const TerminalLine* line); void AddEmptyLines(int32 count); void DropLines(int32 count); private: HistoryLine* _AllocateLine(int32 attributesRuns, int32 byteLength); inline HistoryLine* _LineAt(int32 index) const; private: HistoryLine* fLines; int32 fWidth; int32 fCapacity; int32 fNextLine; int32 fSize; uint8* fBuffer; int32 fBufferSize; int32 fBufferAllocationOffset; }; inline HistoryLine* HistoryBuffer::_LineAt(int32 index) const { return &fLines[(fCapacity + fNextLine - index - 1) % fCapacity]; } inline HistoryLine* HistoryBuffer::LineAt(int32 index) const { return index >= 0 && index < fSize ? _LineAt(index) : NULL; } #endif // HISTORY_BUFFER_H