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