using System; using System.Collections.Generic; namespace Ingvar.LiveWatch { [Serializable] public class WatchValueList { public WatchValueType Type = WatchValueType.NotSet; public RepetitiveValueList> FloatList = new (); public RepetitiveValueList> DoubleList = new (); public RepetitiveValueList> IntList = new (); public RepetitiveValueList> BoolList = new (); public RepetitiveValueList> StringList = new (); public List OriginalKeys { get { return Type switch { WatchValueType.Float => FloatList.OriginalKeys, WatchValueType.Double => DoubleList.OriginalKeys, WatchValueType.Int => IntList.OriginalKeys, WatchValueType.Bool => BoolList.OriginalKeys, WatchValueType.String or WatchValueType.NotSet => StringList.OriginalKeys, _ => throw new ArgumentOutOfRangeException() }; } } public int Count { get { return Type switch { WatchValueType.Float => FloatList?.Count ?? 0, WatchValueType.Double => DoubleList?.Count ?? 0, WatchValueType.Int => IntList?.Count ?? 0, WatchValueType.Bool => BoolList?.Count ?? 0, WatchValueType.String or WatchValueType.NotSet => StringList?.Count ?? 0, _ => throw new ArgumentOutOfRangeException() }; } } public void Clear() { if (Type is WatchValueType.NotSet or WatchValueType.Float) FloatList.Clear(); if (Type is WatchValueType.NotSet or WatchValueType.Double) DoubleList.Clear(); if (Type is WatchValueType.NotSet or WatchValueType.Int) IntList.Clear(); if (Type is WatchValueType.NotSet or WatchValueType.Bool) BoolList.Clear(); if (Type is WatchValueType.NotSet or WatchValueType.String) StringList.Clear(); } public bool IsOriginalAt(int index) { return Type switch { WatchValueType.Float => FloatList.IsOriginalAt(index), WatchValueType.Double => DoubleList.IsOriginalAt(index), WatchValueType.Int => IntList.IsOriginalAt(index), WatchValueType.Bool => BoolList.IsOriginalAt(index), WatchValueType.String or WatchValueType.NotSet => StringList.IsOriginalAt(index), _ => throw new ArgumentOutOfRangeException() }; } public int GetOriginalKey(int index) { return Type switch { WatchValueType.Float => FloatList.GetOriginalIndex(index), WatchValueType.Double => DoubleList.GetOriginalIndex(index), WatchValueType.Int => IntList.GetOriginalIndex(index), WatchValueType.Bool => BoolList.GetOriginalIndex(index), WatchValueType.String or WatchValueType.NotSet => StringList.GetOriginalIndex(index), _ => throw new ArgumentOutOfRangeException() }; } public bool IsEmptyAt(int index) { return Type switch { WatchValueType.Float => !FloatList.AnyAt(index) || FloatList[index].IsEmpty, WatchValueType.Double => !DoubleList.AnyAt(index) || DoubleList[index].IsEmpty, WatchValueType.Int => !IntList.AnyAt(index) || IntList[index].IsEmpty, WatchValueType.Bool => !BoolList.AnyAt(index) || BoolList[index].IsEmpty, WatchValueType.String or WatchValueType.NotSet => !StringList.AnyAt(index) || StringList[index].IsEmpty, _ => throw new ArgumentOutOfRangeException() }; } public bool AnyAt(int index) { return Type switch { WatchValueType.Float => FloatList.AnyAt(index), WatchValueType.Double => DoubleList.AnyAt(index), WatchValueType.Int => IntList.AnyAt(index), WatchValueType.Bool => BoolList.AnyAt(index), WatchValueType.String or WatchValueType.NotSet => StringList.AnyAt(index), _ => throw new ArgumentOutOfRangeException() }; } public void Expand(int count) { if (Type is WatchValueType.Float or WatchValueType.NotSet) FloatList.Expand(count); if (Type is WatchValueType.Double or WatchValueType.NotSet) DoubleList.Expand(count); if (Type is WatchValueType.Int or WatchValueType.NotSet) IntList.Expand(count); if (Type is WatchValueType.Bool or WatchValueType.NotSet) BoolList.Expand(count); if (Type is WatchValueType.String or WatchValueType.NotSet) StringList.Expand(count); } public void PushEmpty() { if (Type is WatchValueType.String or WatchValueType.NotSet) StringList.Add(WatchValue.Empty()); if (Type is WatchValueType.Float or WatchValueType.NotSet) FloatList.Add(WatchValue.Empty()); if (Type is WatchValueType.Double or WatchValueType.NotSet) DoubleList.Add(WatchValue.Empty()); if (Type is WatchValueType.Int or WatchValueType.NotSet) IntList.Add(WatchValue.Empty()); if (Type is WatchValueType.Bool or WatchValueType.NotSet) BoolList.Add(WatchValue.Empty()); } } }