001package com.nativelibs4java.velocity;
002
003import java.nio.*;
004import java.util.ArrayList;
005import java.util.Collections;
006import java.util.List;
007
008/**
009 *
010 * @author Olivier
011 */
012public abstract class Primitive {
013
014    private final Class<?> type, wrapper, bufferType;
015    private final String size;
016    private final String name, capName, wrapperName, bufferName;
017    //private final String v1, v2, v3;
018
019    public String getCapName() {
020        return capName;
021    }
022
023    public Class<?> getBufferType() {
024        return bufferType;
025    }
026
027    public boolean isSignedIntegral() {
028        return type == int.class
029                || type == short.class
030                || type == long.class
031                || type == byte.class;
032    }
033
034    public String getName() {
035        return name;
036    }
037
038    public String getTypeRef() {
039        return getWrapperName();
040    }
041
042    public String getRawTypeRef() {
043        return getTypeRef();
044    }
045    /*
046     public String getV1() {
047     return       v1;
048     }
049
050     public String getV2() {
051     return       v2;
052     }
053
054     public String getV3() {
055     return       v3;
056     }
057     */
058
059    public String getSize() {
060        return size;
061    }
062
063    public Class<?> getType() {
064        return type;
065    }
066
067    public Class<?> getWrapper() {
068        return wrapper;
069    }
070
071    public String getWrapperName() {
072        return wrapperName;
073    }
074
075    public String getBufferName() {
076        return bufferName;
077    }
078
079    public String value(String intValue) {
080        return intValue;
081    }
082
083    public String rawValue(String intValue) {
084        return value(intValue);
085    }
086
087    public Primitive(String integralClassName) {
088        this.type = null;
089        wrapper = null;
090        bufferType = null;
091        size = integralClassName + ".SIZE";
092        //v1 = "new " + integralClassName + "(1)";
093        //v2 = "new " + integralClassName + "(2)";
094        //v3 = "new " + integralClassName + "(3)";
095
096        name = integralClassName;
097        capName = integralClassName;
098        wrapperName = integralClassName;
099        bufferName = null;
100    }
101
102    public Primitive(Class<?> type) {
103        this.type = type;
104        if (type == Integer.TYPE) {
105            wrapper = Integer.class;
106            bufferType = IntBuffer.class;
107            size = "4";
108            //v1 = "1";
109            //v2 = "2";
110            //v3 = "3";
111        } else if (type == Long.TYPE) {
112            wrapper = Long.class;
113            bufferType = LongBuffer.class;
114            size = "8";
115            //v1 = "1L";
116            //v2 = "2L";
117            //v3 = "3L";
118        } else if (type == Short.TYPE) {
119            wrapper = Short.class;
120            bufferType = ShortBuffer.class;
121            size = "2";
122            //v1 = "(short)1";
123            //v2 = "(short)2";
124            //v3 = "(short)3";
125        } else if (type == Byte.TYPE) {
126            wrapper = Byte.class;
127            bufferType = ByteBuffer.class;
128            size = "1";
129            //v1 = "(byte)1";
130            //v2 = "(byte)2";
131            //v3 = "(byte)3";
132        } else if (type == Character.TYPE) {
133            wrapper = Character.class;
134            bufferType = CharBuffer.class;
135            size = "2";
136            //v1 = "'a'";
137            //v2 = "'b'";
138            //v3 = "'c'";
139        } else if (type == Float.TYPE) {
140            wrapper = Float.class;
141            bufferType = FloatBuffer.class;
142            size = "4";
143            //v1 = "1f";
144            //v2 = "2f";
145            //v3 = "3f";
146        } else if (type == Double.TYPE) {
147            wrapper = Double.class;
148            bufferType = DoubleBuffer.class;
149            size = "8";
150            //v1 = "1.0";
151            //v2 = "2.0";
152            //v3 = "3.0";
153        } else if (type == Boolean.TYPE) {
154            wrapper = Boolean.class;
155            bufferType = ByteBuffer.class;
156            size = "1";
157            //v1 = "true";
158            //v2 = "false";
159            //v3 = "true";
160        } else {
161            throw new IllegalArgumentException();
162        }
163
164        name = type.getName();
165        capName = Character.toUpperCase(name.charAt(0)) + name.substring(1);
166        wrapperName = wrapper.getSimpleName();
167        bufferName = bufferType.getSimpleName();
168    }
169    static List<Primitive> bridJPrimitives;
170
171    public static synchronized List<Primitive> getBridJPrimitives() {
172        if (bridJPrimitives == null) {
173            bridJPrimitives = new ArrayList<Primitive>();
174            bridJPrimitives.addAll(getPrimitives());
175            bridJPrimitives.add(new Primitive("CLong") {
176                public String value(String intValue) {
177                    return "new CLong(" + intValue + ")";
178                }
179
180                public String rawValue(String intValue) {
181                    return "(long)" + intValue;
182                }
183            });
184            bridJPrimitives.add(new Primitive("SizeT") {
185                public String value(String intValue) {
186                    return "new SizeT(" + intValue + ")";
187                }
188
189                public String rawValue(String intValue) {
190                    return "(long)" + intValue;
191                }
192            });
193            bridJPrimitives.add(new Primitive("Pointer") {
194                public String value(String intValue) {
195                    return "(Pointer)Pointer.pointerToAddress(" + intValue + ")";
196                }
197
198                public String getTypeRef() {
199                    return "Pointer<?>";
200                }
201
202                public String getRawTypeRef() {
203                    return "Pointer";
204                }
205            });
206            bridJPrimitives = Collections.unmodifiableList(bridJPrimitives);
207        }
208        return bridJPrimitives;
209    }
210    static List<Primitive> primitives;
211
212    public static synchronized List<Primitive> getPrimitives() {
213        if (primitives == null) {
214            primitives = new ArrayList<Primitive>();
215            primitives.addAll(getPrimitivesNoBool());
216            primitives.add(new Primitive(Boolean.TYPE) {
217                public String value(String intValue) {
218                    return "(((" + intValue + ") % 2) == 1)";
219                }
220            });
221            primitives = Collections.unmodifiableList(primitives);
222        }
223        return primitives;
224    }
225    static List<Primitive> primitivesNoBool;
226
227    public static synchronized List<Primitive> getPrimitivesNoBool() {
228        if (primitivesNoBool == null) {
229            primitivesNoBool = new ArrayList<Primitive>();
230            primitivesNoBool.add(new Primitive(Integer.TYPE) {
231                public String value(String intValue) {
232                    return intValue;
233                }
234            });
235            primitivesNoBool.add(new Primitive(Long.TYPE) {
236                public String value(String intValue) {
237                    return "(long)" + intValue;
238                }
239            });
240            primitivesNoBool.add(new Primitive(Short.TYPE) {
241                public String value(String intValue) {
242                    return "(short)" + intValue;
243                }
244            });
245            primitivesNoBool.add(new Primitive(Byte.TYPE) {
246                public String value(String intValue) {
247                    return "(byte)" + intValue;
248                }
249            });
250            primitivesNoBool.add(new Primitive(Character.TYPE) {
251                public String value(String intValue) {
252                    return "(char)" + intValue;
253                }
254            });
255            primitivesNoBool.add(new Primitive(Float.TYPE) {
256                public String value(String intValue) {
257                    return "(float)" + intValue;
258                }
259            });
260            primitivesNoBool.add(new Primitive(Double.TYPE) {
261                public String value(String intValue) {
262                    return "(double)" + intValue;
263                }
264            });
265            primitivesNoBool = Collections.unmodifiableList(primitivesNoBool);
266        }
267        return primitivesNoBool;
268    }
269}