Files
Studio/Assets/Scripts/XRLib/Util/SDictionary.cs
2025-02-21 11:57:09 +09:00

106 lines
2.5 KiB
C#

using System.Collections.Generic;
using UnityEngine;
namespace XRLib
{
[System.Serializable]
public struct SKeyValuePair<T, T2>
{
[SerializeField] public T Key;
[SerializeField] public T2 Value;
public SKeyValuePair(T key, T2 value)
{
Key = key;
Value = value;
}
}
/// <summary>
/// SerializeDictionary For Unity
/// </summary>
[System.Serializable]
public partial class SDictionary<T, T2> : Dictionary<T, T2>
{
[SerializeField] public List<SKeyValuePair<T, T2>> datas = new List<SKeyValuePair<T, T2>>();
public SDictionary()
{
foreach (var d in datas)
{
Add(d.Key, d.Value);
}
}
void Refresh()
{
if (base.Count == datas.Count)
return;
foreach (var d in datas)
{
base.TryAdd(d.Key, d.Value);
}
}
public new T2 this[T key]
{
get
{
Refresh();
return base[key];
}
set
{
for (int i = 0; i < datas.Count; ++i)
{
var currentData = datas[i];
var ck = currentData.Key;
if (ck.Equals(key))
datas.RemoveAt(i);
}
datas.Add(new SKeyValuePair<T, T2>(key, value));
base[key] = value;
}
}
public bool Add(in T key, in T2 value)
{
if (base.ContainsKey(key))
return false;
base.Add(key, value);
datas.Add(new SKeyValuePair<T, T2>(key, value));
return true;
}
public bool Remove(in T key)
{
if (!base.ContainsKey(key))
return false;
for (int i = 0; i < datas.Count; ++i)
{
if (datas[i].Key.Equals(key))
{
datas.RemoveAt(i);
base.Remove(key);
return true;
}
}
return false;
}
public new void Clear()
{
base.Clear();
datas.Clear();
}
public bool TryGetValue(in T key, out T2 value)
{
Refresh();
return base.TryGetValue(key, out value);
}
}
}