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.rop.cst.Constant;
20917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgulimport com.android.dexgen.rop.cst.CstString;
21917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgulimport com.android.dexgen.rop.cst.CstUtf8;
22917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul
23917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul/**
24917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * A (name, value) pair. These are used as the contents of an annotation.
25917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul */
26917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgulpublic final class NameValuePair implements Comparable<NameValuePair> {
27917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul    /** {@code non-null;} the name */
28917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul    private final CstUtf8 name;
29917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul
30917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul    /** {@code non-null;} the value */
31917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul    private final Constant value;
32917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul
33917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul    /**
34917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul     * Construct an instance.
35917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul     *
36917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul     * @param name {@code non-null;} the name
37917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul     * @param value {@code non-null;} the value
38917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul     */
39917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul    public NameValuePair(CstUtf8 name, Constant value) {
40917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul        if (name == null) {
41917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul            throw new NullPointerException("name == null");
42917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul        }
43917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul
44917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul        if (value == null) {
45917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul            throw new NullPointerException("value == null");
46917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul        }
47917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul
48917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul        // Reject CstUtf8 values. (They should be CstStrings.)
49917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul        if (value instanceof CstUtf8) {
50917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul            throw new IllegalArgumentException("bad value: " + value);
51917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul        }
52917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul
53917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul        this.name = name;
54917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul        this.value = value;
55917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul    }
56917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul
57917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul    /** {@inheritDoc} */
58917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul    public String toString() {
59917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul        return name.toHuman() + ":" + value;
60917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul    }
61917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul
62917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul    /** {@inheritDoc} */
63917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul    public int hashCode() {
64917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul        return name.hashCode() * 31 + value.hashCode();
65917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul    }
66917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul
67917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul    /** {@inheritDoc} */
68917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul    public boolean equals(Object other) {
69917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul        if (! (other instanceof NameValuePair)) {
70917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul            return false;
71917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul        }
72917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul
73917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul        NameValuePair otherPair = (NameValuePair) other;
74917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul
75917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul        return name.equals(otherPair.name)
76917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul            && value.equals(otherPair.value);
77917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul    }
78917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul
79917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul    /**
80917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul     * {@inheritDoc}
81917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul     *
82917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul     * <p>Instances of this class compare in name-major and value-minor
83917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul     * order.</p>
84917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul     */
85917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul    public int compareTo(NameValuePair other) {
86917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul        int result = name.compareTo(other.name);
87917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul
88917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul        if (result != 0) {
89917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul            return result;
90917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul        }
91917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul
92917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul        return value.compareTo(other.value);
93917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul    }
94917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul
95917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul    /**
96917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul     * Gets the name.
97917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul     *
98917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul     * @return {@code non-null;} the name
99917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul     */
100917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul    public CstUtf8 getName() {
101917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul        return name;
102917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul    }
103917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul
104917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul    /**
105917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul     * Gets the value.
106917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul     *
107917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul     * @return {@code non-null;} the value
108917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul     */
109917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul    public Constant getValue() {
110917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul        return value;
111917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul    }
112917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul}
113