예제 #1
0
        /// <summary>
        /// For all letters in the bdd add their lower and upper case equivalents.
        /// This operation depends on culture for i, I, '\u0130', and '\u0131';
        /// culture="" means InvariantCulture while culture=null means to use the current culture.
        /// </summary>
        public BDD Apply(BDD bdd, string?culture = null)
        {
            // First get the culture specific relation
            IgnoreCaseRelation relation = GetIgnoreCaseRelation(culture);

            if (_solver.And(relation.InstanceDomain, bdd).IsEmpty)
            {
                // No elements need to be added
                return(bdd);
            }

            // Compute the set of all characters that are equivalent to some element in bdd.
            // restr is the relation restricted to the relevant characters in bdd.
            // This conjunction works because bdd is unspecified for bits > 15.
            BDD restr = _solver.And(bdd, relation.Instance);

            // ShiftRight essentially produces the LHS of the relation (char X char) that restr represents.
            BDD ignorecase = _solver.ShiftRight(restr, 16);

            // The final set is the union of all the characters.
            return(_solver.Or(ignorecase, bdd));
        }
예제 #2
0
        private static void WriteIgnoreCaseBDD(StreamWriter sw)
        {
            sw.WriteLine("        /// <summary>Serialized BDD for mapping characters to their case-ignoring equivalence classes in the default (en-US) culture.</summary>");

            var solver = new CharSetSolver();
            Dictionary <char, BDD> ignoreCase = ComputeIgnoreCaseDictionary(solver, new CultureInfo(DefaultCultureName));
            BDD ignorecase = solver.False;

            foreach (KeyValuePair <char, BDD> kv in ignoreCase)
            {
                BDD a = solver.CreateCharSetFromRange(kv.Key, kv.Key);
                BDD b = kv.Value;
                ignorecase = solver.Or(ignorecase, solver.And(solver.ShiftLeft(a, 16), b));
            }

            sw.Write("        public static readonly long[] IgnoreCaseEnUsSerializedBDD = ");
            GeneratorHelper.WriteInt64ArrayInitSyntax(sw, ignorecase.Serialize());
            sw.WriteLine(";");
        }
        private static void WriteIgnoreCaseBDD(StreamWriter sw)
        {
            sw.WriteLine("        /// <summary>Serialized BDD for mapping characters to their case-ignoring equivalence classes in the default (en-US) culture.</summary>");

            var solver = new CharSetSolver();
            List <EquivalenceClass> ignoreCaseEquivalenceClasses = ComputeIgnoreCaseEquivalenceClasses(solver, new CultureInfo(DefaultCultureName));
            BDD ignorecase = solver.False;

            foreach (EquivalenceClass ec in ignoreCaseEquivalenceClasses)
            {
                // Create the Cartesian product of ec._set with itself
                BDD crossproduct = solver.And(solver.ShiftLeft(ec._set, 16), ec._set);
                // Add the product into the overall lookup table
                ignorecase = solver.Or(ignorecase, crossproduct);
            }

            sw.Write("        public static readonly byte[] IgnoreCaseEnUsSerializedBDD = ");
            GeneratorHelper.WriteByteArrayInitSyntax(sw, ignorecase.SerializeToBytes());
            sw.WriteLine(";");
        }