[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