SharpGen/CppModel/CppContainer.cs (54 lines of code) (raw):
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
namespace SharpGen.CppModel
{
public abstract class CppContainer : CppElement
{
private List<CppElement> items;
public IReadOnlyList<CppElement> Items
{
get => (IReadOnlyList<CppElement>) items ?? ImmutableList<CppElement>.Empty;
set => AdoptAllChildren(
items = value switch
{
List<CppElement> list => list,
_ => new List<CppElement>(value)
}
);
}
protected internal virtual IEnumerable<CppElement> AllItems => Iterate<CppElement>();
public bool IsEmpty => items == null || items.Count == 0;
protected CppContainer(string name) : base(name)
{
}
public void Add(CppElement element)
{
AdoptChild(element);
items ??= new List<CppElement>();
items.Add(element);
}
public void AddRange(IEnumerable<CppElement> elements)
{
items ??= new List<CppElement>();
var index = items.Count;
items.AddRange(elements);
var newCount = items.Count;
for (var i = index; i < newCount; i++)
AdoptChild(items[i]);
}
private void AdoptChild(CppElement element)
{
element.Parent?.items?.Remove(element);
element.Parent = this;
}
private void AdoptAllChildren(IEnumerable<CppElement> elements)
{
foreach (var element in elements)
AdoptChild(element);
}
internal void RemoveChild(CppElement child) => items?.Remove(child);
/// <summary>
/// Iterates on items on this instance.
/// </summary>
/// <typeparam name = "T">Type of the item to iterate</typeparam>
/// <returns>An enumeration on items</returns>
public IEnumerable<T> Iterate<T>() where T : CppElement =>
items == null ? Enumerable.Empty<T>() : Items.OfType<T>();
}
}