From e5c936adfb2399c1cc1cbe8250ad6e82a1a64468 Mon Sep 17 00:00:00 2001 From: monarchdodra Date: Sun, 20 Oct 2013 15:59:28 +0200 Subject: [PATCH 1/2] Remove conditional emplace call --- std/array.d | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/std/array.d b/std/array.d index b9cedd0eded..3ada77d6acf 100644 --- a/std/array.d +++ b/std/array.d @@ -31,27 +31,22 @@ if (isIterable!Range && !isNarrowString!Range && !isInfinite!Range) static if (hasLength!Range) { if(r.length == 0) return null; - //@@@BUG@@@ 10928 should be lambda - static @trusted nothrow auto trustedAllocateArray(size_t n) + + static auto trustedAllocateArray(size_t n) @trusted nothrow pure { return uninitializedArray!(Unqual!E[])(n); } auto result = trustedAllocateArray(r.length); - size_t i = 0; + + size_t i; + static auto trustedGetAddr(T)(ref T t) @trusted nothrow pure + { + return &t; + } foreach (e; r) { - // hacky - static if (is(typeof(result[i].opAssign(e))) || - !is(typeof(result[i] = e))) - { - // this should be in-place construction - emplace(result.ptr + i, e); - } - else - { - result[i] = e; - } - i++; + emplace(trustedGetAddr(result[i]), e); + ++i; } return cast(E[])result; } From 99100cf9ac4c159dc278bf40fa0884152eb812e9 Mon Sep 17 00:00:00 2001 From: monarch dodra Date: Tue, 29 Oct 2013 10:58:40 +0100 Subject: [PATCH 2/2] Remove explicit pure --- std/array.d | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/std/array.d b/std/array.d index 3ada77d6acf..c0fa8130e61 100644 --- a/std/array.d +++ b/std/array.d @@ -32,7 +32,7 @@ if (isIterable!Range && !isNarrowString!Range && !isInfinite!Range) { if(r.length == 0) return null; - static auto trustedAllocateArray(size_t n) @trusted nothrow pure + static auto trustedAllocateArray(size_t n) @trusted nothrow { return uninitializedArray!(Unqual!E[])(n); }