From 0c4bd05dd9054e36f901b679349badf788d432ed Mon Sep 17 00:00:00 2001 From: hondacrx Date: Mon, 24 Dec 2018 01:03:36 -0500 Subject: [PATCH] Core: Removed not needed faststruct --- Source/Framework/Framework.csproj | 1 + Source/Framework/IO/FastStruct.cs | 91 ----------------------------- Source/Framework/Util/Extensions.cs | 65 +++++---------------- Source/Game/Game.csproj | 4 -- 4 files changed, 17 insertions(+), 144 deletions(-) delete mode 100644 Source/Framework/IO/FastStruct.cs diff --git a/Source/Framework/Framework.csproj b/Source/Framework/Framework.csproj index 58730e42c..e665da40e 100644 --- a/Source/Framework/Framework.csproj +++ b/Source/Framework/Framework.csproj @@ -14,6 +14,7 @@ + diff --git a/Source/Framework/IO/FastStruct.cs b/Source/Framework/IO/FastStruct.cs deleted file mode 100644 index c3fa38589..000000000 --- a/Source/Framework/IO/FastStruct.cs +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright (C) 2012-2018 CypherCore - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -using System.Reflection.Emit; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -namespace Framework.IO -{ - public static class FastStruct where T : struct - { - private delegate T LoadFromByteRefDelegate(ref byte source); - private delegate void CopyMemoryDelegate(ref T dest, ref byte src, int count); - - private static readonly LoadFromByteRefDelegate LoadFromByteRef = BuildLoadFromByteRefMethod(); - private static readonly CopyMemoryDelegate CopyMemory = BuildCopyMemoryMethod(); - - public static readonly int Size = Marshal.SizeOf(); - - private static LoadFromByteRefDelegate BuildLoadFromByteRefMethod() - { - var methodLoadFromByteRef = new DynamicMethod("LoadFromByteRef<" + typeof(T).FullName + ">", - typeof(T), new[] { typeof(byte).MakeByRefType() }, typeof(FastStruct)); - - ILGenerator generator = methodLoadFromByteRef.GetILGenerator(); - generator.Emit(OpCodes.Ldarg_0); - generator.Emit(OpCodes.Ldobj, typeof(T)); - generator.Emit(OpCodes.Ret); - - return (LoadFromByteRefDelegate)methodLoadFromByteRef.CreateDelegate(typeof(LoadFromByteRefDelegate)); - } - - private static CopyMemoryDelegate BuildCopyMemoryMethod() - { - var methodCopyMemory = new DynamicMethod("CopyMemory<" + typeof(T).FullName + ">", - typeof(void), new[] { typeof(T).MakeByRefType(), typeof(byte).MakeByRefType(), typeof(int) }, typeof(FastStruct)); - - ILGenerator generator = methodCopyMemory.GetILGenerator(); - generator.Emit(OpCodes.Ldarg_0); - generator.Emit(OpCodes.Ldarg_1); - generator.Emit(OpCodes.Ldarg_2); - generator.Emit(OpCodes.Cpblk); - generator.Emit(OpCodes.Ret); - - return (CopyMemoryDelegate)methodCopyMemory.CreateDelegate(typeof(CopyMemoryDelegate)); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static T ArrayToStructure(byte[] src) - { - return LoadFromByteRef(ref src[0]); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static T ArrayToStructure(byte[] src, int offset) - { - return LoadFromByteRef(ref src[offset]); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static T ArrayToStructure(ref byte src) - { - return LoadFromByteRef(ref src); - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static T[] ReadArray(byte[] source) - { - T[] buffer = new T[source.Length / Size]; - - if (source.Length > 0) - CopyMemory(ref buffer[0], ref source[0], source.Length); - - return buffer; - } - } -} diff --git a/Source/Framework/Util/Extensions.cs b/Source/Framework/Util/Extensions.cs index b6468abed..4e1f84385 100644 --- a/Source/Framework/Util/Extensions.cs +++ b/Source/Framework/Util/Extensions.cs @@ -25,6 +25,7 @@ using System.Reflection.Emit; using System.Runtime.InteropServices; using System.Text; using System.Text.RegularExpressions; +using System.Runtime.CompilerServices; namespace System { @@ -157,50 +158,6 @@ namespace System right = temp; } - public static Func CompileGetter(this FieldInfo field) - { - string methodName = field.ReflectedType.FullName + ".get_" + field.Name; - DynamicMethod setterMethod = new DynamicMethod(methodName, typeof(object), new[] { typeof(object) }, true); - ILGenerator gen = setterMethod.GetILGenerator(); - if (field.IsStatic) - { - gen.Emit(OpCodes.Ldsfld, field); - gen.Emit(field.FieldType.IsClass ? OpCodes.Castclass : OpCodes.Box, field.FieldType); - } - else - { - gen.Emit(OpCodes.Ldarg_0); - gen.Emit(OpCodes.Castclass, field.DeclaringType); - gen.Emit(OpCodes.Ldfld, field); - gen.Emit(field.FieldType.IsClass ? OpCodes.Castclass : OpCodes.Box, field.FieldType); - } - gen.Emit(OpCodes.Ret); - return (Func)setterMethod.CreateDelegate(typeof(Func)); - } - - public static Action CompileSetter(this FieldInfo field) - { - string methodName = field.ReflectedType.FullName + ".set_" + field.Name; - DynamicMethod setterMethod = new DynamicMethod(methodName, null, new[] { typeof(object), typeof(object) }, true); - ILGenerator gen = setterMethod.GetILGenerator(); - if (field.IsStatic) - { - gen.Emit(OpCodes.Ldarg_1); - gen.Emit(field.FieldType.IsClass ? OpCodes.Castclass : OpCodes.Unbox_Any, field.FieldType); - gen.Emit(OpCodes.Stsfld, field); - } - else - { - gen.Emit(OpCodes.Ldarg_0); - gen.Emit(OpCodes.Castclass, field.DeclaringType); - gen.Emit(OpCodes.Ldarg_1); - gen.Emit(field.FieldType.IsClass ? OpCodes.Castclass : OpCodes.Unbox_Any, field.FieldType); - gen.Emit(OpCodes.Stfld, field); - } - gen.Emit(OpCodes.Ret); - return (Action)setterMethod.CreateDelegate(typeof(Action)); - } - public static uint[] SerializeObject(this T obj) { //if (obj.GetType()() == null) @@ -318,18 +275,28 @@ namespace System public static T[] ReadArray(this BinaryReader reader, uint size) where T : struct { - int numBytes = FastStruct.Size * (int)size; + int numBytes = Unsafe.SizeOf() * (int)size; - byte[] result = reader.ReadBytes(numBytes); + byte[] source = reader.ReadBytes(numBytes); - return FastStruct.ReadArray(result); + T[] result = new T[source.Length / Unsafe.SizeOf()]; + + if (source.Length > 0) + { + unsafe + { + Unsafe.CopyBlockUnaligned(Unsafe.AsPointer(ref result[0]), Unsafe.AsPointer(ref source[0]), (uint)source.Length); + } + } + + return result; } public static T Read(this BinaryReader reader) where T : struct { - byte[] result = reader.ReadBytes(FastStruct.Size); + byte[] result = reader.ReadBytes(Unsafe.SizeOf()); - return FastStruct.ArrayToStructure(result); + return Unsafe.ReadUnaligned(ref result[0]); } #endregion } diff --git a/Source/Game/Game.csproj b/Source/Game/Game.csproj index 49d18cbac..12ce67d3c 100644 --- a/Source/Game/Game.csproj +++ b/Source/Game/Game.csproj @@ -7,10 +7,6 @@ 7.3 - - - -