From 837f1b324c52a2433fffda71a2b4ed4f05c1a58e Mon Sep 17 00:00:00 2001 From: Vaci Koblizek Date: Mon, 30 Nov 2020 20:20:53 +0000 Subject: [PATCH] add AnyList --- compiler/src/main/cpp/capnpc-java.c++ | 7 ++- runtime-rpc/src/test/schema/test.capnp | 10 ++-- .../src/main/java/org/capnproto/AnyList.java | 58 +++++++++++++++++++ 3 files changed, 69 insertions(+), 6 deletions(-) create mode 100644 runtime/src/main/java/org/capnproto/AnyList.java diff --git a/compiler/src/main/cpp/capnpc-java.c++ b/compiler/src/main/cpp/capnpc-java.c++ index 49bc4a9..c8e6bdd 100644 --- a/compiler/src/main/cpp/capnpc-java.c++ +++ b/compiler/src/main/cpp/capnpc-java.c++ @@ -414,6 +414,8 @@ private: return kj::strTree("org.capnproto.Capability.", suffix); case schema::Type::AnyPointer::Unconstrained::STRUCT: return kj::strTree("org.capnproto.AnyStruct.", suffix); + case schema::Type::AnyPointer::Unconstrained::LIST: + return kj::strTree("org.capnproto.AnyList.", suffix); default: return kj::strTree("org.capnproto.AnyPointer.", suffix); } @@ -781,6 +783,8 @@ private: return kj::str("org.capnproto.Capability.factory"); case schema::Type::AnyPointer::Unconstrained::STRUCT: return kj::str("org.capnproto.AnyStruct.factory"); + case schema::Type::AnyPointer::Unconstrained::LIST: + return kj::str("org.capnproto.AnyList.factory"); default: return kj::str("org.capnproto.AnyPointer.factory"); } @@ -1042,7 +1046,8 @@ private: kind = FieldKind::ANY_POINTER; break; case schema::Type::AnyPointer::Unconstrained::LIST: - kind = FieldKind::LIST; + kind = FieldKind::ANY_POINTER; + break; case schema::Type::AnyPointer::Unconstrained::CAPABILITY: kind = FieldKind::INTERFACE; break; diff --git a/runtime-rpc/src/test/schema/test.capnp b/runtime-rpc/src/test/schema/test.capnp index cd317a9..06e7a18 100644 --- a/runtime-rpc/src/test/schema/test.capnp +++ b/runtime-rpc/src/test/schema/test.capnp @@ -60,11 +60,11 @@ struct TestAnyPointer { # in the struct. } -#struct TestAnyOthers { -# anyStructField @0 :AnyStruct; -# anyListField @1 :AnyList; -# capabilityField @2 :Capability; -#} +struct TestAnyOthers { + anyStructField @0 :AnyStruct; + anyListField @1 :AnyList; + capabilityField @2 :Capability; +} struct TestOutOfOrder { foo @3 :Text; diff --git a/runtime/src/main/java/org/capnproto/AnyList.java b/runtime/src/main/java/org/capnproto/AnyList.java new file mode 100644 index 0000000..5524594 --- /dev/null +++ b/runtime/src/main/java/org/capnproto/AnyList.java @@ -0,0 +1,58 @@ +package org.capnproto; + +public class AnyList { + + public static final class Factory extends ListFactory { + + Factory() { + super(ElementSize.VOID); + } + + public final Reader asReader(Builder builder) { + return builder.asReader(); + } + + @Override + public Builder constructBuilder(SegmentBuilder segment, int ptr, int elementCount, int step, int structDataSize, short structPointerCount) { + return new Builder(segment, ptr, elementCount, step, structDataSize, structPointerCount); + } + + @Override + public Reader constructReader(SegmentReader segment, int ptr, int elementCount, int step, int structDataSize, short structPointerCount, int nestingLimit) { + return new Reader(segment, ptr, elementCount, step, structDataSize, structPointerCount, nestingLimit); + } + } + + public static final Factory factory = new Factory(); + + public static final ListList.Factory listFactory = + new ListList.Factory<>(factory); + + public static final class Builder extends ListBuilder { + Builder(SegmentBuilder segment, int ptr, int elementCount, int step, int structDataSize, short structPointerCount){ + super(segment, ptr, elementCount, step, structDataSize, structPointerCount); + } + + public final Reader asReader() { + return new Reader(this.segment, this.ptr, this.elementCount, this.step, this.structDataSize, this.structPointerCount, 0x7fffffff); + } + + public final T initAs(Factory factory) { + return factory.constructBuilder(this.segment, this.ptr, this.elementCount, this.step, this.structDataSize, this.structPointerCount); + } + + public final T setAs(Factory factory) { + return factory.constructBuilder(this.segment, this.ptr, this.elementCount, this.step, this.structDataSize, this.structPointerCount); + } + } + + public static final class Reader extends ListReader { + Reader(SegmentReader segment, int ptr, int elementCount, int step, int structDataSize, short structPointerCount, int nestingLimit){ + super(segment, ptr, elementCount, step, structDataSize, structPointerCount, nestingLimit); + } + + public final T getAs(Factory factory) { + return factory.constructReader(this.segment, this.ptr, this.elementCount, this.step, this.structDataSize, this.structPointerCount, this.nestingLimit); + } + } +}