123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161 |
- using System;
- using System.Collections.Generic;
- namespace InABox.Core
- {
- public abstract class PackableDictionary<T> : Dictionary<string, T>, IPackable
- {
- public void Pack(FastBinaryWriter writer)
- {
- writer.Write(Count);
- foreach (var key in Keys)
- {
- writer.Write(key);
- PackItem(writer, this[key]);
- }
- }
- public void Unpack(FastBinaryReader reader)
- {
- Clear();
- var iCount = reader.ReadInt32();
- for (var i = 0; i < iCount; i++)
- {
- var key = reader.ReadString();
- this[key] = UnpackItem(reader);
- }
- }
- public override bool Equals(object obj)
- {
- var other = obj as PackableDictionary<T>;
- if (other == null)
- return false;
- if (Count != other.Count) // Require equal count.
- return false;
- foreach (var pair in this)
- if (other.TryGetValue(pair.Key, out var value))
- {
- if (value == null)
- {
- if (pair.Value != null)
- return false;
- }
- else if (!value.Equals(pair.Value))
- {
- return false;
- }
- }
- else
- {
- return false;
- }
- return true;
- }
- public abstract void PackItem(FastBinaryWriter writer, T value);
- public abstract T UnpackItem(FastBinaryReader reader);
- }
- public class PackableStringDictionary : PackableDictionary<string>
- {
- public override void PackItem(FastBinaryWriter writer, string value)
- {
- writer.Write(value);
- }
- public override string UnpackItem(FastBinaryReader reader)
- {
- return reader.ReadString();
- }
- }
- public class PackableBooleanDictionary : PackableDictionary<bool>
- {
- public override void PackItem(FastBinaryWriter writer, bool value)
- {
- writer.Write(value);
- }
- public override bool UnpackItem(FastBinaryReader reader)
- {
- return reader.ReadBoolean();
- }
- }
- public class PackableObjectDictionary : PackableDictionary<object>
- {
- private static readonly Dictionary<Type, short> Types = new Dictionary<Type, short>
- {
- { typeof(object), 0x0000 },
- { typeof(string), 0x0001 },
- { typeof(string[]), 0x002 },
- { typeof(sbyte), 0x1000 },
- { typeof(byte), 0x0011 },
- { typeof(ushort), 0x0012 },
- { typeof(uint), 0x0013 },
- { typeof(ulong), 0x0014 },
- { typeof(short), 0x0015 },
- { typeof(int), 0x0016 },
- { typeof(long), 0x0017 },
- { typeof(float), 0x0100 },
- { typeof(double), 0x0101 },
- { typeof(decimal), 0x0102 },
- { typeof(TimeSpan), 0x1000 },
- { typeof(DateTime), 0x1001 },
- { typeof(Guid), 0x1002 }
- };
- private static readonly Dictionary<short, Type> Indexes = new Dictionary<short, Type>();
- static PackableObjectDictionary()
- {
- foreach (var key in Types.Keys)
- Indexes[Types[key]] = key;
- }
- private static short GetIndex(Type type)
- {
- if (Types.ContainsKey(type))
- return Types[type];
- return 0x0000;
- }
- public static Type GetType(short index)
- {
- if (Indexes.ContainsKey(index))
- return Indexes[index];
- return typeof(object);
- }
- public override void PackItem(FastBinaryWriter writer, object value)
- {
- if (value == null)
- {
- writer.Write(default(short));
- writer.Write("");
- }
- else
- {
- var type = GetIndex(value.GetType());
- writer.Write(type);
- writer.Write(CoreUtils.TypedValueToString(value));
- }
- }
- public override object UnpackItem(FastBinaryReader reader)
- {
- var index = reader.ReadInt16();
- var type = GetType(index);
- var value = reader.ReadString();
- if (type == typeof(object) && string.IsNullOrEmpty(value))
- return null;
- return CoreUtils.StringToTypedValue(value, type);
- }
- }
- }
|