diff options
Diffstat (limited to 'src/main/java/org/zwobble')
| -rw-r--r-- | src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatransient0/JavaTransient0Generator.java | 60 |
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) { |
