PO/Library/PackageCache/com.unity.2d.animation@5.0.7/Editor/SkinningModule/SerializableDictionary.cs

126 lines
3.7 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace UnityEditor.U2D.Animation
{
[Serializable]
internal class SerializableDictionary<TKey, TValue> : IDictionary<TKey, TValue>, ISerializationCallbackReceiver
{
[SerializeField]
private List<TKey> m_Keys;
[SerializeField]
private List<TValue> m_Values;
private Dictionary<TKey, TValue> m_Dictionary = new Dictionary<TKey, TValue>();
public TValue this[TKey key]
{
get { return m_Dictionary[key]; }
set { m_Dictionary[key] = value; }
}
public TKey this[TValue value]
{
get
{
m_Keys = new List<TKey>(m_Dictionary.Keys);
m_Values = new List<TValue>(m_Dictionary.Values);
var index = m_Values.FindIndex(x => x.Equals(value));
if (index < 0)
throw new KeyNotFoundException();
return m_Keys[index];
}
}
public ICollection<TKey> Keys
{
get { return m_Dictionary.Keys; }
}
public ICollection<TValue> Values
{
get { return m_Dictionary.Values; }
}
public void Add(TKey key, TValue value)
{
m_Dictionary.Add(key, value);
}
public bool ContainsKey(TKey key)
{
return m_Dictionary.ContainsKey(key);
}
public bool Remove(TKey key)
{
return m_Dictionary.Remove(key);
}
public bool TryGetValue(TKey key, out TValue value)
{
return m_Dictionary.TryGetValue(key, out value);
}
public void Clear()
{
m_Dictionary.Clear();
}
public int Count
{
get { return m_Dictionary.Count; }
}
bool ICollection<KeyValuePair<TKey, TValue>>.IsReadOnly
{
get { return (m_Dictionary as ICollection<KeyValuePair<TKey, TValue>>).IsReadOnly; }
}
void ICollection<KeyValuePair<TKey, TValue>>.Add(KeyValuePair<TKey, TValue> item)
{
(m_Dictionary as ICollection<KeyValuePair<TKey, TValue>>).Add(item);
}
bool ICollection<KeyValuePair<TKey, TValue>>.Contains(KeyValuePair<TKey, TValue> item)
{
return (m_Dictionary as ICollection<KeyValuePair<TKey, TValue>>).Contains(item);
}
void ICollection<KeyValuePair<TKey, TValue>>.CopyTo(KeyValuePair<TKey, TValue>[] array, int arrayIndex)
{
(m_Dictionary as ICollection<KeyValuePair<TKey, TValue>>).CopyTo(array, arrayIndex);
}
bool ICollection<KeyValuePair<TKey, TValue>>.Remove(KeyValuePair<TKey, TValue> item)
{
return (m_Dictionary as ICollection<KeyValuePair<TKey, TValue>>).Remove(item);
}
IEnumerator<KeyValuePair<TKey, TValue>> IEnumerable<KeyValuePair<TKey, TValue>>.GetEnumerator()
{
return (m_Dictionary as IEnumerable<KeyValuePair<TKey, TValue>>).GetEnumerator();
}
public IEnumerator GetEnumerator()
{
return m_Dictionary.GetEnumerator();
}
void ISerializationCallbackReceiver.OnBeforeSerialize()
{
m_Keys = new List<TKey>(m_Dictionary.Keys);
m_Values = new List<TValue>(m_Dictionary.Values);
}
void ISerializationCallbackReceiver.OnAfterDeserialize()
{
Debug.Assert(m_Keys.Count == m_Values.Count);
Clear();
for (var i = 0; i < m_Keys.Count; ++i)
Add(m_Keys[i], m_Values[i]);
}
}
}