mirror of
https://github.com/space-wizards/RobustToolbox.git
synced 2026-09-16 07:12:27 +02:00
Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Co-authored-by: metalgearsloth <comedian_vs_clown@hotmail.com>
84 lines
2.9 KiB
C#
84 lines
2.9 KiB
C#
using System.Collections.Generic;
|
|
|
|
namespace Robust.Shared.Serialization.Manager.Result
|
|
{
|
|
public sealed class DeserializedDictionary<TDict, TKey, TValue> :
|
|
DeserializationResult<TDict>
|
|
where TKey : notnull
|
|
where TDict : IReadOnlyDictionary<TKey, TValue>
|
|
{
|
|
public delegate TDict Create(Dictionary<TKey, TValue> elements);
|
|
|
|
public DeserializedDictionary(
|
|
TDict value,
|
|
IReadOnlyDictionary<DeserializationResult, DeserializationResult> mappings,
|
|
Create createDelegate)
|
|
{
|
|
Value = value;
|
|
Mappings = mappings;
|
|
CreateDelegate = createDelegate;
|
|
}
|
|
|
|
public override TDict Value { get; }
|
|
|
|
public IReadOnlyDictionary<DeserializationResult, DeserializationResult> Mappings { get; }
|
|
|
|
public Create CreateDelegate { get; }
|
|
|
|
public override object RawValue => Value;
|
|
|
|
public override DeserializationResult PushInheritanceFrom(DeserializationResult source)
|
|
{
|
|
var sourceRes = source.Cast<DeserializedDictionary<TDict, TKey, TValue>>();
|
|
var valueDict = new Dictionary<TKey, TValue>();
|
|
var mappingDict = new Dictionary<DeserializationResult, DeserializationResult>();
|
|
|
|
foreach (var (keyRes, valRes) in sourceRes.Mappings)
|
|
{
|
|
var newKeyRes = keyRes.Copy();
|
|
var newValueRes = valRes.Copy();
|
|
|
|
valueDict.Add((TKey)newKeyRes.RawValue!, (TValue)newValueRes.RawValue!);
|
|
mappingDict.Add(newKeyRes, newValueRes);
|
|
}
|
|
|
|
foreach (var (keyRes, valRes) in Mappings)
|
|
{
|
|
var newKeyRes = keyRes.Copy();
|
|
var newValueRes = valRes.Copy();
|
|
|
|
valueDict.Add((TKey) newKeyRes.RawValue!, (TValue)newValueRes.RawValue!);
|
|
mappingDict.Add(newKeyRes, newValueRes);
|
|
}
|
|
|
|
return new DeserializedDictionary<TDict, TKey, TValue>(CreateDelegate(valueDict), mappingDict, CreateDelegate);
|
|
}
|
|
|
|
public override DeserializationResult Copy()
|
|
{
|
|
var valueDict = new Dictionary<TKey, TValue>();
|
|
var mappingDict = new Dictionary<DeserializationResult, DeserializationResult>();
|
|
|
|
foreach (var (keyRes, valRes) in Mappings)
|
|
{
|
|
var newKeyRes = keyRes.Copy();
|
|
var newValueRes = valRes.Copy();
|
|
|
|
valueDict.Add((TKey)newKeyRes.RawValue!, (TValue)newValueRes.RawValue!);
|
|
mappingDict.Add(newKeyRes, newValueRes);
|
|
}
|
|
|
|
return new DeserializedDictionary<TDict, TKey, TValue>(CreateDelegate(valueDict), mappingDict, CreateDelegate);
|
|
}
|
|
|
|
public override void CallAfterDeserializationHook()
|
|
{
|
|
foreach (var (key, val) in Mappings)
|
|
{
|
|
key.CallAfterDeserializationHook();
|
|
val.CallAfterDeserializationHook();
|
|
}
|
|
}
|
|
}
|
|
}
|