public void Interesection()
        {
            var mo = new InversionListCodePointSet('m', 'o');
            var ao = new InversionListCodePointSet('a', 'o');
            var mx = new InversionListCodePointSet('m', 'z');

            Assert.AreEqual(mo, ao.Intersect(mx));
        }
        public void Identities()
        {
            var a = new InversionListCodePointSet('a');
            var b = new InversionListCodePointSet('b');
            var x = new InversionListCodePointSet('x');

            Assert.AreEqual(a.Union(b).Complement(), a.Complement().Intersect(b.Complement()), "!(a|b) == !a & !b");
            Assert.AreEqual(a.Union(x).Complement(), a.Complement().Intersect(x.Complement()), "!(a|x) == !a & !x");
        }
        public void Union()
        {
            var eg   = new InversionListCodePointSet('e', 'g');
            var xz   = new InversionListCodePointSet('x', 'z');
            var fhxz = new InversionListCodePointSet('f', 'h').Union(xz);
            var ehxz = new InversionListCodePointSet('e', 'h').Union(xz);

            Assert.AreEqual(ehxz, eg.Union(fhxz));
        }
示例#4
0
        public IEnumerable <Input> GetClasses(InversionListCodePointSet codePoints)
        {
            var result = new List <Input>();

            for (var i = 0; i < classes.Count; i++)
            {
                if (!classes[i].Intersect(codePoints).IsEmpty())                // TODO an overlaps method would optimize this
                {
                    result.Add(new Input(i));
                }
            }

            return(result);
        }
示例#5
0
        /**
         * The effect of this method is to ensure that all characters in the
         * set are not in the same equivalece class with any characters not
         * in the set.
         */
        public void MakeClasses(InversionListCodePointSet set)
        {
            var oldCount = Count;

            for (var i = 0; i < oldCount; i++)
            {
                if (classes[i].Equals(set))
                {
                    return;                     // A class for exactly this set already exists
                }
                var intersection           = classes[i].Intersect(set);
                var intersectionComplement = intersection.Complement();                 // used for difference later

                if (intersection.IsEmpty())
                {
                    continue;
                }

                if (intersection.Equals(classes[i]))                // i.e. classes[i] is subset of set
                {
                    set = set.Intersect(intersectionComplement);    // set -= intersection
                    continue;
                }

                if (intersection.Equals(set))                                  // i.e. set is subset of classes[i]
                {
                    classes[i] = classes[i].Intersect(intersectionComplement); // classes[i] -= intersection
                    classes.Add(intersection);
                    return;
                }

                set        = set.Intersect(intersectionComplement);          // set -= intersection
                classes[i] = classes[i].Intersect(intersectionComplement);   // classes[i] -= intersection
                classes.Add(intersection);
            }
        }
示例#6
0
 public CharClassSpec(InversionListCodePointSet codePoints)
 {
     CodePoints = codePoints;
 }