1/*
2 * Copyright 2008, Ingo Weinhold, ingo_weinhold@gmx.de.
3 * Distributed under the terms of the MIT License.
4 */
5#ifndef HISTORY_BUFFER_H
6#define HISTORY_BUFFER_H
7
8#include <SupportDefs.h>
9
10#include "TerminalLine.h"
11
12
13struct HistoryLine;
14struct TerminalLine;
15
16
17class HistoryBuffer {
18public:
19								HistoryBuffer();
20								~HistoryBuffer();
21
22			status_t			Init(int32 width, int32 capacity);
23
24			void				Clear();
25
26			int32				Width() const		{ return fWidth; }
27			int32				Capacity() const	{ return fCapacity; }
28			int32				Size() const		{ return fSize; }
29
30	inline	HistoryLine*		LineAt(int32 index) const;
31			TerminalLine*		GetTerminalLineAt(int32 index,
32									TerminalLine* buffer) const;
33
34			void				AddLine(const TerminalLine* line);
35			void				AddEmptyLines(int32 count);
36			void				DropLines(int32 count);
37
38private:
39			HistoryLine*		_AllocateLine(int32 attributesRuns,
40									int32 byteLength);
41	inline	HistoryLine*		_LineAt(int32 index) const;
42
43private:
44			HistoryLine*		fLines;
45			int32				fWidth;
46			int32				fCapacity;
47			int32				fNextLine;
48			int32				fSize;
49			uint8*				fBuffer;
50			int32				fBufferSize;
51			int32				fBufferAllocationOffset;
52};
53
54
55inline HistoryLine*
56HistoryBuffer::_LineAt(int32 index) const
57{
58	return &fLines[(fCapacity + fNextLine - index - 1) % fCapacity];
59}
60
61
62inline HistoryLine*
63HistoryBuffer::LineAt(int32 index) const
64{
65	return index >= 0 && index < fSize ? _LineAt(index) : NULL;
66}
67
68
69#endif	// HISTORY_BUFFER_H
70