diff --git a/runtime/src/main/java/org/capnproto/Constants.java b/runtime/src/main/java/org/capnproto/Constants.java index 5ddbe88..8f6cd78 100644 --- a/runtime/src/main/java/org/capnproto/Constants.java +++ b/runtime/src/main/java/org/capnproto/Constants.java @@ -1,6 +1,7 @@ package org.capnproto; final class Constants { + public static final int BITS_PER_BYTE = 8; public static final int BITS_PER_POINTER = 64; public static final int BITS_PER_WORD = 64; public static final int BYTES_PER_WORD = 8; diff --git a/runtime/src/main/java/org/capnproto/ListBuilder.java b/runtime/src/main/java/org/capnproto/ListBuilder.java index 4958b7b..b5882bf 100644 --- a/runtime/src/main/java/org/capnproto/ListBuilder.java +++ b/runtime/src/main/java/org/capnproto/ListBuilder.java @@ -37,4 +37,10 @@ public final class ListBuilder { } + public final PointerBuilder getPointerElement(int index) { + return new PointerBuilder( + this.segment, + (this.ptr + (index * this.step / Constants.BITS_PER_BYTE)) / Constants.BYTES_PER_WORD); + } + } diff --git a/runtime/src/main/java/org/capnproto/ListReader.java b/runtime/src/main/java/org/capnproto/ListReader.java index a63ad60..ee66b17 100644 --- a/runtime/src/main/java/org/capnproto/ListReader.java +++ b/runtime/src/main/java/org/capnproto/ListReader.java @@ -48,4 +48,10 @@ public final class ListReader { return new StructReader(this.segment, structData, structPointers / 8, this.structDataSize, this.structPointerCount, (byte) (indexBit % 8), this.nestingLimit - 1); } + + public PointerReader getPointerElement(int index) { + return new PointerReader(this.segment, + (this.ptr + (index * this.step / Constants.BITS_PER_BYTE)) / Constants.BYTES_PER_WORD, + this.nestingLimit); + } } diff --git a/runtime/src/main/java/org/capnproto/TextList.java b/runtime/src/main/java/org/capnproto/TextList.java new file mode 100644 index 0000000..2a55f2a --- /dev/null +++ b/runtime/src/main/java/org/capnproto/TextList.java @@ -0,0 +1,90 @@ +package org.capnproto; + +public final class TextList { + 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 Text.Reader get(int index) { + return this.reader.getPointerElement(index).getText(); + } + + + public final class Iterator implements java.util.Iterator { + public Reader list; + public int idx = 0; + public Iterator(Reader list) { + this.list = list; + } + + public Text.Reader next() { + return this.list.reader.getPointerElement(idx++).getText(); + } + 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 Text.Builder get(int index) { + return this.builder.getPointerElement(index).getText(); + } + + + public final class Iterator implements java.util.Iterator { + public Builder list; + public int idx = 0; + public Iterator(Builder list) { + this.list = list; + } + + public Text.Builder next() { + return this.list.builder.getPointerElement(idx++).getText(); + } + public boolean hasNext() { + return this.idx < this.list.size(); + } + public void remove() { + throw new UnsupportedOperationException(); + } + } + + public java.util.Iterator iterator() { + return new Iterator(this); + } + + + } + +}