/*******************************************************************************
 * Copyright (c) 2006, 2018 IBM Corporation and others.
 *
 * This program and the accompanying materials are made
 * available under the terms of the Eclipse Public License 2.0
 * which is available at https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     IBM Corporation - Jeff Briggs, Henry Hughes, Ryan Morse
 *******************************************************************************/

package org.eclipse.linuxtools.systemtap.graphing.core.structures;

public final class NumberType {

    /**
     * Returns a new instance of the passed in num of type orig.
     *
     * @param orig The desired datatype.
     * @param num The number to replicate.
     *
     * @return The new cast number.
     */
    public static Number getNumber(Number orig, double num) {
        if(orig instanceof Long) {
            return Long.valueOf((long)num);
        } else if(orig instanceof Double) {
            return Double.valueOf(num);
        } else if(orig instanceof Float) {
            return Float.valueOf((float)num);
        } else if(orig instanceof Byte) {
            return Byte.valueOf((byte)num);
        } else if(orig instanceof Short) {
            return Short.valueOf((short)num);
        }
        return Integer.valueOf((int)num);
    }

    /**
     * Takes an array of objects and returns an array of Numbers.
     *
     * @param o The array of objects to convert.
     *
     * @return The array of Numbers from o.
     */
    public static Number[] obj2num(Object[] o) {
        Number[] arr = new Number[o.length];
        for(int i = 0; i < o.length; i++) {
            arr[i] = obj2num(o[i]);
        }

        return arr;
    }

    /**
     * Takes an array of Numbers and returns an array of objects.
     *
     * @param o The array of Numbers to convert.
     *
     * @return The array of objects from o.
     */
    public static Number obj2num(Object o) {
        Number n = null;

        try {
            n = cleanObj2Num(o);
        } catch(NumberFormatException e ) {
            n = Long.valueOf(0);
        }
        return n;
    }

    /**
     * Returns an array of Numbers type if they are Numbers, otherwise, returns Doubles and Longs as appropriate
     * based on whether or not it has a '.'
     *
     * @param o The object array to clean.
     *
     * @return The Number array cleaned.
     */
    public static Number[] cleanObj2Num(Object[] o) {
        Number[] arr = new Number[o.length];
        for(int i = 0; i < o.length; i++)
            arr[i] = cleanObj2Num(o[i]);

        return arr;
    }

    /**
     * Returns a Number type if its a Number, otherwise, returns Doubles and Longs as appropriate
     * based on whether or not it has a '.'
     *
     * @param o The object to clean.
     *
     * @return The Number object cleaned.
     */
    public static Number cleanObj2Num(Object o) {
        if(o instanceof Number)
            return (Number)o;
        else {
            if(o.toString().contains(".")) //$NON-NLS-1$
                return Double.valueOf(o.toString());
            else
                return Long.valueOf(o.toString());
        }
    }
}
