예제 #1
0
        /*
         * Protected Methods
         */

        protected void changeIndexWindow(Dependency d)
        {
            try
            {
                if (d.IsFormula())
                {
                    IEnumerator e = ((Formula)d).GetDependencies();
                    while (e.MoveNext())
                    {
                        changeIndexWindow((Dependency)e.Current);
                    }
                }
                else if (d is StateDependency)
                {
                    StateDependency sd = (StateDependency)d;

                    changeIndexWindow(sd.StateWindow);

                    if (sd is StateValueDependency && ((StateValueDependency)sd).IsReference)
                    {
                        changeIndexWindow(((StateValueDependency)sd).ReferenceWindow);
                    }
                }
            }
            catch (NullReferenceException e)
            {
                throw new PUC.Parsers.SpecParseException(d.LineNumber, "A dependency within an apply-over block does not refer to a variable within the referenced list group.", e);
            }
        }
예제 #2
0
        protected ArrayList mergeTwoVectors(ArrayList array1, ArrayList array2)
        {
            ArrayList result = new ArrayList();

            result.AddRange(array1);

            IEnumerator e = array2.GetEnumerator();

            while (e.MoveNext())
            {
                bool            cont = false;
                StateDependency d1   = (StateDependency)e.Current;

                for (int i = 0; i < result.Count; i++)
                {
                    StateDependency d2 = (StateDependency)result[i];

                    StateDependency dm = d1.Merge(d2);
                    if (dm != null)
                    {
                        if (dm is WholeSetDependency)
                        {
                            result.Clear();
                            result.Add(dm);
                            return(result);
                        }

                        result[i] = dm;
                        cont      = true;
                        break;
                    }
                }

                if (cont)
                {
                    continue;
                }

                result.Add(d1);
            }

            return(result);
        }
예제 #3
0
        protected StateDependency mergeVector(ArrayList array)
        {
            IEnumerator     e = array.GetEnumerator();
            StateDependency d = null;

            if (e.MoveNext())
            {
                d = (StateDependency)e.Current;
            }

            while (e.MoveNext())
            {
                StateDependency nd = (StateDependency)e.Current;

                d = nd.Merge(d);
            }

            return(d);
        }
예제 #4
0
        protected void resolveHelper(Dependency df,
                                     VariableTable varTable)
        {
            if (df == null)
            {
                return;
            }

            if (df is ApplyOver)
            {
                ((ApplyOver)df).ResolveObject(varTable);
            }

            if (df is Formula)
            {
                IEnumerator e = ((Formula)df).GetDependencies();
                while (e.MoveNext())
                {
                    resolveHelper((Dependency)e.Current, varTable);
                }
            }
            else if (df is StateDependency)
            {
                StateDependency d = (StateDependency)df;

                if (!d.ResolveObject(varTable))
                {
                    throw new PUC.Parsers.SpecParseException(d.LineNumber, "Problem resolving a dependency state name: " + d.StateName);
                }

                _states.Add(d.State);

                if (d.HasValue() && ((StateValueDependency)d).IsReference)
                {
                    _states.Add(((StateValueDependency)d).ReferenceState);
                }
            }

            if (df is ApplyOver)
            {
                ((ApplyOver)df).FixDataWindows();
            }
        }
예제 #5
0
        protected void filterDependencies(ArrayList deps)
        {
            // Step #1: Filter dependencies into groups

            ArrayList greaterThan = new ArrayList();
            ArrayList lessThan    = new ArrayList();
            ArrayList equals      = new ArrayList();

            IEnumerator e = deps.GetEnumerator();

            while (e.MoveNext())
            {
                Dependency d = (Dependency)e.Current;

                if (d is EqualsDependency)
                {
                    equals.Add(d);
                }
                else if (d is LessThanDependency)
                {
                    lessThan.Add(d);
                }
                else if (d is GreaterThanDependency)
                {
                    greaterThan.Add(d);
                }
                else if (d is WholeSetDependency)
                {
                    deps.Clear();
                    deps.Add(d);
                    return;
                }
                else
                {
                    throw new NotSupportedException("unknown dependency");
                }
            }

            deps.Clear();

            // Step #2: Merge greater-than (gt) and less-than (lt) dependencies

            StateDependency gtDep = mergeVector(greaterThan);
            StateDependency ltDep = mergeVector(lessThan);

            // Step #3: Check that filtered gt and lt dependencies don't
            // overlap.  If they do, we're done. (return a new WholeSetDependency)

            if (gtDep != null && ltDep != null)
            {
                Dependency d = gtDep.Merge(ltDep);
                if (d != null)
                {
                    // d must be a WholeSetDependency.  Make it the only
                    // thing in deps, and return.

                    deps.Add(d);
                    return;
                }
            }

            // Step #4: Merge with equals dependencies

            if (gtDep != null)
            {
                deps.Add(gtDep);
            }
            if (ltDep != null)
            {
                deps.Add(ltDep);
            }

            e = equals.GetEnumerator();
            while (e.MoveNext())
            {
                StateDependency d = (StateDependency)e.Current;
                StateDependency m = null;

                for (int i = 0; i < deps.Count; i++)
                {
                    m = d.Merge((StateDependency)deps[i]);

                    if (m != null)
                    {
                        deps[i] = m;
                        break;
                    }
                }

                if (m == null)
                {
                    deps.Add(d);
                }
            }
        }