diff options
7 files changed, 79 insertions, 5 deletions
diff --git a/examples/14-transient-0/output/java/src/test/java/org/zwobble/example/Transient0Tests.java b/examples/14-transient-0/output/java/src/test/java/org/zwobble/example/Transient0Tests.java index 8161920..6732f72 100644 --- a/examples/14-transient-0/output/java/src/test/java/org/zwobble/example/Transient0Tests.java +++ b/examples/14-transient-0/output/java/src/test/java/org/zwobble/example/Transient0Tests.java @@ -17,6 +17,7 @@ import org.junit.jupiter.api.Test; import org.zwobble.example.types.data.EnumWithVariants; import org.zwobble.example.types.data.StructSingleton; import org.zwobble.example.types.data.StructWithBool; +import org.zwobble.example.types.data.StructWithBox; import org.zwobble.example.types.data.StructWithDifferentSharedTypes; import org.zwobble.example.types.data.StructWithEnum; import org.zwobble.example.types.data.StructWithInt8; @@ -257,6 +258,20 @@ public class Transient0Tests { } @Test + public void structWithBox() throws IOException { + var value = new StructWithBox( + new StructWithInt32(10, 25) + ); + + assertRoundTripEncoding( + "StructWithBox", + value, + HobgoblinTransient0Data::encodeStructWithBox, + HobgoblinTransient0Data::decodeStructWithBox + ); + } + + @Test public void structWithListOfShared() throws IOException { var a = new StructWithInt32(10, 25); var b = new StructWithInt32(42, 47); diff --git a/examples/14-transient-0/output/rust/src/gen/data.rs b/examples/14-transient-0/output/rust/src/gen/data.rs index 77bcbe8..d4847ec 100644 --- a/examples/14-transient-0/output/rust/src/gen/data.rs +++ b/examples/14-transient-0/output/rust/src/gen/data.rs @@ -117,6 +117,11 @@ pub struct StructWithSum { } #[derive(Clone, Debug, Hash, PartialEq)] +pub struct StructWithBox { + pub inner: ::std::boxed::Box::<crate::data::StructWithInt32>, +} + +#[derive(Clone, Debug, Hash, PartialEq)] pub struct StructWithListOfShared { pub inner: ::std::vec::Vec::<::std::sync::Arc::<crate::data::StructWithInt32>>, } diff --git a/examples/14-transient-0/output/rust/src/gen/data/transient_0.rs b/examples/14-transient-0/output/rust/src/gen/data/transient_0.rs index f2bf149..0c8efd3 100644 --- a/examples/14-transient-0/output/rust/src/gen/data/transient_0.rs +++ b/examples/14-transient-0/output/rust/src/gen/data/transient_0.rs @@ -264,6 +264,16 @@ pub fn decode_struct_with_sum(reader: &mut impl std::io::Read, shared_values: &m ::std::io::Result::Ok(crate::data::StructWithSum { inner: inner, b: b }) } +pub fn encode_struct_with_box(value: &crate::data::StructWithBox, writer: &mut impl std::io::Write, shared_values: &mut ::std::collections::HashMap::<::core::primitive::usize, ::core::primitive::i64>) -> ::std::io::Result::<()> { + crate::data::transient_0::encode_struct_with_int_32((&value.inner).as_ref(), writer, shared_values)?; + ::std::io::Result::Ok(()) +} + +pub fn decode_struct_with_box(reader: &mut impl std::io::Read, shared_values: &mut ::std::vec::Vec::<::std::sync::Arc::<dyn ::std::any::Any + ::std::marker::Sync + ::std::marker::Send>>) -> ::std::io::Result::<crate::data::StructWithBox> { + let inner = ::std::boxed::Box::new(crate::data::transient_0::decode_struct_with_int_32(reader, shared_values)?); + ::std::io::Result::Ok(crate::data::StructWithBox { inner: inner }) +} + pub fn encode_struct_with_list_of_shared(value: &crate::data::StructWithListOfShared, writer: &mut impl std::io::Write, shared_values: &mut ::std::collections::HashMap::<::core::primitive::usize, ::core::primitive::i64>) -> ::std::io::Result::<()> { { crate::transient_0::encode_int_64(&(((&value.inner).len()).try_into()).map_err(|error| ::std::io::Error::new(::std::io::ErrorKind::InvalidData, error))?, writer, shared_values)?; diff --git a/examples/14-transient-0/output/rust/src/lib.rs b/examples/14-transient-0/output/rust/src/lib.rs index df50cae..f0f6e24 100644 --- a/examples/14-transient-0/output/rust/src/lib.rs +++ b/examples/14-transient-0/output/rust/src/lib.rs @@ -8,7 +8,7 @@ mod test { use std::path::PathBuf; use std::sync::Arc; use std::collections::HashMap; - use super::data::{EnumWithVariants, StructSingleton, StructWithBool, StructWithDifferentSharedTypes, StructWithEnum, StructWithInt8, StructWithInt32, StructWithInt64, StructWithList, StructWithListOfShared, StructWithOption, StructWithSharedSumAndVariant, StructWithString, StructWithStruct, StructWithSum, SumWithBoxedVariants, SumWithVariants, VariantOne, VariantTwo }; + use super::data::{EnumWithVariants, StructSingleton, StructWithBool, StructWithBox, StructWithDifferentSharedTypes, StructWithEnum, StructWithInt8, StructWithInt32, StructWithInt64, StructWithList, StructWithListOfShared, StructWithOption, StructWithSharedSumAndVariant, StructWithString, StructWithStruct, StructWithSum, SumWithBoxedVariants, SumWithVariants, VariantOne, VariantTwo }; #[test] fn struct_singleton() { @@ -229,6 +229,20 @@ mod test { } #[test] + fn struct_with_box() { + let value = StructWithBox { + inner: Box::new(StructWithInt32 { a: 10, b: 25 }), + }; + + assert_round_trip_encoding( + "StructWithBox", + value, + super::data::transient_0::encode_struct_with_box, + super::data::transient_0::decode_struct_with_box, + ); + } + + #[test] fn struct_with_list_of_shared() { let a = Arc::new(StructWithInt32 { a: 10, b: 25 }); let b = Arc::new(StructWithInt32 { a: 42, b: 47 }); diff --git a/examples/14-transient-0/src/data.hob b/examples/14-transient-0/src/data.hob index 0744b79..2bcc6be 100644 --- a/examples/14-transient-0/src/data.hob +++ b/examples/14-transient-0/src/data.hob @@ -76,6 +76,10 @@ struct StructWithSum { field b: Int32; } +struct StructWithBox { + field inner: Box[StructWithInt32]; +} + struct StructWithListOfShared { field inner: List[Shared[StructWithInt32]]; } 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 dd81f99..e27c606 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 @@ -701,7 +701,9 @@ public class JavaTransient0Generator implements Generator { private List<JavaBlockStatement> generateEncode(JavaExpression value, Type type) { return switch (type) { case ConstructedNativeType constructedNativeType -> { - if (constructedNativeType.constructor().equals(NativeTypes.LIST)) { + if (constructedNativeType.constructor().equals(NativeTypes.BOX)) { + yield generateEncode(value, constructedNativeType.args().getFirst()); + } else if (constructedNativeType.constructor().equals(NativeTypes.LIST)) { yield generateEncodeList(value, constructedNativeType.args().getFirst()); } else if (constructedNativeType.constructor().equals(NativeTypes.OPTION)) { yield generateEncodeOption(value, constructedNativeType.args().getFirst()); @@ -775,7 +777,9 @@ public class JavaTransient0Generator implements Generator { private List<JavaBlockStatement> generateDecode(JavaIdentifier target, Type type) { return switch (type) { case ConstructedNativeType constructedNativeType -> { - if (constructedNativeType.constructor().equals(NativeTypes.LIST)) { + if (constructedNativeType.constructor().equals(NativeTypes.BOX)) { + yield generateDecode(target, constructedNativeType.args().getFirst()); + } else if (constructedNativeType.constructor().equals(NativeTypes.LIST)) { yield generateDecodeList(target, constructedNativeType.args().getFirst()); } else if (constructedNativeType.constructor().equals(NativeTypes.OPTION)) { yield generateDecodeOption(target, constructedNativeType.args().getFirst()); diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rusttransient0/RustTransient0Generator.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rusttransient0/RustTransient0Generator.java index ea1949d..981e02b 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rusttransient0/RustTransient0Generator.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rusttransient0/RustTransient0Generator.java @@ -578,7 +578,9 @@ public class RustTransient0Generator implements Generator { private RustStatement generateEncode(RustExpression value, Type type) { return switch (type) { case ConstructedNativeType constructedNativeType -> { - if (constructedNativeType.constructor().equals(NativeTypes.LIST)) { + if (constructedNativeType.constructor().equals(NativeTypes.BOX)) { + yield generateEncodeBox(value, constructedNativeType.args().getFirst()); + } else if (constructedNativeType.constructor().equals(NativeTypes.LIST)) { yield generateEncodeList(value, constructedNativeType.args().getFirst()); } else if (constructedNativeType.constructor().equals(NativeTypes.OPTION)) { yield generateEncodeOption(value, constructedNativeType.args().getFirst()); @@ -618,7 +620,9 @@ public class RustTransient0Generator implements Generator { private RustExpression generateDecode(Type type) { return switch (type) { case ConstructedNativeType constructedNativeType -> { - if (constructedNativeType.constructor().equals(NativeTypes.LIST)) { + if (constructedNativeType.constructor().equals(NativeTypes.BOX)) { + yield generateDecodeBox(constructedNativeType.args().getFirst()); + } else if (constructedNativeType.constructor().equals(NativeTypes.LIST)) { yield generateDecodeList(constructedNativeType.args().getFirst()); } else if (constructedNativeType.constructor().equals(NativeTypes.OPTION)) { yield generateDecodeOption(constructedNativeType.args().getFirst()); @@ -685,6 +689,24 @@ public class RustTransient0Generator implements Generator { )); } + private RustStatement generateEncodeBox(RustExpression value, Type elementType) { + return generateEncode( + methodCall( + value, + RustIdentifier.of("as_ref"), + List.of() + ), + elementType + ); + } + + private RustExpression generateDecodeBox(Type elementType) { + return new RustCallExpression( + RustTypes.BOX.addSegment(RustPathSegment.of("new")), + List.of(generateDecode(elementType)) + ); + } + private RustStatement generateEncodeList(RustExpression value, Type elementType) { var element = RustIdentifier.of("element"); |
