diff options
author | Harvey Harrison <[email protected]> | 2015-04-19 21:02:06 -0700 |
---|---|---|
committer | Harvey Harrison <[email protected]> | 2015-04-19 21:02:06 -0700 |
commit | 7a2e20caac9db6f789a7b3fab344b9758af45335 (patch) | |
tree | b5236ff2570178de356eab569225108948eb4d30 /src/javax/media/j3d/HashKey.java | |
parent | f76ce302c4bb2a9f03bbee571ec5d05c29633023 (diff) |
j3dcore: flatten the directory structure a bit
Signed-off-by: Harvey Harrison <[email protected]>
Diffstat (limited to 'src/javax/media/j3d/HashKey.java')
-rw-r--r-- | src/javax/media/j3d/HashKey.java | 257 |
1 files changed, 257 insertions, 0 deletions
diff --git a/src/javax/media/j3d/HashKey.java b/src/javax/media/j3d/HashKey.java new file mode 100644 index 0000000..cfbf7fe --- /dev/null +++ b/src/javax/media/j3d/HashKey.java @@ -0,0 +1,257 @@ +/* + * Copyright 1997-2008 Sun Microsystems, Inc. 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. Sun designates this + * particular file as subject to the "Classpath" exception as provided + * by Sun in the LICENSE file that accompanied this code. + * + * 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + * + */ + +package javax.media.j3d; + +class HashKey extends Object { + + /** + * The value is used for character storage. + */ + char value[]; + + /** + * The count is the number of characters in the buffer. + */ + int count = 0; + + HashKey() { + this(16); + } + + HashKey(int length) { + value = new char[length]; + } + + HashKey(HashKey hashkey) { + this.set(hashkey); + } + + HashKey(String str) { + this(str.length() + 16); + append(str); + } + + void set(HashKey hashkey) { + int i; + + if (this.count < hashkey.count) { + this.value = new char[hashkey.count]; + } + + for (i=0; i<hashkey.count; i++) { + this.value[i] = hashkey.value[i]; + } + this.count = hashkey.count; + } + + void reset() { + count = 0; + } + + void ensureCapacity(int minimumCapacity) { + int maxCapacity = value.length; + + if (minimumCapacity > maxCapacity) { + int newCapacity = (maxCapacity + 1) * 2; + if (minimumCapacity > newCapacity) { + newCapacity = minimumCapacity; + } + + char newValue[] = new char[newCapacity]; + System.arraycopy(value, 0, newValue, 0, count); + value = newValue; + } + } + + HashKey append(String str) { + int len = 0; + + if (str == null) + return this; + + len = str.length(); + ensureCapacity(count + len); + str.getChars(0, len, value, count); + count += len; + return this; + } + + @Override + public int hashCode() { + int h = 0; + int off = 0; + char val[] = value; + int len = count; + + if (len < 16) { + for (int i = len ; i > 0; i--) { + h = (h * 37) + val[off++]; + } + } else { + // only sample some characters + int skip = len / 8; + for (int i = len ; i > 0; i -= skip, off += skip) { + h = (h * 39) + val[off]; + } + } + return h; + } + + @Override + public boolean equals(Object anObject) { + if ((anObject != null) && (anObject instanceof HashKey)) { + HashKey anotherHashKey = (HashKey)anObject; + int n = count; + if (n == anotherHashKey.count) { + char v1[] = value; + char v2[] = anotherHashKey.value;; + int i = 0; + int j = 0; + while (n-- != 0) { + if (v1[i++] != v2[j++]) { + return false; + } + } + return true; + } + } + return false; + } + + + /* For internal use only. */ + private int equals(HashKey hk) { + int index = 0; + + while((index < count) && (index < hk.count)) { + if(value[index] < hk.value[index]) + return -1; + else if(value[index] > hk.value[index]) + return 1; + index++; + } + + if(count == hk.count) + // Found it! + return 0; + else if(count < hk.count) + return -1; + else + return 1; + + } + + + /* For package use only. */ + int equals(HashKey localToVworldKeys[], int start, int end) { + int mid; + + mid = start +((end - start)/ 2); + if(localToVworldKeys[mid] != null) { + int test = equals(localToVworldKeys[mid]); + + if((test < 0) && (start != mid)) + return equals(localToVworldKeys, start, mid); + else if((test > 0) && (start != mid)) + return equals(localToVworldKeys, mid, end); + else if(test == 0) + return mid; + else + return -1; + } + // A null haskey encountered. + return -2; + } + + /* For package use only. */ + boolean equals(HashKey localToVworldKeys[], int[] index, + int start, int end) { + + int mid; + + mid = start +((end - start)/ 2); + if(localToVworldKeys[mid] != null) { + int test = equals(localToVworldKeys[mid]); + + if(start != mid) { + if(test < 0) { + return equals(localToVworldKeys, index, start, mid); + } + else if(test > 0) { + return equals(localToVworldKeys, index, mid, end); + } + } + else { // (start == mid) + if(test < 0) { + index[0] = mid; + return false; + } + else if(test > 0) { + index[0] = mid+1; + return false; + } + } + + // (test == 0) + index[0] = mid; + return true; + + } + // A null haskey encountered. + // But we still want to return the index where we encounter it. + index[0] = mid; + return false; + } + + @Override + public String toString() { + return new String(value, 0, count); + } + + String getLastNodeId() { + int i, j, temp; + + for(i=(count-1); i>0; i--) + if(value[i] == '+') + break; + + if(i>0) { + value[i++] = '\0'; + temp = count-i; + char v1[] = new char[temp]; + for(j=0; j<temp; j++, i++) { + v1[j] = value[i]; + value[i] = '\0'; + } + count = count - (temp+1); + return new String(v1); + } + + return new String(value, 0, count); + } + +} |