summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--examples/10-transient-0/output/java-junit/src/test/java/org/zwobble/example/Transient0Tests.java15
-rw-r--r--examples/10-transient-0/src/data.hob5
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatransient0/JavaTransient0Generator.java60
3 files changed, 68 insertions, 12 deletions
diff --git a/examples/10-transient-0/output/java-junit/src/test/java/org/zwobble/example/Transient0Tests.java b/examples/10-transient-0/output/java-junit/src/test/java/org/zwobble/example/Transient0Tests.java
index 09a23a3..ff5ca5b 100644
--- a/examples/10-transient-0/output/java-junit/src/test/java/org/zwobble/example/Transient0Tests.java
+++ b/examples/10-transient-0/output/java-junit/src/test/java/org/zwobble/example/Transient0Tests.java
@@ -6,11 +6,26 @@ import java.io.IOException;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.zwobble.example.types.data.HobgoblinTransient0Data;
+import org.zwobble.example.types.data.StructWithBool;
import org.zwobble.example.types.data.StructWithInt32;
import org.zwobble.example.types.data.StructWithInt64;
public class Transient0Tests {
@Test
+ public void structWithBool() throws IOException {
+ var value = new StructWithBool(true, false);
+
+ var outputStream = new ByteArrayOutputStream();
+ HobgoblinTransient0Data.encodeStructWithBool(value, outputStream);
+ var bytes = outputStream.toByteArray();
+
+ var inputStream = new ByteArrayInputStream(bytes);
+ var decodedValue = HobgoblinTransient0Data.decodeStructWithBool(inputStream);
+
+ Assertions.assertEquals(value, decodedValue);
+ }
+
+ @Test
public void structWithInt32() throws IOException {
var value = new StructWithInt32(10, 25);
diff --git a/examples/10-transient-0/src/data.hob b/examples/10-transient-0/src/data.hob
index f3343f2..d2ad016 100644
--- a/examples/10-transient-0/src/data.hob
+++ b/examples/10-transient-0/src/data.hob
@@ -1,3 +1,8 @@
+struct StructWithBool {
+ field a: Bool;
+ field b: Bool;
+}
+
struct StructWithInt32 {
field a: Int32;
field b: Int32;
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatransient0/JavaTransient0Generator.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatransient0/JavaTransient0Generator.java
index a8bacbf..6d0a6c9 100644
--- a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatransient0/JavaTransient0Generator.java
+++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatransient0/JavaTransient0Generator.java
@@ -200,7 +200,9 @@ public class JavaTransient0Generator implements Generator {
}
case SimpleNativeType simpleNativeType -> {
- if (simpleNativeType.equals(NativeTypes.INT_32)) {
+ if (simpleNativeType.equals(NativeTypes.BOOL)) {
+ yield generateEncodeBool(value);
+ } else if (simpleNativeType.equals(NativeTypes.INT_32)) {
yield generateEncodeInt32(value);
} else if (simpleNativeType.equals(NativeTypes.INT_64)) {
yield generateEncodeInt64(value);
@@ -246,7 +248,9 @@ public class JavaTransient0Generator implements Generator {
}
case SimpleNativeType simpleNativeType -> {
- if (simpleNativeType.equals(NativeTypes.INT_32)) {
+ if (simpleNativeType.equals(NativeTypes.BOOL)) {
+ yield generateDecodeBool(target);
+ } else if (simpleNativeType.equals(NativeTypes.INT_32)) {
yield generateDecodeInt32(target);
} else if (simpleNativeType.equals(NativeTypes.INT_64)) {
yield generateDecodeInt64(target);
@@ -283,6 +287,30 @@ public class JavaTransient0Generator implements Generator {
};
}
+ private static Stream<JavaBlockStatement> generateEncodeBool(JavaExpression value) {
+ return Stream.of(
+ new JavaExpressionStatement(generateOutputStreamWrite(new JavaTernaryConditional(
+ value,
+ new JavaIntegerLiteral(1),
+ new JavaIntegerLiteral(0)
+ ))
+ ));
+ }
+
+ private static Stream<JavaBlockStatement> generateDecodeBool(JavaIdentifier target) {
+ return Stream.of(
+ new JavaLocalVariableDeclaration(
+ Optional.empty(),
+ target,
+ new JavaBinaryOperation(
+ JavaBinaryOperator.NOT_EQUAL_TO,
+ generateInputStreamRead(),
+ new JavaIntegerLiteral(0)
+ )
+ )
+ );
+ }
+
private static Stream<JavaBlockStatement> generateEncodeInt32(JavaExpression value) {
return generateEncodeInt(value, 32);
}
@@ -324,11 +352,7 @@ public class JavaTransient0Generator implements Generator {
}
return new JavaExpressionStatement(
- new JavaMethodCall(
- new JavaRef(OUTPUT_STREAM_NAME),
- JavaIdentifier.of("write"),
- List.of(byteToWrite)
- )
+ generateOutputStreamWrite(byteToWrite)
);
});
}
@@ -358,11 +382,7 @@ public class JavaTransient0Generator implements Generator {
new JavaRef(target),
new JavaBinaryOperation(
JavaBinaryOperator.LEFT_SHIFT,
- new JavaMethodCall(
- new JavaRef(INPUT_STREAM_NAME),
- JavaIdentifier.of("read"),
- List.of()
- ),
+ generateInputStreamRead(),
new JavaIntegerLiteral(shiftBy)
)
)
@@ -372,6 +392,22 @@ public class JavaTransient0Generator implements Generator {
return statements.stream();
}
+ private static JavaMethodCall generateOutputStreamWrite(JavaExpression byteToWrite) {
+ return new JavaMethodCall(
+ new JavaRef(OUTPUT_STREAM_NAME),
+ JavaIdentifier.of("write"),
+ List.of(byteToWrite)
+ );
+ }
+
+ private static JavaMethodCall generateInputStreamRead() {
+ return new JavaMethodCall(
+ new JavaRef(INPUT_STREAM_NAME),
+ JavaIdentifier.of("read"),
+ List.of()
+ );
+ }
+
/// For an integer of the given number of bits, find the indices of each
/// byte in bits.
private static IntStream byteIndicesInBits(int bits) {