TH1/Unity/Assets/Plugins/ViSDK/ViBaseStruct/ViPriorityValue.cs
2025-08-20 02:24:48 +08:00

161 lines
2.5 KiB
C#

using System;
using System.Collections.Generic;
public class ViPriorityValue<T>
{
public delegate void DeleUpdated(T oldValue, T newValue);
public DeleUpdated UpdatedExec;
public ViPriorityValue()
{
}
public ViPriorityValue(T defaultValue)
{
_defaultValue = defaultValue;
_value = defaultValue;
}
public T Value { get { return _value; } }
public T DefaultValue
{
get { return _defaultValue; }
set
{
_defaultValue = value;
Update();
}
}
public int Count { get { return _list.Count; } }
public void Clear()
{
_list.Clear();
_value = DefaultValue;
}
public void Add(string name, Int32 weight, T value)
{
for (int iter = 0; iter < _list.Count; ++iter)
{
Node iterNode = _list[iter];
if (iterNode.Name == name)
{
iterNode.Weight = weight;
iterNode.Value = value;
//
Update();
return;
}
}
//
Node node = new Node();
node.Name = name;
node.Weight = weight;
node.Value = value;
_list.Add(node);
//
Update();
}
public bool Del(string name)
{
for (int iter = 0; iter < _list.Count; ++iter)
{
Node iterNode = _list[iter];
if (iterNode.Name == name)
{
_list.RemoveAt(iter);
Update();
return true;
}
}
return false;
}
public void DelAll()
{
_list.Clear();
Update();
}
public bool Has(string name)
{
for (int iter = 0; iter < _list.Count; ++iter)
{
Node iterNode = _list[iter];
if (iterNode.Name == name)
{
return true;
}
}
return false;
}
public bool UpdateWeight(string name, Int32 weight)
{
for (int iter = 0; iter < _list.Count; ++iter)
{
Node iterNode = _list[iter];
if (iterNode.Name == name)
{
iterNode.Weight = weight;
Update();
return true;
}
}
return false;
}
void Update()
{
T oldValue = _value;
_value = _defaultValue;
Int32 maxWeight = Int32.MinValue;
for (int iter = 0; iter < _list.Count; ++iter)
{
Node iterNode = _list[iter];
if (iterNode.Weight > maxWeight)
{
_value = iterNode.Value;
maxWeight = iterNode.Weight;
}
}
if (!object.Equals(oldValue, _value))
{
if (UpdatedExec != null)
{
UpdatedExec(oldValue, _value);
}
}
}
public void UpdateNotify()
{
if (UpdatedExec != null)
{
UpdatedExec(_value, _value);
}
}
T _value;
T _defaultValue;
public void CopyTo(List<Node> list)
{
for (int iter = 0; iter < _list.Count; ++iter)
{
list.Add(_list[iter]);
}
}
public class Node
{
public string Name;
public Int32 Weight;
public T Value;
}
List<Node> _list = new List<Node>();
}