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.code; 18917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul 19917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgulimport com.android.dexgen.rop.cst.CstUtf8; 20917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul 21917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul/** 22917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * A local variable item: either a name or a signature or both. 23917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul */ 24917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgulpublic class LocalItem implements Comparable<LocalItem> { 25917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul /** {@code null-ok;} local variable name */ 26917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul private final CstUtf8 name; 27917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul 28917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul /** {@code null-ok;} local variable signature */ 29917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul private final CstUtf8 signature; 30917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul 31917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul /** 32917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * Make a new item. If both name and signature are null, null is returned. 33917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * 34917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * TODO: intern these 35917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * 36917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * @param name {@code null-ok;} local variable name 37917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * @param signature {@code null-ok;} local variable signature 38917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * @return {@code non-null;} appropriate instance. 39917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul */ 40917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul public static LocalItem make(CstUtf8 name, CstUtf8 signature) { 41917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul if (name == null && signature == null) { 42917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul return null; 43917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul } 44917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul 45917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul return new LocalItem (name, signature); 46917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul } 47917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul 48917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul /** 49917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * Constructs instance. 50917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * 51917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * @param name {@code null-ok;} local variable name 52917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * @param signature {@code null-ok;} local variable signature 53917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul */ 54917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul private LocalItem(CstUtf8 name, CstUtf8 signature) { 55917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul this.name = name; 56917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul this.signature = signature; 57917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul } 58917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul 59917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul /** {@inheritDoc} */ 60917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul @Override 61917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul public boolean equals(Object other) { 62917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul if (!(other instanceof LocalItem)) { 63917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul return false; 64917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul } 65917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul 66917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul LocalItem local = (LocalItem) other; 67917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul 68917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul return 0 == compareTo(local); 69917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul } 70917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul 71917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul /** 72917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * Compares two strings like String.compareTo(), excepts treats a null 73917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * as the least-possible string value. 74917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * 75917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * @return negative integer, zero, or positive integer in accordance 76917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * with Comparable.compareTo() 77917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul */ 78917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul private static int compareHandlesNulls(CstUtf8 a, CstUtf8 b) { 79917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul if (a == b) { 80917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul return 0; 81917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul } else if (a == null) { 82917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul return -1; 83917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul } else if (b == null) { 84917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul return 1; 85917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul } else { 86917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul return a.compareTo(b); 87917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul } 88917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul } 89917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul 90917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul /** {@inheritDoc} */ 91917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul public int compareTo(LocalItem local) { 92917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul int ret; 93917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul 94917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul ret = compareHandlesNulls(name, local.name); 95917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul 96917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul if (ret != 0) { 97917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul return ret; 98917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul } 99917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul 100917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul ret = compareHandlesNulls(signature, local.signature); 101917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul 102917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul return ret; 103917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul } 104917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul 105917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul 106917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul /** {@inheritDoc} */ 107917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul @Override 108917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul public int hashCode() { 109917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul return (name == null ? 0 : name.hashCode()) * 31 110917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul + (signature == null ? 0 : signature.hashCode()); 111917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul } 112917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul 113917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul /** {@inheritDoc} */ 114917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul @Override 115917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul public String toString() { 116917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul if (name != null && signature == null) { 117917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul return name.toQuoted(); 118917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul } else if (name == null && signature == null) { 119917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul return ""; 120917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul } 121917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul 122917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul return "[" + (name == null ? "" : name.toQuoted()) 123917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul + "|" + (signature == null ? "" : signature.toQuoted()); 124917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul } 125917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul 126917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul /** 127917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * Gets name. 128917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * 129917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * @return {@code null-ok;} name 130917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul */ 131917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul public CstUtf8 getName() { 132917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul return name; 133917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul } 134917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul 135917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul /** 136917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * Gets signature. 137917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * 138917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul * @return {@code null-ok;} signature 139917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul */ 140917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul public CstUtf8 getSignature() { 141917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul return signature; 142917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul } 143917cb222329ee8c035c3ffaf947e4265761b9367Piotr Gurgul} 144