This commit is contained in:
nub31
2026-03-09 16:38:09 +01:00
parent 32042d0769
commit 4210ad878b
8 changed files with 800 additions and 675 deletions

View File

@@ -256,6 +256,28 @@ public class NubTypeFunc : NubType
private record Signature(IReadOnlyList<NubType> Parameters, NubType ReturnType);
}
public class NubTypeArray : NubType
{
private static readonly Dictionary<NubType, NubTypeArray> Cache = new();
public static NubTypeArray Get(NubType to)
{
if (!Cache.TryGetValue(to, out var ptr))
Cache[to] = ptr = new NubTypeArray(to);
return ptr;
}
public NubType ElementType { get; }
private NubTypeArray(NubType elementType)
{
ElementType = elementType;
}
public override string ToString() => $"[]{ElementType}";
}
public class TypeEncoder
{
public static string Encode(NubType type)
@@ -355,6 +377,12 @@ public class TypeEncoder
sb.Append(')');
break;
case NubTypeArray a:
sb.Append("A(");
EncodeType(sb, a.ElementType);
sb.Append(')');
break;
default:
throw new NotSupportedException(type.GetType().Name);
}
@@ -396,6 +424,7 @@ public class TypeDecoder
'F' => DecodeFunc(),
'T' => DecodeStruct(),
'E' => DecodeEnum(),
'A' => DecodeArray(),
_ => throw new Exception($"'{start}' is not a valid start to a type")
};
}
@@ -531,6 +560,14 @@ public class TypeDecoder
throw new Exception($"Expected 'V' or 'N'");
}
private NubTypeArray DecodeArray()
{
Expect('(');
var elementType = DecodeType();
Expect(')');
return NubTypeArray.Get(elementType);
}
private bool TryPeek(out char c)
{
if (index >= encoded.Length)