From 5f5cb242419a4e38d23d1d0b4c94e50a0e66e6a2 Mon Sep 17 00:00:00 2001 From: David Renshaw Date: Thu, 4 Sep 2014 16:00:14 -0400 Subject: [PATCH] DataList and some StructList tests --- compiler/src/main/cpp/capnpc-java.c++ | 6 +- .../test/scala/org/capnproto/TestUtil.scala | 21 +++++ compiler/src/test/schema/test.capnp | 4 +- .../java/org/capnproto/ArrayInputStream.java | 2 +- .../src/main/java/org/capnproto/DataList.java | 94 +++++++++++++++++++ 5 files changed, 123 insertions(+), 4 deletions(-) create mode 100644 runtime/src/main/java/org/capnproto/DataList.java diff --git a/compiler/src/main/cpp/capnpc-java.c++ b/compiler/src/main/cpp/capnpc-java.c++ index e37b9d8..385f9fa 100644 --- a/compiler/src/main/cpp/capnpc-java.c++ +++ b/compiler/src/main/cpp/capnpc-java.c++ @@ -297,6 +297,7 @@ private: case schema::Type::TEXT: return kj::strTree( "org.capnproto.TextList"); case schema::Type::DATA: + return kj::strTree( "org.capnproto.DataList"); case schema::Type::ENUM: case schema::Type::INTERFACE: case schema::Type::ANY_POINTER: @@ -1049,8 +1050,11 @@ private: case schema::Type::TEXT: primitiveElement = false; fieldSize = kj::str("org.capnproto.FieldSize.POINTER"); - + break; case schema::Type::DATA: + primitiveElement = false; + fieldSize = kj::str("org.capnproto.FieldSize.POINTER"); + break; case schema::Type::LIST: case schema::Type::ANY_POINTER: primitiveElement = false; diff --git a/compiler/src/test/scala/org/capnproto/TestUtil.scala b/compiler/src/test/scala/org/capnproto/TestUtil.scala index f75ad4c..e001a85 100644 --- a/compiler/src/test/scala/org/capnproto/TestUtil.scala +++ b/compiler/src/test/scala/org/capnproto/TestUtil.scala @@ -52,6 +52,11 @@ object TestUtil { textList.set(1, new Text.Reader("xyzzy")); textList.set(2, new Text.Reader("thud")); + val structList = builder.initStructList(3); + structList.get(0).setTextField(new Text.Reader("structlist 1")); + structList.get(1).setTextField(new Text.Reader("structlist 2")); + structList.get(2).setTextField(new Text.Reader("structlist 3")); + } @@ -98,6 +103,15 @@ object TestUtil { assert(textList.get(0).toString() == "plugh"); assert(textList.get(1).toString() == "xyzzy"); assert(textList.get(2).toString() == "thud"); + + /* + val structList = builder.getStructList(); + assert(3 == structList.size()); + assert(structList.get(0).getTextField().toString() == "structlist 1") + assert(structList.get(1).getTextField().toString() == "structlist 2") + assert(structList.get(2).getTextField().toString() == "structlist 3") + */ + } def checkTestMessage(reader : TestAllTypes.Reader) { @@ -144,6 +158,13 @@ object TestUtil { assert(textList.get(1).toString() == "xyzzy"); assert(textList.get(2).toString() == "thud"); + + val structList = reader.getStructList(); + assert(3 == structList.size()); + assert(structList.get(0).getTextField().toString() == "structlist 1") + assert(structList.get(1).getTextField().toString() == "structlist 2") + assert(structList.get(2).getTextField().toString() == "structlist 3") + } diff --git a/compiler/src/test/schema/test.capnp b/compiler/src/test/schema/test.capnp index 56aaff6..5eeff11 100644 --- a/compiler/src/test/schema/test.capnp +++ b/compiler/src/test/schema/test.capnp @@ -47,8 +47,8 @@ struct TestAllTypes { float32List @27 : List(Float32); float64List @28 : List(Float64); textList @29 : List(Text); -# dataList @30 : List(Data); -# structList @31 : List(TestAllTypes); + dataList @30 : List(Data); + structList @31 : List(TestAllTypes); # enumList @32 : List(TestEnum); # interfaceList @33 : List(Void); } diff --git a/runtime/src/main/java/org/capnproto/ArrayInputStream.java b/runtime/src/main/java/org/capnproto/ArrayInputStream.java index 3195f34..ce9da89 100644 --- a/runtime/src/main/java/org/capnproto/ArrayInputStream.java +++ b/runtime/src/main/java/org/capnproto/ArrayInputStream.java @@ -16,7 +16,7 @@ public final class ArrayInputStream implements BufferedInputStream { int available = this.buf.remaining(); int size = dst.remaining(); - ByteBuffer slice = buf.slice(); + ByteBuffer slice = this.buf.slice(); slice.limit(size); dst.put(slice); diff --git a/runtime/src/main/java/org/capnproto/DataList.java b/runtime/src/main/java/org/capnproto/DataList.java new file mode 100644 index 0000000..3063c38 --- /dev/null +++ b/runtime/src/main/java/org/capnproto/DataList.java @@ -0,0 +1,94 @@ +package org.capnproto; + +public final class DataList { + public static final class Reader implements Iterable { + public final ListReader reader; + + public Reader(ListReader reader) { + this.reader = reader; + } + + public int size() { + return this.reader.size(); + } + + public Data.Reader get(int index) { + return this.reader.getPointerElement(index).getData(); + } + + + public final class Iterator implements java.util.Iterator { + public Reader list; + public int idx = 0; + public Iterator(Reader list) { + this.list = list; + } + + public Data.Reader next() { + return this.list.reader.getPointerElement(idx++).getData(); + } + public boolean hasNext() { + return idx < list.size(); + } + public void remove() { + throw new UnsupportedOperationException(); + } + } + + public java.util.Iterator iterator() { + return new Iterator(this); + } + + } + + public static final class Builder implements Iterable { + public final ListBuilder builder; + + public Builder(ListBuilder builder) { + this.builder = builder; + } +/* + // init + Builder(PointerBuilder builder, int size) { + this.builder = builder.initStructList(size, factory.structSize()); + } +*/ + public int size() { + return this.builder.size(); + } + + public final Data.Builder get(int index) { + return this.builder.getPointerElement(index).getData(); + } + + + public final void set(int index, Data.Reader value) { + this.builder.getPointerElement(index).setData(value); + } + + public final class Iterator implements java.util.Iterator { + public Builder list; + public int idx = 0; + public Iterator(Builder list) { + this.list = list; + } + + public Data.Builder next() { + return this.list.builder.getPointerElement(idx++).getData(); + } + public boolean hasNext() { + return this.idx < this.list.size(); + } + public void remove() { + throw new UnsupportedOperationException(); + } + } + + public java.util.Iterator iterator() { + return new Iterator(this); + } + + + } + +}