Esempio n. 1
0
 /// <summary>
 /// Constructor
 /// </summary>
 /// <param name="parent"></param>
 public FilterValuePair(FilterGrammarBase parent = null)
     : base(FilterGrammar.Value)
 {
     FilterGrammarBase.SetParent(this, parent);
     this.propertyValues = new List<string>();
 }
Esempio n. 2
0
        /// <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;
        }
Esempio n. 3
0
 /// <summary>
 /// Constructor
 /// </summary>
 /// <param name="parent"></param>
 public FilterNode(FilterGrammarBase parent = null)
     : base(FilterGrammar.TreeBranch)
 {
     FilterGrammarBase.SetParent(this, parent);
     SetChild(null);
 }
Esempio n. 4
0
        /// <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;
        }