diff options
| author | Michael Williamson <mike@zwobble.org> | 2026-03-22 17:56:34 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2026-03-22 17:59:31 +0000 |
| commit | 8430d69e1df2e9062c8fa25c5b0584966794855e (patch) | |
| tree | 302677ee5db7b8ebd2ebb6616a7f4fd46e666b6c /src/main/java | |
| parent | 21a38961437a4139321ab1c2601413e5f88c8e9c (diff) | |
Serialize Patio int values to flatbuffers
Diffstat (limited to 'src/main/java')
| -rw-r--r-- | src/main/java/org/shedlang/compiler/patio/serialization/PatioToFlatbuffers.java | 91 |
1 files changed, 88 insertions, 3 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 58207bda..aab63bad 100644 --- a/src/main/java/org/shedlang/compiler/patio/serialization/PatioToFlatbuffers.java +++ b/src/main/java/org/shedlang/compiler/patio/serialization/PatioToFlatbuffers.java @@ -1,11 +1,10 @@ package org.shedlang.compiler.patio.serialization; import com.google.flatbuffers.FlatBufferBuilder; +import com.google.flatbuffers.IntVector; import org.shedlang.compiler.patio.flatbuffers.*; import org.shedlang.compiler.patio.types.*; -import org.shedlang.compiler.patio.values.PatioDataPtrValue; -import org.shedlang.compiler.patio.values.PatioDataPtrValueDataElement; -import org.shedlang.compiler.patio.values.PatioDataPtrValueNull; +import org.shedlang.compiler.patio.values.*; import java.util.ArrayList; import java.util.List; @@ -60,6 +59,76 @@ public class PatioToFlatbuffers { }; } + // == Int values == + + public static int serializeIntValue(FlatBufferBuilder builder, PatioIntValue value) { + return switch (value) { + case PatioIntValueByteOffsetOf byteOffsetOf -> { + var layoutFbs = serializeDataLayout(builder, byteOffsetOf.layout()); + var offsetFbs = PatioIntValueByteOffsetOfFbs.createOffsetVector( + builder, + intListToLongArray(byteOffsetOf.offset()) + ); + + var byteOffsetOfFbs = PatioIntValueByteOffsetOfFbs.createPatioIntValueByteOffsetOfFbs( + builder, + layoutFbs, + offsetFbs + ); + + PatioIntValueFbs.startPatioIntValueFbs(builder); + PatioIntValueFbs.addValueType(builder, PatioIntValueValueFbs.PatioIntValueByteOffsetOfFbs); + PatioIntValueFbs.addValue(builder, byteOffsetOfFbs); + yield PatioIntValueFbs.endPatioIntValueFbs(builder); + } + + case PatioIntValueByteSizeOf byteSizeOf -> { + var layoutFbs = serializeDataLayout(builder, byteSizeOf.layout()); + + var byteSizeOfFbs = PatioIntValueByteSizeOfFbs.createPatioIntValueByteSizeOfFbs(builder, layoutFbs); + + PatioIntValueFbs.startPatioIntValueFbs(builder); + PatioIntValueFbs.addValueType(builder, PatioIntValueValueFbs.PatioIntValueByteSizeOfFbs); + PatioIntValueFbs.addValue(builder, byteSizeOfFbs); + yield PatioIntValueFbs.endPatioIntValueFbs(builder); + } + + case PatioIntValueLiteral literal -> { + var literalFbs = PatioIntValueLiteralFbs.createPatioIntValueLiteralFbs(builder, literal.value()); + + PatioIntValueFbs.startPatioIntValueFbs(builder); + PatioIntValueFbs.addValueType(builder, PatioIntValueValueFbs.PatioIntValueLiteralFbs); + PatioIntValueFbs.addValue(builder, literalFbs); + yield PatioIntValueFbs.endPatioIntValueFbs(builder); + } + }; + } + + public static PatioIntValue deserializeIntValue(PatioIntValueFbs valueFbs) { + return switch (valueFbs.valueType()) { + case PatioIntValueValueFbs.PatioIntValueByteOffsetOfFbs -> { + var byteOffsetOfFbs = (PatioIntValueByteOffsetOfFbs) valueFbs.value(new PatioIntValueByteOffsetOfFbs()); + var layout = deserializeDataLayout(byteOffsetOfFbs.layout()); + var offset = deserializeListOfInts(byteOffsetOfFbs.offsetVector()); + yield new PatioIntValueByteOffsetOf(layout, offset); + } + + case PatioIntValueValueFbs.PatioIntValueByteSizeOfFbs -> { + var byteSizeOfFbs = (PatioIntValueByteSizeOfFbs) valueFbs.value(new PatioIntValueByteSizeOfFbs()); + var layout = deserializeDataLayout(byteSizeOfFbs.layout()); + yield new PatioIntValueByteSizeOf(layout); + } + + case PatioIntValueValueFbs.PatioIntValueLiteralFbs -> { + var literalFbs = (PatioIntValueLiteralFbs) valueFbs.value(new PatioIntValueLiteralFbs()); + yield new PatioIntValueLiteral(literalFbs.value()); + } + + default -> + throw new UnsupportedOperationException("TODO"); + }; + } + // == Data layouts == public static int serializeDataLayout( @@ -186,4 +255,20 @@ public class PatioToFlatbuffers { } return result; } + + private static long[] intListToLongArray(List<Integer> list) { + var array = new long[list.size()]; + for (var index = 0; index < list.size(); index++) { + array[index] = list.get(index); + } + return array; + } + + private static List<Integer> deserializeListOfInts(IntVector vector) { + var result = new ArrayList<Integer>(); + for (var index = 0; index < vector.length(); index++) { + result.add(vector.get(index)); + } + return result; + } } |
