コード例 #1
0
        public ICleanerNode Sub(ICleanerNode a)
        {
            if (typeof(ComplexCleanerNode) == a.GetType())
            {
                ((ComplexCleanerNode)a).IterateOverComputables((IComputableCleanerNode node, int i) =>
                {
                    Sub(node);
                });

                return(this);
            }
            else if (typeof(CleanerNode) == a.GetType())
            {
                for (int i = 0; i < subNodes.Count; i++)
                {
                    if (!typeof(IComputableCleanerNode).IsAssignableFrom(subNodes[i].GetType()))
                    {
                        continue;
                    }
                    IComputableCleanerNode node = (IComputableCleanerNode)subNodes[i];
                    if (CleanerNode.CanAdd((CleanerNode)node, (CleanerNode)a))
                    {
                        subNodes[i] = (CleanerNode)node - (CleanerNode)a;
                    }
                }
                return(this);
            }
            throw new System.NotImplementedException();
        }
コード例 #2
0
        public static CleanerNode operator ^(CleanerNode a, ComplexCleanerNode b)
        {
            CleanerNode n = new CleanerNode(a.value, a.identifiers);

            for (int i = 0; i < a.identifiers.Length; i++)
            {
                n.identifiers[i] = new Identifier(a.identifiers[i].Base,
                                                  string.Format("{0}*{1}", a.identifiers[i].Power, b.ToString()));
            }
            return(n);
        }
コード例 #3
0
        public ICleanerNode Add(ICleanerNode a)
        {
            if (typeof(ComplexCleanerNode) == a.GetType())
            {
                ComplexCleanerNode ccna = ((ComplexCleanerNode)a);
                for (int j = 0; j < ccna.subNodes.Count; j++)
                {
                    if (!typeof(IComputableCleanerNode).IsAssignableFrom(ccna.subNodes[j].GetType()))
                    {
                        continue;
                    }
                    Add(ccna.subNodes[j]);
                }

                return(this);
            }
            else if (typeof(CleanerNode) == a.GetType())
            {
                bool added = false;

                for (int i = 0; i < subNodes.Count; i++)
                {
                    if (!typeof(IComputableCleanerNode).IsAssignableFrom(subNodes[i].GetType()))
                    {
                        continue;
                    }
                    IComputableCleanerNode node = (IComputableCleanerNode)subNodes[i];
                    if (CleanerNode.CanAdd((CleanerNode)node, (CleanerNode)a))
                    {
                        added       = true;
                        subNodes[i] = (CleanerNode)node + (CleanerNode)a;
                        break;
                    }
                }

                if (!added)
                {
                    subNodes.Add(new CleanerOperatorNode('+'));
                    subNodes.Add(a);
                }

                return(this);
            }
            throw new System.NotImplementedException();
        }
コード例 #4
0
        public bool IsEqual(ICleanerNode n)
        {
            if (n.GetType() != typeof(CleanerNode))
            {
                return(false);
            }

            CleanerNode cnn = (CleanerNode)n;

            if (value != cnn.value || identifiers.Length != cnn.identifiers.Length)
            {
                return(false);
            }

            for (int i = 0; i < identifiers.Length; i++)
            {
                if (!identifiers[i].IsEqual(cnn.identifiers[i]))
                {
                    return(false);
                }
            }

            return(true);
        }
コード例 #5
0
 public static bool CanAdd(CleanerNode a, CleanerNode b)
 {
     return(Identifier.CanAdd(a.identifiers, b.identifiers));
 }