1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * you may not use this file except in compliance with the License.
6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * You may obtain a copy of the License at
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and
14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License.
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage com.android.dx.rop.code;
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
19333201833d506a3accdeac6ceb7caba8d4b95797Jesse Wilsonimport com.android.dx.rop.cst.CstString;
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/**
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * A local variable item: either a name or a signature or both.
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic class LocalItem implements Comparable<LocalItem> {
2599409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project    /** {@code null-ok;} local variable name */
26333201833d506a3accdeac6ceb7caba8d4b95797Jesse Wilson    private final CstString name;
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
2899409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project    /** {@code null-ok;} local variable signature */
29333201833d506a3accdeac6ceb7caba8d4b95797Jesse Wilson    private final CstString signature;
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Make a new item. If both name and signature are null, null is returned.
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * TODO: intern these
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
3699409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param name {@code null-ok;} local variable name
3799409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param signature {@code null-ok;} local variable signature
3899409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @return {@code non-null;} appropriate instance.
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
40333201833d506a3accdeac6ceb7caba8d4b95797Jesse Wilson    public static LocalItem make(CstString name, CstString signature) {
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (name == null && signature == null) {
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return null;
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return new LocalItem (name, signature);
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Constructs instance.
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
5199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param name {@code null-ok;} local variable name
5299409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param signature {@code null-ok;} local variable signature
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
54333201833d506a3accdeac6ceb7caba8d4b95797Jesse Wilson    private LocalItem(CstString name, CstString signature) {
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.name = name;
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.signature = signature;
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** {@inheritDoc} */
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public boolean equals(Object other) {
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (!(other instanceof LocalItem)) {
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return false;
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        LocalItem local = (LocalItem) other;
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return 0 == compareTo(local);
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
71de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro    /**
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Compares two strings like String.compareTo(), excepts treats a null
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * as the least-possible string value.
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return negative integer, zero, or positive integer in accordance
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * with Comparable.compareTo()
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
78333201833d506a3accdeac6ceb7caba8d4b95797Jesse Wilson    private static int compareHandlesNulls(CstString a, CstString b) {
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (a == b) {
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return 0;
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } else if (a == null) {
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return -1;
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } else if (b == null) {
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return 1;
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } else {
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return a.compareTo(b);
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** {@inheritDoc} */
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public int compareTo(LocalItem local) {
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int ret;
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ret = compareHandlesNulls(name, local.name);
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (ret != 0) {
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return ret;
98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ret = compareHandlesNulls(signature, local.signature);
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return ret;
103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** {@inheritDoc} */
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public int hashCode() {
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return (name == null ? 0 : name.hashCode()) * 31
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                + (signature == null ? 0 : signature.hashCode());
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** {@inheritDoc} */
114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String toString() {
116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (name != null && signature == null) {
117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return name.toQuoted();
118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } else if (name == null && signature == null) {
119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return "";
120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return "[" + (name == null ? "" : name.toQuoted())
123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                + "|" + (signature == null ? "" : signature.toQuoted());
124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Gets name.
128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
12999409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @return {@code null-ok;} name
130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
131333201833d506a3accdeac6ceb7caba8d4b95797Jesse Wilson    public CstString getName() {
132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return name;
133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Gets signature.
137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
13899409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @return {@code null-ok;} signature
139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
140333201833d506a3accdeac6ceb7caba8d4b95797Jesse Wilson    public CstString getSignature() {
141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return signature;
142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
144