add StructList.newFactory method, allowing type parameters to be inferred

This commit is contained in:
David Renshaw 2020-05-12 23:29:16 -04:00
parent 29cf713fa5
commit 4cc34896b4
3 changed files with 29 additions and 17 deletions

View file

@ -46,6 +46,15 @@
<build> <build>
<plugins> <plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.3</version>
<configuration>
<compilerArgument>-Xlint:unchecked</compilerArgument>
</configuration>
</plugin>
<plugin> <plugin>
<artifactId>maven-antrun-plugin</artifactId> <artifactId>maven-antrun-plugin</artifactId>
<version>3.0.0</version> <version>3.0.0</version>

View file

@ -204,9 +204,7 @@ public class EncodingTest {
segment.order(java.nio.ByteOrder.LITTLE_ENDIAN); segment.order(java.nio.ByteOrder.LITTLE_ENDIAN);
MessageReader messageReader = new MessageReader(new ByteBuffer[]{segment}, ReaderOptions.DEFAULT_READER_OPTIONS); MessageReader messageReader = new MessageReader(new ByteBuffer[]{segment}, ReaderOptions.DEFAULT_READER_OPTIONS);
StructList.Factory<Test.TestOldVersion.Builder, Test.TestOldVersion.Reader> oldFactory = StructList.Reader<Test.TestOldVersion.Reader> oldVersion = messageReader.getRoot(StructList.newFactory(Test.TestOldVersion.factory));
new StructList.Factory(Test.TestOldVersion.factory);
StructList.Reader<Test.TestOldVersion.Reader> oldVersion = messageReader.getRoot(oldFactory);
Assert.assertEquals(oldVersion.size(), 1); Assert.assertEquals(oldVersion.size(), 1);
Assert.assertEquals(oldVersion.get(0).getOld1(), 91); Assert.assertEquals(oldVersion.get(0).getOld1(), 91);
@ -215,15 +213,14 @@ public class EncodingTest {
// Make the first segment exactly large enough to fit the original message. // Make the first segment exactly large enough to fit the original message.
// This leaves no room for a far pointer landing pad in the first segment. // This leaves no room for a far pointer landing pad in the first segment.
MessageBuilder message = new MessageBuilder(6); MessageBuilder message = new MessageBuilder(6);
message.setRoot(oldFactory, oldVersion); message.setRoot(StructList.newFactory(Test.TestOldVersion.factory), oldVersion);
ByteBuffer[] segments = message.getSegmentsForOutput(); ByteBuffer[] segments = message.getSegmentsForOutput();
Assert.assertEquals(segments.length, 1); Assert.assertEquals(segments.length, 1);
Assert.assertEquals(segments[0].limit(), 6 * 8); Assert.assertEquals(segments[0].limit(), 6 * 8);
StructList.Factory<Test.TestNewVersion.Builder, Test.TestNewVersion.Reader> newFactory = StructList.Builder<Test.TestNewVersion.Builder> newVersion =
new StructList.Factory(Test.TestNewVersion.factory); message.getRoot(new StructList.Factory<Test.TestNewVersion.Builder, Test.TestNewVersion.Reader>(Test.TestNewVersion.factory));
StructList.Builder<Test.TestNewVersion.Builder> newVersion = message.getRoot(newFactory);
Assert.assertEquals(newVersion.size(), 1); Assert.assertEquals(newVersion.size(), 1);
Assert.assertEquals(newVersion.get(0).getOld1(), 91); Assert.assertEquals(newVersion.get(0).getOld1(), 91);
Assert.assertEquals(newVersion.get(0).getOld2().toString(), "hello!!"); Assert.assertEquals(newVersion.get(0).getOld2().toString(), "hello!!");
@ -318,7 +315,7 @@ public class EncodingTest {
structList2.get(2).setInt16Field((short)4444); structList2.get(2).setInt16Field((short)4444);
ListList.Reader<StructList.Reader<Test.TestAllTypes.Reader>> structListListReader = ListList.Reader<StructList.Reader<Test.TestAllTypes.Reader>> structListListReader =
structListList.asReader(new StructList.Factory(Test.TestAllTypes.factory)); structListList.asReader(StructList.newFactory(Test.TestAllTypes.factory));
Assert.assertEquals(structListListReader.size(), 3); Assert.assertEquals(structListListReader.size(), 3);
StructList.Reader<Test.TestAllTypes.Reader> structList0Reader = structListListReader.get(0); StructList.Reader<Test.TestAllTypes.Reader> structList0Reader = structListListReader.get(0);
Assert.assertEquals(structList0Reader.size(), 1); Assert.assertEquals(structList0Reader.size(), 1);
@ -334,9 +331,9 @@ public class EncodingTest {
@org.junit.Test @org.junit.Test
public void testGenerics() { public void testGenerics() {
MessageBuilder message = new MessageBuilder(); MessageBuilder message = new MessageBuilder();
Test.TestGenerics.Factory factory = Test.TestGenerics.newFactory(Test.TestAllTypes.factory, Text.factory);
Test.TestGenerics.Builder<Test.TestAllTypes.Builder, Text.Builder> root = (Test.TestGenerics.Builder<Test.TestAllTypes.Builder, Text.Builder>) message.initRoot(factory); Test.TestGenerics.Builder<Test.TestAllTypes.Builder, Text.Builder> root =
(Test.TestGenerics.Builder<Test.TestAllTypes.Builder, Text.Builder>) message.initRoot(Test.TestGenerics.newFactory(Test.TestAllTypes.factory, Text.factory));
TestUtil.initTestMessage(root.getFoo()); TestUtil.initTestMessage(root.getFoo());
root.getDub().setFoo(Text.factory, new Text.Reader("Hello")); root.getDub().setFoo(Text.factory, new Text.Reader("Hello"));
@ -349,7 +346,8 @@ public class EncodingTest {
boolList.set(1, true); boolList.set(1, true);
TestUtil.checkTestMessage(root.getFoo()); TestUtil.checkTestMessage(root.getFoo());
Test.TestGenerics.Reader<Test.TestAllTypes.Reader, Text.Reader> rootReader = root.asReader(factory); Test.TestGenerics.Reader<Test.TestAllTypes.Reader, Text.Reader> rootReader =
root.asReader(Test.TestGenerics.newFactory(Test.TestAllTypes.factory, Text.factory));
TestUtil.checkTestMessage(rootReader.getFoo()); TestUtil.checkTestMessage(rootReader.getFoo());
Test.TestGenerics.Builder<Text.Builder, PrimitiveList.Byte.Builder> dubReader = root.getDub(); Test.TestGenerics.Builder<Text.Builder, PrimitiveList.Byte.Builder> dubReader = root.getDub();
Assert.assertEquals(dubReader.getFoo().toString(), "Hello"); Assert.assertEquals(dubReader.getFoo().toString(), "Hello");
@ -570,7 +568,7 @@ public class EncodingTest {
MessageReader message = new MessageReader(new ByteBuffer[]{segment}, ReaderOptions.DEFAULT_READER_OPTIONS); MessageReader message = new MessageReader(new ByteBuffer[]{segment}, ReaderOptions.DEFAULT_READER_OPTIONS);
Test.TestAnyPointer.Reader root = message.getRoot(Test.TestAnyPointer.factory); Test.TestAnyPointer.Reader root = message.getRoot(Test.TestAnyPointer.factory);
root.getAnyPointerField().getAs(new StructList.Factory(Test.TestAllTypes.factory)); root.getAnyPointerField().getAs(StructList.newFactory(Test.TestAllTypes.factory));
} }
@org.junit.Test(expected=DecodeException.class) @org.junit.Test(expected=DecodeException.class)
@ -599,21 +597,21 @@ public class EncodingTest {
MessageReader reader = new MessageReader(segments, ReaderOptions.DEFAULT_READER_OPTIONS); MessageReader reader = new MessageReader(segments, ReaderOptions.DEFAULT_READER_OPTIONS);
Test.TestAnyPointer.Reader root = reader.getRoot(Test.TestAnyPointer.factory); Test.TestAnyPointer.Reader root = reader.getRoot(Test.TestAnyPointer.factory);
root.getAnyPointerField().getAs(new StructList.Factory(Test.TestAllTypes.factory)); root.getAnyPointerField().getAs(StructList.newFactory(Test.TestAllTypes.factory));
} }
@org.junit.Test(expected=DecodeException.class) @org.junit.Test(expected=DecodeException.class)
public void testEmptyStructListAmplification() { public void testEmptyStructListAmplification() {
MessageBuilder builder = new MessageBuilder(); MessageBuilder builder = new MessageBuilder();
builder.initRoot(Test.TestAnyPointer.factory).getAnyPointerField() builder.initRoot(Test.TestAnyPointer.factory).getAnyPointerField()
.initAs(new StructList.Factory(Test.TestEmptyStruct.factory), (1 << 29) - 1); .initAs(StructList.newFactory(Test.TestEmptyStruct.factory), (1 << 29) - 1);
ByteBuffer[] segments = builder.getSegmentsForOutput(); ByteBuffer[] segments = builder.getSegmentsForOutput();
Assert.assertEquals(1, segments.length); Assert.assertEquals(1, segments.length);
MessageReader reader = new MessageReader(segments, ReaderOptions.DEFAULT_READER_OPTIONS); MessageReader reader = new MessageReader(segments, ReaderOptions.DEFAULT_READER_OPTIONS);
Test.TestAnyPointer.Reader root = reader.getRoot(Test.TestAnyPointer.factory); Test.TestAnyPointer.Reader root = reader.getRoot(Test.TestAnyPointer.factory);
root.getAnyPointerField().getAs(new StructList.Factory(Test.TestAllTypes.factory)); root.getAnyPointerField().getAs(StructList.newFactory(Test.TestAllTypes.factory));
} }
@org.junit.Test @org.junit.Test
@ -777,11 +775,11 @@ public class EncodingTest {
public void testGenericMap() { public void testGenericMap() {
MessageBuilder builder = new MessageBuilder(); MessageBuilder builder = new MessageBuilder();
Test.GenericMap.Factory<Text.Builder, Text.Reader, Test.TestAllTypes.Builder, Test.TestAllTypes.Reader> mapFactory Test.GenericMap.Factory<Text.Builder, Text.Reader, Test.TestAllTypes.Builder, Test.TestAllTypes.Reader> mapFactory
= new Test.GenericMap.Factory(Text.factory, Test.TestAllTypes.factory); = Test.GenericMap.newFactory(Text.factory, Test.TestAllTypes.factory);
StructList.Factory<Test.GenericMap.Entry.Builder<Text.Builder, Test.TestAllTypes.Builder>, StructList.Factory<Test.GenericMap.Entry.Builder<Text.Builder, Test.TestAllTypes.Builder>,
Test.GenericMap.Entry.Reader<Text.Reader, Test.TestAllTypes.Reader>> entryFactory Test.GenericMap.Entry.Reader<Text.Reader, Test.TestAllTypes.Reader>> entryFactory
= new StructList.Factory(new Test.GenericMap.Entry.Factory(Text.factory, Test.TestAllTypes.factory)); = StructList.newFactory(Test.GenericMap.Entry.newFactory(Text.factory, Test.TestAllTypes.factory));
Test.GenericMap.Builder<Text.Builder, Test.TestAllTypes.Builder> root = builder.initRoot(mapFactory); Test.GenericMap.Builder<Text.Builder, Test.TestAllTypes.Builder> root = builder.initRoot(mapFactory);

View file

@ -22,6 +22,11 @@
package org.capnproto; package org.capnproto;
public final class StructList { public final class StructList {
public static final <ElementBuilder extends StructBuilder, ElementReader extends StructReader> Factory<ElementBuilder, ElementReader>
newFactory(StructFactory<ElementBuilder, ElementReader> factory) {
return new Factory<ElementBuilder, ElementReader>(factory);
}
public static final class Factory<ElementBuilder extends StructBuilder, ElementReader extends StructReader> public static final class Factory<ElementBuilder extends StructBuilder, ElementReader extends StructReader>
extends ListFactory<Builder<ElementBuilder>, Reader<ElementReader>> { extends ListFactory<Builder<ElementBuilder>, Reader<ElementReader>> {