1579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson/*
2579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Copyright (C) 2007 The Android Open Source Project
3579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson *
4579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Licensed under the Apache License, Version 2.0 (the "License");
5579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * you may not use this file except in compliance with the License.
6579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * You may obtain a copy of the License at
7579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson *
8579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson *      http://www.apache.org/licenses/LICENSE-2.0
9579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson *
10579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Unless required by applicable law or agreed to in writing, software
11579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * distributed under the License is distributed on an "AS IS" BASIS,
12579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * See the License for the specific language governing permissions and
14579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * limitations under the License.
15579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson */
16579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
17579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilsonpackage com.android.dx.rop.cst;
18579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
19579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilsonimport com.android.dx.util.ToHuman;
20579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
21579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson/**
22579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Base class for constants of all sorts.
23579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson */
24579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilsonpublic abstract class Constant
25579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        implements ToHuman, Comparable<Constant> {
26579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    /**
27579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * Returns {@code true} if this instance is a category-2 constant,
28579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * meaning it takes up two slots in the constant pool, or
29579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * {@code false} if this instance is category-1.
30579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     *
31579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * @return {@code true} iff this instance is category-2
32579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     */
33579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    public abstract boolean isCategory2();
34579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
35579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    /**
36579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * Returns the human name for the particular type of constant
37579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * this instance is.
38579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     *
39579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * @return {@code non-null;} the name
40579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     */
41579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    public abstract String typeName();
42579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
43579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    /**
44579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * {@inheritDoc}
45579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     *
46579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * This compares in class-major and value-minor order.
47579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     */
48579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    public final int compareTo(Constant other) {
49579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        Class clazz = getClass();
50579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        Class otherClazz = other.getClass();
51579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
52579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        if (clazz != otherClazz) {
53579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson            return clazz.getName().compareTo(otherClazz.getName());
54579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        }
55579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
56579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson        return compareTo0(other);
57579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    }
58579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson
59579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    /**
60579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * Compare the values of this and another instance, which are guaranteed
61579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * to be of the same class. Subclasses must implement this.
62579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     *
63579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * @param other {@code non-null;} the instance to compare to
64579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * @return {@code -1}, {@code 0}, or {@code 1}, as usual
65579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     * for a comparison
66579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson     */
67579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson    protected abstract int compareTo0(Constant other);
68579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson}
69