From 0a6b38ca7ee956cab5818c195856d5c159966f7a Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 22 Mar 2026 18:25:49 +0000 Subject: Serialize Patio data values to flatbuffers --- .../patio/serialization/PatioToFlatbuffers.java | 171 +++++++++++++++++++++ 1 file changed, 171 insertions(+) (limited to 'src/main/java') 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 List mapVector(Function get, int length, Function map) { -- cgit v1.2.3