/* * Copyright (c) 2002, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package nsk.share; import java.util.*; /** * Denotation implies a pair of algorithms for naming and * indexing of some objects. * *
No matter what kind of objects, just make sure that: *
The notions of indeces equality and names equivalence * are formalized by the methods equality() and * equivalence() correspondingly. * *
For better understanding of Denotation, you may want to * see the TreeNodesDenotation class as an implementation example. * * @see #equality(int[],int[]) * @see #equivalence(String,String) * @see TreeNodesDenotation */ abstract public class Denotation { /** * Check if the name is legal, and return the * numeric index for that object denoted by the given * name. * * @throws IllegalArgumentException If the name * is illegal. */ abstract public int[] indexFor(String name); /** * Check if the index[] is legal, and return * a symbolic name for the object denoted by the given * index[]. * * @throws IllegalArgumentException If the index[] * is illegal. */ abstract public String nameFor(int[] index); /** * Re-call to nameFor(int[]) with the 1-element * array {i} as the index argument. * * @see #nameFor(int[]) */ public String nameFor(int i) { return nameFor(new int[] { i }); } /** * Re-call to nameFor(int[]) with the 2-elements * array {i0,i1} as the index argument. * * @see #nameFor(int[]) */ public String nameFor(int i0, int i1) { return nameFor(new int[] {i0, i1}); } /** * Re-call to nameFor(int[]) with the 3-elements * array {i0,i1,i2} as the index argument. * * @see #nameFor(int[]) */ public String nameFor(int i0, int i1, int i2) { return nameFor(new int[] {i0, i1, i2}); } /** * Indeces equality means equality of objects they denote. * *
Indeces index1[] and index2[] are * equal, if they are equal as int[] arrays. But, * there is no index equal to null; particularly, * null is not equal to itself. * * @see Arrays#equals(int[],int[]) */ public boolean equality(int[] index1, int[] index2) { if (index1 == null || index2 == null) return false; return Arrays.equals(index1,index2); } /** * Names equivalence means equality of objects they denote. * *
Strings name1 and name2 are equivalent, * if correspondent indeces are equal. There is no name * equivalent to null; particularly, null is * not equivalent to itself. * * @see #equality(int[],int[]) */ public boolean equivalence(String name1, String name2) { if (name1 == null || name2 == null) return false; return equality(indexFor(name1),indexFor(name2)); } /** * Dummy constructor. */ protected Denotation() { } }