FromStructReader -> StructReader.Factory
This commit is contained in:
parent
3aefbb76e0
commit
b4f34cb393
17 changed files with 55 additions and 59 deletions
|
@ -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;
|
||||||
|
|
|
@ -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",
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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();
|
|
||||||
}
|
|
|
@ -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);
|
|
||||||
}
|
|
|
@ -85,17 +85,17 @@ 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,
|
||||||
this.structPointerCount,
|
this.structPointerCount,
|
||||||
(byte)(indexBit % 8));
|
(byte)(indexBit % 8));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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,8 +74,8 @@ 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);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected PointerReader _getPointerElement(int index) {
|
protected PointerReader _getPointerElement(int index) {
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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 */);
|
||||||
|
|
|
@ -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());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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){
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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,9 +181,9 @@ 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,
|
||||||
|
|
|
@ -5,9 +5,9 @@ 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);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue