View Javadoc
1   package org.djutils.primitives;
2   
3   /**
4    * The Primitive class is a utility class to deal with primitives. Besides widening and unwidening this class casts and parses
5    * UTF8 strings into appropriate primitive classes.
6    * <p>
7    * Copyright (c) 2002-2019 Delft University of Technology, Jaffalaan 5, 2628 BX Delft, the Netherlands. All rights reserved. See
8    * for project information <a href="https://djutils.org" target="_blank"> https://djutils.org</a>. The DJUTILS project is
9    * distributed under a three-clause BSD-style license, which can be found at
10   * <a href="https://djutils.org/docs/license.html" target="_blank"> https://djutils.org/docs/license.html</a>.
11   * </p>
12   * @author <a href="https://www.linkedin.com/in/peterhmjacobs">Peter Jacobs </a>
13   */
14  public final class Primitive
15  {
16      /**
17       * constructs a new Primitive.
18       */
19      private Primitive()
20      {
21          super();
22          // unreachable code
23      }
24  
25      /**
26       * casts a set of values to classes.
27       * @param classes Class&lt;?&gt;[]; the classes to cast to
28       * @param values Object[]; the values
29       * @return the newly creates values
30       */
31      public static Object[] cast(final Class<?>[] classes, final Object[] values)
32      {
33          for (int i = 0; i < classes.length; i++)
34          {
35              values[i] = Primitive.cast(classes[i], values[i]);
36          }
37          return values;
38      }
39  
40      /**
41       * casts an object to a instance of clazz.
42       * @param clazz Class&lt;?&gt;; the class to cast to
43       * @param object Object; the object to cast
44       * @return the casted object
45       */
46      public static Object cast(final Class<?> clazz, final Object object)
47      {
48          if (clazz.isInstance(object) || !clazz.isPrimitive() || (clazz.equals(Primitive.getPrimitive(object.getClass()))))
49          {
50              return object;
51          }
52  
53          // Boolean
54          if (clazz.equals(boolean.class))
55          {
56              return Primitive.toBoolean(object);
57          }
58  
59          // Character
60          if (clazz.equals(char.class))
61          {
62              return Primitive.toCharacter(object);
63          }
64  
65          // Byte
66          if (clazz.equals(byte.class))
67          {
68              return Primitive.toByte(object);
69          }
70  
71          // Double
72          if (clazz.equals(double.class))
73          {
74              return Primitive.toDouble(object);
75          }
76  
77          // Float
78          if (clazz.equals(float.class))
79          {
80              return Primitive.toFloat(object);
81          }
82  
83          // Long
84          if (clazz.equals(long.class))
85          {
86              return Primitive.toLong(object);
87          }
88  
89          // Integer
90          if (clazz.equals(int.class))
91          {
92              return Primitive.toInteger(object);
93          }
94  
95          // Short
96          if (clazz.equals(short.class))
97          {
98              return Primitive.toShort(object);
99          }
100         return object;
101     }
102 
103     /**
104      * returns the primitiveClass of the name given as defined by the Java VM class constants. (i.e. both "int" and "I" return
105      * int.class). Both void and "V" return void.class. null is returned whenever an unknown className is given.
106      * @param className String; the className
107      * @return Class the primitiveClass
108      */
109     public static Class<?> forName(final String className)
110     {
111         if (className.equals("int") || className.equals("I"))
112         {
113             return int.class;
114         }
115         if (className.equals("double") || className.equals("D"))
116         {
117             return double.class;
118         }
119         if (className.equals("byte") || className.equals("B"))
120         {
121             return byte.class;
122         }
123         if (className.equals("float") || className.equals("F"))
124         {
125             return float.class;
126         }
127         if (className.equals("long") || className.equals("J"))
128         {
129             return long.class;
130         }
131         if (className.equals("boolean") || className.equals("Z"))
132         {
133             return boolean.class;
134         }
135         if (className.equals("char") || className.equals("C"))
136         {
137             return char.class;
138         }
139         if (className.equals("short") || className.equals("S"))
140         {
141             return short.class;
142         }
143         if (className.equals("void") || className.equals("V"))
144         {
145             return void.class;
146         }
147         return null;
148     }
149 
150     /**
151      * gets the primitive of the given wrapperClass.
152      * @param wrapperClass Class&lt;?&gt;; the wrapper class
153      * @return the primitive Class. null is returned whenever wrapperClass is not a wrapperclass.
154      */
155     public static Class<?> getPrimitive(final Class<?> wrapperClass)
156     {
157         if (wrapperClass.equals(Integer.class))
158         {
159             return int.class;
160         }
161         if (wrapperClass.equals(Double.class))
162         {
163             return double.class;
164         }
165         if (wrapperClass.equals(Byte.class))
166         {
167             return byte.class;
168         }
169         if (wrapperClass.equals(Float.class))
170         {
171             return float.class;
172         }
173         if (wrapperClass.equals(Long.class))
174         {
175             return long.class;
176         }
177         if (wrapperClass.equals(Boolean.class))
178         {
179             return boolean.class;
180         }
181         if (wrapperClass.equals(Character.class))
182         {
183             return char.class;
184         }
185         if (wrapperClass.equals(Short.class))
186         {
187             return short.class;
188         }
189         return null;
190     }
191 
192     /**
193      * gets the wrapper of this primitive class.
194      * @param primitiveClass Class&lt;?&gt;; the primitive class
195      * @return the Class. null is returned whenever wrapperClass is not a wrapperclass.
196      */
197     public static Class<?> getWrapper(final Class<?> primitiveClass)
198     {
199         if (primitiveClass.equals(int.class))
200         {
201             return Integer.class;
202         }
203         if (primitiveClass.equals(double.class))
204         {
205             return Double.class;
206         }
207         if (primitiveClass.equals(byte.class))
208         {
209             return Byte.class;
210         }
211         if (primitiveClass.equals(float.class))
212         {
213             return Float.class;
214         }
215         if (primitiveClass.equals(long.class))
216         {
217             return Long.class;
218         }
219         if (primitiveClass.equals(boolean.class))
220         {
221             return Boolean.class;
222         }
223         if (primitiveClass.equals(char.class))
224         {
225             return Character.class;
226         }
227         if (primitiveClass.equals(short.class))
228         {
229             return Short.class;
230         }
231         throw new IllegalArgumentException(primitiveClass + " != primitive");
232     }
233 
234     /**
235      * casts an object to Boolean.
236      * @param object Object; the object
237      * @return Boolean
238      */
239     public static Boolean toBoolean(final Object object)
240     {
241         if (object instanceof Number)
242         {
243             int value = ((Number) object).intValue();
244             if (value == 1)
245             {
246                 return Boolean.TRUE;
247             }
248             if (value == 0)
249             {
250                 return Boolean.FALSE;
251             }
252             throw new IllegalArgumentException("object.intValue !=0 && !=1");
253         }
254         return (Boolean) object;
255     }
256 
257     /**
258      * casts an object to Byte.
259      * @param object Object; the object
260      * @return Byte
261      */
262     public static Byte toByte(final Object object)
263     {
264         if (object instanceof Number)
265         {
266             return new Byte(((Number) object).byteValue());
267         }
268         return (Byte) object;
269     }
270 
271     /**
272      * casts an object to Character.
273      * @param object Object; the object to parse
274      * @return Integer the result
275      */
276     public static Character toCharacter(final Object object)
277     {
278         if (object instanceof Number)
279         {
280             return new Character((char) ((Number) object).byteValue());
281         }
282         return (Character) object;
283     }
284 
285     /**
286      * casts an object to Double.
287      * @param object Object; the object to parse
288      * @return Integer the result
289      */
290     public static Double toDouble(final Object object)
291     {
292         return new Double(((Number) object).doubleValue());
293     }
294 
295     /**
296      * casts an object to Float.
297      * @param object Object; the object to parse
298      * @return Float the result
299      */
300     public static Float toFloat(final Object object)
301     {
302         return new Float(((Number) object).floatValue());
303     }
304 
305     /**
306      * casts an object to Long.
307      * @param object Object; the object to parse
308      * @return Long the result
309      */
310     public static Long toLong(final Object object)
311     {
312         return new Long(((Number) object).longValue());
313     }
314 
315     /**
316      * casts an object to Short.
317      * @param object Object; the object to parse
318      * @return Long the result
319      */
320     public static Short toShort(final Object object)
321     {
322         return new Short(((Number) object).shortValue());
323     }
324 
325     /**
326      * casts an object to Integer.
327      * @param object Object; the object to parse
328      * @return Integer the result
329      */
330     public static Integer toInteger(final Object object)
331     {
332         if (object instanceof Character)
333         {
334             return new Integer(((Character) object).charValue());
335         }
336         if (object instanceof Boolean)
337         {
338             if (((Boolean) object).booleanValue())
339             {
340                 return new Integer(1);
341             }
342             return new Integer(0);
343         }
344         return new Integer(((Number) object).intValue());
345     }
346 }