aboutsummaryrefslogtreecommitdiff
path: root/ARMeilleure/Translation/PTC/PtcFormatter.cs
diff options
context:
space:
mode:
Diffstat (limited to 'ARMeilleure/Translation/PTC/PtcFormatter.cs')
-rw-r--r--ARMeilleure/Translation/PTC/PtcFormatter.cs121
1 files changed, 121 insertions, 0 deletions
diff --git a/ARMeilleure/Translation/PTC/PtcFormatter.cs b/ARMeilleure/Translation/PTC/PtcFormatter.cs
new file mode 100644
index 00000000..7346b484
--- /dev/null
+++ b/ARMeilleure/Translation/PTC/PtcFormatter.cs
@@ -0,0 +1,121 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+namespace ARMeilleure.Translation.PTC
+{
+ public class PtcFormatter
+ {
+ #region "Deserialize"
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public static Dictionary<TKey, TValue> DeserializeDictionary<TKey, TValue>(Stream stream, Func<Stream, TValue> valueFunc) where TKey : unmanaged
+ {
+ Dictionary<TKey, TValue> dictionary = new();
+
+ int count = DeserializeStructure<int>(stream);
+
+ for (int i = 0; i < count; i++)
+ {
+ TKey key = DeserializeStructure<TKey>(stream);
+ TValue value = valueFunc(stream);
+
+ dictionary.Add(key, value);
+ }
+
+ return dictionary;
+ }
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public static List<T> DeserializeList<T>(Stream stream) where T : unmanaged
+ {
+ List<T> list = new();
+
+ int count = DeserializeStructure<int>(stream);
+
+ for (int i = 0; i < count; i++)
+ {
+ T item = DeserializeStructure<T>(stream);
+
+ list.Add(item);
+ }
+
+ return list;
+ }
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public static T DeserializeStructure<T>(Stream stream) where T : unmanaged
+ {
+ T structure = default(T);
+
+ Span<T> spanT = MemoryMarshal.CreateSpan(ref structure, 1);
+ stream.Read(MemoryMarshal.AsBytes(spanT));
+
+ return structure;
+ }
+ #endregion
+
+ #region "GetSerializeSize"
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public static int GetSerializeSizeDictionary<TKey, TValue>(Dictionary<TKey, TValue> dictionary, Func<TValue, int> valueFunc) where TKey : unmanaged
+ {
+ int size = 0;
+
+ size += Unsafe.SizeOf<int>();
+
+ foreach ((_, TValue value) in dictionary)
+ {
+ size += Unsafe.SizeOf<TKey>();
+ size += valueFunc(value);
+ }
+
+ return size;
+ }
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public static int GetSerializeSizeList<T>(List<T> list) where T : unmanaged
+ {
+ int size = 0;
+
+ size += Unsafe.SizeOf<int>();
+
+ size += list.Count * Unsafe.SizeOf<T>();
+
+ return size;
+ }
+ #endregion
+
+ #region "Serialize"
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public static void SerializeDictionary<TKey, TValue>(Stream stream, Dictionary<TKey, TValue> dictionary, Action<Stream, TValue> valueAction) where TKey : unmanaged
+ {
+ SerializeStructure<int>(stream, dictionary.Count);
+
+ foreach ((TKey key, TValue value) in dictionary)
+ {
+ SerializeStructure<TKey>(stream, key);
+ valueAction(stream, value);
+ }
+ }
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public static void SerializeList<T>(Stream stream, List<T> list) where T : unmanaged
+ {
+ SerializeStructure<int>(stream, list.Count);
+
+ foreach (T item in list)
+ {
+ SerializeStructure<T>(stream, item);
+ }
+ }
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ public static void SerializeStructure<T>(Stream stream, T structure) where T : unmanaged
+ {
+ Span<T> spanT = MemoryMarshal.CreateSpan(ref structure, 1);
+ stream.Write(MemoryMarshal.AsBytes(spanT));
+ }
+ #endregion
+ }
+} \ No newline at end of file