ClassiCube/ClassicalSharp/Utils/StringBuffer.cs
2017-10-14 20:31:10 +11:00

127 lines
2.6 KiB
C#

// Copyright 2014-2017 ClassicalSharp | Licensed under BSD-3
using System;
namespace ClassicalSharp {
public class StringBuffer {
public char[] value;
public int Capacity;
public StringBuffer(int capacity) {
this.Capacity = capacity;
value = new char[capacity];
}
public StringBuffer Append(int index, char c) {
value[index] = c;
return this;
}
public StringBuffer Append(int index, string s) {
return Append(ref index, s);
}
public StringBuffer Append(ref int index, string s) {
for (int i = 0; i < s.Length; i++)
value[index++] = s[i];
return this;
}
public StringBuffer AppendColourless(ref int index, string s) {
for (int i = 0; i < s.Length; i++) {
char token = s[i];
if (token == '&')
i++;// Skip over the following colour code.
else
value[index++] = token;
}
return this;
}
public StringBuffer Append(ref int index, char c) {
value[index++] = c;
return this;
}
static char[] numBuffer = new char[20];
public StringBuffer AppendNum(ref int index, int num) {
int numLen = MakeNum(num);
for (int i = numLen - 1; i >= 0; i--)
value[index++] = numBuffer[i];
return this;
}
public StringBuffer AppendPaddedNum(ref int index, int minDigits, int num) {
for (int i = 0; i < minDigits; i++)
numBuffer[i] = '0';
int numLen = Math.Max(minDigits, MakeNum(num));
for (int i = numLen - 1; i >= 0; i--)
value[index++] = numBuffer[i];
return this;
}
int MakeNum(int num) {
int len = 0;
do {
numBuffer[len] = (char)('0' + (num % 10));
num /= 10; len++;
} while (num > 0);
return len;
}
public StringBuffer Clear() {
for (int i = 0; i < Capacity; i++)
value[i] = '\0';
return this;
}
public void DeleteAt(int index) {
for (int i = index; i < Capacity - 1; i++)
value[i] = value[i + 1];
value[Capacity - 1] = '\0';
}
public void InsertAt(int index, char c) {
for (int i = Capacity - 1; i > index; i--)
value[i] = value[i - 1];
value[index] = c;
}
public bool Empty {
get {
for (int i = 0; i < Capacity; i++) {
if (value[i] != '\0') return false;
}
return true;
}
}
public int Length {
get {
int len = Capacity;
for (int i = Capacity - 1; i >= 0; i--) {
if (value[i] != '\0') break;
len--;
}
return len;
}
}
public int TextLength {
get {
int len = Capacity;
for (int i = Capacity - 1; i >= 0; i--) {
if (value[i] != '\0' && value[i] != ' ') break;
len--;
}
return len;
}
}
public override string ToString() {
return new String(value, 0, Length);
}
}
}