summaryrefslogtreecommitdiff
path: root/WorldlineKeepers/Assets/ThirdParty/StringUtil/VString.cs
diff options
context:
space:
mode:
Diffstat (limited to 'WorldlineKeepers/Assets/ThirdParty/StringUtil/VString.cs')
-rw-r--r--WorldlineKeepers/Assets/ThirdParty/StringUtil/VString.cs618
1 files changed, 618 insertions, 0 deletions
diff --git a/WorldlineKeepers/Assets/ThirdParty/StringUtil/VString.cs b/WorldlineKeepers/Assets/ThirdParty/StringUtil/VString.cs
new file mode 100644
index 0000000..9563280
--- /dev/null
+++ b/WorldlineKeepers/Assets/ThirdParty/StringUtil/VString.cs
@@ -0,0 +1,618 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+
+
+public static class StringExtend
+{
+ private static volatile object lockThis = new object();
+
+ public static string ToTempString(this int i)
+ {
+ lock (lockThis)
+ {
+ return VString.IntToString(i);
+ }
+ }
+
+ public static string ToTempString(this float f, int digits = 2)
+ {
+ lock (lockThis)
+ {
+ return VString.FloatToString(f, digits);
+ }
+ }
+
+ public static string ToTempString(this long l)
+ {
+ lock (lockThis)
+ {
+ return VString.LongToString(l);
+ }
+ }
+
+ public static string ToTempStringLower(this string str)
+ {
+ lock (lockThis)
+ {
+ return VString.ToLower(str);
+ }
+ }
+
+ public static string ToTempStringUpper(this string str)
+ {
+ lock (lockThis)
+ {
+ return VString.ToUpper(str);
+ }
+ }
+
+ public static string ToTempSubString(this string str, int index, int count)
+ {
+ lock (lockThis)
+ {
+ return VString.ToTempSubString(str, index, count);
+ }
+ }
+
+
+
+ #region 转美式数字
+ public static string ToStringUS(this float f)
+ {
+ return StringUtil.Num2US(f);
+ }
+ public static string ToStringUS(this int i)
+ {
+ return StringUtil.Num2US(i);
+ }
+ public static string ToStringUS(this long i)
+ {
+ return StringUtil.Num2US(i);
+ }
+ #endregion
+
+}
+
+
+
+
+
+
+/// <summary>
+/// 内容可变的字符串
+/// !!!只能作为临时变量使用,绝对不可以在逻辑中存储引用,包含VString和返回的string对象
+/// </summary>
+public class VString
+{
+ private string _data;
+ private int maxCount;
+
+ private static int _internalVsIndex;
+ private static VString[] _internalVSArray = new VString[]
+ {
+ new VString(64),
+ new VString(64),
+ new VString(64),
+ new VString(64),
+ new VString(64),
+ new VString(64),
+ new VString(64),
+ new VString(64),
+ new VString(64),
+ new VString(64),
+ new VString(64),
+ new VString(64),
+ new VString(64),
+ new VString(64),
+ new VString(64),
+ new VString(64),
+ new VString(64),
+ new VString(64),
+ new VString(64),
+ new VString(64)
+ };
+ private static string[] digitalNumberArray = new string[] { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" };
+
+
+ public VString(int maxCount = 1024)
+ {
+ this.maxCount = maxCount + 1; //多加一个,用于留1个给字符串结束符
+ _data = new string('\0', this.maxCount);
+ Clear();
+ }
+
+ public string GetString()
+ {
+ return _data;
+ }
+
+
+
+ /// <summary>
+ /// int转string,无GC,注意生成的string一定不能进行存贮
+ /// </summary>
+ /// <param name="val"></param>
+ /// <returns></returns>
+ public static string IntToString(int val)
+ {
+ return LongToString(val);
+ }
+
+ /// <summary>
+ /// long转string,无GC,注意生成的string一定不能进行存贮
+ /// </summary>
+ /// <param name="val"></param>
+ /// <returns></returns>
+ public static string LongToString(long val)
+ {
+ if (val == 0)
+ {
+ return "0";
+ }
+
+ VString tempVS = GetInternalVString();
+ bool isNegative = false;
+ if (val < 0)
+ {
+ val = -val;
+ isNegative = true;
+ }
+
+ while (val != 0)
+ {
+ long mod = val % 10;
+ val = val / 10;
+ tempVS.Push(digitalNumberArray[mod]);
+ }
+
+ if (isNegative)
+ {
+ tempVS.Push("-");
+ }
+
+ tempVS.ReverseString();
+ return tempVS.GetString();
+ }
+
+ /// <summary>
+ /// float转string,无GC,注意生成的string一定不能进行存贮
+ /// </summary>
+ /// <param name="f"></param>
+ /// <param name="digits">小数的位数</param>
+ /// <returns></returns>
+ public static string FloatToString(float f, int digits = 2)
+ {
+ bool isNegative = false;
+ if (f < 0)
+ {
+ f = -f;
+ isNegative = true;
+ }
+
+ int iPart = Mathf.FloorToInt(f);
+ float fPart = f - iPart;
+
+ VString tempVS0 = GetInternalVString();
+
+
+ if (iPart != 0)
+ {
+ while (iPart != 0)
+ {
+ long mod = iPart % 10;
+ iPart = iPart / 10;
+ tempVS0.Push(digitalNumberArray[mod]);
+ }
+ }
+ else
+ {
+ tempVS0.Push("0");
+ }
+
+ if (isNegative)
+ {
+ tempVS0.Push("-");
+ }
+ tempVS0.ReverseString();
+
+
+ if (digits != 0)
+ {
+ VString tempVS1 = GetInternalVString();
+ fPart = fPart * Mathf.Pow(10, digits);
+ int iPart2 = Mathf.RoundToInt(fPart);
+
+ int i = 0;
+ while (iPart2 != 0 && i < digits)
+ {
+ long mod = iPart2 % 10;
+ iPart2 = iPart2 / 10;
+ i++;
+ tempVS1.Push(digitalNumberArray[mod]);
+ }
+ tempVS1.ReverseString();
+
+ tempVS0.Push(".");
+ tempVS0.Push(tempVS1.GetString());
+ while (i < digits)
+ {
+ i++;
+ tempVS0.Push("0");
+ }
+ }
+ else
+ {
+ tempVS0.Push(".");
+ for (int i = 0; i < digits; ++i)
+ {
+ tempVS0.Push("0");
+ }
+ }
+
+ return tempVS0.GetString();
+ }
+
+
+ /// <summary>
+ /// 把一个字符串拷贝后,转换为lower case,,注意生成的string一定不能进行存贮
+ /// </summary>
+ /// <param name="str"></param>
+ /// <returns></returns>
+ public static string ToLower(string str)
+ {
+ if (!string.IsNullOrEmpty(str))
+ {
+ VString tempVS = VStringShareObject.GetShareVString();
+ tempVS.Push(str);
+ tempVS.ToLower();
+ return tempVS.GetString();
+ }
+ return str;
+ }
+
+ /// <summary>
+ /// 把一个字符串拷贝后,转换为upper case,,注意生成的string一定不能进行存贮
+ /// </summary>
+ /// <param name="str"></param>
+ /// <returns></returns>
+ public static string ToUpper(string str)
+ {
+ if (!string.IsNullOrEmpty(str))
+ {
+ VString tempVS = VStringShareObject.GetShareVString();
+ tempVS.Push(str);
+ tempVS.ToUpper();
+ return tempVS.GetString();
+ }
+ return str;
+ }
+
+ public static string ToTempSubString(string str, int index, int count)
+ {
+ if (string.IsNullOrEmpty(str) || count <= 0 || index < 0)
+ {
+ LogHelper.LogError(VStringUtil.Concat("ToTempSubString IsNullOrEmpty ", index.ToTempString(), "/", count.ToTempString()));
+ return str;
+ }
+
+ if (index + count > str.Length)
+ {
+ LogHelper.LogError(VStringUtil.Concat("ToTempSubString ", str, index.ToTempString(), "/", count.ToTempString()));
+ return str;
+ }
+
+ VString tempVS1 = VStringShareObject.GetShareVString();
+ tempVS1.Push(str);
+ VString tempVS2 = VStringShareObject.GetShareVString();
+ tempVS2.CopyFrom(tempVS1, index, count);
+ return tempVS2.GetString();
+ }
+
+
+ /// <summary>
+ /// 拼接两个字符串
+ /// </summary>
+ /// <param name="a"></param>
+ /// <param name="b"></param>
+ /// <param name="clear"></param>
+ /// <returns></returns>
+ public string Concat(string a, string b, bool clear = true)
+ {
+ if (clear)
+ {
+ Clear();
+ }
+
+ Push(a);
+ Push(b);
+ return _data;
+ }
+
+
+
+ public string Concat(string a, string b, string c, bool clear = true)
+ {
+ if (clear)
+ {
+ Clear();
+ }
+
+ Push(a);
+ Push(b);
+ Push(c);
+ return _data;
+ }
+ public string Concat(string a, string b, string c, string d, bool clear = true)
+ {
+ if (clear)
+ {
+ Clear();
+ }
+
+ Push(a);
+ Push(b);
+ Push(c);
+ Push(d);
+ return _data;
+ }
+ public string Concat(string a, string b, string c, string d, string e, bool clear = true)
+ {
+ if (clear)
+ {
+ Clear();
+ }
+
+ Push(a);
+ Push(b);
+ Push(c);
+ Push(d);
+ Push(e);
+ return _data;
+ }
+ public string Concat(string a, string b, string c, string d, string e, string f, bool clear = true)
+ {
+ if (clear)
+ {
+ Clear();
+ }
+
+ Push(a);
+ Push(b);
+ Push(c);
+ Push(d);
+ Push(e);
+ Push(f);
+ return _data;
+ }
+ public string Concat(string a, string b, string c, string d, string e, string f, string g, bool clear = true)
+ {
+ if (clear)
+ {
+ Clear();
+ }
+
+ Push(a);
+ Push(b);
+ Push(c);
+ Push(d);
+ Push(e);
+ Push(f);
+ Push(g);
+ return _data;
+ }
+ public string Concat(string a, string b, string c, string d, string e, string f, string g, string h, bool clear = true)
+ {
+ if (clear)
+ {
+ Clear();
+ }
+
+ Push(a);
+ Push(b);
+ Push(c);
+ Push(d);
+ Push(e);
+ Push(f);
+ Push(g);
+ Push(h);
+ return _data;
+ }
+ public string Concat(string a, string b, string c, string d, string e, string f, string g, string h, string i, bool clear = true)
+ {
+ if (clear)
+ {
+ Clear();
+ }
+
+ Push(a);
+ Push(b);
+ Push(c);
+ Push(d);
+ Push(e);
+ Push(f);
+ Push(g);
+ Push(h);
+ Push(i);
+ return _data;
+ }
+ public string Concat(string a, string b, string c, string d, string e, string f, string g, string h, string i, string j, bool clear = true)
+ {
+ if (clear)
+ {
+ Clear();
+ }
+
+ Push(a);
+ Push(b);
+ Push(c);
+ Push(d);
+ Push(e);
+ Push(f);
+ Push(g);
+ Push(h);
+ Push(i);
+ Push(j);
+ return _data;
+ }
+
+
+ public static bool UseShareObject(string str)
+ {
+ for (int i = 0; i < _internalVSArray.Length; ++i)
+ {
+ if (string.ReferenceEquals(str, _internalVSArray[i].GetString()))
+ {
+ return true;
+ }
+ }
+ return false;
+ }
+
+
+ //往当前的字符串中添加字符串
+ public unsafe void Push(string newStr)
+ {
+ if (string.IsNullOrEmpty(newStr))
+ {
+ return;
+ }
+
+ int copyLen = newStr.Length;
+ int newLen = _data.Length + copyLen;
+ if ((newLen + 1) > maxCount) //留1个给字符串结束符
+ {
+ int len = newLen;
+ copyLen = maxCount - _data.Length - 1;
+ newLen = maxCount - 1; //设置新的长度
+ //这个地方不使用VstringUtil.Concat避免死循环
+ LogHelper.LogEditorError(StringUtil.Concat("超过了最大添加长度 ", maxCount.ToTempString(), " ", len.ToTempString()));
+ }
+
+ if (copyLen <= 0)
+ {
+ return;
+ }
+
+ fixed (char* src = newStr)
+ {
+ fixed (char* dst = _data)
+ {
+ UnsafeFunction.memcpyimpl((byte*)src, (byte*)(dst + _data.Length), copyLen * 2); //system.string的存储每个元素两个字节
+
+ int* iDst = (int*)dst;
+ iDst = iDst - 1; //字符串的长度在第一个元素的前面4个字节
+ *iDst = newLen;
+
+ char* iEnd = (char*)(dst + newLen);
+ *iEnd = (char)0;//设置字符串结束符
+ }
+ }
+ }
+
+
+ public unsafe void Clear()
+ {
+ fixed (char* p = _data)
+ {
+ int* pSize = (int*)p;
+ pSize = pSize - 1;
+ *pSize = 0;
+ }
+ }
+
+ public unsafe void CopyFrom(VString srcVstring, int startIndex, int count)
+ {
+ if ((count + 1) > maxCount) //留1个给字符串结束符
+ {
+ throw new ArgumentException(VStringUtil.Concat("copy count is larger then maxCount ",
+ count.ToTempString(), " ", maxCount.ToTempString()));
+ }
+
+ string srcStr = srcVstring.GetString();
+ if (startIndex + count > srcStr.Length)
+ {
+ throw new ArgumentException(VStringUtil.Concat("copy count is larger then srcString len ",
+ count.ToTempString(), " ", srcStr.Length.ToTempString(), " ", startIndex.ToTempString()));
+ }
+
+ Clear();
+
+ fixed (char* src = srcStr)
+ {
+ fixed (char* dst = _data)
+ {
+ UnsafeFunction.memcpyimpl((byte*)(src + startIndex), (byte*)dst, count * 2); //system.string的存储每个元素两个字节
+
+ int* iDst = (int*)dst;
+ iDst = iDst - 1; //字符串的长度在第一个元素的前面4个字节
+ *iDst = count;
+
+ char* iEnd = (char*)(dst + _data.Length);
+ *iEnd = (char)0;//设置字符串结束符
+ }
+ }
+ }
+
+ public unsafe void ToLower()
+ {
+ int index = 0;
+ int len = _data.Length;
+ fixed (char* dst = _data)
+ {
+ while (index < len)
+ {
+ char tempChar = *(dst + index);
+ *(dst + index) = char.ToLower(tempChar);
+ ++index;
+ }
+ }
+ }
+
+ public unsafe void ToUpper()
+ {
+ int index = 0;
+ int len = _data.Length;
+ fixed (char* dst = _data)
+ {
+ while (index < len)
+ {
+ char tempChar = *(dst + index);
+ *(dst + index) = char.ToUpper(tempChar);
+ ++index;
+ }
+ }
+ }
+
+ //反转字符串的内容
+ private unsafe string ReverseString()
+ {
+ int len = _data.Length;
+ if (len > 0)
+ {
+ fixed (char* pHead = _data)
+ {
+ int count = len / 2;
+ for (int i = 0; i < count; ++i)
+ {
+ char temp = pHead[i];
+ pHead[i] = pHead[len - 1 - i];
+ pHead[len - 1 - i] = temp;
+ }
+ }
+ }
+ return _data;
+ }
+
+
+ private static VString GetInternalVString()
+ {
+ _internalVsIndex = (_internalVsIndex + 1) % _internalVSArray.Length;
+ VString vString = _internalVSArray[_internalVsIndex];
+ vString.Clear();
+ return vString;
+ }
+
+} \ No newline at end of file