aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2026-03-22 18:25:49 +0000
committerMichael Williamson <mike@zwobble.org>2026-03-22 18:25:49 +0000
commit0a6b38ca7ee956cab5818c195856d5c159966f7a (patch)
tree760bb0e88b5e83a2a44826ed032d580e334fd82a /src/main/java/org
parented1c39334aaf4635119532e9ba6098a46843321a (diff)
Serialize Patio data values to flatbuffers
Diffstat (limited to 'src/main/java/org')
-rw-r--r--src/main/java/org/shedlang/compiler/patio/serialization/PatioToFlatbuffers.java171
1 files changed, 171 insertions, 0 deletions
diff --git a/src/main/java/org/shedlang/compiler/patio/serialization/PatioToFlatbuffers.java b/src/main/java/org/shedlang/compiler/patio/serialization/PatioToFlatbuffers.java
index 6e5545a5..7eaae88e 100644
--- a/src/main/java/org/shedlang/compiler/patio/serialization/PatioToFlatbuffers.java
+++ b/src/main/java/org/shedlang/compiler/patio/serialization/PatioToFlatbuffers.java
@@ -323,6 +323,177 @@ public class PatioToFlatbuffers {
};
}
+ // == Data values ==
+
+ public static int serializeDataValue(FlatBufferBuilder builder, PatioDataValue value) {
+ return switch (value) {
+ case PatioDataValueArray array -> {
+ var elementLayoutFbs = serializeDataLayout(builder, array.elementLayout());
+
+ var elementsOffsetsFbs = array.elements().stream()
+ .mapToInt(element -> serializeDataValue(builder, element))
+ .toArray();
+ var elementsVectorFbs = PatioDataValueArrayFbs.createElementsVector(builder, elementsOffsetsFbs);
+
+ PatioDataValueArrayFbs.startPatioDataValueArrayFbs(builder);
+ PatioDataValueArrayFbs.addElementLayout(builder, elementLayoutFbs);
+ PatioDataValueArrayFbs.addElements(builder, elementsVectorFbs);
+ var arrayFbs = PatioDataValueArrayFbs.endPatioDataValueArrayFbs(builder);
+
+ PatioDataValueFbs.startPatioDataValueFbs(builder);
+ PatioDataValueFbs.addValueType(builder, PatioDataValueValueFbs.PatioDataValueArrayFbs);
+ PatioDataValueFbs.addValue(builder, arrayFbs);
+ yield PatioDataValueFbs.endPatioDataValueFbs(builder);
+ }
+
+ case PatioDataValueBool bool -> {
+ PatioDataValueBoolFbs.startPatioDataValueBoolFbs(builder);
+ PatioDataValueBoolFbs.addValue(builder, bool.value());
+ var boolFbs = PatioDataValueBoolFbs.endPatioDataValueBoolFbs(builder);
+
+ PatioDataValueFbs.startPatioDataValueFbs(builder);
+ PatioDataValueFbs.addValueType(builder, PatioDataValueValueFbs.PatioDataValueBoolFbs);
+ PatioDataValueFbs.addValue(builder, boolFbs);
+ yield PatioDataValueFbs.endPatioDataValueFbs(builder);
+ }
+
+ case PatioDataValueByte byte_ -> {
+ PatioDataValueByteFbs.startPatioDataValueByteFbs(builder);
+ PatioDataValueByteFbs.addValue(builder, byte_.value());
+ var byteFbs = PatioDataValueByteFbs.endPatioDataValueByteFbs(builder);
+
+ PatioDataValueFbs.startPatioDataValueFbs(builder);
+ PatioDataValueFbs.addValueType(builder, PatioDataValueValueFbs.PatioDataValueByteFbs);
+ PatioDataValueFbs.addValue(builder, byteFbs);
+ yield PatioDataValueFbs.endPatioDataValueFbs(builder);
+ }
+
+ case PatioDataValueDataPtr dataPtr -> {
+ var dataPtrValueFbs = serializeDataPtrValue(builder, dataPtr.value());
+
+ PatioDataValueDataPtrFbs.startPatioDataValueDataPtrFbs(builder);
+ PatioDataValueDataPtrFbs.addValue(builder, dataPtrValueFbs);
+ var dataPtrFbs = PatioDataValueDataPtrFbs.endPatioDataValueDataPtrFbs(builder);
+
+ PatioDataValueFbs.startPatioDataValueFbs(builder);
+ PatioDataValueFbs.addValueType(builder, PatioDataValueValueFbs.PatioDataValueDataPtrFbs);
+ PatioDataValueFbs.addValue(builder, dataPtrFbs);
+ yield PatioDataValueFbs.endPatioDataValueFbs(builder);
+ }
+
+ case PatioDataValueInt int_ -> {
+ var intValueFbs = serializeIntValue(builder, int_.value());
+
+ PatioDataValueIntFbs.startPatioDataValueIntFbs(builder);
+ PatioDataValueIntFbs.addValue(builder, intValueFbs);
+ var intFbs = PatioDataValueIntFbs.endPatioDataValueIntFbs(builder);
+
+ PatioDataValueFbs.startPatioDataValueFbs(builder);
+ PatioDataValueFbs.addValueType(builder, PatioDataValueValueFbs.PatioDataValueIntFbs);
+ PatioDataValueFbs.addValue(builder, intFbs);
+ yield PatioDataValueFbs.endPatioDataValueFbs(builder);
+ }
+
+ case PatioDataValueInt32 int32 -> {
+ var intValueFbs = serializeIntValue(builder, int32.value());
+
+ PatioDataValueInt32Fbs.startPatioDataValueInt32Fbs(builder);
+ PatioDataValueInt32Fbs.addValue(builder, intValueFbs);
+ var int32Fbs = PatioDataValueInt32Fbs.endPatioDataValueInt32Fbs(builder);
+
+ PatioDataValueFbs.startPatioDataValueFbs(builder);
+ PatioDataValueFbs.addValueType(builder, PatioDataValueValueFbs.PatioDataValueInt32Fbs);
+ PatioDataValueFbs.addValue(builder, int32Fbs);
+ yield PatioDataValueFbs.endPatioDataValueFbs(builder);
+ }
+
+ case PatioDataValueStruct struct -> {
+ var elementsOffsetsFbs = struct.elements().stream()
+ .mapToInt(element -> serializeDataValue(builder, element))
+ .toArray();
+ var elementsVectorFbs = PatioDataValueStructFbs.createElementsVector(builder, elementsOffsetsFbs);
+
+ PatioDataValueStructFbs.startPatioDataValueStructFbs(builder);
+ PatioDataValueStructFbs.addElements(builder, elementsVectorFbs);
+ var structFbs = PatioDataValueStructFbs.endPatioDataValueStructFbs(builder);
+
+ PatioDataValueFbs.startPatioDataValueFbs(builder);
+ PatioDataValueFbs.addValueType(builder, PatioDataValueValueFbs.PatioDataValueStructFbs);
+ PatioDataValueFbs.addValue(builder, structFbs);
+ yield PatioDataValueFbs.endPatioDataValueFbs(builder);
+ }
+ };
+ }
+
+ public static PatioDataValue deserializeDataValue(PatioDataValueFbs valueFbs) {
+ return switch (valueFbs.valueType()) {
+ case PatioDataValueValueFbs.PatioDataValueArrayFbs -> {
+ var arrayFbs = (PatioDataValueArrayFbs) valueFbs.value(new PatioDataValueArrayFbs());
+
+ var elementLayout = deserializeDataLayout(arrayFbs.elementLayout());
+
+ var elements = mapVector(
+ arrayFbs::elements,
+ arrayFbs.elementsLength(),
+ PatioToFlatbuffers::deserializeDataValue
+ );
+
+ yield new PatioDataValueArray(elementLayout, elements);
+ }
+
+ case PatioDataValueValueFbs.PatioDataValueBoolFbs -> {
+ var boolFbs = (PatioDataValueBoolFbs) valueFbs.value(new PatioDataValueBoolFbs());
+
+ yield new PatioDataValueBool(boolFbs.value());
+ }
+
+ case PatioDataValueValueFbs.PatioDataValueByteFbs -> {
+ var byteFbs = (PatioDataValueByteFbs) valueFbs.value(new PatioDataValueByteFbs());
+
+ yield new PatioDataValueByte((byte) byteFbs.value());
+ }
+
+ case PatioDataValueValueFbs.PatioDataValueDataPtrFbs -> {
+ var dataPtrFbs = (PatioDataValueDataPtrFbs) valueFbs.value(new PatioDataValueDataPtrFbs());
+
+ var value = deserializeDataPtrValue(dataPtrFbs.value());
+
+ yield new PatioDataValueDataPtr(value);
+ }
+
+ case PatioDataValueValueFbs.PatioDataValueIntFbs -> {
+ var intFbs = (PatioDataValueIntFbs) valueFbs.value(new PatioDataValueIntFbs());
+
+ var value = deserializeIntValue(intFbs.value());
+
+ yield new PatioDataValueInt(value);
+ }
+
+ case PatioDataValueValueFbs.PatioDataValueInt32Fbs -> {
+ var int32Fbs = (PatioDataValueInt32Fbs) valueFbs.value(new PatioDataValueInt32Fbs());
+
+ var value = deserializeIntValue(int32Fbs.value());
+
+ yield new PatioDataValueInt32(value);
+ }
+
+ case PatioDataValueValueFbs.PatioDataValueStructFbs -> {
+ var structFbs = (PatioDataValueStructFbs) valueFbs.value(new PatioDataValueStructFbs());
+
+ var elements = mapVector(
+ structFbs::elements,
+ structFbs.elementsLength(),
+ PatioToFlatbuffers::deserializeDataValue
+ );
+
+ yield new PatioDataValueStruct(elements);
+ }
+
+ default ->
+ throw new UnsupportedOperationException("TODO");
+ };
+ }
+
// == Flatbuffers ==
private static <T, R> List<R> mapVector(Function<Integer, T> get, int length, Function<T, R> map) {