2
0
mirror of https://github.com/esiur/esiur-dotnet.git synced 2025-09-13 20:43:19 +00:00
This commit is contained in:
2025-08-17 00:43:02 +03:00
parent 0603aa5700
commit 3bfb666b17
2 changed files with 188 additions and 46 deletions

View File

@@ -41,44 +41,45 @@ public static class Codec
//delegate AsyncReply AsyncParser(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence); //delegate AsyncReply AsyncParser(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence);
delegate object SyncParser(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence); delegate object AsyncParser(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence);
delegate object SyncParser(byte[] data, uint offset, uint length);
static SyncParser[][] FixedParsers = new SyncParser[][] static AsyncParser[][] FixedAsyncParsers = new AsyncParser[][]
{ {
new SyncParser[]{ new AsyncParser[]{
DataDeserializer.NullParser, DataDeserializer.NullParser,
DataDeserializer.BooleanFalseParser, DataDeserializer.BooleanFalseParser,
DataDeserializer.BooleanTrueParser, DataDeserializer.BooleanTrueParser,
DataDeserializer.NotModifiedParser, DataDeserializer.NotModifiedParser,
}, },
new SyncParser[]{ new AsyncParser[]{
DataDeserializer.ByteParser, DataDeserializer.ByteParser,
DataDeserializer.SByteParser, DataDeserializer.SByteParser,
DataDeserializer.Char8Parser, DataDeserializer.Char8Parser,
DataDeserializer.LocalResourceParser8, DataDeserializer.LocalResourceParser8,
DataDeserializer.ResourceParser8, DataDeserializer.ResourceParser8,
}, },
new SyncParser[]{ new AsyncParser[]{
DataDeserializer.Int16Parser, DataDeserializer.Int16Parser,
DataDeserializer.UInt16Parser, DataDeserializer.UInt16Parser,
DataDeserializer.Char16Parser, DataDeserializer.Char16Parser,
DataDeserializer.LocalResourceParser16, DataDeserializer.LocalResourceParser16,
DataDeserializer.ResourceParser16, DataDeserializer.ResourceParser16,
}, },
new SyncParser[]{ new AsyncParser[]{
DataDeserializer.Int32Parser, DataDeserializer.Int32Parser,
DataDeserializer.UInt32Parser, DataDeserializer.UInt32Parser,
DataDeserializer.Float32Parser, DataDeserializer.Float32Parser,
DataDeserializer.LocalResourceParser32, DataDeserializer.LocalResourceParser32,
DataDeserializer.ResourceParser32, DataDeserializer.ResourceParser32,
}, },
new SyncParser[]{ new AsyncParser[]{
DataDeserializer.Int64Parser, DataDeserializer.Int64Parser,
DataDeserializer.UInt64Parser, DataDeserializer.UInt64Parser,
DataDeserializer.Float64Parser, DataDeserializer.Float64Parser,
DataDeserializer.DateTimeParser, DataDeserializer.DateTimeParser,
}, },
new SyncParser[] new AsyncParser[]
{ {
DataDeserializer.Int128Parser, // int 128 DataDeserializer.Int128Parser, // int 128
DataDeserializer.UInt128Parser, // uint 128 DataDeserializer.UInt128Parser, // uint 128
@@ -86,7 +87,7 @@ public static class Codec
} }
}; };
static SyncParser[] DynamicParsers = new SyncParser[] static AsyncParser[] DynamicAsyncParsers = new AsyncParser[]
{ {
DataDeserializer.RawDataParser, DataDeserializer.RawDataParser,
DataDeserializer.StringParser, DataDeserializer.StringParser,
@@ -95,7 +96,7 @@ public static class Codec
DataDeserializer.RecordListParser, DataDeserializer.RecordListParser,
}; };
static SyncParser[] TypedParsers = new SyncParser[] static AsyncParser[] TypedAsyncParsers = new AsyncParser[]
{ {
DataDeserializer.RecordParser, DataDeserializer.RecordParser,
DataDeserializer.TypedListParser, DataDeserializer.TypedListParser,
@@ -136,19 +137,50 @@ public static class Codec
if (tt.Class == TransmissionTypeClass.Fixed) if (tt.Class == TransmissionTypeClass.Fixed)
{ {
return (len, FixedParsers[tt.Exponent][tt.Index](data, dataType.Value.Offset, (uint)tt.ContentLength, connection, requestSequence)); return (len, FixedAsyncParsers[tt.Exponent][tt.Index](data, dataType.Value.Offset, (uint)tt.ContentLength, connection, requestSequence));
} }
else if (tt.Class == TransmissionTypeClass.Dynamic) else if (tt.Class == TransmissionTypeClass.Dynamic)
{ {
return (len, DynamicParsers[tt.Index](data, dataType.Value.Offset, (uint)tt.ContentLength, connection, requestSequence)); return (len, DynamicAsyncParsers[tt.Index](data, dataType.Value.Offset, (uint)tt.ContentLength, connection, requestSequence));
} }
else //if (tt.Class == TransmissionTypeClass.Typed) else //if (tt.Class == TransmissionTypeClass.Typed)
{ {
return (len, TypedParsers[tt.Index](data, dataType.Value.Offset, (uint)tt.ContentLength, connection, requestSequence)); return (len, TypedAsyncParsers[tt.Index](data, dataType.Value.Offset, (uint)tt.ContentLength, connection, requestSequence));
} }
} }
public static (uint, object) ParseSync(byte[] data, uint offset, TransmissionType? dataType = null)
{
uint len = 0;
if (dataType == null)
{
(var longLen, dataType) = TransmissionType.Parse(data, offset, (uint)data.Length);
if (dataType == null)
throw new NullReferenceException("DataType can't be parsed.");
len = (uint)longLen;
offset = dataType.Value.Offset;
}
else
len = (uint)dataType.Value.ContentLength;
var tt = dataType.Value;
if (tt.Class == TransmissionTypeClass.Fixed)
{
return (len, FixedParsers[tt.Exponent][tt.Index](data, dataType.Value.Offset, (uint)tt.ContentLength));
}
else if (tt.Class == TransmissionTypeClass.Dynamic)
{
return (len, DynamicParsers[tt.Index](data, dataType.Value.Offset, (uint)tt.ContentLength));
}
else //if (tt.Class == TransmissionTypeClass.Typed)
{
return (len, TypedParsers[tt.Index](data, dataType.Value.Offset, (uint)tt.ContentLength));
}
}
/// <summary> /// <summary>
/// Check if a resource is local to a given connection. /// Check if a resource is local to a given connection.
/// </summary> /// </summary>
@@ -208,21 +240,21 @@ public static class Codec
[typeof(string)] = DataSerializer.StringComposer, [typeof(string)] = DataSerializer.StringComposer,
// Special // Special
[typeof(object[])] = DataSerializer.ListComposer,// DataSerializer.ListComposerFromArray, [typeof(object[])] = DataSerializer.ListComposer,
[typeof(List<object>)] = DataSerializer.ListComposer,// DataSerializer.ListComposerFromList, [typeof(List<object>)] = DataSerializer.ListComposer,
[typeof(VarList<object>)] = DataSerializer.ListComposer,// DataSerializer.ListComposerFromList, [typeof(VarList<object>)] = DataSerializer.ListComposer,
[typeof(IResource[])] = DataSerializer.ResourceListComposer,// (value, con) => (TransmissionTypeIdentifier.ResourceList, DC.ToBytes((decimal)value)), [typeof(IResource[])] = DataSerializer.ResourceListComposer,
[typeof(IResource?[])] = DataSerializer.ResourceListComposer,// (value, con) => (TransmissionTypeIdentifier.ResourceList, DC.ToBytes((decimal)value)), [typeof(IResource?[])] = DataSerializer.ResourceListComposer,
[typeof(List<IResource>)] = DataSerializer.ResourceListComposer, //(value, con) => (TransmissionTypeIdentifier.ResourceList, DC.ToBytes((decimal)value)), [typeof(List<IResource>)] = DataSerializer.ResourceListComposer,
[typeof(List<IResource?>)] = DataSerializer.ResourceListComposer, //(value, con) => (TransmissionTypeIdentifier.ResourceList, DC.ToBytes((decimal)value)), [typeof(List<IResource?>)] = DataSerializer.ResourceListComposer,
[typeof(VarList<IResource>)] = DataSerializer.ResourceListComposer, //(value, con) => (TransmissionTypeIdentifier.ResourceList, DC.ToBytes((decimal)value)), [typeof(VarList<IResource>)] = DataSerializer.ResourceListComposer,
[typeof(VarList<IResource?>)] = DataSerializer.ResourceListComposer, //(value, con) => (TransmissionTypeIdentifier.ResourceList, DC.ToBytes((decimal)value)), [typeof(VarList<IResource?>)] = DataSerializer.ResourceListComposer,
[typeof(IRecord[])] = DataSerializer.RecordListComposer,// (value, con) => (TransmissionTypeIdentifier.RecordList, DC.ToBytes((decimal)value)), [typeof(IRecord[])] = DataSerializer.RecordListComposer,
[typeof(IRecord?[])] = DataSerializer.RecordListComposer,// (value, con) => (TransmissionTypeIdentifier.RecordList, DC.ToBytes((decimal)value)), [typeof(IRecord?[])] = DataSerializer.RecordListComposer,
[typeof(List<IRecord>)] = DataSerializer.RecordListComposer, //(value, con) => (TransmissionTypeIdentifier.RecordList, DC.ToBytes((decimal)value)), [typeof(List<IRecord>)] = DataSerializer.RecordListComposer,
[typeof(List<IRecord?>)] = DataSerializer.RecordListComposer, //(value, con) => (TransmissionTypeIdentifier.RecordList, DC.ToBytes((decimal)value)), [typeof(List<IRecord?>)] = DataSerializer.RecordListComposer,
[typeof(VarList<IRecord>)] = DataSerializer.RecordListComposer, //(value, con) => (TransmissionTypeIdentifier.RecordList, DC.ToBytes((decimal)value)), [typeof(VarList<IRecord>)] = DataSerializer.RecordListComposer,
[typeof(VarList<IRecord?>)] = DataSerializer.RecordListComposer, //(value, con) => (TransmissionTypeIdentifier.RecordList, DC.ToBytes((decimal)value)), [typeof(VarList<IRecord?>)] = DataSerializer.RecordListComposer,
[typeof(Map<object, object>)] = DataSerializer.MapComposer, [typeof(Map<object, object>)] = DataSerializer.MapComposer,
[typeof(Map<object?, object>)] = DataSerializer.MapComposer, [typeof(Map<object?, object>)] = DataSerializer.MapComposer,
[typeof(Map<object, object?>)] = DataSerializer.MapComposer, [typeof(Map<object, object?>)] = DataSerializer.MapComposer,

View File

@@ -14,83 +14,168 @@ namespace Esiur.Data;
public static class DataDeserializer public static class DataDeserializer
{ {
public static object NullParser(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence) public static object NullParserAsync(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence)
{ {
return null; return null;
} }
public static object BooleanTrueParser(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence) public static object NullParser(byte[] data, uint offset, uint length)
{
return null;
}
public static object BooleanTrueParserAsync(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence)
{ {
return true; return true;
} }
public static object BooleanFalseParser(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence) public static object BooleanTrueParser(byte[] data, uint offset, uint length)
{
return true;
}
public static object BooleanFalseParserAsync(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence)
{ {
return false; return false;
} }
public static object NotModifiedParser(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence) public static object BooleanFalseParser(byte[] data, uint offset, uint length)
{
return false;
}
public static object NotModifiedParserAsync(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence)
{ {
return NotModified.Default; return NotModified.Default;
} }
public static object ByteParser(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence) public static object NotModifiedParser(byte[] data, uint offset, uint length)
{
return NotModified.Default;
}
public static object UInt8ParserAsync(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence)
{ {
return data[offset]; return data[offset];
} }
public static object SByteParser(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence) public static object UInt8Parser(byte[] data, uint offset, uint length)
{
return data[offset];
}
public static object Int8ParserAsync(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence)
{ {
return (sbyte)data[offset]; return (sbyte)data[offset];
} }
public static unsafe object Char16Parser(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence) public static object Int8Parser(byte[] data, uint offset, uint length)
{
return (sbyte)data[offset];
}
public static unsafe object Char16ParserAsync(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence)
{ {
fixed (byte* ptr = &data[offset]) fixed (byte* ptr = &data[offset])
return *(char*)ptr; return *(char*)ptr;
} }
public static object Char8Parser(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence) public static unsafe object Char16Parser(byte[] data, uint offset, uint length)
{
fixed (byte* ptr = &data[offset])
return *(char*)ptr;
}
public static object Char8ParserAsync(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence)
{
return (char)data[offset];
}
public static object Char8Parser(byte[] data, uint offset, uint length)
{ {
return (char)data[offset]; return (char)data[offset];
} }
public static unsafe object Int16Parser(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence) public static unsafe object Int16ParserAsync(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence)
{ {
fixed (byte* ptr = &data[offset]) fixed (byte* ptr = &data[offset])
return *(short*)ptr; return *(short*)ptr;
} }
public static unsafe object UInt16Parser(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence) public static unsafe object Int16Parser(byte[] data, uint offset, uint length)
{
fixed (byte* ptr = &data[offset])
return *(short*)ptr;
}
public static unsafe object UInt16ParserAsync(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence)
{ {
fixed (byte* ptr = &data[offset]) fixed (byte* ptr = &data[offset])
return *(ushort*)ptr; return *(ushort*)ptr;
} }
public static unsafe object Int32Parser(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence) public static unsafe object UInt16Parser(byte[] data, uint offset, uint length)
{
fixed (byte* ptr = &data[offset])
return *(ushort*)ptr;
}
public static unsafe object Int32ParserAsync(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence)
{ {
fixed (byte* ptr = &data[offset]) fixed (byte* ptr = &data[offset])
return *(int*)ptr; return *(int*)ptr;
} }
public static unsafe object UInt32Parser(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence) public static unsafe object Int32Parser(byte[] data, uint offset, uint length)
{
fixed (byte* ptr = &data[offset])
return *(int*)ptr;
}
public static unsafe object UInt32ParserAsync(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence)
{ {
fixed (byte* ptr = &data[offset]) fixed (byte* ptr = &data[offset])
return *(uint*)ptr; return *(uint*)ptr;
} }
public static unsafe object Float32Parser(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence) public static unsafe object UInt32Parser(byte[] data, uint offset, uint length)
{
fixed (byte* ptr = &data[offset])
return *(uint*)ptr;
}
public static unsafe object Float32ParserAsync(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence)
{ {
fixed (byte* ptr = &data[offset]) fixed (byte* ptr = &data[offset])
return *(float*)ptr; return *(float*)ptr;
} }
public static unsafe object Float64Parser(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence) public static unsafe object Float32Parser(byte[] data, uint offset, uint length)
{
fixed (byte* ptr = &data[offset])
return *(float*)ptr;
}
public static unsafe object Float64ParserAsync(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence)
{ {
fixed (byte* ptr = &data[offset]) fixed (byte* ptr = &data[offset])
return *(double*)ptr; return *(double*)ptr;
} }
public static unsafe object Float128Parser(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence) public static unsafe object Float64Parser(byte[] data, uint offset, uint length)
{
fixed (byte* ptr = &data[offset])
return *(double*)ptr;
}
public static unsafe object Float128ParserAsync(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence)
{
fixed (byte* ptr = &data[offset])
return *(decimal*)ptr;
}
public static unsafe object Float128Parser(byte[] data, uint offset, uint length)
{ {
fixed (byte* ptr = &data[offset]) fixed (byte* ptr = &data[offset])
return *(decimal*)ptr; return *(decimal*)ptr;
@@ -102,26 +187,51 @@ public static class DataDeserializer
return *(decimal*)ptr; return *(decimal*)ptr;
} }
public static unsafe object Int128ParserAsync(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence)
public static unsafe object UInt128Parser(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence)
{ {
fixed (byte* ptr = &data[offset]) fixed (byte* ptr = &data[offset])
return *(decimal*)ptr; return *(decimal*)ptr;
} }
public static unsafe object Int64Parser(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence) public static unsafe object UInt128ParserAsync(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence)
{
fixed (byte* ptr = &data[offset])
return *(decimal*)ptr;
}
public static unsafe object UInt128Parser(byte[] data, uint offset, uint length)
{
fixed (byte* ptr = &data[offset])
return *(decimal*)ptr;
}
public static unsafe object Int64ParserAsync(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence)
{ {
fixed (byte* ptr = &data[offset]) fixed (byte* ptr = &data[offset])
return *(long*)ptr; return *(long*)ptr;
} }
public static unsafe object Int64Parser(byte[] data, uint offset, uint length)
{
fixed (byte* ptr = &data[offset])
return *(long*)ptr;
}
public static unsafe object UInt64Parser(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence) public static unsafe object UInt64Parser(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence)
{ {
fixed (byte* ptr = &data[offset]) fixed (byte* ptr = &data[offset])
return *(ulong*)ptr; return *(ulong*)ptr;
} }
public static unsafe object DateTimeParserAsync(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence)
{
fixed (byte* ptr = &data[offset])
return new DateTime(*(long*)ptr, DateTimeKind.Utc);
}
public static unsafe object DateTimeParser(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence) public static unsafe object DateTimeParser(byte[] data, uint offset, uint length, DistributedConnection connection, uint[] requestSequence)
{ {
fixed (byte* ptr = &data[offset]) fixed (byte* ptr = &data[offset])