/// <summary> /// Constructor /// </summary> /// <param name="parent"></param> public FilterValuePair(FilterGrammarBase parent = null) : base(FilterGrammar.Value) { FilterGrammarBase.SetParent(this, parent); this.propertyValues = new List<string>(); }
/// <summary> /// Helper function. 1) Controls what can access setting the parent. 2) avoids null checks everywhere /// </summary> /// <param name="node"></param> /// <param name="parent"></param> protected static void SetParent(FilterGrammarBase node, FilterGrammarBase parent) { if (node == null) return; // nothing to do if the parent is already the parent if (Object.ReferenceEquals(node.Parent, parent)) return; // make sure the parent node isn't already in the tree if (FilterGrammarBase.IsAncestor(node, parent)) throw new RecursiveTree("Can not attache parent node, infinite loop detected"); if (FilterGrammarBase.IsAncestor(parent, node)) throw new RecursiveTree("Can not attache parent node, infinite loop detected"); node.Parent = parent; }
/// <summary> /// Constructor /// </summary> /// <param name="parent"></param> public FilterNode(FilterGrammarBase parent = null) : base(FilterGrammar.TreeBranch) { FilterGrammarBase.SetParent(this, parent); SetChild(null); }
/// <summary> /// Need a way to check for infinite loops. /// </summary> /// <param name="node">Base node</param> /// <param name="ancestorCheck">Node to search for in relation to the base node</param> protected static bool IsAncestor(FilterGrammarBase node, FilterGrammarBase ancestorCheck) { if (node == null || ancestorCheck == null) return false; FilterGrammarBase p = node.Parent as FilterGrammarBase; while (p != null) { if (Object.ReferenceEquals(p, ancestorCheck)) return true; p = p.Parent; } return false; }