public void TestComplementarySetUnionWith()
        {
            var cset = new ComplementarySet<string>(new string[] { Value0, Value1 });

            Assert.False(cset.Contains(Value0), "set doesn't contain Value0");
            Assert.False(cset.Contains(Value1), "set doesn't contain Value1");

            var set = new HashSet<string>(new string[] { Value1, Value2 });

            cset.UnionWith(set);

            Assert.False(cset.Contains(Value0), "union still doesn't contain Value0");
            Assert.True(cset.Contains(Value1), "union contains Value1");
            Assert.True(cset.Contains(Value2), "union contains Value2");
        }
Exemple #2
0
        internal override ISet<char?> ComputeFirst(ISet<Parser> seen)
        {
            if (seen.Contains(this))
            {
                return null;
            }
            else
            {
                var newSeen = new HashSet<Parser>(seen);
                newSeen.Add(this);
                var setLeft = Left.ComputeFirst(newSeen);

                if (setLeft != null)
                {
                    if (setLeft.Count == 0 || setLeft.Contains(null))
                    {
                        var setRight = Right.ComputeFirst(newSeen);
                        if (setRight != null)
                        {
                            if (setLeft.IsComplement())
                            {
                                var newSet = new ComplementarySet<char?>(setLeft as ComplementarySet<char?>);
                                newSet.Remove(null);
                                newSet.UnionWith(setRight);
                                return newSet;
                            }
                            else
                            {
                                var newSetLeft = new HashSet<char?>(setLeft);
                                newSetLeft.Remove(null);
                                var newSetRight = new HashSet<char?>(setRight);
                                newSetRight.UnionWith(newSetLeft);
                                return newSetRight;
                            }
                        }
                    }
                }

                return setLeft;
            }
        }