summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatransient0/JavaTransient0Generator.java60
1 files changed, 48 insertions, 12 deletions
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) {