1/*
2 * Copyright (C) 2008 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package libcore.reflect;
18
19import java.lang.reflect.Type;
20import java.util.ArrayList;
21import java.util.List;
22import libcore.util.EmptyArray;
23
24public final class ListOfTypes {
25    public static final ListOfTypes EMPTY = new ListOfTypes(0);
26
27    private final ArrayList<Type> types;
28    private Type[] resolvedTypes;
29
30    ListOfTypes(int capacity) {
31        types = new ArrayList<Type>(capacity);
32    }
33
34    ListOfTypes(Type[] types) {
35        this.types = new ArrayList<Type>(types.length);
36        for (Type type : types) {
37            this.types.add(type);
38        }
39    }
40
41    void add(Type type) {
42        if (type == null) {
43            throw new NullPointerException("type == null");
44        }
45        types.add(type);
46    }
47
48    int length() {
49        return types.size();
50    }
51
52    public Type[] getResolvedTypes() {
53        Type[] result = resolvedTypes;
54        if (result == null) {
55            result = resolveTypes(types);
56            resolvedTypes = result;
57        }
58        return result;
59    }
60
61    private Type[] resolveTypes(List<Type> unresolved) {
62        int size = unresolved.size();
63        if (size == 0) {
64            return EmptyArray.TYPE;
65        }
66        Type[] result = new Type[size];
67        for (int i = 0; i < size; i++) {
68            Type type = unresolved.get(i);
69            try {
70                result[i] = ((ParameterizedTypeImpl) type).getResolvedType();
71            } catch (ClassCastException e) {
72                result[i] = type;
73            }
74        }
75        return result;
76    }
77
78    @Override public String toString() {
79        StringBuilder result = new StringBuilder();
80        for (int i = 0; i < types.size(); i++) {
81            if (i > 0) {
82                result.append(", ");
83            }
84            result.append(types.get(i));
85        }
86        return result.toString();
87    }
88}
89