NBTExplorer/SubstrateCS/Source/Nbt/SchemaNodeCompound.cs
2011-10-08 00:01:51 -04:00

219 lines
8.5 KiB
C#

using System;
using System.Collections.Generic;
namespace Substrate.Nbt
{
/// <summary>
/// A concrete <see cref="SchemaNode"/> representing a <see cref="TagNodeCompound"/>.
/// </summary>
public sealed class SchemaNodeCompound : SchemaNode, ICollection<SchemaNode>
{
private List<SchemaNode> _subnodes;
#region ICollection<NBTSchemaNode> Members
/// <summary>
/// Adds a <see cref="SchemaNode"/> as a child of this node.
/// </summary>
/// <param name="item">The <see cref="SchemaNode"/> to add.</param>
public void Add (SchemaNode item)
{
_subnodes.Add(item);
}
/// <summary>
/// Removes all <see cref="SchemaNode"/> objects from the node.
/// </summary>
public void Clear ()
{
_subnodes.Clear();
}
/// <summary>
/// Checks if a <see cref="SchemaNode"/> is a child of this node.
/// </summary>
/// <param name="item">The <see cref="SchemaNode"/> to check for existance.</param>
/// <returns>Status indicating if the <see cref="SchemaNode"/> exists as a child of this node.</returns>
public bool Contains (SchemaNode item)
{
return _subnodes.Contains(item);
}
/// <summary>
/// Copies all child <see cref="SchemaNode"/> objects of this node to a compatible one-dimensional array, starting at the specified index of the target array.
/// </summary>
/// <param name="array">The one-dimensional <see cref="Array"/> that is the destination of the subnodes copied. The Array must have zero-based indexing.</param>
/// <param name="arrayIndex">The zero-based index in <paramref name="array"/> at which copying begins.</param>
public void CopyTo (SchemaNode[] array, int arrayIndex)
{
_subnodes.CopyTo(array, arrayIndex);
}
/// <summary>
/// Gets the number of child <see cref="SchemaNode"/> objects in this node.
/// </summary>
public int Count
{
get { return _subnodes.Count; }
}
/// <summary>
/// Gets a value indicating whether the node is readonly.
/// </summary>
public bool IsReadOnly
{
get { return false; }
}
/// <summary>
/// Removes the first occurance of a <see cref="SchemaNode"/> from this node.
/// </summary>
/// <param name="item">The <see cref="SchemaNode"/> to remove.</param>
/// <returns>Status indicating whether a <see cref="SchemaNode"/> was removed.</returns>
public bool Remove (SchemaNode item)
{
return _subnodes.Remove(item);
}
#endregion
#region IEnumerable<SchemaNode> Members
/// <summary>
/// Iterates through all of the <see cref="SchemaNode"/> objects in this <see cref="SchemaNodeCompound"/>.
/// </summary>
/// <returns>An enumerator for this node.</returns>
public IEnumerator<SchemaNode> GetEnumerator ()
{
return _subnodes.GetEnumerator();
}
#endregion
#region IEnumerable Members
/// <summary>
/// Iterates through all of the <see cref="SchemaNode"/> objects in this <see cref="SchemaNodeCompound"/>.
/// </summary>
/// <returns>An enumerator for this node.</returns>
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator ()
{
return _subnodes.GetEnumerator();
}
#endregion
/// <summary>
/// Constructs a new <see cref="SchemaNodeCompound"/> representing a root <see cref="TagNodeCompound"/>.
/// </summary>
public SchemaNodeCompound ()
: base("")
{
_subnodes = new List<SchemaNode>();
}
/// <summary>
/// Constructs a new <see cref="SchemaNodeCompound"/> with additional options.
/// </summary>
/// <param name="options">One or more option flags modifying the processing of this node.</param>
public SchemaNodeCompound (SchemaOptions options)
: base("", options)
{
_subnodes = new List<SchemaNode>();
}
/// <summary>
/// Constructs a new <see cref="SchemaNodeCompound"/> representing a <see cref="TagNodeCompound"/> named <paramref name="name"/>.
/// </summary>
/// <param name="name">The name of the corresponding <see cref="TagNodeCompound"/>.</param>
public SchemaNodeCompound (string name)
: base(name)
{
_subnodes = new List<SchemaNode>();
}
/// <summary>
/// Constructs a new <see cref="SchemaNodeCompound"/> with additional options.
/// </summary>
/// <param name="name">The name of the corresponding <see cref="TagNodeCompound"/>.</param>
/// <param name="options">One or more option flags modifying the processing of this node.</param>
public SchemaNodeCompound (string name, SchemaOptions options)
: base(name, options)
{
_subnodes = new List<SchemaNode>();
}
/// <summary>
/// Constructs a new <see cref="SchemaNodeCompound"/> representing a <see cref="TagNodeCompound"/> named <paramref name="name"/> matching the given schema.
/// </summary>
/// <param name="name">The name of the corresponding <see cref="TagNodeCompound"/>.</param>
/// <param name="subschema">A <see cref="SchemaNodeCompound"/> representing a schema to verify against the corresponding <see cref="TagNodeCompound"/>.</param>
public SchemaNodeCompound (string name, SchemaNode subschema)
: base(name)
{
_subnodes = new List<SchemaNode>();
SchemaNodeCompound schema = subschema as SchemaNodeCompound;
if (schema == null) {
return;
}
foreach (SchemaNode node in schema._subnodes) {
_subnodes.Add(node);
}
}
/// <summary>
/// Constructs a new <see cref="SchemaNodeCompound"/> with additional options.
/// </summary>
/// <param name="name">The name of the corresponding <see cref="TagNodeCompound"/>.</param>
/// <param name="subschema">A <see cref="SchemaNodeCompound"/> representing a schema to verify against the corresponding <see cref="TagNodeCompound"/>.</param>
/// <param name="options">One or more option flags modifying the processing of this node.</param>
public SchemaNodeCompound (string name, SchemaNode subschema, SchemaOptions options)
: base(name, options)
{
_subnodes = new List<SchemaNode>();
SchemaNodeCompound schema = subschema as SchemaNodeCompound;
if (schema == null) {
return;
}
foreach (SchemaNode node in schema._subnodes) {
_subnodes.Add(node);
}
}
/// <summary>
/// Copies all the elements of this <see cref="SchemaNodeCompound"/> into <paramref name="tree"/>.
/// </summary>
/// <param name="tree">The destination <see cref="SchemaNodeCompound"/> to copy <see cref="SchemaNode"/> elements into.</param>
/// <returns>A reference to <paramref name="tree"/>.</returns>
public SchemaNodeCompound MergeInto (SchemaNodeCompound tree)
{
foreach (SchemaNode node in _subnodes) {
SchemaNode f = tree._subnodes.Find(n => n.Name == node.Name);
if (f != null) {
continue;
}
tree.Add(node);
}
return tree;
}
/// <summary>
/// Constructs a default <see cref="TagNodeCompound"/> satisfying the constraints of this node.
/// </summary>
/// <returns>A <see cref="TagNodeCompound"/> with a sensible default value. A default child <see cref="TagNode"/> is created for every <see cref="SchemaNode"/> contained in this <see cref="SchemaNodeCompound"/>.</returns>
public override TagNode BuildDefaultTree ()
{
TagNodeCompound list = new TagNodeCompound();
foreach (SchemaNode node in _subnodes) {
list[node.Name] = node.BuildDefaultTree();
}
return list;
}
}
}