1 /* 2 * Copyright (C) 2007 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 17 package com.android.dexgen.rop.annotation; 18 19 import com.android.dexgen.rop.cst.Constant; 20 import com.android.dexgen.rop.cst.CstString; 21 import com.android.dexgen.rop.cst.CstUtf8; 22 23 /** 24 * A (name, value) pair. These are used as the contents of an annotation. 25 */ 26 public final class NameValuePair implements Comparable<NameValuePair> { 27 /** {@code non-null;} the name */ 28 private final CstUtf8 name; 29 30 /** {@code non-null;} the value */ 31 private final Constant value; 32 33 /** 34 * Construct an instance. 35 * 36 * @param name {@code non-null;} the name 37 * @param value {@code non-null;} the value 38 */ NameValuePair(CstUtf8 name, Constant value)39 public NameValuePair(CstUtf8 name, Constant value) { 40 if (name == null) { 41 throw new NullPointerException("name == null"); 42 } 43 44 if (value == null) { 45 throw new NullPointerException("value == null"); 46 } 47 48 // Reject CstUtf8 values. (They should be CstStrings.) 49 if (value instanceof CstUtf8) { 50 throw new IllegalArgumentException("bad value: " + value); 51 } 52 53 this.name = name; 54 this.value = value; 55 } 56 57 /** {@inheritDoc} */ toString()58 public String toString() { 59 return name.toHuman() + ":" + value; 60 } 61 62 /** {@inheritDoc} */ hashCode()63 public int hashCode() { 64 return name.hashCode() * 31 + value.hashCode(); 65 } 66 67 /** {@inheritDoc} */ equals(Object other)68 public boolean equals(Object other) { 69 if (! (other instanceof NameValuePair)) { 70 return false; 71 } 72 73 NameValuePair otherPair = (NameValuePair) other; 74 75 return name.equals(otherPair.name) 76 && value.equals(otherPair.value); 77 } 78 79 /** 80 * {@inheritDoc} 81 * 82 * <p>Instances of this class compare in name-major and value-minor 83 * order.</p> 84 */ compareTo(NameValuePair other)85 public int compareTo(NameValuePair other) { 86 int result = name.compareTo(other.name); 87 88 if (result != 0) { 89 return result; 90 } 91 92 return value.compareTo(other.value); 93 } 94 95 /** 96 * Gets the name. 97 * 98 * @return {@code non-null;} the name 99 */ getName()100 public CstUtf8 getName() { 101 return name; 102 } 103 104 /** 105 * Gets the value. 106 * 107 * @return {@code non-null;} the value 108 */ getValue()109 public Constant getValue() { 110 return value; 111 } 112 } 113