FromStructReader -> StructReader.Factory

This commit is contained in:
David Renshaw 2014-10-07 17:47:42 -04:00
parent 3aefbb76e0
commit b4f34cb393
17 changed files with 55 additions and 59 deletions

View file

@ -7,8 +7,6 @@ import java.io.FileInputStream;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.FileDescriptor; import java.io.FileDescriptor;
import org.capnproto.FromStructReader;
import org.capnproto.FromStructBuilder;
import org.capnproto.StructFactory; import org.capnproto.StructFactory;
import org.capnproto.MessageBuilder; import org.capnproto.MessageBuilder;
import org.capnproto.MessageReader; import org.capnproto.MessageReader;

View file

@ -1189,11 +1189,11 @@ private:
spaces(indent), " public static class Factory implements org.capnproto.StructFactory<Builder, Reader> {\n", spaces(indent), " public static class Factory implements org.capnproto.StructFactory<Builder, Reader> {\n",
spaces(indent), spaces(indent),
" public final Reader fromStructReader(org.capnproto.SegmentReader segment, int data,", " public final Reader constructReader(org.capnproto.SegmentReader segment, int data,",
"int pointers, int dataSize, short pointerCount, byte bit0Offset, int nestingLimit) {\n", "int pointers, int dataSize, short pointerCount, byte bit0Offset, int nestingLimit) {\n",
spaces(indent), " return new Reader(segment,data,pointers,dataSize,pointerCount,bit0Offset,nestingLimit);\n", spaces(indent), " return new Reader(segment,data,pointers,dataSize,pointerCount,bit0Offset,nestingLimit);\n",
spaces(indent), " }\n", spaces(indent), " }\n",
spaces(indent), " public final Builder fromStructBuilder(org.capnproto.SegmentBuilder segment, int data,", spaces(indent), " public final Builder constructBuilder(org.capnproto.SegmentBuilder segment, int data,",
"int pointers, int dataSize, short pointerCount, byte bit0Offset) {\n", "int pointers, int dataSize, short pointerCount, byte bit0Offset) {\n",
spaces(indent), " return new Builder(segment, data, pointers, dataSize, pointerCount, bit0Offset);\n", spaces(indent), " return new Builder(segment, data, pointers, dataSize, pointerCount, bit0Offset);\n",
spaces(indent), " }\n", spaces(indent), " }\n",

View file

@ -9,7 +9,7 @@ public final class AnyPointer {
this.reader = reader; this.reader = reader;
} }
public final <T> T getAsStruct(FromStructReader<T> factory) { public final <T> T getAsStruct(StructReader.Factory<T> factory) {
return this.reader.getStruct(factory); return this.reader.getStruct(factory);
} }
@ -25,7 +25,7 @@ public final class AnyPointer {
this.builder = builder; this.builder = builder;
} }
public final <T> T initAsStruct(FromStructBuilder<T> factory) { public final <T> T initAsStruct(StructBuilder.Factory<T> factory) {
return this.builder.initStruct(factory); return this.builder.initStruct(factory);
} }

View file

@ -1,7 +0,0 @@
package org.capnproto;
public interface FromStructBuilder<T> {
T fromStructBuilder(SegmentBuilder segment, int data, int pointers, int dataSize,
short pointerCount, byte bit0Offset);
StructSize structSize();
}

View file

@ -1,7 +0,0 @@
package org.capnproto;
public interface FromStructReader<T> {
T fromStructReader(SegmentReader segment, int data, int pointers,
int dataSize, short pointerCount,
byte bit0Offset, int nestingLimit);
}

View file

@ -85,12 +85,12 @@ public class ListBuilder {
this.segment.buffer.putDouble(this.ptr + index * 8, value); this.segment.buffer.putDouble(this.ptr + index * 8, value);
} }
protected final <T> T _getStructElement(FromStructBuilder<T> factory, int index) { protected final <T> T _getStructElement(StructBuilder.Factory<T> factory, int index) {
int indexBit = index * this.step; int indexBit = index * this.step;
int structData = this.ptr + indexBit / 8 ; int structData = this.ptr + indexBit / 8 ;
int structPointers = (structData + (this.structDataSize / 8)) / 8; int structPointers = (structData + (this.structDataSize / 8)) / 8;
return factory.fromStructBuilder(this.segment, return factory.constructBuilder(this.segment,
structData, structData,
structPointers, structPointers,
this.structDataSize, this.structDataSize,

View file

@ -66,7 +66,7 @@ public class ListReader {
return this.segment.buffer.getDouble(this.ptr + index * 8); return this.segment.buffer.getDouble(this.ptr + index * 8);
} }
protected <T> T _getStructElement(FromStructReader<T> factory, int index) { protected <T> T _getStructElement(StructReader.Factory<T> factory, int index) {
// TODO check nesting limit // TODO check nesting limit
int indexBit = index * this.step; int indexBit = index * this.step;
@ -74,7 +74,7 @@ public class ListReader {
int structData = this.ptr + (indexBit / 8); int structData = this.ptr + (indexBit / 8);
int structPointers = structData + (this.structDataSize / 8); int structPointers = structData + (this.structDataSize / 8);
return factory.fromStructReader(this.segment, structData, structPointers / 8, this.structDataSize, return factory.constructReader(this.segment, structData, structPointers / 8, this.structDataSize,
this.structPointerCount, (byte) (indexBit % 8), this.nestingLimit - 1); this.structPointerCount, (byte) (indexBit % 8), this.nestingLimit - 1);
} }

View file

@ -19,11 +19,11 @@ public final class MessageBuilder {
allocationStrategy); allocationStrategy);
} }
public <T> T getRoot(FromStructBuilder<T> factory) { public <T> T getRoot(StructBuilder.Factory<T> factory) {
throw new Error("unimplemented"); throw new Error("unimplemented");
} }
public <T> T initRoot(FromStructBuilder<T> factory) { public <T> T initRoot(StructBuilder.Factory <T> factory) {
SegmentBuilder rootSegment = this.arena.segments.get(0); SegmentBuilder rootSegment = this.arena.segments.get(0);
int location = rootSegment.allocate(1); int location = rootSegment.allocate(1);
if (location == SegmentBuilder.FAILED_ALLOCATION) { if (location == SegmentBuilder.FAILED_ALLOCATION) {

View file

@ -9,7 +9,7 @@ public final class MessageReader {
this.arena = new ReaderArena(segmentSlices); this.arena = new ReaderArena(segmentSlices);
} }
public <T> T getRoot(FromStructReader<T> factory) { public <T> T getRoot(StructReader.Factory<T> factory) {
SegmentReader segment = this.arena.tryGetSegment(0); SegmentReader segment = this.arena.tryGetSegment(0);
PointerReader pointerReader = PointerReader.getRoot(segment, 0, PointerReader pointerReader = PointerReader.getRoot(segment, 0,
0x7fffffff /* XXX */); 0x7fffffff /* XXX */);

View file

@ -18,11 +18,11 @@ public final class PointerBuilder {
} }
public final <T> T getStruct(FromStructBuilder<T> factory) { public final <T> T getStruct(StructBuilder.Factory<T> factory) {
return WireHelpers.getWritableStructPointer(factory, this.pointer, this.segment, factory.structSize(), null, 0); return WireHelpers.getWritableStructPointer(factory, this.pointer, this.segment, factory.structSize(), null, 0);
} }
public final <T> T getStruct(FromStructBuilder<T> factory, SegmentReader defaultReader, int defaultOffset) { public final <T> T getStruct(StructBuilder.Factory<T> factory, SegmentReader defaultReader, int defaultOffset) {
return WireHelpers.getWritableStructPointer(factory, this.pointer, this.segment, factory.structSize(), return WireHelpers.getWritableStructPointer(factory, this.pointer, this.segment, factory.structSize(),
defaultReader, defaultOffset); defaultReader, defaultOffset);
} }
@ -54,7 +54,7 @@ public final class PointerBuilder {
defaultSize); defaultSize);
} }
public final <T> T initStruct(FromStructBuilder<T> factory) { public final <T> T initStruct(StructBuilder.Factory<T> factory) {
return WireHelpers.initStructPointer(factory, this.pointer, this.segment, factory.structSize()); return WireHelpers.initStructPointer(factory, this.pointer, this.segment, factory.structSize());
} }

View file

@ -28,7 +28,7 @@ public final class PointerReader {
return this.segment.buffer.getLong(this.pointer) == 0; return this.segment.buffer.getLong(this.pointer) == 0;
} }
public <T> T getStruct(FromStructReader<T> factory) { public <T> T getStruct(StructReader.Factory<T> factory) {
return WireHelpers.readStructPointer(factory, return WireHelpers.readStructPointer(factory,
this.segment, this.segment,
this.pointer, this.pointer,
@ -36,7 +36,7 @@ public final class PointerReader {
this.nestingLimit); this.nestingLimit);
} }
public <T> T getStruct(FromStructReader<T> factory, SegmentReader defaultSegment, int defaultOffset) { public <T> T getStruct(StructReader.Factory<T> factory, SegmentReader defaultSegment, int defaultOffset) {
return WireHelpers.readStructPointer(factory, return WireHelpers.readStructPointer(factory,
this.segment, this.segment,
this.pointer, this.pointer,

View file

@ -1,6 +1,13 @@
package org.capnproto; package org.capnproto;
public class StructBuilder { public class StructBuilder {
public interface Factory<T> {
T constructBuilder(SegmentBuilder segment, int data, int pointers, int dataSize,
short pointerCount, byte bit0Offset);
StructSize structSize();
}
protected final SegmentBuilder segment; protected final SegmentBuilder segment;
protected final int data; // byte offset to data section protected final int data; // byte offset to data section
protected final int pointers; // word offset of pointer section protected final int pointers; // word offset of pointer section

View file

@ -1,7 +1,5 @@
package org.capnproto; package org.capnproto;
public interface StructFactory<Builder, Reader> extends FromStructBuilder<Builder>, FromStructReader<Reader>{ public interface StructFactory<Builder, Reader> extends StructBuilder.Factory<Builder>, StructReader.Factory<Reader>{
public Reader asReader(Builder builder); public Reader asReader(Builder builder);
} }

View file

@ -54,9 +54,9 @@ public final class StructList {
} }
public static final class Reader<T> extends ListReader implements Iterable<T> { public static final class Reader<T> extends ListReader implements Iterable<T> {
public final FromStructReader<T> factory; public final StructReader.Factory<T> factory;
public Reader(FromStructReader<T> factory, public Reader(StructReader.Factory<T> factory,
SegmentReader segment, SegmentReader segment,
int ptr, int ptr,
int elementCount, int step, int elementCount, int step,
@ -95,9 +95,9 @@ public final class StructList {
} }
public static final class Builder<T> extends ListBuilder implements Iterable<T> { public static final class Builder<T> extends ListBuilder implements Iterable<T> {
public final FromStructBuilder<T> factory; public final StructBuilder.Factory<T> factory;
public Builder(FromStructBuilder<T> factory, public Builder(StructBuilder.Factory<T> factory,
SegmentBuilder segment, int ptr, SegmentBuilder segment, int ptr,
int elementCount, int step, int elementCount, int step,
int structDataSize, short structPointerCount){ int structDataSize, short structPointerCount){

View file

@ -2,6 +2,13 @@ package org.capnproto;
public class StructReader { public class StructReader {
public interface Factory<T> {
T constructReader(SegmentReader segment, int data, int pointers,
int dataSize, short pointerCount,
byte bit0Offset, int nestingLimit);
}
protected final SegmentReader segment; protected final SegmentReader segment;
protected final int data; //byte offset to data section protected final int data; //byte offset to data section
protected final int pointers; // word offset of pointer section protected final int pointers; // word offset of pointer section

View file

@ -146,18 +146,18 @@ final class WireHelpers {
} }
static <T> T initStructPointer(FromStructBuilder<T> factory, static <T> T initStructPointer(StructBuilder.Factory<T> factory,
int refOffset, int refOffset,
SegmentBuilder segment, SegmentBuilder segment,
StructSize size) { StructSize size) {
AllocateResult allocation = allocate(refOffset, segment, size.total(), WirePointer.STRUCT); AllocateResult allocation = allocate(refOffset, segment, size.total(), WirePointer.STRUCT);
StructPointer.setFromStructSize(allocation.segment.buffer, allocation.refOffset, size); StructPointer.setFromStructSize(allocation.segment.buffer, allocation.refOffset, size);
return factory.fromStructBuilder(allocation.segment, allocation.ptr * Constants.BYTES_PER_WORD, return factory.constructBuilder(allocation.segment, allocation.ptr * Constants.BYTES_PER_WORD,
allocation.ptr + size.data, allocation.ptr + size.data,
size.data * 64, size.pointers, (byte)0); size.data * 64, size.pointers, (byte)0);
} }
static <T> T getWritableStructPointer(FromStructBuilder<T> factory, static <T> T getWritableStructPointer(StructBuilder.Factory<T> factory,
int refOffset, int refOffset,
SegmentBuilder segment, SegmentBuilder segment,
StructSize size, StructSize size,
@ -181,7 +181,7 @@ final class WireHelpers {
if (oldDataSize < size.data || oldPointerCount < size.pointers) { if (oldDataSize < size.data || oldPointerCount < size.pointers) {
throw new Error("unimplemented"); throw new Error("unimplemented");
} else { } else {
return factory.fromStructBuilder(resolved.segment, resolved.ptr * Constants.BYTES_PER_WORD, return factory.constructBuilder(resolved.segment, resolved.ptr * Constants.BYTES_PER_WORD,
oldPointerSectionOffset, oldDataSize * Constants.BITS_PER_WORD, oldPointerSectionOffset, oldDataSize * Constants.BITS_PER_WORD,
oldPointerCount, (byte)0); oldPointerCount, (byte)0);
} }
@ -435,7 +435,7 @@ final class WireHelpers {
} }
static <T> T readStructPointer(FromStructReader<T> factory, static <T> T readStructPointer(StructReader.Factory<T> factory,
SegmentReader segment, SegmentReader segment,
int refOffset, int refOffset,
SegmentReader defaultSegment, SegmentReader defaultSegment,
@ -444,7 +444,7 @@ final class WireHelpers {
long ref = WirePointer.get(segment.buffer, refOffset); long ref = WirePointer.get(segment.buffer, refOffset);
if (WirePointer.isNull(ref)) { if (WirePointer.isNull(ref)) {
if (defaultSegment == null) { if (defaultSegment == null) {
return factory.fromStructReader(SegmentReader.EMPTY, 0, 0, 0, (short) 0, (byte) 0, 0x7fffffff); return factory.constructReader(SegmentReader.EMPTY, 0, 0, 0, (short) 0, (byte) 0, 0x7fffffff);
} else { } else {
segment = defaultSegment; segment = defaultSegment;
refOffset = defaultOffset; refOffset = defaultOffset;
@ -468,7 +468,7 @@ final class WireHelpers {
// TODO "bounds_check" (read limiting) // TODO "bounds_check" (read limiting)
return factory.fromStructReader(resolved.segment, return factory.constructReader(resolved.segment,
resolved.ptr * Constants.BYTES_PER_WORD, resolved.ptr * Constants.BYTES_PER_WORD,
(resolved.ptr + dataSizeWords), (resolved.ptr + dataSizeWords),
dataSizeWords * Constants.BITS_PER_WORD, dataSizeWords * Constants.BITS_PER_WORD,

View file

@ -5,8 +5,8 @@ import org.scalatest.FunSuite
class LayoutSuite extends FunSuite { class LayoutSuite extends FunSuite {
class BareStructReader extends FromStructReader[StructReader] { class BareStructReader extends StructReader.Factory[StructReader] {
def fromStructReader(segment: org.capnproto.SegmentReader, data: Int, pointers: Int, def constructReader(segment: org.capnproto.SegmentReader, data: Int, pointers: Int,
dataSize: Int, pointerCount: Short, bit0Offset: Byte, nestingLimit:Int) : StructReader = { dataSize: Int, pointerCount: Short, bit0Offset: Byte, nestingLimit:Int) : StructReader = {
return new StructReader(segment,data,pointers,dataSize,pointerCount,bit0Offset,nestingLimit); return new StructReader(segment,data,pointers,dataSize,pointerCount,bit0Offset,nestingLimit);
} }
@ -97,9 +97,9 @@ class LayoutSuite extends FunSuite {
} }
class BareStructBuilder(structSize : StructSize) extends FromStructBuilder[StructBuilder] { class BareStructBuilder(structSize : StructSize) extends StructBuilder.Factory[StructBuilder] {
def fromStructBuilder(segment: org.capnproto.SegmentBuilder, data: Int, pointers: Int, def constructBuilder(segment: org.capnproto.SegmentBuilder, data: Int, pointers: Int,
dataSize: Int, pointerCount: Short, bit0Offset: Byte) : StructBuilder = { dataSize: Int, pointerCount: Short, bit0Offset: Byte) : StructBuilder = {
return new StructBuilder(segment,data,pointers,dataSize,pointerCount,bit0Offset); return new StructBuilder(segment,data,pointers,dataSize,pointerCount,bit0Offset);
} }