aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2026-03-22 17:56:34 +0000
committerMichael Williamson <mike@zwobble.org>2026-03-22 17:59:31 +0000
commit8430d69e1df2e9062c8fa25c5b0584966794855e (patch)
tree302677ee5db7b8ebd2ebb6616a7f4fd46e666b6c /src/main/java
parent21a38961437a4139321ab1c2601413e5f88c8e9c (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.java91
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;
+ }
}