View Javadoc

1   package com.sharkysoft.printf;
2   
3   import com.sharkysoft.util.UnreachableCodeException;
4   
5   abstract class Formatter
6   {
7   
8     protected Formatter()
9     {
10    }
11  
12    abstract void format(PrintfState ipPs);
13  
14    abstract int argsRequired();
15  
16      abstract Class[] argTypes();
17  
18    private static final String LINE_SEPARATOR;
19    
20    static 
21    {
22      String vsLineSeparator = "\n";
23      try
24      {
25        vsLineSeparator = System.getProperty("line.separator");
26      }
27      catch (SecurityException e)
28      {
29      }
30      LINE_SEPARATOR = vsLineSeparator;
31    }
32    
33    static Formatter create(FormatSpecifier ipPfs)
34    {
35      switch (ipPfs.mcType)
36      {
37      // These cases are presented in order of highest probability, in order to let the switch run as fast as possible.
38      case FormatSpecifier.TYPE_LITERAL :
39        return new Formatter_Literal(ipPfs.msLiteral);
40      case FormatSpecifier.TYPE_SIGNED_DEC :
41        switch (ipPfs.mcInputSize)
42        {
43        case FormatSpecifier.INPUT_SIZE_NORMAL :
44          return new Formatter_d(ipPfs);
45        case FormatSpecifier.INPUT_SIZE_LONG :
46          return new Formatter_d_l(ipPfs);
47        case FormatSpecifier.INPUT_SIZE_SHORT :
48          return new Formatter_d_h(ipPfs);
49        case FormatSpecifier.INPUT_SIZE_BYTE :
50          return new Formatter_d_by(ipPfs);
51        case FormatSpecifier.INPUT_SIZE_BIG :
52          return new Formatter_d_Bi(ipPfs);
53        }
54        break;
55      case FormatSpecifier.TYPE_STRING :
56        return new Formatter_s(ipPfs);
57      case FormatSpecifier.TYPE_UNSIGNED_DEC :
58        switch (ipPfs.mcInputSize)
59        {
60        case FormatSpecifier.INPUT_SIZE_NORMAL :
61          return new Formatter_u(ipPfs);
62        case FormatSpecifier.INPUT_SIZE_LONG :
63          return new Formatter_u_l(ipPfs);
64        case FormatSpecifier.INPUT_SIZE_SHORT :
65          return new Formatter_u_h(ipPfs);
66        case FormatSpecifier.INPUT_SIZE_BYTE :
67          return new Formatter_u_By(ipPfs);
68        case FormatSpecifier.INPUT_SIZE_BIG :
69          return new Formatter_u_Bi(ipPfs);
70        }
71        break;
72      case FormatSpecifier.TYPE_HEX_LOWER :
73      case FormatSpecifier.TYPE_HEX_UPPER :
74        switch (ipPfs.mcInputSize)
75        {
76        case FormatSpecifier.INPUT_SIZE_NORMAL :
77          return new Formatter_x(ipPfs);
78        case FormatSpecifier.INPUT_SIZE_LONG :
79          return new Formatter_x_l(ipPfs);
80        case FormatSpecifier.INPUT_SIZE_SHORT :
81          return new Formatter_x_h(ipPfs);
82        case FormatSpecifier.INPUT_SIZE_BYTE :
83          return new Formatter_x_By(ipPfs);
84        case FormatSpecifier.INPUT_SIZE_BIG :
85          return new Formatter_x_Bi(ipPfs);
86        }
87        break;
88      case FormatSpecifier.TYPE_INTEGER_UPPER :
89      case FormatSpecifier.TYPE_INTEGER_LOWER :
90        switch (ipPfs.mcInputSize)
91        {
92        case FormatSpecifier.INPUT_SIZE_NORMAL :
93          return new Formatter_z(ipPfs);
94        case FormatSpecifier.INPUT_SIZE_LONG :
95          return new Formatter_z_l(ipPfs);
96        case FormatSpecifier.INPUT_SIZE_SHORT :
97          return new Formatter_z_h(ipPfs);
98        case FormatSpecifier.INPUT_SIZE_BYTE :
99          return new Formatter_z_by(ipPfs);
100       case FormatSpecifier.INPUT_SIZE_BIG :
101         return new Formatter_z_Bi(ipPfs);
102       }
103       break;
104     case FormatSpecifier.TYPE_OCT :
105       switch (ipPfs.mcInputSize)
106       {
107       case FormatSpecifier.INPUT_SIZE_NORMAL :
108         return new Formatter_o(ipPfs);
109       case FormatSpecifier.INPUT_SIZE_LONG :
110         return new Formatter_o_l(ipPfs);
111       case FormatSpecifier.INPUT_SIZE_SHORT :
112         return new Formatter_o_h(ipPfs);
113       case FormatSpecifier.INPUT_SIZE_BYTE :
114         return new Formatter_o_by(ipPfs);
115       case FormatSpecifier.INPUT_SIZE_BIG :
116         return new Formatter_o_Bi(ipPfs);
117       }
118       break;
119     case FormatSpecifier.TYPE_CHAR :
120       return new Formatter_c(ipPfs);
121     case FormatSpecifier.TYPE_FLOAT :
122       switch (ipPfs.mcInputSize)
123       {
124       case FormatSpecifier.INPUT_SIZE_NORMAL :
125         return new Formatter_f(ipPfs);
126       case FormatSpecifier.INPUT_SIZE_LONG :
127         return new Formatter_f_l(ipPfs);
128       case FormatSpecifier.INPUT_SIZE_BIG :
129         return new Formatter_f_Bi(ipPfs);
130       }
131       break;
132     case FormatSpecifier.TYPE_FLOAT_E_LOWER :
133     case FormatSpecifier.TYPE_FLOAT_E_UPPER :
134       switch (ipPfs.mcInputSize)
135       {
136       case FormatSpecifier.INPUT_SIZE_NORMAL :
137         return new Formatter_e(ipPfs);
138       case FormatSpecifier.INPUT_SIZE_LONG :
139         return new Formatter_e_l(ipPfs);
140       case FormatSpecifier.INPUT_SIZE_BIG :
141         return new Formatter_e_Bi(ipPfs);
142       }
143       break;
144     case FormatSpecifier.TYPE_FLOAT_G_LOWER :
145     case FormatSpecifier.TYPE_FLOAT_G_UPPER :
146       switch (ipPfs.mcInputSize)
147       {
148       case FormatSpecifier.INPUT_SIZE_NORMAL :
149         return new Formatter_g(ipPfs);
150       case FormatSpecifier.INPUT_SIZE_LONG :
151         return new Formatter_g_l(ipPfs);
152       case FormatSpecifier.INPUT_SIZE_BIG :
153         return new Formatter_g_Bi(ipPfs);
154       }
155       break;
156     case FormatSpecifier.TYPE_POINTER :
157       return new Formatter_p(ipPfs);
158     case FormatSpecifier.TYPE_CHARCOUNT :
159       return new Formatter_n(ipPfs);
160     case FormatSpecifier.TYPE_PERCENT :
161       return new Formatter_Literal("%");
162     case FormatSpecifier.TYPE_ENDL :
163       return new Formatter_Literal(LINE_SEPARATOR);
164     }
165     throw new UnreachableCodeException();
166   }
167 }
168