mirror of
https://github.com/ClassiCube/ClassiCube.git
synced 2025-10-02 10:22:52 -04:00
133 lines
2.8 KiB
C#
133 lines
2.8 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, long 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, long 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(long num) {
|
|
int len = 0;
|
|
numBuffer[len++] = (char)('0' + (num % 10)); num /= 10;
|
|
|
|
while (num > 0) {
|
|
numBuffer[len++] = (char)('0' + (num % 10)); num /= 10;
|
|
}
|
|
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 void InsertAt(int index, string s) {
|
|
for (int i = 0; i < s.Length; i++)
|
|
InsertAt(index + i, s[i]);
|
|
}
|
|
|
|
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);
|
|
}
|
|
}
|
|
}
|