/*
 * 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.code;

import com.android.dx.util.FixedSizeList;
import com.android.dx.util.Hex;
import com.android.dx.util.LabeledList;

/**
 * List of {@link ByteBlock} instances.
 */
public final class ByteBlockList extends LabeledList {

    /**
     * Constructs an instance.
     *
     * @param size {@code >= 0;} the number of elements to be in the list
     */
    public ByteBlockList(int size) {
        super(size);
    }

    /**
     * Gets the indicated element. It is an error to call this with the
     * index for an element which was never set; if you do that, this
     * will throw {@code NullPointerException}.
     *
     * @param n {@code >= 0, < size();} which element
     * @return {@code non-null;} the indicated element
     */
    public ByteBlock get(int n) {
        return (ByteBlock) get0(n);
    }

    /**
     * Gets the block with the given label.
     *
     * @param label the label to look for
     * @return {@code non-null;} the block with the given label
     */
    public ByteBlock labelToBlock(int label) {
        int idx = indexOfLabel(label);

        if (idx < 0) {
            throw new IllegalArgumentException("no such label: "
                    + Hex.u2(label));
        }

        return get(idx);
    }

    /**
     * Sets the element at the given index.
     *
     * @param n {@code >= 0, < size();} which element
     * @param bb {@code null-ok;} the value to store
     */
    public void set(int n, ByteBlock bb) {
        super.set(n, bb);
    }
}
