package ij.macro;

class Variable implements MacroConstants {
    static final int VALUE=0, ARRAY=1, STRING=2;
    int symTabIndex;
    private double value;
    private String str;
    private Variable[] array;

    Variable() {
    }

    Variable(double value) {
        this.value = value;
    }

    Variable(int symTabIndex, double value, String str) {
        this.symTabIndex = symTabIndex;
        this.value = value;
        this.str = str;
    }

    Variable(int symTabIndex, double value, String str, Variable[] array) {
        this.symTabIndex = symTabIndex;
        this.value = value;
        this.str = str;
        this.array = array;
    }

    Variable(byte[] array) {
        this.array = new Variable[array.length];
        for (int i=0; i<array.length; i++)
            this.array[i] = new Variable(array[i]&255);
    }

    Variable(int[] array) {
        this.array = new Variable[array.length];
        for (int i=0; i<array.length; i++)
            this.array[i] = new Variable(array[i]);
    }

    Variable(double[] array) {
        this.array = new Variable[array.length];
        for (int i=0; i<array.length; i++)
            this.array[i] = new Variable(array[i]);
    }

    double getValue() {
        if (str!=null)
                return convertToDouble();  // string to number conversions
        else
            return value;
    }

    double convertToDouble() {
        try {
            Double d = new Double(str);
            return d.doubleValue();
        } catch (NumberFormatException e){
            return Double.NaN;
        }
    }

    void setValue(double value) {
        this.value = value;
        str = null;
        array = null;
    }

    String getString() {
        return str;
    }

    void setString(String str) {
        this.str = str;
        value = 0.0;
        array = null;
    }

    Variable[] getArray() {
        return array;
    }

    void setArray(Variable[] array) {
        this.array = array;
        value = 0.0;
        str = null;
    }
    
    int getType() {
        if (array!=null)
            return ARRAY;
        else if (str!=null)
            return STRING;
        else
            return VALUE;
    }

    public String toString() {
        String s = "";
        if (array!=null)
            s += "array["+array.length+"]";
        else if (str!=null)
            s += str;
        else
            s += ""+value;      
        return s+" "+symTabIndex;
    }
    
} // class Variable