Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 39 additions & 0 deletions MEOS.NET.Tests/CallerAllocatedArrayTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
using System.Runtime.InteropServices;

using MEOS.NET.Functions;
using MEOS.NET.Types;

namespace MEOS.NET.Tests
{
/// <summary>
/// The `each` family fills an array the CALLER allocates, so the wrapper
/// takes that array rather than making one: MEOS writes one pointer per
/// member of the object, and storage for fewer of them is written past.
/// </summary>
[TestClass]
public class CallerAllocatedArrayTests : MeosTest
{
[TestMethod]
public void EachFillsTheArrayTheCallerGivesIt()
{
Jsonb jb = Jsonb.In("{\"a\": 1, \"b\": \"two\"}")!;
IntPtr values = Marshal.AllocHGlobal(IntPtr.Size * 8);
try
{
IntPtr[] keys = Meos.JsonbEach(jb.Ptr, values);

Assert.AreEqual(2, keys.Length);
Assert.AreEqual("a", Meos.TextOut(keys[0]));
Assert.AreEqual("b", Meos.TextOut(keys[1]));
Assert.AreEqual("1",
Meos.JsonbOut(Marshal.ReadIntPtr(values, 0)));
Assert.AreEqual("\"two\"",
Meos.JsonbOut(Marshal.ReadIntPtr(values, IntPtr.Size)));
}
finally
{
Marshal.FreeHGlobal(values);
}
}
}
}
29 changes: 29 additions & 0 deletions MEOS.NET.Tests/OutParameterTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -49,5 +49,34 @@ public void ATemporalFloatAnswersItsValueAtAMoment()
Assert.IsNull(
temp.ValueAtTimestamptz(new DateTime(2024, 12, 9, 0, 0, 0, DateTimeKind.Utc), true));
}

[TestMethod]
public void ANearestNeighbourStepAnswersTheEntryAndItsDistance()
{
RTree tree = RTree.CreateStbox()!;
STBox near = STBox.In("STBOX X((1,1),(2,2))")!;
STBox far = STBox.In("STBOX X((9,9),(10,10))")!;
Assert.IsTrue(tree.Insert(near.Ptr, 1));
Assert.IsTrue(tree.Insert(far.Ptr, 2));

STBox query = STBox.In("STBOX X((0,0),(0,0))")!;
RTreeNNCursor walk = RTreeNNCursor.Open(tree, query.Ptr)!;
try
{
(long Id, double Distance)? nearest = walk.Next();
(long Id, double Distance)? next = walk.Next();

Assert.IsNotNull(nearest);
Assert.IsNotNull(next);
Assert.AreEqual(1L, nearest!.Value.Id);
Assert.AreEqual(2L, next!.Value.Id);
Assert.IsTrue(next.Value.Distance > nearest.Value.Distance);
Assert.IsNull(walk.Next());
}
finally
{
walk.Close();
}
}
}
}
100 changes: 32 additions & 68 deletions MEOS.NET/Functions/Meos.meos_json.g.cs
Original file line number Diff line number Diff line change
Expand Up @@ -105,52 +105,34 @@ public static IntPtr[] JsonArrayElementsText(IntPtr js)
public static int JsonArrayLength(IntPtr js)
=> SafeExecution<int>(() => Native.JsonArrayLength(js));

public static (IntPtr[], IntPtr[]) JsonEach(IntPtr js)
public static IntPtr[] JsonEach(IntPtr js, IntPtr values)
{
IntPtr _out_values = Marshal.AllocHGlobal(IntPtr.Size);
IntPtr _count_count = Marshal.AllocHGlobal(sizeof(int));
IntPtr _cnt = Marshal.AllocHGlobal(sizeof(int));
try
{
IntPtr _resultPtr = SafeExecution<IntPtr>(() => Native.JsonEach(js, _out_values, _count_count));
int _n = Marshal.ReadInt32(_count_count);
IntPtr[] _resultArr = new IntPtr[_n];
for (int _i = 0; _i < _n; _i++)
{ _resultArr[_i] = Marshal.ReadIntPtr(_resultPtr, _i * IntPtr.Size); }
IntPtr __out_values_arr = Marshal.ReadIntPtr(_out_values);
IntPtr[] __out_values_out = new IntPtr[_n];
IntPtr _p = SafeExecution<IntPtr>(() => Native.JsonEach(js, values, _cnt));
int _n = Marshal.ReadInt32(_cnt);
IntPtr[] _out = new IntPtr[_n];
for (int _i = 0; _i < _n; _i++)
{ __out_values_out[_i] = Marshal.ReadIntPtr(__out_values_arr, _i * IntPtr.Size); }
return (_resultArr, __out_values_out);
}
finally
{
Marshal.FreeHGlobal(_out_values);
Marshal.FreeHGlobal(_count_count);
{ _out[_i] = Marshal.ReadIntPtr(_p, _i * IntPtr.Size); }
return _out;
}
finally { Marshal.FreeHGlobal(_cnt); }
}

public static (IntPtr[], IntPtr[]) JsonEachText(IntPtr js)
public static IntPtr[] JsonEachText(IntPtr js, IntPtr values)
{
IntPtr _out_values = Marshal.AllocHGlobal(IntPtr.Size);
IntPtr _count_count = Marshal.AllocHGlobal(sizeof(int));
IntPtr _cnt = Marshal.AllocHGlobal(sizeof(int));
try
{
IntPtr _resultPtr = SafeExecution<IntPtr>(() => Native.JsonEachText(js, _out_values, _count_count));
int _n = Marshal.ReadInt32(_count_count);
IntPtr[] _resultArr = new IntPtr[_n];
for (int _i = 0; _i < _n; _i++)
{ _resultArr[_i] = Marshal.ReadIntPtr(_resultPtr, _i * IntPtr.Size); }
IntPtr __out_values_arr = Marshal.ReadIntPtr(_out_values);
IntPtr[] __out_values_out = new IntPtr[_n];
IntPtr _p = SafeExecution<IntPtr>(() => Native.JsonEachText(js, values, _cnt));
int _n = Marshal.ReadInt32(_cnt);
IntPtr[] _out = new IntPtr[_n];
for (int _i = 0; _i < _n; _i++)
{ __out_values_out[_i] = Marshal.ReadIntPtr(__out_values_arr, _i * IntPtr.Size); }
return (_resultArr, __out_values_out);
}
finally
{
Marshal.FreeHGlobal(_out_values);
Marshal.FreeHGlobal(_count_count);
{ _out[_i] = Marshal.ReadIntPtr(_p, _i * IntPtr.Size); }
return _out;
}
finally { Marshal.FreeHGlobal(_cnt); }
}

public static IntPtr JsonExtractPath(IntPtr js, IntPtr path_elems, int path_len)
Expand Down Expand Up @@ -228,52 +210,34 @@ public static bool JsonbContained(IntPtr jb1, IntPtr jb2)
public static bool JsonbContains(IntPtr jb1, IntPtr jb2)
=> SafeExecution<bool>(() => Native.JsonbContains(jb1, jb2));

public static (IntPtr[], IntPtr[]) JsonbEach(IntPtr jb)
public static IntPtr[] JsonbEach(IntPtr jb, IntPtr values)
{
IntPtr _out_values = Marshal.AllocHGlobal(IntPtr.Size);
IntPtr _count_count = Marshal.AllocHGlobal(sizeof(int));
IntPtr _cnt = Marshal.AllocHGlobal(sizeof(int));
try
{
IntPtr _resultPtr = SafeExecution<IntPtr>(() => Native.JsonbEach(jb, _out_values, _count_count));
int _n = Marshal.ReadInt32(_count_count);
IntPtr[] _resultArr = new IntPtr[_n];
for (int _i = 0; _i < _n; _i++)
{ _resultArr[_i] = Marshal.ReadIntPtr(_resultPtr, _i * IntPtr.Size); }
IntPtr __out_values_arr = Marshal.ReadIntPtr(_out_values);
IntPtr[] __out_values_out = new IntPtr[_n];
IntPtr _p = SafeExecution<IntPtr>(() => Native.JsonbEach(jb, values, _cnt));
int _n = Marshal.ReadInt32(_cnt);
IntPtr[] _out = new IntPtr[_n];
for (int _i = 0; _i < _n; _i++)
{ __out_values_out[_i] = Marshal.ReadIntPtr(__out_values_arr, _i * IntPtr.Size); }
return (_resultArr, __out_values_out);
}
finally
{
Marshal.FreeHGlobal(_out_values);
Marshal.FreeHGlobal(_count_count);
{ _out[_i] = Marshal.ReadIntPtr(_p, _i * IntPtr.Size); }
return _out;
}
finally { Marshal.FreeHGlobal(_cnt); }
}

public static (IntPtr[], IntPtr[]) JsonbEachText(IntPtr jb)
public static IntPtr[] JsonbEachText(IntPtr jb, IntPtr values)
{
IntPtr _out_values = Marshal.AllocHGlobal(IntPtr.Size);
IntPtr _count_count = Marshal.AllocHGlobal(sizeof(int));
IntPtr _cnt = Marshal.AllocHGlobal(sizeof(int));
try
{
IntPtr _resultPtr = SafeExecution<IntPtr>(() => Native.JsonbEachText(jb, _out_values, _count_count));
int _n = Marshal.ReadInt32(_count_count);
IntPtr[] _resultArr = new IntPtr[_n];
for (int _i = 0; _i < _n; _i++)
{ _resultArr[_i] = Marshal.ReadIntPtr(_resultPtr, _i * IntPtr.Size); }
IntPtr __out_values_arr = Marshal.ReadIntPtr(_out_values);
IntPtr[] __out_values_out = new IntPtr[_n];
IntPtr _p = SafeExecution<IntPtr>(() => Native.JsonbEachText(jb, values, _cnt));
int _n = Marshal.ReadInt32(_cnt);
IntPtr[] _out = new IntPtr[_n];
for (int _i = 0; _i < _n; _i++)
{ __out_values_out[_i] = Marshal.ReadIntPtr(__out_values_arr, _i * IntPtr.Size); }
return (_resultArr, __out_values_out);
}
finally
{
Marshal.FreeHGlobal(_out_values);
Marshal.FreeHGlobal(_count_count);
{ _out[_i] = Marshal.ReadIntPtr(_p, _i * IntPtr.Size); }
return _out;
}
finally { Marshal.FreeHGlobal(_cnt); }
}

public static bool JsonbExists(IntPtr jb, IntPtr key)
Expand Down
100 changes: 32 additions & 68 deletions MEOS.NET/Functions/Meos.pgtypes.g.cs
Original file line number Diff line number Diff line change
Expand Up @@ -534,52 +534,34 @@ public static IntPtr[] PgJsonArrayElementsText(IntPtr js)
public static int PgJsonArrayLength(IntPtr js)
=> SafeExecution<int>(() => Native.PgJsonArrayLength(js));

public static (IntPtr[], IntPtr[]) PgJsonEach(IntPtr js)
public static IntPtr[] PgJsonEach(IntPtr js, IntPtr values)
{
IntPtr _out_values = Marshal.AllocHGlobal(IntPtr.Size);
IntPtr _count_count = Marshal.AllocHGlobal(sizeof(int));
IntPtr _cnt = Marshal.AllocHGlobal(sizeof(int));
try
{
IntPtr _resultPtr = SafeExecution<IntPtr>(() => Native.PgJsonEach(js, _out_values, _count_count));
int _n = Marshal.ReadInt32(_count_count);
IntPtr[] _resultArr = new IntPtr[_n];
for (int _i = 0; _i < _n; _i++)
{ _resultArr[_i] = Marshal.ReadIntPtr(_resultPtr, _i * IntPtr.Size); }
IntPtr __out_values_arr = Marshal.ReadIntPtr(_out_values);
IntPtr[] __out_values_out = new IntPtr[_n];
IntPtr _p = SafeExecution<IntPtr>(() => Native.PgJsonEach(js, values, _cnt));
int _n = Marshal.ReadInt32(_cnt);
IntPtr[] _out = new IntPtr[_n];
for (int _i = 0; _i < _n; _i++)
{ __out_values_out[_i] = Marshal.ReadIntPtr(__out_values_arr, _i * IntPtr.Size); }
return (_resultArr, __out_values_out);
}
finally
{
Marshal.FreeHGlobal(_out_values);
Marshal.FreeHGlobal(_count_count);
{ _out[_i] = Marshal.ReadIntPtr(_p, _i * IntPtr.Size); }
return _out;
}
finally { Marshal.FreeHGlobal(_cnt); }
}

public static (IntPtr[], IntPtr[]) PgJsonEachText(IntPtr js)
public static IntPtr[] PgJsonEachText(IntPtr js, IntPtr values)
{
IntPtr _out_values = Marshal.AllocHGlobal(IntPtr.Size);
IntPtr _count_count = Marshal.AllocHGlobal(sizeof(int));
IntPtr _cnt = Marshal.AllocHGlobal(sizeof(int));
try
{
IntPtr _resultPtr = SafeExecution<IntPtr>(() => Native.PgJsonEachText(js, _out_values, _count_count));
int _n = Marshal.ReadInt32(_count_count);
IntPtr[] _resultArr = new IntPtr[_n];
for (int _i = 0; _i < _n; _i++)
{ _resultArr[_i] = Marshal.ReadIntPtr(_resultPtr, _i * IntPtr.Size); }
IntPtr __out_values_arr = Marshal.ReadIntPtr(_out_values);
IntPtr[] __out_values_out = new IntPtr[_n];
IntPtr _p = SafeExecution<IntPtr>(() => Native.PgJsonEachText(js, values, _cnt));
int _n = Marshal.ReadInt32(_cnt);
IntPtr[] _out = new IntPtr[_n];
for (int _i = 0; _i < _n; _i++)
{ __out_values_out[_i] = Marshal.ReadIntPtr(__out_values_arr, _i * IntPtr.Size); }
return (_resultArr, __out_values_out);
}
finally
{
Marshal.FreeHGlobal(_out_values);
Marshal.FreeHGlobal(_count_count);
{ _out[_i] = Marshal.ReadIntPtr(_p, _i * IntPtr.Size); }
return _out;
}
finally { Marshal.FreeHGlobal(_cnt); }
}

public static IntPtr[] PgJsonObjectKeys(IntPtr js)
Expand Down Expand Up @@ -642,52 +624,34 @@ public static bool PgJsonbContained(IntPtr jb1, IntPtr jb2)
public static bool PgJsonbContains(IntPtr jb1, IntPtr jb2)
=> SafeExecution<bool>(() => Native.PgJsonbContains(jb1, jb2));

public static (IntPtr[], IntPtr[]) PgJsonbEach(IntPtr jb)
public static IntPtr[] PgJsonbEach(IntPtr jb, IntPtr values)
{
IntPtr _out_values = Marshal.AllocHGlobal(IntPtr.Size);
IntPtr _count_count = Marshal.AllocHGlobal(sizeof(int));
IntPtr _cnt = Marshal.AllocHGlobal(sizeof(int));
try
{
IntPtr _resultPtr = SafeExecution<IntPtr>(() => Native.PgJsonbEach(jb, _out_values, _count_count));
int _n = Marshal.ReadInt32(_count_count);
IntPtr[] _resultArr = new IntPtr[_n];
for (int _i = 0; _i < _n; _i++)
{ _resultArr[_i] = Marshal.ReadIntPtr(_resultPtr, _i * IntPtr.Size); }
IntPtr __out_values_arr = Marshal.ReadIntPtr(_out_values);
IntPtr[] __out_values_out = new IntPtr[_n];
IntPtr _p = SafeExecution<IntPtr>(() => Native.PgJsonbEach(jb, values, _cnt));
int _n = Marshal.ReadInt32(_cnt);
IntPtr[] _out = new IntPtr[_n];
for (int _i = 0; _i < _n; _i++)
{ __out_values_out[_i] = Marshal.ReadIntPtr(__out_values_arr, _i * IntPtr.Size); }
return (_resultArr, __out_values_out);
}
finally
{
Marshal.FreeHGlobal(_out_values);
Marshal.FreeHGlobal(_count_count);
{ _out[_i] = Marshal.ReadIntPtr(_p, _i * IntPtr.Size); }
return _out;
}
finally { Marshal.FreeHGlobal(_cnt); }
}

public static (IntPtr[], IntPtr[]) PgJsonbEachText(IntPtr jb)
public static IntPtr[] PgJsonbEachText(IntPtr jb, IntPtr values)
{
IntPtr _out_values = Marshal.AllocHGlobal(IntPtr.Size);
IntPtr _count_count = Marshal.AllocHGlobal(sizeof(int));
IntPtr _cnt = Marshal.AllocHGlobal(sizeof(int));
try
{
IntPtr _resultPtr = SafeExecution<IntPtr>(() => Native.PgJsonbEachText(jb, _out_values, _count_count));
int _n = Marshal.ReadInt32(_count_count);
IntPtr[] _resultArr = new IntPtr[_n];
for (int _i = 0; _i < _n; _i++)
{ _resultArr[_i] = Marshal.ReadIntPtr(_resultPtr, _i * IntPtr.Size); }
IntPtr __out_values_arr = Marshal.ReadIntPtr(_out_values);
IntPtr[] __out_values_out = new IntPtr[_n];
IntPtr _p = SafeExecution<IntPtr>(() => Native.PgJsonbEachText(jb, values, _cnt));
int _n = Marshal.ReadInt32(_cnt);
IntPtr[] _out = new IntPtr[_n];
for (int _i = 0; _i < _n; _i++)
{ __out_values_out[_i] = Marshal.ReadIntPtr(__out_values_arr, _i * IntPtr.Size); }
return (_resultArr, __out_values_out);
}
finally
{
Marshal.FreeHGlobal(_out_values);
Marshal.FreeHGlobal(_count_count);
{ _out[_i] = Marshal.ReadIntPtr(_p, _i * IntPtr.Size); }
return _out;
}
finally { Marshal.FreeHGlobal(_cnt); }
}

public static bool PgJsonbEq(IntPtr jb1, IntPtr jb2)
Expand Down
15 changes: 15 additions & 0 deletions MEOS.NET/Types/Geometry.g.cs
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,21 @@ public double Length()
public double MaxDistance2d(Geo gs2)
=> Meos.GeomMaxDistance2d(this.Ptr, gs2.Ptr);

public (Geo?, double) MinBoundingRadius()
{
IntPtr _radius = Marshal.AllocHGlobal(8);
try
{
var _answered = Meos.GeomMinBoundingRadius(this.Ptr, _radius);

return (MEOSFactory.WrapGeo(_answered), Marshal.PtrToStructure<double>(_radius));
}
finally
{
Marshal.FreeHGlobal(_radius);
}
}

public Geo? OrientedEnvelope()
=> MEOSFactory.WrapGeo(Meos.GeomOrientedEnvelope(this.Ptr));

Expand Down
14 changes: 0 additions & 14 deletions MEOS.NET/Types/Jsonb.g.cs
Original file line number Diff line number Diff line change
Expand Up @@ -86,20 +86,6 @@ public bool Contained(Jsonb jb2)
}
}

public (Text?[], Jsonb?[]) Each()
{
var _answered = Meos.JsonbEach(this.Ptr);

return (MEOSFactory.WrapTextArray(_answered.Item1), MEOSFactory.WrapJsonbArray(_answered.Item2));
}

public (Text?[], Text?[]) EachText()
{
var _answered = Meos.JsonbEachText(this.Ptr);

return (MEOSFactory.WrapTextArray(_answered.Item1), MEOSFactory.WrapTextArray(_answered.Item2));
}

public bool Exists(Text key)
=> Meos.JsonbExists(this.Ptr, key.Ptr);

Expand Down
Loading
Loading