1e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson/*
2e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * Copyright (c) 2007 Mockito contributors
3e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson * This program is made available under the terms of the MIT License.
4e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson */
5e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonpackage org.mockito.internal.util;
6e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
7e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport java.util.HashMap;
8e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonimport java.util.Map;
9e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
10e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson@SuppressWarnings("unchecked")
11e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinsonpublic class Primitives {
12e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
13e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    private static Map<Class<?>, Class<?>> primitiveTypes = new HashMap<Class<?>, Class<?>>();
14e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    private static Map<Class<?>, Object> primitiveOrWrapperDefaultValues = new HashMap<Class<?>, Object>();
15e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
16e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
17e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    /**
18e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * Returns the primitive type of the given class.
19e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * <p/>
20e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * The passed class can be any class : <code>boolean.class</code>, <code>Integer.class</code>
21e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * in witch case this method will return <code>boolean.class</code>, even <code>SomeObject.class</code>
22e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * in which case <code>null</code> will be returned.
23e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     *
24e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * @param clazz The class from which primitive type has to be retrieved
25e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * @param <T>   The type
26e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * @return The primitive type if relevant, otherwise <code>null</code>
27e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     */
28e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public static <T> Class<T> primitiveTypeOf(Class<T> clazz) {
29e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        if (clazz.isPrimitive()) {
30e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson            return clazz;
31e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        }
32e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        return (Class<T>) primitiveTypes.get(clazz);
33e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
34e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
35e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    /**
36e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * Indicates if the given class is primitive type or a primitive wrapper.
37e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     *
38e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * @param type The type to check
39e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * @return <code>true</code> if primitive or wrapper, <code>false</code> otherwise.
40e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     */
41e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public static boolean isPrimitiveOrWrapper(Class<?> type) {
42e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        return primitiveOrWrapperDefaultValues.containsKey(type);
43e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
44e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
45e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    /**
46e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * Returns the boxed default value for a primitive or a primitive wrapper.
47e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     *
48e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * @param primitiveOrWrapperType The type to lookup the default value
49e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     * @return The boxed default values as defined in Java Language Specification,
50e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     *         <code>null</code> if the type is neither a primitive nor a wrapper
51e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson     */
52e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    public static <T> T defaultValueForPrimitiveOrWrapper(Class<T> primitiveOrWrapperType) {
53e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        return (T) primitiveOrWrapperDefaultValues.get(primitiveOrWrapperType);
54e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
55e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
56e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
57e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    static {
58e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        primitiveTypes.put(Boolean.class, Boolean.TYPE);
59e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        primitiveTypes.put(Character.class, Character.TYPE);
60e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        primitiveTypes.put(Byte.class, Byte.TYPE);
61e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        primitiveTypes.put(Short.class, Short.TYPE);
62e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        primitiveTypes.put(Integer.class, Integer.TYPE);
63e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        primitiveTypes.put(Long.class, Long.TYPE);
64e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        primitiveTypes.put(Float.class, Float.TYPE);
65e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        primitiveTypes.put(Double.class, Double.TYPE);
66e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
67e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
68e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    static {
69e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        primitiveOrWrapperDefaultValues.put(Boolean.class, false);
70e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        primitiveOrWrapperDefaultValues.put(Character.class, '\u0000');
71e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        primitiveOrWrapperDefaultValues.put(Byte.class, (byte) 0);
72e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        primitiveOrWrapperDefaultValues.put(Short.class, (short) 0);
73e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        primitiveOrWrapperDefaultValues.put(Integer.class, 0);
74e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        primitiveOrWrapperDefaultValues.put(Long.class, 0L);
75e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        primitiveOrWrapperDefaultValues.put(Float.class, 0F);
76e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        primitiveOrWrapperDefaultValues.put(Double.class, 0D);
77e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson
78e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        primitiveOrWrapperDefaultValues.put(boolean.class, false);
79e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        primitiveOrWrapperDefaultValues.put(char.class, '\u0000');
80e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        primitiveOrWrapperDefaultValues.put(byte.class, (byte) 0);
81e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        primitiveOrWrapperDefaultValues.put(short.class, (short) 0);
82e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        primitiveOrWrapperDefaultValues.put(int.class, 0);
83e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        primitiveOrWrapperDefaultValues.put(long.class, 0L);
84e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        primitiveOrWrapperDefaultValues.put(float.class, 0F);
85e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson        primitiveOrWrapperDefaultValues.put(double.class, 0D);
86e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson    }
87e0ae5d7e87b1dd6e789803c1b9615a84bd7488b7Ian Parkinson}