From ebbb391b9e87bb50907f8a17546cd383c41a713e Mon Sep 17 00:00:00 2001 From: Jacek Sieka Date: Mon, 12 Jun 2023 14:13:18 +0200 Subject: [PATCH] ptrops: add makeUncheckedArray (#193) turns a pointer into an array pointer of the same type --- stew/ptrops.nim | 5 ++++- tests/test_ptrops.nim | 5 +++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/stew/ptrops.nim b/stew/ptrops.nim index 3074a0d..ec700f6 100644 --- a/stew/ptrops.nim +++ b/stew/ptrops.nim @@ -49,10 +49,13 @@ template distance*[T](a, b: ptr T): int = # exceeds what can be represented in an int distance(cast[pointer](a), cast[pointer](b)) div sizeof(T) -proc baseAddr*[T](x: openArray[T]): ptr T = +func baseAddr*[T](x: openArray[T]): ptr T = # Return the address of the zero:th element of x or `nil` if x is empty if x.len == 0: nil else: cast[ptr T](x) +func makeUncheckedArray*[T](p: ptr T): ptr UncheckedArray[T] = + cast[ptr UncheckedArray[T]](p) + template makeOpenArray*[T](p: ptr T, len: Natural): openArray[T] = toOpenArray(cast[ptr UncheckedArray[T]](p), 0, len - 1) diff --git a/tests/test_ptrops.nim b/tests/test_ptrops.nim index 36c1d72..c6c0028 100644 --- a/tests/test_ptrops.nim +++ b/tests/test_ptrops.nim @@ -86,3 +86,8 @@ suite "ptrops": check: baseAddr(makeOpenArray(nil, int, 0)) == nil baseAddr(makeOpenArray(addr v, 1)) == addr v + + block ua: + var v = [2, 3] + check: + makeUncheckedArray(baseAddr v)[1] == 3