diff --git a/MEOS.NET.Tests/CountedArrayTests.cs b/MEOS.NET.Tests/CountedArrayTests.cs
new file mode 100644
index 0000000..bc9eeac
--- /dev/null
+++ b/MEOS.NET.Tests/CountedArrayTests.cs
@@ -0,0 +1,54 @@
+using MEOS.NET.Enums;
+using MEOS.NET.Types;
+
+namespace MEOS.NET.Tests
+{
+ ///
+ /// MEOS reads an array of its own values through a pointer to the first
+ /// element and a count, so a method taking one takes a C# array and answers
+ /// its length to MEOS.
+ ///
+ [TestClass]
+ public class CountedArrayTests : MeosTest
+ {
+ [TestMethod]
+ public void ASequenceIsMadeOfItsInstants()
+ {
+ Temporal[] instants =
+ [
+ TFloat.In("25.0@2024-12-06")!,
+ TFloat.In("27.0@2024-12-07")!,
+ TFloat.In("30.0@2024-12-09")!,
+ ];
+
+ Temporal sequence = TSequence.Make(instants, true, true, InterpType.Linear, true)!;
+
+ Assert.AreEqual(3, sequence.NumInstants());
+ Assert.AreEqual(
+ "[25@2024-12-06 00:00:00+00, 27@2024-12-07 00:00:00+00, 30@2024-12-09 00:00:00+00]",
+ sequence.ToString());
+ }
+
+ [TestMethod]
+ public void MergingAnArrayOfTemporalValuesJoinsThem()
+ {
+ Temporal[] parts =
+ [
+ TFloat.In("[25.0@2024-12-06, 27.0@2024-12-07]")!,
+ TFloat.In("[30.0@2024-12-09, 32.0@2024-12-10]")!,
+ ];
+
+ Temporal merged = Temporal.MergeArray(parts)!;
+
+ Assert.AreEqual(4, merged.NumInstants());
+ Assert.AreEqual(2, merged.NumSequences());
+ }
+
+ [TestMethod]
+ public void AnEmptyArrayIsARequestMeosRefuses()
+ {
+ Assert.ThrowsException(
+ () => TSequence.Make([], true, true, InterpType.Linear, true));
+ }
+ }
+}
diff --git a/MEOS.NET/Types/BigIntSet.g.cs b/MEOS.NET/Types/BigIntSet.g.cs
index c2cbf30..493945d 100644
--- a/MEOS.NET/Types/BigIntSet.g.cs
+++ b/MEOS.NET/Types/BigIntSet.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/BigIntSpan.g.cs b/MEOS.NET/Types/BigIntSpan.g.cs
index 16bf168..bc3c38e 100644
--- a/MEOS.NET/Types/BigIntSpan.g.cs
+++ b/MEOS.NET/Types/BigIntSpan.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/BigIntSpanSet.g.cs b/MEOS.NET/Types/BigIntSpanSet.g.cs
index 50aa718..73c6e84 100644
--- a/MEOS.NET/Types/BigIntSpanSet.g.cs
+++ b/MEOS.NET/Types/BigIntSpanSet.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/Box.g.cs b/MEOS.NET/Types/Box.g.cs
index cd06e96..4147bb6 100644
--- a/MEOS.NET/Types/Box.g.cs
+++ b/MEOS.NET/Types/Box.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/CbufferSet.g.cs b/MEOS.NET/Types/CbufferSet.g.cs
index 52cf06f..755bbbe 100644
--- a/MEOS.NET/Types/CbufferSet.g.cs
+++ b/MEOS.NET/Types/CbufferSet.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/Collection.g.cs b/MEOS.NET/Types/Collection.g.cs
index 6b65e5b..7ffd7cc 100644
--- a/MEOS.NET/Types/Collection.g.cs
+++ b/MEOS.NET/Types/Collection.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/DateSet.g.cs b/MEOS.NET/Types/DateSet.g.cs
index 81b5c43..de8374a 100644
--- a/MEOS.NET/Types/DateSet.g.cs
+++ b/MEOS.NET/Types/DateSet.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/DateSpan.g.cs b/MEOS.NET/Types/DateSpan.g.cs
index cc95052..76d299f 100644
--- a/MEOS.NET/Types/DateSpan.g.cs
+++ b/MEOS.NET/Types/DateSpan.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/DateSpanSet.g.cs b/MEOS.NET/Types/DateSpanSet.g.cs
index 7b671a2..296627d 100644
--- a/MEOS.NET/Types/DateSpanSet.g.cs
+++ b/MEOS.NET/Types/DateSpanSet.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/FloatSet.g.cs b/MEOS.NET/Types/FloatSet.g.cs
index be1b2fa..e2dc05e 100644
--- a/MEOS.NET/Types/FloatSet.g.cs
+++ b/MEOS.NET/Types/FloatSet.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/FloatSpan.g.cs b/MEOS.NET/Types/FloatSpan.g.cs
index 75fcf5a..bba4ef0 100644
--- a/MEOS.NET/Types/FloatSpan.g.cs
+++ b/MEOS.NET/Types/FloatSpan.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/FloatSpanSet.g.cs b/MEOS.NET/Types/FloatSpanSet.g.cs
index 528ef1f..ea65d63 100644
--- a/MEOS.NET/Types/FloatSpanSet.g.cs
+++ b/MEOS.NET/Types/FloatSpanSet.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/GeogSet.g.cs b/MEOS.NET/Types/GeogSet.g.cs
index e37f3fe..107f2ca 100644
--- a/MEOS.NET/Types/GeogSet.g.cs
+++ b/MEOS.NET/Types/GeogSet.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/GeomSet.g.cs b/MEOS.NET/Types/GeomSet.g.cs
index 6f92b60..f091385 100644
--- a/MEOS.NET/Types/GeomSet.g.cs
+++ b/MEOS.NET/Types/GeomSet.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/IntSet.g.cs b/MEOS.NET/Types/IntSet.g.cs
index 296ffd7..eada4ca 100644
--- a/MEOS.NET/Types/IntSet.g.cs
+++ b/MEOS.NET/Types/IntSet.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/IntSpan.g.cs b/MEOS.NET/Types/IntSpan.g.cs
index d5682c2..13d26cf 100644
--- a/MEOS.NET/Types/IntSpan.g.cs
+++ b/MEOS.NET/Types/IntSpan.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/IntSpanSet.g.cs b/MEOS.NET/Types/IntSpanSet.g.cs
index 25421a4..df3fbb2 100644
--- a/MEOS.NET/Types/IntSpanSet.g.cs
+++ b/MEOS.NET/Types/IntSpanSet.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/NpointSet.g.cs b/MEOS.NET/Types/NpointSet.g.cs
index cc40491..74516e7 100644
--- a/MEOS.NET/Types/NpointSet.g.cs
+++ b/MEOS.NET/Types/NpointSet.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/PoseSet.g.cs b/MEOS.NET/Types/PoseSet.g.cs
index c11b9fc..43edda2 100644
--- a/MEOS.NET/Types/PoseSet.g.cs
+++ b/MEOS.NET/Types/PoseSet.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/STBox.g.cs b/MEOS.NET/Types/STBox.g.cs
index 1364163..fff3d92 100644
--- a/MEOS.NET/Types/STBox.g.cs
+++ b/MEOS.NET/Types/STBox.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/Set.g.cs b/MEOS.NET/Types/Set.g.cs
index 4591a62..c8b16ae 100644
--- a/MEOS.NET/Types/Set.g.cs
+++ b/MEOS.NET/Types/Set.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/Span.g.cs b/MEOS.NET/Types/Span.g.cs
index 4d1d016..1199e83 100644
--- a/MEOS.NET/Types/Span.g.cs
+++ b/MEOS.NET/Types/Span.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/SpanSet.g.cs b/MEOS.NET/Types/SpanSet.g.cs
index 0223c92..b5ed634 100644
--- a/MEOS.NET/Types/SpanSet.g.cs
+++ b/MEOS.NET/Types/SpanSet.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/TAlpha.g.cs b/MEOS.NET/Types/TAlpha.g.cs
index c87c5e8..a75e539 100644
--- a/MEOS.NET/Types/TAlpha.g.cs
+++ b/MEOS.NET/Types/TAlpha.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/TBigint.g.cs b/MEOS.NET/Types/TBigint.g.cs
index a042297..2018749 100644
--- a/MEOS.NET/Types/TBigint.g.cs
+++ b/MEOS.NET/Types/TBigint.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/TBigintInst.g.cs b/MEOS.NET/Types/TBigintInst.g.cs
index 53f7416..402640c 100644
--- a/MEOS.NET/Types/TBigintInst.g.cs
+++ b/MEOS.NET/Types/TBigintInst.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/TBigintSeq.g.cs b/MEOS.NET/Types/TBigintSeq.g.cs
index eb92b2b..0c8c5bc 100644
--- a/MEOS.NET/Types/TBigintSeq.g.cs
+++ b/MEOS.NET/Types/TBigintSeq.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/TBigintSeqSet.g.cs b/MEOS.NET/Types/TBigintSeqSet.g.cs
index 1c0a8a8..d5f271f 100644
--- a/MEOS.NET/Types/TBigintSeqSet.g.cs
+++ b/MEOS.NET/Types/TBigintSeqSet.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/TBool.g.cs b/MEOS.NET/Types/TBool.g.cs
index 64d2b27..fc5bd1d 100644
--- a/MEOS.NET/Types/TBool.g.cs
+++ b/MEOS.NET/Types/TBool.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/TBoolInst.g.cs b/MEOS.NET/Types/TBoolInst.g.cs
index 3a14e5a..3f7d07c 100644
--- a/MEOS.NET/Types/TBoolInst.g.cs
+++ b/MEOS.NET/Types/TBoolInst.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/TBoolSeq.g.cs b/MEOS.NET/Types/TBoolSeq.g.cs
index dcc7129..c3d0456 100644
--- a/MEOS.NET/Types/TBoolSeq.g.cs
+++ b/MEOS.NET/Types/TBoolSeq.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/TBoolSeqSet.g.cs b/MEOS.NET/Types/TBoolSeqSet.g.cs
index 73c8520..22dabc6 100644
--- a/MEOS.NET/Types/TBoolSeqSet.g.cs
+++ b/MEOS.NET/Types/TBoolSeqSet.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/TBox.g.cs b/MEOS.NET/Types/TBox.g.cs
index d7e3c17..dd855a3 100644
--- a/MEOS.NET/Types/TBox.g.cs
+++ b/MEOS.NET/Types/TBox.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/TCbuffer.g.cs b/MEOS.NET/Types/TCbuffer.g.cs
index c5d3404..15fa255 100644
--- a/MEOS.NET/Types/TCbuffer.g.cs
+++ b/MEOS.NET/Types/TCbuffer.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/TCbufferInst.g.cs b/MEOS.NET/Types/TCbufferInst.g.cs
index cfb28fb..f3e4ed3 100644
--- a/MEOS.NET/Types/TCbufferInst.g.cs
+++ b/MEOS.NET/Types/TCbufferInst.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/TCbufferSeq.g.cs b/MEOS.NET/Types/TCbufferSeq.g.cs
index a914339..1f7edf1 100644
--- a/MEOS.NET/Types/TCbufferSeq.g.cs
+++ b/MEOS.NET/Types/TCbufferSeq.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/TCbufferSeqSet.g.cs b/MEOS.NET/Types/TCbufferSeqSet.g.cs
index e2d07be..bafdc5b 100644
--- a/MEOS.NET/Types/TCbufferSeqSet.g.cs
+++ b/MEOS.NET/Types/TCbufferSeqSet.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/TFloat.g.cs b/MEOS.NET/Types/TFloat.g.cs
index cf10297..4b2e1a9 100644
--- a/MEOS.NET/Types/TFloat.g.cs
+++ b/MEOS.NET/Types/TFloat.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/TFloatInst.g.cs b/MEOS.NET/Types/TFloatInst.g.cs
index 45e38fd..77ae2b9 100644
--- a/MEOS.NET/Types/TFloatInst.g.cs
+++ b/MEOS.NET/Types/TFloatInst.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/TFloatSeq.g.cs b/MEOS.NET/Types/TFloatSeq.g.cs
index f0860ca..cbc06cb 100644
--- a/MEOS.NET/Types/TFloatSeq.g.cs
+++ b/MEOS.NET/Types/TFloatSeq.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/TFloatSeqSet.g.cs b/MEOS.NET/Types/TFloatSeqSet.g.cs
index e8b94c9..7abe65f 100644
--- a/MEOS.NET/Types/TFloatSeqSet.g.cs
+++ b/MEOS.NET/Types/TFloatSeqSet.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/TGeo.g.cs b/MEOS.NET/Types/TGeo.g.cs
index be2ce7a..b13a2d6 100644
--- a/MEOS.NET/Types/TGeo.g.cs
+++ b/MEOS.NET/Types/TGeo.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/TGeogPoint.g.cs b/MEOS.NET/Types/TGeogPoint.g.cs
index 7000248..1cc5bdd 100644
--- a/MEOS.NET/Types/TGeogPoint.g.cs
+++ b/MEOS.NET/Types/TGeogPoint.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/TGeogPointInst.g.cs b/MEOS.NET/Types/TGeogPointInst.g.cs
index e1e6325..bcf02c9 100644
--- a/MEOS.NET/Types/TGeogPointInst.g.cs
+++ b/MEOS.NET/Types/TGeogPointInst.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/TGeogPointSeq.g.cs b/MEOS.NET/Types/TGeogPointSeq.g.cs
index eb4f4a7..099af6c 100644
--- a/MEOS.NET/Types/TGeogPointSeq.g.cs
+++ b/MEOS.NET/Types/TGeogPointSeq.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/TGeogPointSeqSet.g.cs b/MEOS.NET/Types/TGeogPointSeqSet.g.cs
index 090e73e..f31d686 100644
--- a/MEOS.NET/Types/TGeogPointSeqSet.g.cs
+++ b/MEOS.NET/Types/TGeogPointSeqSet.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/TGeography.g.cs b/MEOS.NET/Types/TGeography.g.cs
index 73a6594..3555fbf 100644
--- a/MEOS.NET/Types/TGeography.g.cs
+++ b/MEOS.NET/Types/TGeography.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/TGeographyInst.g.cs b/MEOS.NET/Types/TGeographyInst.g.cs
index 23b2feb..98ea92c 100644
--- a/MEOS.NET/Types/TGeographyInst.g.cs
+++ b/MEOS.NET/Types/TGeographyInst.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/TGeographySeq.g.cs b/MEOS.NET/Types/TGeographySeq.g.cs
index a132e8c..df793a5 100644
--- a/MEOS.NET/Types/TGeographySeq.g.cs
+++ b/MEOS.NET/Types/TGeographySeq.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/TGeographySeqSet.g.cs b/MEOS.NET/Types/TGeographySeqSet.g.cs
index c5f1e78..7676ed3 100644
--- a/MEOS.NET/Types/TGeographySeqSet.g.cs
+++ b/MEOS.NET/Types/TGeographySeqSet.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/TGeomPoint.g.cs b/MEOS.NET/Types/TGeomPoint.g.cs
index 1ad0ebf..3dd793e 100644
--- a/MEOS.NET/Types/TGeomPoint.g.cs
+++ b/MEOS.NET/Types/TGeomPoint.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/TGeomPointInst.g.cs b/MEOS.NET/Types/TGeomPointInst.g.cs
index 8a87535..110488d 100644
--- a/MEOS.NET/Types/TGeomPointInst.g.cs
+++ b/MEOS.NET/Types/TGeomPointInst.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/TGeomPointSeq.g.cs b/MEOS.NET/Types/TGeomPointSeq.g.cs
index 08ad3b4..8b1fd8a 100644
--- a/MEOS.NET/Types/TGeomPointSeq.g.cs
+++ b/MEOS.NET/Types/TGeomPointSeq.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/TGeomPointSeqSet.g.cs b/MEOS.NET/Types/TGeomPointSeqSet.g.cs
index 963b109..7ba7d77 100644
--- a/MEOS.NET/Types/TGeomPointSeqSet.g.cs
+++ b/MEOS.NET/Types/TGeomPointSeqSet.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/TGeometry.g.cs b/MEOS.NET/Types/TGeometry.g.cs
index f76d612..52e799d 100644
--- a/MEOS.NET/Types/TGeometry.g.cs
+++ b/MEOS.NET/Types/TGeometry.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/TGeometryInst.g.cs b/MEOS.NET/Types/TGeometryInst.g.cs
index cfddf5e..35dc952 100644
--- a/MEOS.NET/Types/TGeometryInst.g.cs
+++ b/MEOS.NET/Types/TGeometryInst.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/TGeometrySeq.g.cs b/MEOS.NET/Types/TGeometrySeq.g.cs
index d56fe31..20247ee 100644
--- a/MEOS.NET/Types/TGeometrySeq.g.cs
+++ b/MEOS.NET/Types/TGeometrySeq.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/TGeometrySeqSet.g.cs b/MEOS.NET/Types/TGeometrySeqSet.g.cs
index 561585e..d0e6245 100644
--- a/MEOS.NET/Types/TGeometrySeqSet.g.cs
+++ b/MEOS.NET/Types/TGeometrySeqSet.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/TInstant.g.cs b/MEOS.NET/Types/TInstant.g.cs
index 0fb49ef..1d49aff 100644
--- a/MEOS.NET/Types/TInstant.g.cs
+++ b/MEOS.NET/Types/TInstant.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/TInt.g.cs b/MEOS.NET/Types/TInt.g.cs
index a78e0ed..71b1af9 100644
--- a/MEOS.NET/Types/TInt.g.cs
+++ b/MEOS.NET/Types/TInt.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/TIntInst.g.cs b/MEOS.NET/Types/TIntInst.g.cs
index d734142..273085d 100644
--- a/MEOS.NET/Types/TIntInst.g.cs
+++ b/MEOS.NET/Types/TIntInst.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/TIntSeq.g.cs b/MEOS.NET/Types/TIntSeq.g.cs
index 1ab09dd..c6bb2d2 100644
--- a/MEOS.NET/Types/TIntSeq.g.cs
+++ b/MEOS.NET/Types/TIntSeq.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/TIntSeqSet.g.cs b/MEOS.NET/Types/TIntSeqSet.g.cs
index 35dfc94..11731a0 100644
--- a/MEOS.NET/Types/TIntSeqSet.g.cs
+++ b/MEOS.NET/Types/TIntSeqSet.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/TJsonb.g.cs b/MEOS.NET/Types/TJsonb.g.cs
index d5cde93..239c88c 100644
--- a/MEOS.NET/Types/TJsonb.g.cs
+++ b/MEOS.NET/Types/TJsonb.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/TJsonbInst.g.cs b/MEOS.NET/Types/TJsonbInst.g.cs
index 05487af..89399af 100644
--- a/MEOS.NET/Types/TJsonbInst.g.cs
+++ b/MEOS.NET/Types/TJsonbInst.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/TJsonbSeq.g.cs b/MEOS.NET/Types/TJsonbSeq.g.cs
index 1358209..1e9271b 100644
--- a/MEOS.NET/Types/TJsonbSeq.g.cs
+++ b/MEOS.NET/Types/TJsonbSeq.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/TJsonbSeqSet.g.cs b/MEOS.NET/Types/TJsonbSeqSet.g.cs
index fdbf680..0589ea4 100644
--- a/MEOS.NET/Types/TJsonbSeqSet.g.cs
+++ b/MEOS.NET/Types/TJsonbSeqSet.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/TNpoint.g.cs b/MEOS.NET/Types/TNpoint.g.cs
index 5581560..c2ed0db 100644
--- a/MEOS.NET/Types/TNpoint.g.cs
+++ b/MEOS.NET/Types/TNpoint.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/TNpointInst.g.cs b/MEOS.NET/Types/TNpointInst.g.cs
index 31ed367..b167a0b 100644
--- a/MEOS.NET/Types/TNpointInst.g.cs
+++ b/MEOS.NET/Types/TNpointInst.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/TNpointSeq.g.cs b/MEOS.NET/Types/TNpointSeq.g.cs
index e945b60..3b560b0 100644
--- a/MEOS.NET/Types/TNpointSeq.g.cs
+++ b/MEOS.NET/Types/TNpointSeq.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/TNpointSeqSet.g.cs b/MEOS.NET/Types/TNpointSeqSet.g.cs
index 3715e3c..3722161 100644
--- a/MEOS.NET/Types/TNpointSeqSet.g.cs
+++ b/MEOS.NET/Types/TNpointSeqSet.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/TNumber.g.cs b/MEOS.NET/Types/TNumber.g.cs
index 29f83b1..9e1534a 100644
--- a/MEOS.NET/Types/TNumber.g.cs
+++ b/MEOS.NET/Types/TNumber.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/TPoint.g.cs b/MEOS.NET/Types/TPoint.g.cs
index b9a6118..0fca9d9 100644
--- a/MEOS.NET/Types/TPoint.g.cs
+++ b/MEOS.NET/Types/TPoint.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/TPose.g.cs b/MEOS.NET/Types/TPose.g.cs
index 076af2e..ae53a5e 100644
--- a/MEOS.NET/Types/TPose.g.cs
+++ b/MEOS.NET/Types/TPose.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/TPoseInst.g.cs b/MEOS.NET/Types/TPoseInst.g.cs
index 8d5e5e3..3c7213e 100644
--- a/MEOS.NET/Types/TPoseInst.g.cs
+++ b/MEOS.NET/Types/TPoseInst.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/TPoseSeq.g.cs b/MEOS.NET/Types/TPoseSeq.g.cs
index 88aa0bf..1f70f9a 100644
--- a/MEOS.NET/Types/TPoseSeq.g.cs
+++ b/MEOS.NET/Types/TPoseSeq.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/TPoseSeqSet.g.cs b/MEOS.NET/Types/TPoseSeqSet.g.cs
index 79e348e..cb5b373 100644
--- a/MEOS.NET/Types/TPoseSeqSet.g.cs
+++ b/MEOS.NET/Types/TPoseSeqSet.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/TRGeometry.g.cs b/MEOS.NET/Types/TRGeometry.g.cs
index 0eaa6f5..f4c44fa 100644
--- a/MEOS.NET/Types/TRGeometry.g.cs
+++ b/MEOS.NET/Types/TRGeometry.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
@@ -192,5 +194,24 @@ public string Out()
public static Temporal? In(string str)
=> MEOSFactory.WrapTemporal(Meos.TrgeometryIn(str));
+ public new static Temporal? MergeArray(Temporal[] temparr)
+ {
+ IntPtr[] _temparrValues = new IntPtr[temparr.Length];
+ for (int i = 0; i < temparr.Length; i++)
+ {
+ _temparrValues[i] = temparr[i].Ptr;
+ }
+
+ GCHandle _temparr = GCHandle.Alloc(_temparrValues, GCHandleType.Pinned);
+ try
+ {
+ return MEOSFactory.WrapTemporal(Meos.TrgeometryMergeArray(_temparr.AddrOfPinnedObject(), temparr.Length));
+ }
+ finally
+ {
+ _temparr.Free();
+ }
+ }
+
}
}
diff --git a/MEOS.NET/Types/TRGeometryInst.g.cs b/MEOS.NET/Types/TRGeometryInst.g.cs
index 9432f2f..d317814 100644
--- a/MEOS.NET/Types/TRGeometryInst.g.cs
+++ b/MEOS.NET/Types/TRGeometryInst.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/TRGeometrySeq.g.cs b/MEOS.NET/Types/TRGeometrySeq.g.cs
index 6868e48..864dea3 100644
--- a/MEOS.NET/Types/TRGeometrySeq.g.cs
+++ b/MEOS.NET/Types/TRGeometrySeq.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/TRGeometrySeqSet.g.cs b/MEOS.NET/Types/TRGeometrySeqSet.g.cs
index 6401afb..7474e78 100644
--- a/MEOS.NET/Types/TRGeometrySeqSet.g.cs
+++ b/MEOS.NET/Types/TRGeometrySeqSet.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/TSequence.g.cs b/MEOS.NET/Types/TSequence.g.cs
index 7f774f4..3793c15 100644
--- a/MEOS.NET/Types/TSequence.g.cs
+++ b/MEOS.NET/Types/TSequence.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
@@ -11,5 +13,24 @@ public class TSequence : Temporal
{
internal TSequence(IntPtr ptr) : base(ptr) { }
+ public static Temporal? Make(Temporal[] instants, bool lower_inc, bool upper_inc, InterpType interp, bool normalize)
+ {
+ IntPtr[] _instantsValues = new IntPtr[instants.Length];
+ for (int i = 0; i < instants.Length; i++)
+ {
+ _instantsValues[i] = instants[i].Ptr;
+ }
+
+ GCHandle _instants = GCHandle.Alloc(_instantsValues, GCHandleType.Pinned);
+ try
+ {
+ return MEOSFactory.WrapTemporal(Meos.TsequenceMake(_instants.AddrOfPinnedObject(), instants.Length, lower_inc, upper_inc, (int) interp, normalize));
+ }
+ finally
+ {
+ _instants.Free();
+ }
+ }
+
}
}
diff --git a/MEOS.NET/Types/TSequenceSet.g.cs b/MEOS.NET/Types/TSequenceSet.g.cs
index df0c491..876cbb4 100644
--- a/MEOS.NET/Types/TSequenceSet.g.cs
+++ b/MEOS.NET/Types/TSequenceSet.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
@@ -11,5 +13,24 @@ public class TSequenceSet : Temporal
{
internal TSequenceSet(IntPtr ptr) : base(ptr) { }
+ public static Temporal? Make(Temporal[] sequences, bool normalize)
+ {
+ IntPtr[] _sequencesValues = new IntPtr[sequences.Length];
+ for (int i = 0; i < sequences.Length; i++)
+ {
+ _sequencesValues[i] = sequences[i].Ptr;
+ }
+
+ GCHandle _sequences = GCHandle.Alloc(_sequencesValues, GCHandleType.Pinned);
+ try
+ {
+ return MEOSFactory.WrapTemporal(Meos.TsequencesetMake(_sequences.AddrOfPinnedObject(), sequences.Length, normalize));
+ }
+ finally
+ {
+ _sequences.Free();
+ }
+ }
+
}
}
diff --git a/MEOS.NET/Types/TSpatial.g.cs b/MEOS.NET/Types/TSpatial.g.cs
index 5a543c1..91dd7d2 100644
--- a/MEOS.NET/Types/TSpatial.g.cs
+++ b/MEOS.NET/Types/TSpatial.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/TText.g.cs b/MEOS.NET/Types/TText.g.cs
index e7cffb2..54f98f9 100644
--- a/MEOS.NET/Types/TText.g.cs
+++ b/MEOS.NET/Types/TText.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/TTextInst.g.cs b/MEOS.NET/Types/TTextInst.g.cs
index 5f819bb..058b79c 100644
--- a/MEOS.NET/Types/TTextInst.g.cs
+++ b/MEOS.NET/Types/TTextInst.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/TTextSeq.g.cs b/MEOS.NET/Types/TTextSeq.g.cs
index 3fbb9d2..3dd14da 100644
--- a/MEOS.NET/Types/TTextSeq.g.cs
+++ b/MEOS.NET/Types/TTextSeq.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/TTextSeqSet.g.cs b/MEOS.NET/Types/TTextSeqSet.g.cs
index 87e1064..546f736 100644
--- a/MEOS.NET/Types/TTextSeqSet.g.cs
+++ b/MEOS.NET/Types/TTextSeqSet.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/Temporal.g.cs b/MEOS.NET/Types/Temporal.g.cs
index 0c6e8da..8d5b4b8 100644
--- a/MEOS.NET/Types/Temporal.g.cs
+++ b/MEOS.NET/Types/Temporal.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
@@ -245,5 +247,24 @@ public bool UpperInc()
public static Temporal? FromHEXWKB(string hexwkb)
=> MEOSFactory.WrapTemporal(Meos.TemporalFromHexwkb(hexwkb));
+ public static Temporal? MergeArray(Temporal[] temparr)
+ {
+ IntPtr[] _temparrValues = new IntPtr[temparr.Length];
+ for (int i = 0; i < temparr.Length; i++)
+ {
+ _temparrValues[i] = temparr[i].Ptr;
+ }
+
+ GCHandle _temparr = GCHandle.Alloc(_temparrValues, GCHandleType.Pinned);
+ try
+ {
+ return MEOSFactory.WrapTemporal(Meos.TemporalMergeArray(_temparr.AddrOfPinnedObject(), temparr.Length));
+ }
+ finally
+ {
+ _temparr.Free();
+ }
+ }
+
}
}
diff --git a/MEOS.NET/Types/TextSet.g.cs b/MEOS.NET/Types/TextSet.g.cs
index 5343968..e4c6a32 100644
--- a/MEOS.NET/Types/TextSet.g.cs
+++ b/MEOS.NET/Types/TextSet.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/TsTzSet.g.cs b/MEOS.NET/Types/TsTzSet.g.cs
index e884934..e655640 100644
--- a/MEOS.NET/Types/TsTzSet.g.cs
+++ b/MEOS.NET/Types/TsTzSet.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/TsTzSpan.g.cs b/MEOS.NET/Types/TsTzSpan.g.cs
index 81d675a..834c3ec 100644
--- a/MEOS.NET/Types/TsTzSpan.g.cs
+++ b/MEOS.NET/Types/TsTzSpan.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/MEOS.NET/Types/TsTzSpanSet.g.cs b/MEOS.NET/Types/TsTzSpanSet.g.cs
index aa690a6..c54a5e1 100644
--- a/MEOS.NET/Types/TsTzSpanSet.g.cs
+++ b/MEOS.NET/Types/TsTzSpanSet.g.cs
@@ -1,5 +1,7 @@
#nullable enable
+using System.Runtime.InteropServices;
+
using MEOS.NET.Enums;
using MEOS.NET.Functions;
diff --git a/tools/objectgen.py b/tools/objectgen.py
index 9f4ef40..d807b94 100644
--- a/tools/objectgen.py
+++ b/tools/objectgen.py
@@ -233,12 +233,14 @@ class Method:
"""One emitted method: its C# signature and the wrapper call behind it."""
def __init__(self, name: str, ret: str, params: list[tuple[str, str]],
- body: str, static: bool):
+ body: str, static: bool, arrays: list[tuple[str, str]] | None = None):
self.name = name
self.ret = ret
self.params = params
self.body = body
self.static = static
+ # (parameter name, element class) for each counted array the method takes.
+ self.arrays = arrays or []
class Generator:
@@ -321,16 +323,22 @@ def method_for(self, cls: str, entry: dict) -> Method | None:
# `T *values, int count` is MEOS's counted-array convention: the pointer is
# the first element of an array, not one value, so wrapping it as one
# object would hand the callee a single element and a length that lies.
- raw = [p["name"] for p in f.get("params", [])]
+ recv_ctype = self.m.ctype.get(cls)
+ declared = f.get("params", [])
+ receiver_first = (bool(declared)
+ and clean(declared[0]["cType"]) == f"{recv_ctype} *")
+ # `T *values, int count` is MEOS's counted-array convention. The length is
+ # named `count`; a parameter named `n` is the INDEX of the `*_n`
+ # accessors, whose pointer is the receiver and no array at all.
counted = set()
- for i, p in enumerate(f.get("params", [])):
- nxt = f["params"][i + 1] if i + 1 < len(f["params"]) else None
- if (clean(p["cType"]).endswith("*") and nxt
- and nxt["name"] in ("count", "n")
+ for i, p in enumerate(declared):
+ nxt = declared[i + 1] if i + 1 < len(declared) else None
+ if (i == 0 and receiver_first) or not clean(p["cType"]).endswith("*"):
+ continue
+ if (nxt and nxt["name"] == "count"
and clean(nxt["cType"]) in ("int", "int32", "int32_t")):
counted.add(codegen.csharp_param_name(p["name"]))
- recv_ctype = self.m.ctype.get(cls)
params = list(wrapper_params)
static = True
args: list[str] = []
@@ -349,12 +357,33 @@ def method_for(self, cls: str, entry: dict) -> Method | None:
self.deferred[cls].append(f"{oo}: neither a receiver nor a value to return")
return None
+ # A counted array is one parameter to the caller and two to MEOS: the
+ # array and its length, which the array itself answers.
+ declared = f.get("params", [])
+ count_of = {}
+ for i, p in enumerate(declared):
+ if (codegen.csharp_param_name(p["name"]) in counted
+ and i + 1 < len(declared)):
+ count_of[codegen.csharp_param_name(declared[i + 1]["name"])] = \
+ codegen.csharp_param_name(p["name"])
+
sig: list[tuple[str, str]] = []
+ arrays: list[tuple[str, str]] = []
for cs_type, pname in params:
+ if pname in count_of:
+ args.append(f"{count_of[pname]}.Length")
+ continue
if pname in counted:
- self.deferred[cls].append(
- f"{oo}: argument {pname} is a counted array")
- return None
+ element = self.m.class_for_ctype(clean(c_by_name[pname])[:-1])
+ if element is None:
+ self.deferred[cls].append(
+ f"{oo}: argument {pname} is an array of "
+ f"{clean(c_by_name[pname])[:-1]}, which has no class")
+ return None
+ sig.append((f"{element}[]", pname))
+ arrays.append((pname, element))
+ args.append(f"_{pname}.AddrOfPinnedObject()")
+ continue
mapped = self.map_param(c_by_name.get(pname, ""), cs_type, pname)
if mapped is None:
self.deferred[cls].append(
@@ -365,7 +394,8 @@ def method_for(self, cls: str, entry: dict) -> Method | None:
args.append(mapped[1])
call = f"Meos.{codegen.public_name(fname)}({', '.join(args)})"
- return Method(pascal(oo), ret_type, sig, ret_expr.replace("$", call), static)
+ return Method(pascal(oo), ret_type, sig, ret_expr.replace("$", call), static,
+ arrays)
def inherited_names(self, cls: str) -> set[tuple]:
names: set[tuple] = set()
@@ -393,6 +423,8 @@ def emit_class(self, cls: str) -> str:
lines = [
"#nullable enable",
"",
+ "using System.Runtime.InteropServices;",
+ "",
"using MEOS.NET.Enums;",
"using MEOS.NET.Functions;",
"",
@@ -411,11 +443,43 @@ def emit_class(self, cls: str) -> str:
new = "new " if (m.name, tuple(t for t, _ in m.params)) in inherited else ""
kind = "static " if m.static else ""
lines.append(f" public {new}{kind}{m.ret} {m.name}({args})")
- lines.append(f" => {m.body};")
+ if m.arrays:
+ lines.extend(self.array_body(m))
+ else:
+ lines.append(f" => {m.body};")
lines.append("")
lines += [" }", "}", ""]
return "\n".join(lines)
+ def array_body(self, method: Method) -> list[str]:
+ """The body of a method taking a counted array.
+
+ MEOS reads an array of its own values through a pointer to the first
+ element, so the wrappers' pointers are gathered into one array and pinned
+ for the call. MEOS copies what it keeps, so the pin lasts exactly as long
+ as the call does."""
+ lines = [" {"]
+ for name, element in method.arrays:
+ lines += [
+ f" IntPtr[] _{name}Values = new IntPtr[{ident(name)}.Length];",
+ f" for (int i = 0; i < {ident(name)}.Length; i++)",
+ " {",
+ f" _{name}Values[i] = {ident(name)}[i].Ptr;",
+ " }",
+ "",
+ f" GCHandle _{name} = GCHandle.Alloc(_{name}Values, GCHandleType.Pinned);",
+ ]
+ lines.append(" try")
+ lines.append(" {")
+ lines.append(f" return {method.body};")
+ lines.append(" }")
+ lines.append(" finally")
+ lines.append(" {")
+ for name, _ in method.arrays:
+ lines.append(f" _{name}.Free();")
+ lines += [" }", " }"]
+ return lines
+
def to_string(self, cls: str, methods: list) -> list[str]:
"""`ToString` over the class's own text output, where MEOS publishes one.