diff options
Diffstat (limited to 'src/CellBuffer.h')
| -rw-r--r-- | src/CellBuffer.h | 69 | 
1 files changed, 28 insertions, 41 deletions
diff --git a/src/CellBuffer.h b/src/CellBuffer.h index 92bbfa0da..7faeecd23 100644 --- a/src/CellBuffer.h +++ b/src/CellBuffer.h @@ -27,10 +27,10 @@ class MarkerHandleSet {  public:  	MarkerHandleSet();  	~MarkerHandleSet(); -	int Length(); -	int NumberFromHandle(int handle); -	int MarkValue();	///< Bit set of marker numbers. -	bool Contains(int handle); +	int Length() const; +	int NumberFromHandle(int handle) const; +	int MarkValue() const;	///< Bit set of marker numbers. +	bool Contains(int handle) const;  	bool InsertHandle(int handle, int markerNum);  	void RemoveHandle(int handle);  	bool RemoveNumber(int markerNum); @@ -38,43 +38,40 @@ public:  };  /** - * Each line stores the starting position of the first character of the line in the cell buffer - * and potentially a marker handle set. Often a line will not have any attached markers. - */ -struct LineData { -	int startPosition; -	MarkerHandleSet *handleSet; -	LineData() : startPosition(0), handleSet(0) { -	} -}; - -/**   * The line vector contains information about each of the lines in a cell buffer.   */  class LineVector { -public: -	int growSize; -	int lines; -	LineData *linesData; -	int size; -	int *levels; -	int sizeLevels; +	Partitioning starts; +	SplitVector<MarkerHandleSet *> markers; +	SplitVector<int> levels;  	/// Handles are allocated sequentially and should never have to be reused as 32 bit ints are very big.  	int handleCurrent; +public: +  	LineVector();  	~LineVector();  	void Init(); -	void Expand(int sizeNew);  	void ExpandLevels(int sizeNew=-1);  	void ClearLevels(); -	void InsertValue(int pos, int value); -	void SetValue(int pos, int value); -	void Remove(int pos); +	int SetLevel(int line, int level); +	int GetLevel(int line); + +	void InsertText(int line, int delta); +	void InsertLine(int line, int position); +	void SetLineStart(int line, int position); +	void RemoveLine(int line); +	int Lines() { +		return starts.Partitions(); +	}  	int LineFromPosition(int pos); +	int LineStart(int line) { +		return starts.PositionFromPartition(line); +	} +	int MarkValue(int line);  	int AddMark(int line, int marker);  	void MergeMarkers(int pos);  	void DeleteMark(int line, int markerNum, bool all); @@ -150,16 +147,8 @@ public:   */  class CellBuffer {  private: -	char *body;		///< The cell buffer itself. -	int size;		///< Allocated size of the buffer. -	int length;		///< Total length of the data. -	int part1len;	///< Length of the first part. -	int gaplen;		///< Length of the gap between the two parts. -	char *part2body;	///< The second part of the cell buffer. -						///< Doesn't point after the gap but set so that -						///< part2body[position] is consistent with body[position]. +	SplitVector<char> body;  	bool readOnly; -	int growSize;  	bool collectingUndo;  	UndoHistory uh; @@ -168,15 +157,13 @@ private:  	SVector lineStates; -	void GapTo(int position); -	void RoomFor(int insertionLength); - -	inline char ByteAt(int position); -	void SetByteAt(int position, char ch); +	char ByteAt(int position) { +		return body.ValueAt(position); +	}  public: -	CellBuffer(int initialLength = 4000); +	CellBuffer();  	~CellBuffer();  	/// Retrieving positions outside the range of the buffer works and returns 0  | 
