122 lines
4.1 KiB
C#
122 lines
4.1 KiB
C#
|
using System.Collections;
|
|||
|
using System.Collections.Generic;
|
|||
|
using System;
|
|||
|
|
|||
|
namespace ES3Internal
|
|||
|
{
|
|||
|
internal enum ES3SpecialByte : byte
|
|||
|
{
|
|||
|
Null = 0,
|
|||
|
Bool = 1,
|
|||
|
Byte = 2,
|
|||
|
Sbyte = 3,
|
|||
|
Char = 4,
|
|||
|
Decimal = 5,
|
|||
|
Double = 6,
|
|||
|
Float = 7,
|
|||
|
Int = 8,
|
|||
|
Uint = 9,
|
|||
|
Long = 10,
|
|||
|
Ulong = 11,
|
|||
|
Short = 12,
|
|||
|
Ushort = 13,
|
|||
|
String = 14,
|
|||
|
ByteArray = 15,
|
|||
|
Collection = 128,
|
|||
|
Dictionary = 129,
|
|||
|
CollectionItem = 130,
|
|||
|
Object = 254,
|
|||
|
Terminator = 255
|
|||
|
}
|
|||
|
|
|||
|
internal static class ES3Binary
|
|||
|
{
|
|||
|
internal const string ObjectTerminator = ".";
|
|||
|
|
|||
|
internal static readonly Dictionary<ES3SpecialByte, Type> IdToType = new Dictionary<ES3SpecialByte, Type>()
|
|||
|
{
|
|||
|
{ ES3SpecialByte.Null, null },
|
|||
|
{ ES3SpecialByte.Bool, typeof(bool)},
|
|||
|
{ ES3SpecialByte.Byte, typeof(byte)},
|
|||
|
{ ES3SpecialByte.Sbyte, typeof(sbyte)},
|
|||
|
{ ES3SpecialByte.Char, typeof(char)},
|
|||
|
{ ES3SpecialByte.Decimal, typeof(decimal)},
|
|||
|
{ ES3SpecialByte.Double, typeof(double)},
|
|||
|
{ ES3SpecialByte.Float, typeof(float)},
|
|||
|
{ ES3SpecialByte.Int, typeof(int)},
|
|||
|
{ ES3SpecialByte.Uint, typeof(uint)},
|
|||
|
{ ES3SpecialByte.Long, typeof(long)},
|
|||
|
{ ES3SpecialByte.Ulong, typeof(ulong)},
|
|||
|
{ ES3SpecialByte.Short, typeof(short)},
|
|||
|
{ ES3SpecialByte.Ushort, typeof(ushort)},
|
|||
|
{ ES3SpecialByte.String, typeof(string)},
|
|||
|
{ ES3SpecialByte.ByteArray, typeof(byte[])}
|
|||
|
};
|
|||
|
|
|||
|
internal static readonly Dictionary<Type, ES3SpecialByte> TypeToId = new Dictionary<Type, ES3SpecialByte>()
|
|||
|
{
|
|||
|
{ typeof(bool), ES3SpecialByte.Bool},
|
|||
|
{ typeof(byte), ES3SpecialByte.Byte},
|
|||
|
{ typeof(sbyte), ES3SpecialByte.Sbyte},
|
|||
|
{ typeof(char), ES3SpecialByte.Char},
|
|||
|
{ typeof(decimal), ES3SpecialByte.Decimal},
|
|||
|
{ typeof(double), ES3SpecialByte.Double},
|
|||
|
{ typeof(float), ES3SpecialByte.Float},
|
|||
|
{ typeof(int), ES3SpecialByte.Int},
|
|||
|
{ typeof(uint), ES3SpecialByte.Uint},
|
|||
|
{ typeof(long), ES3SpecialByte.Long},
|
|||
|
{ typeof(ulong), ES3SpecialByte.Ulong},
|
|||
|
{ typeof(short), ES3SpecialByte.Short},
|
|||
|
{ typeof(ushort), ES3SpecialByte.Ushort},
|
|||
|
{ typeof(string), ES3SpecialByte.String},
|
|||
|
{ typeof(byte[]), ES3SpecialByte.ByteArray}
|
|||
|
};
|
|||
|
|
|||
|
internal static ES3SpecialByte TypeToByte(Type type)
|
|||
|
{
|
|||
|
ES3SpecialByte b;
|
|||
|
if (TypeToId.TryGetValue(type, out b))
|
|||
|
return b;
|
|||
|
return ES3SpecialByte.Object;
|
|||
|
}
|
|||
|
|
|||
|
internal static Type ByteToType(ES3SpecialByte b)
|
|||
|
{
|
|||
|
return ByteToType((byte)b);
|
|||
|
}
|
|||
|
|
|||
|
internal static Type ByteToType(byte b)
|
|||
|
{
|
|||
|
Type type;
|
|||
|
if (IdToType.TryGetValue((ES3SpecialByte)b, out type))
|
|||
|
return type;
|
|||
|
return typeof(object);
|
|||
|
}
|
|||
|
|
|||
|
internal static bool IsPrimitive(ES3SpecialByte b)
|
|||
|
{
|
|||
|
switch(b)
|
|||
|
{
|
|||
|
case ES3SpecialByte.Bool:
|
|||
|
case ES3SpecialByte.Byte:
|
|||
|
case ES3SpecialByte.Sbyte:
|
|||
|
case ES3SpecialByte.Char:
|
|||
|
case ES3SpecialByte.Decimal:
|
|||
|
case ES3SpecialByte.Double:
|
|||
|
case ES3SpecialByte.Float:
|
|||
|
case ES3SpecialByte.Int:
|
|||
|
case ES3SpecialByte.Uint:
|
|||
|
case ES3SpecialByte.Long:
|
|||
|
case ES3SpecialByte.Ulong:
|
|||
|
case ES3SpecialByte.Short:
|
|||
|
case ES3SpecialByte.Ushort:
|
|||
|
case ES3SpecialByte.String:
|
|||
|
case ES3SpecialByte.ByteArray:
|
|||
|
return true;
|
|||
|
default:
|
|||
|
return false;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|