From 43e56d57a51ef6a3240a459d3e6068fc4a9292a5 Mon Sep 17 00:00:00 2001 From: sinkuu Date: Sat, 28 Feb 2015 17:35:52 +0900 Subject: [PATCH] Fix Issue 14230 - std.array.join misses the first element which is empty string --- std/array.d | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/std/array.d b/std/array.d index 21dfda6caf9..48b6f3fdae5 100644 --- a/std/array.d +++ b/std/array.d @@ -1644,13 +1644,13 @@ ElementEncodingType!(ElementType!RoR)[] join(RoR, R)(RoR ror, R sep) auto result = (() @trusted => uninitializedArray!(RetTypeElement[])(length))(); size_t len; + foreach(e; ror.front) + emplaceRef(result[len++], e); + ror.popFront(); foreach(r; ror) { - if (len) // if not first time thru loop - { - foreach(e; sepArr) - emplaceRef(result[len++], e); - } + foreach(e; sepArr) + emplaceRef(result[len++], e); foreach(e; r) emplaceRef(result[len++], e); } @@ -1671,6 +1671,12 @@ ElementEncodingType!(ElementType!RoR)[] join(RoR, R)(RoR ror, R sep) } } +unittest // Issue 14230 +{ + string[] ary = ["","aa","bb","cc"]; // leaded by _empty_ element + assert(ary.join(" @") == " @aa @bb @cc"); // OK in 2.067b1 and olders +} + /// Ditto ElementEncodingType!(ElementType!RoR)[] join(RoR, E)(RoR ror, E sep) if(isInputRange!RoR && @@ -1710,10 +1716,12 @@ ElementEncodingType!(ElementType!RoR)[] join(RoR, E)(RoR ror, E sep) size_t len; + foreach(e; ror.front) + emplaceRef(result[len++], e); + ror.popFront(); foreach(r; ror) { - if (len) - emplaceRef(result[len++], sep); + emplaceRef(result[len++], sep); foreach(e; r) emplaceRef(result[len++], e); } @@ -1735,6 +1743,12 @@ ElementEncodingType!(ElementType!RoR)[] join(RoR, E)(RoR ror, E sep) } } +unittest // Issue 14230 +{ + string[] ary = ["","aa","bb","cc"]; + assert(ary.join('@') == "@aa@bb@cc"); +} + /// Ditto ElementEncodingType!(ElementType!RoR)[] join(RoR)(RoR ror) if(isInputRange!RoR &&