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"); }
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; } }