|
using IPA.Utilities;
|
|
using System;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
|
|
namespace IPA.Config.Data
|
|
{
|
|
/// <summary>
|
|
/// A list of <see cref="Value"/>s for serialization by an <see cref="IConfigProvider"/>.
|
|
/// Use <see cref="Value.List"/> or <see cref="Value.From(IEnumerable{Value})"/> to create.
|
|
/// </summary>
|
|
public sealed class List : Value, IList<Value>
|
|
{
|
|
private readonly List<Value> values = new List<Value>();
|
|
|
|
internal List() { }
|
|
|
|
/// <summary>
|
|
/// Gets the value at the given index in this <see cref="List"/>.
|
|
/// </summary>
|
|
/// <param name="index">the index to retrieve the <see cref="Value"/> at</param>
|
|
/// <returns>the <see cref="Value"/> at <paramref name="index"/></returns>
|
|
/// <seealso cref="IList{T}.this[int]"/>
|
|
public Value this[int index] { get => values[index]; set => values[index] = value; }
|
|
|
|
/// <summary>
|
|
/// Gets the number of elements in the <see cref="List"/>.
|
|
/// </summary>
|
|
/// <seealso cref="ICollection{T}.Count"/>
|
|
public int Count => values.Count;
|
|
|
|
bool ICollection<Value>.IsReadOnly => ((IList<Value>)values).IsReadOnly;
|
|
|
|
/// <summary>
|
|
/// Adds a <see cref="Value"/> to the end of this <see cref="List"/>.
|
|
/// </summary>
|
|
/// <param name="item">the <see cref="Value"/> to add</param>
|
|
/// <seealso cref="ICollection{T}.Add(T)"/>
|
|
public void Add(Value item) => values.Add(item);
|
|
|
|
/// <summary>
|
|
/// Adds a range of <see cref="Value"/>s to the end of this <see cref="List"/>.
|
|
/// </summary>
|
|
/// <param name="vals">the range of <see cref="Value"/>s to add</param>
|
|
public void AddRange(IEnumerable<Value> vals)
|
|
{
|
|
foreach (var val in vals) Add(val);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Clears the <see cref="List"/>.
|
|
/// </summary>
|
|
/// <seealso cref="ICollection{T}.Clear"/>
|
|
public void Clear() => values.Clear();
|
|
|
|
/// <summary>
|
|
/// Checks if the <see cref="List"/> contains a certian item.
|
|
/// </summary>
|
|
/// <param name="item">the <see cref="Value"/> to check for</param>
|
|
/// <returns><see langword="true"/> if the item was founc, otherwise <see langword="false"/></returns>
|
|
/// <seealso cref="ICollection{T}.Contains(T)"/>
|
|
public bool Contains(Value item) => values.Contains(item);
|
|
|
|
/// <summary>
|
|
/// Copies the <see cref="Value"/>s in the <see cref="List"/> to the <see cref="Array"/> in <paramref name="array"/>.
|
|
/// </summary>
|
|
/// <param name="array">the <see cref="Array"/> to copy to</param>
|
|
/// <param name="arrayIndex">the starting index to copy to</param>
|
|
/// <seealso cref="ICollection{T}.CopyTo(T[], int)"/>
|
|
public void CopyTo(Value[] array, int arrayIndex) => values.CopyTo(array, arrayIndex);
|
|
|
|
/// <summary>
|
|
/// Gets an enumerator to enumerate the <see cref="List"/>.
|
|
/// </summary>
|
|
/// <returns>an <see cref="IEnumerator{T}"/> for this <see cref="List"/></returns>
|
|
/// <seealso cref="IEnumerable{T}.GetEnumerator"/>
|
|
public IEnumerator<Value> GetEnumerator() => ((IList<Value>)values).GetEnumerator();
|
|
|
|
/// <summary>
|
|
/// Gets the index that a given <see cref="Value"/> is in the <see cref="List"/>.
|
|
/// </summary>
|
|
/// <param name="item">the <see cref="Value"/> to search for</param>
|
|
/// <returns>the index that the <paramref name="item"/> was at, or -1.</returns>
|
|
/// <seealso cref="IList{T}.IndexOf(T)"/>
|
|
public int IndexOf(Value item) => values.IndexOf(item);
|
|
|
|
/// <summary>
|
|
/// Inserts a <see cref="Value"/> at an index.
|
|
/// </summary>
|
|
/// <param name="index">the index to insert at</param>
|
|
/// <param name="item">the <see cref="Value"/> to insert</param>
|
|
/// <seealso cref="IList{T}.Insert(int, T)"/>
|
|
public void Insert(int index, Value item) => values.Insert(index, item);
|
|
|
|
/// <summary>
|
|
/// Removes a <see cref="Value"/> from the <see cref="List"/>.
|
|
/// </summary>
|
|
/// <param name="item">the <see cref="Value"/> to remove</param>
|
|
/// <returns><see langword="true"/> if the item was removed, <see langword="false"/> otherwise</returns>
|
|
/// <seealso cref="ICollection{T}.Remove(T)"/>
|
|
public bool Remove(Value item) => values.Remove(item);
|
|
|
|
/// <summary>
|
|
/// Removes a <see cref="Value"/> at an index.
|
|
/// </summary>
|
|
/// <param name="index">the index to remove a <see cref="Value"/> at</param>
|
|
/// <seealso cref="IList{T}.RemoveAt(int)"/>
|
|
public void RemoveAt(int index) => values.RemoveAt(index);
|
|
|
|
/// <summary>
|
|
/// Converts this <see cref="Value"/> into a human-readable format.
|
|
/// </summary>
|
|
/// <returns>a comma-seperated list of the result of <see cref="Value.ToString"/> wrapped in square brackets</returns>
|
|
public override string ToString()
|
|
=> $"[{string.Join(",",this.Select(v => v?.ToString() ?? "null").StrJP())}]";
|
|
|
|
IEnumerator IEnumerable.GetEnumerator() => ((IList<Value>)values).GetEnumerator();
|
|
}
|
|
|
|
|
|
}
|