VisitedObjects.java [plain text]
package com.sleepycat.persist.impl;
class VisitedObjects {
static final int PRI_KEY_VISITED_OFFSET = Integer.MAX_VALUE - 1;
static final int PROHIBIT_REF_OFFSET = Integer.MAX_VALUE - 2;
static final Object PROHIBIT_REF_OBJECT = new Object();
static final String PROHIBIT_NESTED_REF_MSG =
"Cannot embed a reference to a proxied object in the proxy; for " +
"example, a collection may not be an element of the collection " +
"because collections are proxied";
private static final int INIT_LEN = 50;
private Object[] objects;
private int[] offsets;
private int nextIndex;
VisitedObjects() {
objects = new Object[INIT_LEN];
offsets = new int[INIT_LEN];
nextIndex = 0;
}
int add(Object o, int offset) {
int i = nextIndex;
nextIndex += 1;
if (nextIndex > objects.length) {
growVisitedArrays();
}
objects[i] = o;
offsets[i] = offset;
return i;
}
void setObject(int index, Object o) {
objects[index] = o;
}
void setOffset(int index, int offset) {
offsets[index] = offset;
}
int getOffset(Object o) {
for (int i = 0; i < nextIndex; i += 1) {
if (objects[i] == o) {
return offsets[i];
}
}
return -1;
}
Object getObject(int offset) {
for (int i = 0; i < nextIndex; i += 1) {
if (offsets[i] == offset) {
return objects[i];
}
}
return null;
}
void replaceObject(Object existing, Object replacement) {
for (int i = nextIndex - 1; i >= 0; i -= 1) {
if (objects[i] == existing) {
objects[i] = replacement;
return;
}
}
assert false;
}
private void growVisitedArrays() {
int oldLen = objects.length;
int newLen = oldLen * 2;
Object[] newObjects = new Object[newLen];
int[] newOffsets = new int[newLen];
System.arraycopy(objects, 0, newObjects, 0, oldLen);
System.arraycopy(offsets, 0, newOffsets, 0, oldLen);
objects = newObjects;
offsets = newOffsets;
}
}