From f565e8551267ca24a391d570da5a90b8934c99a7 Mon Sep 17 00:00:00 2001 From: Timothee Cour Date: Mon, 5 Oct 2020 18:03:34 -0700 Subject: [PATCH 1/2] new pointers.toUncheckedArray --- changelog.md | 1 + lib/std/pointers.nim | 15 +++++++++++++++ 2 files changed, 16 insertions(+) create mode 100644 lib/std/pointers.nim diff --git a/changelog.md b/changelog.md index 3144c7cf54a46..0cb48942b9dc7 100644 --- a/changelog.md +++ b/changelog.md @@ -212,6 +212,7 @@ - Added `progressInterval` argument to `asyncftpclient.newAsyncFtpClient` to control the interval at which progress callbacks are called. +- Added module `pointers` containing `toUncheckedArray` ## Language changes diff --git a/lib/std/pointers.nim b/lib/std/pointers.nim new file mode 100644 index 0000000000000..8220c870f0244 --- /dev/null +++ b/lib/std/pointers.nim @@ -0,0 +1,15 @@ +##[ +Convenience procs to deal with pointer-like variables. +]## + +proc toUncheckedArray*[T](a: ptr[T]): ptr UncheckedArray[T] {.inline.} = + ## calls `cast[ptr UncheckedArray[T]]` (less error prone). + runnableExamples: + var a = @[10, 11, 12] + let pa = a[1].addr.toUncheckedArray + doAssert pa[-1] == 10 + pa[0] = 100 + doAssert a == @[10, 100, 12] + pa[0] += 5 + doAssert a[1] == 105 + cast[ptr UncheckedArray[T]](a) From 8ee5d184fd527d61b15c3ebd0ce5f107c2012047 Mon Sep 17 00:00:00 2001 From: Timothee Cour Date: Wed, 7 Oct 2020 11:46:15 -0700 Subject: [PATCH 2/2] address comments --- lib/std/pointers.nim | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/std/pointers.nim b/lib/std/pointers.nim index 8220c870f0244..4c92f74b7d146 100644 --- a/lib/std/pointers.nim +++ b/lib/std/pointers.nim @@ -2,8 +2,10 @@ Convenience procs to deal with pointer-like variables. ]## -proc toUncheckedArray*[T](a: ptr[T]): ptr UncheckedArray[T] {.inline.} = - ## calls `cast[ptr UncheckedArray[T]]` (less error prone). +proc toUncheckedArray*[T](a: ptr T): ptr UncheckedArray[T] {.inline.} = + ## Shortcut for `cast[ptr UncheckedArray[T]](a)`, where T is inferred. + ## This allows array indexing operations on `a`. + ## This is unsafe as it returns `UncheckedArray`. runnableExamples: var a = @[10, 11, 12] let pa = a[1].addr.toUncheckedArray