/*
 * Copyright (C) 2007 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.dx.cf.attrib;

import com.android.dx.rop.cst.CstDouble;
import com.android.dx.rop.cst.CstFloat;
import com.android.dx.rop.cst.CstInteger;
import com.android.dx.rop.cst.CstLong;
import com.android.dx.rop.cst.CstString;
import com.android.dx.rop.cst.TypedConstant;

/**
 * Attribute class for standard {@code ConstantValue} attributes.
 */
public final class AttConstantValue extends BaseAttribute {
    /** {@code non-null;} attribute name for attributes of this type */
    public static final String ATTRIBUTE_NAME = "ConstantValue";

    /** {@code non-null;} the constant value */
    private final TypedConstant constantValue;

    /**
     * Constructs an instance.
     *
     * @param constantValue {@code non-null;} the constant value, which must
     * be an instance of one of: {@code CstString},
     * {@code CstInteger}, {@code CstLong},
     * {@code CstFloat}, or {@code CstDouble}
     */
    public AttConstantValue(TypedConstant constantValue) {
        super(ATTRIBUTE_NAME);

        if (!((constantValue instanceof CstString) ||
               (constantValue instanceof CstInteger) ||
               (constantValue instanceof CstLong) ||
               (constantValue instanceof CstFloat) ||
               (constantValue instanceof CstDouble))) {
            if (constantValue == null) {
                throw new NullPointerException("constantValue == null");
            }
            throw new IllegalArgumentException("bad type for constantValue");
        }

        this.constantValue = constantValue;
    }

    /** {@inheritDoc} */
    public int byteLength() {
        return 8;
    }

    /**
     * Gets the constant value of this instance. The returned value
     * is an instance of one of: {@code CstString},
     * {@code CstInteger}, {@code CstLong},
     * {@code CstFloat}, or {@code CstDouble}.
     *
     * @return {@code non-null;} the constant value
     */
    public TypedConstant getConstantValue() {
        return constantValue;
    }
}
