Beispiel #1
0
    // 特定の範囲に対するカテゴリの分類コードを出力します。
    public static void SwitchCase(char start, char end)
    {
        System.IO.TextWriter stdout = System.Console.Out;

        stdout.WriteLine("Range {0} - {1}", (int)start, (int)end);

        // 方法一: 連続する部分を不等号で判定
        MapCategories dic10   = SwitchCase_hojo(start, (char)(end - 1), 1, 0);
        int           weight1 = dic10.EvalWeight;

        // 方法二: 大文字小文字など交互になっている部分に対応
        MapCategories dic20   = SwitchCase_hojo(start, (char)(end - 1), 2, 0);
        MapCategories dic21   = SwitchCase_hojo(start, (char)(end - 1), 2, 1);
        int           weight2 = dic20.EvalWeight + dic21.EvalWeight + 1;

        if (20 < weight1 && 20 < weight2)
        {
            // 方法零: テーブル
        }
        else if (weight1 <= weight2)
        {
            stdout.WriteLine("EvalWeight: {0}", weight1);
            stdout.WriteLine(dic10.ToString());
        }
        else
        {
            stdout.WriteLine("EvalWeight: {0}", weight2);
            stdout.WriteLine("** mod. == 0 **");
            stdout.WriteLine(dic20.ToString());
            stdout.WriteLine("** mod. == 1 **");
            stdout.WriteLine(dic21.ToString());
        }
    }
Beispiel #2
0
    private static MapCategories SwitchCase_hojo(char start, char end_inclusive, int mod, int modval)
    {
        MapCategories dic = new MapCategories();

        foreach (string[] dat in enum_chars(delegate(string[] d){
            char c = d[0][0];
            return(start <= c && c <= end_inclusive && (int)c % mod == modval);
        }))
        {
            if (!dic.ContainsKey(dat[2]))
            {
                dic[dat[2]] = new WriteIntRange(mod);
            }
            dic[dat[2]].Register(dat[0][0]);
        }

        return(dic);
    }
Beispiel #3
0
    public static void SelectMethod(System.IO.TextWriter w, char start, char end_inclusive)
    {
        w.WriteLine("==== Charcode-Range {0:X4} - {1:X4} ====", (int)start, (int)end_inclusive);

        // 方法一: 連続する部分を不等号で判定
        MapCategories dic10   = SwitchCase_hojo(start, end_inclusive, 1, 0);
        int           weight1 = dic10.EvalWeight;

        // 方法二: 大文字小文字など交互になっている部分に対応
        MapCategories dic20   = SwitchCase_hojo(start, end_inclusive, 2, 0);
        MapCategories dic21   = SwitchCase_hojo(start, end_inclusive, 2, 1);
        int           weight2 = dic20.EvalWeight + dic21.EvalWeight + 1;

        // 出力
        if (20 < weight1 && 20 < weight2)
        {
            // 方法零: テーブル
            const string SEP  = ",";
            const string ENDL = ",\r\n";

            int i = start;
            foreach (string[] dat in enum_chars(delegate(string[] d) {
                char c = d[0][0];
                return(start <= c && c <= end_inclusive);
            }))
            {
                int c = dat[0][0];

                // 空白のコード (割り当てられていない文字)
                while (i < c)
                {
                    w.Write("Cn");
                    w.Write(++i % 16 == 0?ENDL:SEP);
                }

                // 文字
                w.Write(dat[2]);
                w.Write(++i % 16 == 0?ENDL:SEP);
            }

            // 空白のコード (割り当てられていない文字)
            while (i < end_inclusive + 1)
            {
                w.Write("Cn");
                w.Write(++i % 16 == 0?ENDL:SEP);
            }
            if (i % 16 != 0)
            {
                w.Write(ENDL);
            }
        }
        else if (weight1 <= weight2)
        {
            // 方法一:
            w.WriteLine(dic10.ToString('#'));
        }
        else
        {
            // 方法二:
            w.WriteLine(":: if(c%2==0) ::");
            w.WriteLine(dic20.ToString('#'));
            w.WriteLine(":: if(c%2==1) ::");
            w.WriteLine(dic21.ToString('#'));
        }
    }