/// <summary> /// Adds this tracker to the list of active containers. /// </summary> /// <param name="root">The root of the list.</param> internal void StartTracking(ref ContainerTracking <T> root) { // Add the node to the root if (root != null) { root._previous = this; } _next = root; root = this; }
/// <summary> /// Checks that this tracker is present in the list starting with root. It's a linear walk through the list, so should be used /// mostly for debugging /// </summary> private bool IsInList(ContainerTracking <T> root) { ContainerTracking <T> node = root; while (node != null) { if (node == this) { return(true); } node = node._next; } return(false); }
/// <summary> /// Removes this tracker from the list of active containers. /// </summary> /// <param name="root">The root of the list.</param> internal void StopTracking(ref ContainerTracking <T> root) { // Unhook the node from the list if (_previous != null) { _previous._next = _next; } if (_next != null) { _next._previous = _previous; } // Update the root reference if (root == this) { root = _next; } // Clear the node's references _previous = null; _next = null; }
/// <summary> /// Instantiates a new instance of this class. /// </summary> public DataGridCell() { _tracker = new ContainerTracking <DataGridCell>(this); }
/// <summary> /// Instantiates a new instance of this class. /// </summary> public DataGridRow() { _tracker = new ContainerTracking <DataGridRow>(this); }
internal void Debug_AssertNotInList(ContainerTracking <T> root) { #if DEBUG Debug.Assert(!IsInList(root), "This container shouldn't be in our tracking list"); #endif }
internal void Debug_AssertIsInList(ContainerTracking <T> root) { #if DEBUG Debug.Assert(IsInList(root), "This container should be in the tracking list."); #endif }