simplify List and Struct Pointer getters

This commit is contained in:
David Renshaw 2014-06-16 20:00:01 -04:00
parent df2233a52b
commit 58417744ff
4 changed files with 27 additions and 39 deletions

View file

@ -3,16 +3,16 @@ package org.capnproto;
import java.nio.ByteBuffer;
final class ListPointer {
public static byte elementSize(int elementSizeAndCount) {
return (byte) (elementSizeAndCount & 7);
public static byte elementSize(long ref) {
return (byte) (WirePointer.upper32Bits(ref) & 7);
}
public static int elementCount(int elementSizeAndCount) {
return elementSizeAndCount >>> 3;
public static int elementCount(long ref) {
return WirePointer.upper32Bits(ref) >>> 3;
}
public static int inlineCompositeWordCount(int elementSizeAndCount) {
return elementCount(elementSizeAndCount);
public static int inlineCompositeWordCount(long ref) {
return elementCount(ref);
}
public static void set(ByteBuffer buffer, int offset, byte elementSize, int elementCount) {

View file

@ -3,16 +3,16 @@ package org.capnproto;
import java.nio.ByteBuffer;
final class StructPointer{
public static short dataSize(int structRef) {
return (short)(structRef & 0xffff);
public static short dataSize(long ref) {
return (short)(WirePointer.upper32Bits(ref) & 0xffff);
}
public static short ptrCount(int structRef) {
return (short)(structRef >>> 16);
public static short ptrCount(long ref) {
return (short)(WirePointer.upper32Bits(ref) >>> 16);
}
public static int wordSize(int structRef) {
return (int)dataSize(structRef) + (int)ptrCount(structRef);
public static int wordSize(long ref) {
return (int)dataSize(ref) + (int)ptrCount(ref);
}
public static void setFromStructSize(ByteBuffer buffer, int offset, StructSize size) {

View file

@ -116,8 +116,8 @@ final class WireHelpers {
}
FollowBuilderFarsResult resolved = followBuilderFars(ref, target, segment);
short oldDataSize = StructPointer.dataSize(WirePointer.structPointer(resolved.ref));
short oldPointerCount = StructPointer.ptrCount(WirePointer.structPointer(resolved.ref));
short oldDataSize = StructPointer.dataSize(resolved.ref);
short oldPointerCount = StructPointer.ptrCount(resolved.ref);
int oldPointerSectionOffset = resolved.ptr + oldDataSize;
if (oldDataSize < size.data || oldPointerCount < size.pointers) {
@ -206,7 +206,7 @@ final class WireHelpers {
throw new DecodeException("Called getList{Field,Element}() but existing pointer is not a list");
}
byte oldSize = ListPointer.elementSize(WirePointer.listPointer(resolved.ref));
byte oldSize = ListPointer.elementSize(resolved.ref);
if (oldSize == FieldSize.INLINE_COMPOSITE) {
//# The existing element size is InlineComposite, which
@ -232,7 +232,7 @@ final class WireHelpers {
int step = dataSize + pointerCount * Constants.BITS_PER_POINTER;
return new ListBuilder(resolved.segment, resolved.ptr * Constants.BYTES_PER_WORD,
ListPointer.elementCount(WirePointer.listPointer(resolved.ref)),
ListPointer.elementCount(resolved.ref),
step, dataSize, (short) pointerCount);
}
}
@ -281,7 +281,7 @@ final class WireHelpers {
if (WirePointer.kind(resolved.ref) != WirePointer.LIST) {
throw new DecodeException("Called getText{Field,Element} but existing pointer is not a list.");
}
if (ListPointer.elementSize(WirePointer.listPointer(resolved.ref)) != FieldSize.BYTE) {
if (ListPointer.elementSize(resolved.ref) != FieldSize.BYTE) {
throw new DecodeException(
"Called getText{Field,Element} but existing list pointer is not byte-sized.");
}
@ -289,7 +289,7 @@ final class WireHelpers {
//# Subtract 1 from the size for the NUL terminator.
return new Text.Builder(resolved.segment.buffer, resolved.ptr * Constants.BYTES_PER_WORD,
ListPointer.elementCount(WirePointer.listPointer(resolved.ref)) - 1);
ListPointer.elementCount(resolved.ref) - 1);
}
@ -305,14 +305,13 @@ final class WireHelpers {
long ref = WirePointer.get(segment.buffer, refOffset);
int ptrOffset = WirePointer.target(refOffset, ref);
int structPtr = WirePointer.structPointer(ref);
int dataSizeWords = StructPointer.dataSize(structPtr);
int dataSizeWords = StructPointer.dataSize(ref);
return new StructReader(segment,
ptrOffset * 8,
(ptrOffset + dataSizeWords),
dataSizeWords * 64,
StructPointer.ptrCount(structPtr),
StructPointer.ptrCount(ref),
(byte)0,
nestingLimit - 1);
@ -331,14 +330,13 @@ final class WireHelpers {
return new ListReader();
}
int listPtr = WirePointer.listPointer(ref);
int ptrOffset = WirePointer.target(refOffset, ref);
long ptr = WirePointer.get(segment.buffer, ptrOffset);
switch (ListPointer.elementSize(listPtr)) {
switch (ListPointer.elementSize(ref)) {
case FieldSize.INLINE_COMPOSITE : {
int wordCount = ListPointer.inlineCompositeWordCount(listPtr);
int wordCount = ListPointer.inlineCompositeWordCount(ref);
long tag = ptr;
ptrOffset += 1;
@ -347,8 +345,7 @@ final class WireHelpers {
int size = WirePointer.inlineCompositeListElementCount(tag);
int structPtr = WirePointer.structPointer(tag);
int wordsPerElement = StructPointer.wordSize(structPtr);
int wordsPerElement = StructPointer.wordSize(tag);
// TODO check that elemements do not overrun word count
@ -358,8 +355,8 @@ final class WireHelpers {
ptrOffset * 8, //
size,
wordsPerElement * 64,
StructPointer.dataSize(structPtr) * 64,
StructPointer.ptrCount(structPtr),
StructPointer.dataSize(tag) * 64,
StructPointer.ptrCount(tag),
nestingLimit - 1);
}
case FieldSize.VOID : break;
@ -380,14 +377,13 @@ final class WireHelpers {
}
int ptrOffset = WirePointer.target(refOffset, ref);
int listPtr = WirePointer.listPointer(ref);
int size = ListPointer.elementCount(listPtr);
int size = ListPointer.elementCount(ref);
if (WirePointer.kind(ref) != WirePointer.LIST) {
throw new DecodeException("Message contains non-list pointer where text was expected.");
}
if (ListPointer.elementSize(listPtr) != FieldSize.BYTE) {
if (ListPointer.elementSize(ref) != FieldSize.BYTE) {
throw new DecodeException("Message contains list pointer of non-bytes where text was expected.");
}

View file

@ -44,14 +44,6 @@ final class WirePointer {
return (int)(wirePointer >>> 32);
}
public static int listPointer(long wirePointer) {
return upper32Bits(wirePointer);
}
public static int structPointer(long wirePointer) {
return upper32Bits(wirePointer);
}
public static long get(ByteBuffer buffer, int offset) {
return buffer.getLong(offset * 8);
}