/*
 * @author Ranides Atterwim <ranides@gmail.com>
 * @copyright Ranides Atterwim
 * @license WTFPL
 * @url http://ranides.net/projects/assira
 */
package net.ranides.assira.reflection.util;

/**
 *
 * @author Ranides Atterwim <ranides@gmail.com>
 */
public final class ClassTraits {
    
    private ClassTraits() {
        // utility class
    }

    /**
     * Sprawdza, czy podana klasa reprezentuje nieopakowany typ prymitywny (np {@code int}).
     * @param clazz
     * @return
     */
    public static boolean isPrimitive(Class<?> clazz) {
        if(null == clazz) {
            return false;
        }
        return
            byte.class.equals(clazz) ||
            short.class.equals(clazz) ||
            int.class.equals(clazz) ||
            long.class.equals(clazz) ||
            char.class.equals(clazz) ||
            float.class.equals(clazz) ||
            double.class.equals(clazz) ||
            boolean.class.equals(clazz) ||
            void.class.equals(clazz);
    }
    
    public static boolean isPrimitiveArray(Class<?> clazz) {
        return clazz.isArray() && isPrimitive(clazz.getComponentType());
    }

    /**
     * Sprawdza, czy podana klasa reprezentuje opakowany typ prymitywny (np {@code Integer}).
     * @param clazz
     * @return
     */
    public static boolean isBoxed(Class<?> clazz) {
        return
            Byte.class.equals(clazz) ||
            Short.class.equals(clazz) ||
            Integer.class.equals(clazz) ||
            Long.class.equals(clazz) ||
            Character.class.equals(clazz) ||
            Float.class.equals(clazz) ||
            Double.class.equals(clazz) ||
            Boolean.class.equals(clazz) ||
            Void.class.equals(clazz);
    }
    
    /**
     * Sprawdza, czy podana klasa reprezentuje typ logiczny - bez względu na to,
     * czy przekazana klasa reprezentuje typ prymitywny ({@code boolean}),
     * czy wrapper (np {@code Boolean}).
     * @param clazz
     * @return
     */
    public static boolean isBool(Class<?> clazz) {
        return boolean.class.equals(clazz) || Boolean.class.equals(clazz);
    }

    /**
     * Sprawdza, czy podana klasa reprezentuje typ numeryczny - bez względu na to,
     * czy przekazana klasa reprezentuje typ prymitywny (np {@code float}),
     * czy wrapper (np {@code Double}), czy {@link Number}.
     * @param clazz
     * @return
     */
    public static boolean isNumber(Class<?> clazz) {
        return
            byte.class.equals(clazz) ||
            short.class.equals(clazz) ||
            int.class.equals(clazz) ||
            long.class.equals(clazz) ||
            float.class.equals(clazz) ||
            double.class.equals(clazz) ||
            Byte.class.equals(clazz) ||
            Short.class.equals(clazz) ||
            Integer.class.equals(clazz) ||
            Long.class.equals(clazz) ||
            Float.class.equals(clazz) ||
            Double.class.equals(clazz) ||
            Number.class.isAssignableFrom(clazz);
    }
}
