using Qrakhen.Qamp.Core.Collections; using System.Text; namespace Qrakhen.Qamp.Core.Values.Objects; public class String(string? value) : Obj(ValueType.String) { private static readonly Register _strings = new(); public string? Value = value; public override string ToString() => Value ?? "null"; public uint GetHash() { if (string.IsNullOrEmpty(value)) return 0; return Value.GetHash(); } public static Value Make(string? value) { String? str; var hash = value?.GetHash() ?? 0; if (!_strings.TryGet(hash, out str)) { str = new String(value); _strings.Add(hash, str); } return Create(str); } public static byte[] SerializeStrings() { List result = new(); foreach (var pair in _strings) { String str = pair.Value; if (str == null || str.__gcMarked) continue; byte[] bytes; bytes = Encoding.ASCII.GetBytes(str.Value!); result.AddRange(pair.Key.GetBytes()); result.AddRange(bytes.Length.GetBytes()); result.AddRange(bytes); result.Add(0); } return result.ToArray(); } }