private int makeRoomAfterFirst(int offsetNeedingRoom, int totalDesired) { // compress rear its larger totalDesired = compressAfter(offsetNeedingRoom + 4, totalDesired); if (totalDesired > 0) { totalDesired = compressBefore(offsetNeedingRoom - 4, totalDesired); if (totalDesired > 0) { preserveWorkspace = false; totalDesired = compressAfter(offsetNeedingRoom + 4, totalDesired); if (totalDesired > 0) { totalDesired = compressBefore(offsetNeedingRoom - 4, totalDesired); } } } return totalDesired; }
public static int copyToRingBuffer(int idx, byte[] target, final int targetIdx, final int targetMask, LocalHeap localHeap) {//Invoked 100's of millions of times, must be tight. final int offset = idx << 2; final int pos = localHeap.tat[offset]; final int len = localHeap.tat[offset + 1] - pos; copyToRingBuffer(target, targetIdx, targetMask, pos, len, localHeap.data); return targetIdx + len; }
public static boolean equals(int idx, byte[] target, int targetIdx, int targetLen, int targetMask, LocalHeap heap) { if (idx < 0) { int offset = idx << 1; return eq(target, targetIdx, targetLen, targetMask, heap.initTat[offset], heap.initTat[offset + 1], heap.initBuffer); } else { int offset = idx << 2; return eq(target, targetIdx, targetLen, targetMask, heap.tat[offset], heap.tat[offset + 1], heap.data); } }
public static int length(int idx, LocalHeap heap) { int result = (idx < 0 ? LocalHeap.initLength(idx, heap) : LocalHeap.valueLength(idx,heap)); return result < 0 ? 0 : result; }
private void makeRoom(int offsetNeedingRoom, boolean startBefore, int totalDesired) { if (startBefore) { totalDesired = makeRoomBeforeFirst(offsetNeedingRoom, totalDesired); } else { totalDesired = makeRoomAfterFirst(offsetNeedingRoom, totalDesired); } if (totalDesired > 0) { throw new RuntimeException("LocalHeap must be initialized larger for required text of length "+totalDesired); } }
public static void copy(int sourceIdx, int targetIdx, LocalHeap heap) { int len; int startFrom; byte[] buffer; if (sourceIdx < 0) { int offset = sourceIdx << 1; // this shift left also removes the top // bit! sweet. startFrom = heap.initTat[offset]; len = heap.initTat[offset + 1] - startFrom; buffer = heap.initBuffer; } else { int offset = sourceIdx << 2; startFrom = heap.tat[offset]; len = heap.tat[offset + 1] - startFrom; buffer = heap.data; } if (len < 0) { setNull(targetIdx, heap); return; } heap.setInternal(targetIdx, buffer, startFrom, LocalHeap.length(sourceIdx,heap)); }
public static void set(int idx, byte[] source, int startFrom, int copyLength, int sourceMask, LocalHeap heap) { int offset = idx << 2; heap.totalContent += (copyLength - (heap.tat[offset + 1] - heap.tat[offset])); int target = heap.makeRoom(offset, copyLength); heap.tat[offset] = target; heap.tat[offset + 1] = target + copyLength; int i = copyLength; while (--i>=0) { heap.data[target+i] = source[sourceMask&(startFrom+i)]; } }
private void makeSpaceForPrepend(int offset, int textLength) { if (tat[offset] > tat[offset + 1]) { // null or empty string detected so change to simple set tat[offset + 1] = tat[offset]; } int start = tat[offset] - textLength; if (start < 0) { // must move this right first. makeRoomBeforeFirst(offset, textLength); start = tat[offset] - textLength; } if (start < 0) { start = 0; } int limit = offset - 3 < 0 ? 0 : tat[offset - 3]; if (start < limit) { int stop = tat[offset + 4]; int space = stop - limit; int need = tat[offset + 1] - start; if (need > space) { makeRoom(offset, true, need); } // we have some space so just shift the existing data. int len = tat[offset + 1] - tat[offset]; System.arraycopy(data, tat[offset], data, start, len); tat[offset] = start; tat[offset + 1] = start + len; } }
public static void copy(int sourceIdx, int targetIdx, LocalHeap heap) { int len; int startFrom; byte[] buffer; if (sourceIdx < 0) { int offset = sourceIdx << 1; // this shift left also removes the top // bit! sweet. startFrom = heap.initTat[offset]; len = heap.initTat[offset + 1] - startFrom; buffer = heap.initBuffer; } else { int offset = sourceIdx << 2; startFrom = heap.tat[offset]; len = heap.tat[offset + 1] - startFrom; buffer = heap.data; } if (len < 0) { setNull(targetIdx, heap); return; } heap.setInternal(targetIdx, buffer, startFrom, LocalHeap.length(sourceIdx,heap)); }
public static void set(int idx, byte[] source, int startFrom, int copyLength, int sourceMask, LocalHeap heap) { int offset = idx << 2; heap.totalContent += (copyLength - (heap.tat[offset + 1] - heap.tat[offset])); int target = heap.makeRoom(offset, copyLength); heap.tat[offset] = target; heap.tat[offset + 1] = target + copyLength; int i = copyLength; while (--i>=0) { heap.data[target+i] = source[sourceMask&(startFrom+i)]; } }
private void makeRoom(int offsetNeedingRoom, boolean startBefore, int totalDesired) { if (startBefore) { totalDesired = makeRoomBeforeFirst(offsetNeedingRoom, totalDesired); } else { totalDesired = makeRoomAfterFirst(offsetNeedingRoom, totalDesired); } if (totalDesired > 0) { throw new RuntimeException("LocalHeap must be initialized larger for required text of length "+totalDesired); } }
public static int length(int idx, LocalHeap heap) { int result = (idx < 0 ? LocalHeap.initLength(idx, heap) : LocalHeap.valueLength(idx,heap)); return result < 0 ? 0 : result; }
private void makeSpaceForPrepend(int offset, int textLength) { if (tat[offset] > tat[offset + 1]) { // null or empty string detected so change to simple set tat[offset + 1] = tat[offset]; } int start = tat[offset] - textLength; if (start < 0) { // must move this right first. makeRoomBeforeFirst(offset, textLength); start = tat[offset] - textLength; } if (start < 0) { start = 0; } int limit = offset - 3 < 0 ? 0 : tat[offset - 3]; if (start < limit) { int stop = tat[offset + 4]; int space = stop - limit; int need = tat[offset + 1] - start; if (need > space) { makeRoom(offset, true, need); } // we have some space so just shift the existing data. int len = tat[offset + 1] - tat[offset]; System.arraycopy(data, tat[offset], data, start, len); tat[offset] = start; tat[offset + 1] = start + len; } }
public static void copy(int sourceIdx, int targetIdx, LocalHeap heap) { int len; int startFrom; byte[] buffer; if (sourceIdx < 0) { int offset = sourceIdx << 1; // this shift left also removes the top // bit! sweet. startFrom = heap.initTat[offset]; len = heap.initTat[offset + 1] - startFrom; buffer = heap.initBuffer; } else { int offset = sourceIdx << 2; startFrom = heap.tat[offset]; len = heap.tat[offset + 1] - startFrom; buffer = heap.data; } if (len < 0) { setNull(targetIdx, heap); return; } heap.setInternal(targetIdx, buffer, startFrom, LocalHeap.length(sourceIdx,heap)); }
private int makeRoomBeforeFirst(int offsetNeedingRoom, int totalDesired) { // compress front its larger totalDesired = compressBefore(offsetNeedingRoom - 4, totalDesired); if (totalDesired > 0) { totalDesired = compressAfter(offsetNeedingRoom + 4, totalDesired); if (totalDesired > 0) { preserveWorkspace = false; totalDesired = compressBefore(offsetNeedingRoom - 4, totalDesired); if (totalDesired > 0) { totalDesired = compressAfter(offsetNeedingRoom + 4, totalDesired); } } } return totalDesired; }
public static void set(int idx, byte[] source, int startFrom, int copyLength, int sourceMask, LocalHeap heap) { int offset = idx << 2; heap.totalContent += (copyLength - (heap.tat[offset + 1] - heap.tat[offset])); int target = heap.makeRoom(offset, copyLength); heap.tat[offset] = target; heap.tat[offset + 1] = target + copyLength; int i = copyLength; while (--i>=0) { heap.data[target+i] = source[sourceMask&(startFrom+i)]; } }
private void makeRoom(int offsetNeedingRoom, boolean startBefore, int totalDesired) { if (startBefore) { totalDesired = makeRoomBeforeFirst(offsetNeedingRoom, totalDesired); } else { totalDesired = makeRoomAfterFirst(offsetNeedingRoom, totalDesired); } if (totalDesired > 0) { throw new RuntimeException("LocalHeap must be initialized larger for required text of length "+totalDesired); } }