RoboticArms/Library/PackageCache/com.unity.splines@d3e1e500c9a0/Runtime/SplineDataDictionary.cs
2025-11-17 15:16:36 +07:00

96 lines
2.7 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
namespace UnityEngine.Splines
{
[Serializable]
class SplineDataKeyValuePair<T>
{
public string Key;
public SplineData<T> Value;
}
[Serializable]
class SplineDataDictionary<T> : IEnumerable<SplineDataKeyValuePair<T>>
{
[SerializeField]
List<SplineDataKeyValuePair<T>> m_Data = new ();
public IEnumerable<string> Keys => m_Data.Select(x => x.Key);
public IEnumerable<SplineData<T>> Values => m_Data.Select(x => x.Value);
int FindIndex(string key)
{
for (int i = 0, c = m_Data.Count; i < c; ++i)
if (m_Data[i].Key == key)
return i;
return -1;
}
public bool TryGetValue(string key, out SplineData<T> value)
{
var index = FindIndex(key);
value = index < 0 ? null : m_Data[index].Value;
return index > -1;
}
public SplineData<T> GetOrCreate(string key)
{
if (string.IsNullOrEmpty(key))
throw new ArgumentNullException(nameof(key));
if (!TryGetValue(key, out var data))
m_Data.Add(new SplineDataKeyValuePair<T>()
{
Key = key,
Value = data = new SplineData<T>()
});
return data;
}
public SplineData<T> this[string key]
{
get => TryGetValue(key, out var data) ? data : null;
set
{
int i = FindIndex(key);
var copy = new SplineData<T>(value);
if (i < 0)
m_Data.Add(new SplineDataKeyValuePair<T>() { Key = key, Value = copy });
else
m_Data[i].Value = copy;
}
}
public bool Contains(string key) => FindIndex(key) > -1;
public IEnumerator<SplineDataKeyValuePair<T>> GetEnumerator() => m_Data.GetEnumerator();
IEnumerator IEnumerable.GetEnumerator() => ((IEnumerable)m_Data).GetEnumerator();
public bool Remove(string key)
{
var i = FindIndex(key);
if (i < 0)
return false;
m_Data.RemoveAt(i);
return true;
}
public void RemoveEmpty()
{
for (int i = m_Data.Count - 1; i > -1; --i)
{
if (string.IsNullOrEmpty(m_Data[i].Key) || m_Data[i].Value?.Count < 1)
{
Debug.Log($"{typeof(T)} remove empty key \"{m_Data[i].Key}\"");
m_Data.RemoveAt(i);
}
}
}
}
}