using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Data.SqlTypes; using System.Diagnostics.CodeAnalysis; using System.Text; namespace StgSharp { public abstract class INode where T : INode { [NotNull] protected ContainerNode _id; internal ContainerNode ID { get { return _id; } } internal ContainerNode Previous { get { return _id._previous; } set { _id._previous = value; } } internal ContainerNode Next { get { return _id._next; } set { _id._next = value; } } public INode() { _id = new ContainerNode(this as T); } internal void SetId(ContainerNode tContainer) { _id = tContainer; } internal void SelfDestrcut() { _id._previous._next = _id._next; _id._next._previous = _id._previous; _id._next = null; _id._previous = null; GC.Collect(); } } public class ContainerNode : INullable where T : INode { internal readonly T _value; [AllowNull] internal ContainerNode _previous; [AllowNull] internal ContainerNode _next; internal ContainerNode() { } public ContainerNode(T t) { _value = t; _previous = new ContainerNode(); _next = new ContainerNode(); } public virtual ContainerNode Previous { get { return _previous; } set { _previous = value; } } public ContainerNode Next { get { return _next; } set { _next = value; } } public T Value { get { return _value; } } public bool IsNull { get; } public void Remove() { _previous.Next = _next; _next.Previous = _previous; _next = default(ContainerNode); _previous = default(ContainerNode); } } }