1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
package Torello.Java.Additional;

import Torello.Java.StrPrint;
import Torello.Java.StringParse;
import Torello.Java.LFEC;

import Torello.Java.Additional.Ret2;

import Torello.Java.ReadOnly.ReadOnlyList;

import static Torello.Java.C.BRED;
import static Torello.Java.C.RESET;

class CPToString
{
    @SuppressWarnings("rawtypes")
    private static Ret2 dataFileR2 = LFEC.readObjectFromFile_JAR
        (ConstantPool.class, "data-files/data4.r2dat", true, Ret2.class);

    // Private-Static Constants Lookup-Table **HELPER** for Method "toString"
    private static final ReadOnlyList<String> tagNamesToString1 = dataFileR2.GET(1);

    // **ANOTHER** Private-Static Constants Lookup-Table **HELPER** for Method "toString"
    private static final ReadOnlyList<String> tagNamesToString2 = dataFileR2.GET(2);

    static { dataFileR2 = null; }

    static String str(
            final ReadOnlyList<Byte>                    tags,
            final ReadOnlyList<Object>                  values,
            final ReadOnlyList<ReadOnlyList<Integer>>   indicesGroupBy
        )
    {
        final StringBuilder sb      = new StringBuilder();
        final int           SIZE    = tags.size();
        final int           SPACING = 25;

        for (int i = 1; i < SIZE; i++)
        {
            final Byte      tag     = tags.get(i);
            final Object    value   = values.get(i);

            if (tag == null)
            {
                sb.append(
                    "                       " +
                    BRED +
                    "  Previous tag occupies TWO PLACES, so " +
                    "Tag #" + i + " doesn't exist.\n" +
                    RESET
                );

                continue;
            }

            sb.append(
                '#' + StringParse.zeroPad(i) + ": " +
                CPToString.tagNamesToString1.get(tag)
            );

            if (value instanceof Ret2)
            {
                @SuppressWarnings("unchecked")
                Ret2<Number, Number> r2 = (Ret2<Number, Number>) value;
                sb.append(r2.a + ", " + r2.b);
            }

            else if (value instanceof String)
                sb.append('\"' + value.toString() + '\"');
            else
                sb.append(value.toString());

            sb.append("\n");
        }

        final String part1Str = StrPrint.wrapToIndentationPlus(sb.toString(), 90, 100, SPACING);

        sb.setLength(0);

        // Add indicesGroupBy content
        sb.append("\nIndices Group By (Tag-Kinds):\n");

        for (byte tagKind=0; tagKind < indicesGroupBy.size(); tagKind++)
        {
            final ReadOnlyList<Integer> indices = indicesGroupBy.get(tagKind);

            sb.append(CPToString.tagNamesToString2.get(tagKind));

            if (indices == null)        sb.append("null (Unused Tag)\n");
            else if (indices.isEmpty()) sb.append("[Empty]\n");
            else                        sb.append(indices.toString() + "\n");
        }

        final String part2Str = StrPrint.wrapToIndentation(sb.toString(), 90, 100);

        return part1Str + part2Str;
    }
}