Skip to content

Commit d222317

Browse files
committed
More efficient and correct Base.copy
* Do not copy the underlying memory only to overwrite it * Return a new copy of the same type as the input
1 parent f73e73b commit d222317

File tree

3 files changed

+12
-4
lines changed

3 files changed

+12
-4
lines changed

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name = "MemoryViews"
22
uuid = "a791c907-b98b-4e44-8f4d-e4c2362c6b2f"
3-
version = "0.3.0"
3+
version = "0.3.1"
44
authors = ["Jakob Nybo Nissen <jakobnybonissen@gmail.com>"]
55

66
[weakdeps]

src/basic.jl

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -328,14 +328,17 @@ function Base.reverse!(mem::MutableMemoryView)
328328
mem
329329
end
330330

331-
# TODO: No need to copy
332331
function Base.reverse(mem::MemoryView)
333-
cp = MutableMemoryView(unsafe, copy(mem))
332+
cp = similar(mem)
334333
stop = length(cp) + 1
335334
@inbounds for i in 1:length(cp)
336335
cp[i] = mem[stop - i]
337336
end
338-
cp
337+
return if mem isa MutableMemoryView
338+
cp
339+
else
340+
ImmutableMemoryView(cp)
341+
end
339342
end
340343

341344
struct ReverseMemoryView{T}

test/runtests.jl

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -388,10 +388,15 @@ end
388388
@test reverse!(MemoryView(copy(v))) == MemoryView(reverse(v))
389389
mem = MemoryView(v)
390390
rev = reverse(mem)
391+
@test typeof(rev) == typeof(mem)
391392
@test rev.ref != mem.ref
392393
@test rev == reverse(v)
393394
@test_throws Exception reverse!(ImmutableMemoryView(v))
394395
end
396+
mem = MemoryView("abcd")
397+
rev = reverse(mem)
398+
@test rev == b"dcba"
399+
@test rev isa ImmutableMemoryView{UInt8}
395400
end
396401

397402
@testset "Cmp" begin

0 commit comments

Comments
 (0)