[Issue 10930] std.array.replace cannot simple replace an element in array

d-bugmail at puremagic.com d-bugmail at puremagic.com
Tue Jan 9 17:42:14 UTC 2018


https://issues.dlang.org/show_bug.cgi?id=10930

Seb <greensunny12 at gmail.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |greensunny12 at gmail.com

--- Comment #7 from Seb <greensunny12 at gmail.com> ---
This applied on top of https://github.com/dlang/phobos/pull/6017 will make it
work:

diff --git a/std/array.d b/std/array.d
index 3a44612cb..207b1280d 100644
--- a/std/array.d
+++ b/std/array.d
@@ -2120,21 +2120,21 @@ if (isInputRange!RoR &&
         $(REF map, std,algorithm,iteration) which can act as a lazy replace
  +/
 E[] replace(E, R1, R2)(E[] subject, R1 from, R2 to)
-if (isDynamicArray!(E[]) && isForwardRange!R1 && isForwardRange!R2
-        && (hasLength!R2 || isSomeString!R2))
+if (isDynamicArray!(E[]))
 {
     import std.algorithm.searching : find;
     import std.range : dropOne;

-    if (from.empty) return subject;
+    static if (isInputRange!R1)
+        if (from.empty) return subject;

-    auto balance = find(subject, from.save);
+    auto balance = find(subject, from);
     if (balance.empty)
         return subject;

     auto app = appender!(E[])();
     app.put(subject[0 .. subject.length - balance.length]);
-    app.put(to.save);
+    app.put(to);
     // replacing an element in an array is different to a range replacement
     static if (is(Unqual!E : Unqual!R1))
         replaceInto(app, balance.dropOne, from, to);
@@ -2158,6 +2158,11 @@ if (isDynamicArray!(E[]) && isForwardRange!R1 &&
isForwardRange!R2
     assert([3, 3, 4, 3].replace([3, 3], [1, 1, 1]) == [1, 1, 1, 4, 3]);
 }

+ at safe unittest
+{
+    assert([0, 1, 2].replace(1, 4) == [0, 4, 2]);
+}
+
 // https://issues.dlang.org/show_bug.cgi?id=18215
 @safe unittest
 {
@@ -2181,28 +2186,29 @@ if (isDynamicArray!(E[]) && isForwardRange!R1 &&
isForwardRange!R2

 /// ditto
 void replaceInto(E, Sink, R1, R2)(Sink sink, E[] subject, R1 from, R2 to)
-if (isOutputRange!(Sink, E) && isDynamicArray!(E[])
-    && isForwardRange!R1 && isForwardRange!R2
-    && (hasLength!R2 || isSomeString!R2))
+if (isOutputRange!(Sink, E) && isDynamicArray!(E[]))
 {
     import std.algorithm.searching : find;
     import std.range : dropOne;

-    if (from.empty)
+    static if (isInputRange!R1)
     {
-        sink.put(subject);
-        return;
+        if (from.empty)
+        {
+            sink.put(subject);
+            return;
+        }
     }
     for (;;)
     {
-        auto balance = find(subject, from.save);
+        auto balance = find(subject, from);
         if (balance.empty)
         {
             sink.put(subject);
             break;
         }
         sink.put(subject[0 .. subject.length - balance.length]);
-        sink.put(to.save);
+        sink.put(to);
         // replacing an element in an array is different to a range
replacement
         static if (is(Unqual!E : Unqual!R1))
             subject = balance.dropOne;


Of course constraints need be set, but to be fair currently there aren't any
for this

--


More information about the Digitalmars-d-bugs mailing list