1917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul/*
2917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * Copyright (C) 2007 The Android Open Source Project
3917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul *
4917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * Licensed under the Apache License, Version 2.0 (the "License");
5917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * you may not use this file except in compliance with the License.
6917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * You may obtain a copy of the License at
7917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul *
8917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul *      http://www.apache.org/licenses/LICENSE-2.0
9917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul *
10917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * Unless required by applicable law or agreed to in writing, software
11917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * distributed under the License is distributed on an "AS IS" BASIS,
12917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * See the License for the specific language governing permissions and
14917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * limitations under the License.
15917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul */
16917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul
17917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgulpackage com.android.dexgen.rop.annotation;
18917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul
19917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgulimport com.android.dexgen.util.FixedSizeList;
20917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul
21917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul/**
22917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * List of {@link Annotations} instances.
23917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul */
24917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgulpublic final class AnnotationsList
25917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul        extends FixedSizeList {
26917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul    /** {@code non-null;} immutable empty instance */
27917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul    public static final AnnotationsList EMPTY = new AnnotationsList(0);
28917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul
29917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul    /**
30917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul     * Constructs an immutable instance which is the combination of
31917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul     * the two given instances. The two instances must each have the
32917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul     * same number of elements, and each pair of elements must contain
33917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul     * disjoint sets of types.
34917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul     *
35917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul     * @param list1 {@code non-null;} an instance
36917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul     * @param list2 {@code non-null;} the other instance
37917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul     * @return {@code non-null;} the combination
38917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul     */
39917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul    public static AnnotationsList combine(AnnotationsList list1,
40917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul            AnnotationsList list2) {
41917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul        int size = list1.size();
42917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul
43917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul        if (size != list2.size()) {
44917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul            throw new IllegalArgumentException("list1.size() != list2.size()");
45917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul        }
46917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul
47917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul        AnnotationsList result = new AnnotationsList(size);
48917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul
49917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul        for (int i = 0; i < size; i++) {
50917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul            Annotations a1 = list1.get(i);
51917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul            Annotations a2 = list2.get(i);
52917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul            result.set(i, Annotations.combine(a1, a2));
53917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul        }
54917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul
55917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul        result.setImmutable();
56917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul        return result;
57917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul    }
58917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul
59917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul    /**
60917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul     * Constructs an instance. All indices initially contain {@code null}.
61917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul     *
62917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul     * @param size the size of the list
63917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul     */
64917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul    public AnnotationsList(int size) {
65917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul        super(size);
66917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul    }
67917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul
68917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul    /**
69917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul     * Gets the element at the given index. It is an error to call
70917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul     * this with the index for an element which was never set; if you
71917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul     * do that, this will throw {@code NullPointerException}.
72917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul     *
73917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul     * @param n {@code >= 0, < size();} which index
74917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul     * @return {@code non-null;} element at that index
75917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul     */
76917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul    public Annotations get(int n) {
77917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul        return (Annotations) get0(n);
78917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul    }
79917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul
80917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul    /**
81917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul     * Sets the element at the given index. The given element must be
82917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul     * immutable.
83917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul     *
84917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul     * @param n {@code >= 0, < size();} which index
85917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul     * @param a {@code null-ok;} the element to set at {@code n}
86917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul     */
87917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul    public void set(int n, Annotations a) {
88917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul        a.throwIfMutable();
89917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul        set0(n, a);
90917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul    }
91917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul}
92