Merge pull request #4887 from Superstar64/joiner_assign_front

made joiner.front assignable
This commit is contained in:
Jack Stouffer 2017-01-18 16:05:28 -05:00 committed by GitHub
commit fc37e0f750

View file

@ -2447,6 +2447,21 @@ if (isInputRange!RoR && isInputRange!(ElementType!RoR))
return copy;
}
}
static if (hasAssignableElements!(ElementType!RoR))
{
@property void front(ElementType!(ElementType!RoR) element)
{
assert(!empty, "Attempting to assign to front of an empty joiner.");
_current.front = element;
}
@property void front(ref ElementType!(ElementType!RoR) element)
{
assert(!empty, "Attempting to assign to front of an empty joiner.");
_current.front = element;
}
}
}
return Result(r);
}
@ -2606,6 +2621,51 @@ if (isInputRange!RoR && isInputRange!(ElementType!RoR))
assert(str == "abcd");
}
@safe unittest
{
import std.range : repeat;
class AssignableRange
{
@safe:
int element;
@property int front()
{
return element;
}
enum empty = false;
void popFront()
{
}
@property void front(int newValue)
{
element = newValue;
}
}
static assert(isInputRange!AssignableRange);
static assert(is(ElementType!AssignableRange == int));
static assert(hasAssignableElements!AssignableRange);
static assert(!hasLvalueElements!AssignableRange);
auto range = new AssignableRange();
assert(range.element == 0);
auto joined = joiner(repeat(range));
joined.front = 5;
assert(range.element == 5);
assert(joined.front == 5);
joined.popFront;
int byRef = 7;
joined.front = byRef;
assert(range.element == byRef);
assert(joined.front == byRef);
}
/++
Implements the homonym function (also known as $(D accumulate), $(D
compress), $(D inject), or $(D foldl)) present in various programming