From 8ed11c6d48f6b4a4349c12186b5c9e38cd578844 Mon Sep 17 00:00:00 2001 From: Friedrich von Never Date: Sun, 12 Feb 2023 20:20:13 +0100 Subject: [PATCH] (#354) CPtr, FPtr: add tests --- Cesium.Runtime.Tests/PtrTests.cs | 29 +++++++++++++++++++++++++++++ Cesium.Runtime/CPtr.cs | 4 ++-- Cesium.Runtime/FPtr.cs | 14 ++++++++++++++ Cesium.Runtime/StringFunctions.cs | 2 +- 4 files changed, 46 insertions(+), 3 deletions(-) create mode 100644 Cesium.Runtime.Tests/PtrTests.cs create mode 100644 Cesium.Runtime/FPtr.cs diff --git a/Cesium.Runtime.Tests/PtrTests.cs b/Cesium.Runtime.Tests/PtrTests.cs new file mode 100644 index 00000000..ba8120f7 --- /dev/null +++ b/Cesium.Runtime.Tests/PtrTests.cs @@ -0,0 +1,29 @@ +namespace Cesium.Runtime.Tests; + +public unsafe class PtrTests +{ + [Fact] + public void CPtrTests() + { + CPtr v = (void*)0x1234; + Assert.Equal(0x1234L, (long)v.AsPtr()); + Assert.Equal(0x1234L, (long)v.AsPtr()); + + Assert.Equal(sizeof(long), sizeof(CPtr)); + + CPtr t = (int*)0x2345; + Assert.Equal(0x2345L, (long)t.AsPtr()); + Assert.Equal((IntPtr)0x2345, t.AsIntPtr()); + Assert.Equal(0x2345L, (long)t.AsPtr()); + + Assert.Equal(sizeof(long), sizeof(CPtr)); + } + + [Fact] + public void FPtrTests() + { + var a = new FPtr((void*)0x1234); + Assert.Equal(0x1234L, (long)a.AsPtr()); + Assert.Equal(sizeof(long), sizeof(FPtr)); + } +} diff --git a/Cesium.Runtime/CPtr.cs b/Cesium.Runtime/CPtr.cs index d974bacc..0fb097d5 100644 --- a/Cesium.Runtime/CPtr.cs +++ b/Cesium.Runtime/CPtr.cs @@ -1,7 +1,7 @@ namespace Cesium.Runtime; /// A class encapsulating an opaque pointer (aka void* in C). -public unsafe readonly struct CPtr +public readonly unsafe struct CPtr { private readonly long _value; @@ -19,7 +19,7 @@ private CPtr(long value) /// A class encapsulating an object pointer. /// Type this pointer may be resolved to. -public unsafe readonly struct CPtr where T : unmanaged +public readonly unsafe struct CPtr where T : unmanaged { private readonly long _value; diff --git a/Cesium.Runtime/FPtr.cs b/Cesium.Runtime/FPtr.cs new file mode 100644 index 00000000..0b609c53 --- /dev/null +++ b/Cesium.Runtime/FPtr.cs @@ -0,0 +1,14 @@ +namespace Cesium.Runtime; + +/// A class encapsulating a C function pointer. +public readonly unsafe struct FPtr where TDelegate : Delegate // TODO: Think about vararg and empty parameter list encoding. +{ + private readonly long _value; + + public FPtr(void* ptr) + { + _value = (long)ptr; + } + + public void* AsPtr() => (void*)_value; +} diff --git a/Cesium.Runtime/StringFunctions.cs b/Cesium.Runtime/StringFunctions.cs index 1ece4c3d..cce1e32d 100644 --- a/Cesium.Runtime/StringFunctions.cs +++ b/Cesium.Runtime/StringFunctions.cs @@ -10,7 +10,7 @@ namespace Cesium.Runtime; /// /// Functions declared in the string.h /// -public unsafe static class StringFunctions +public static unsafe class StringFunctions { public static uint StrLen(CPtr str) {