Skip to content

Commit fc37e0f

Browse files
authored
Merge pull request #4887 from Superstar64/joiner_assign_front
made joiner.front assignable
2 parents 9dd0f57 + 0b4b453 commit fc37e0f

File tree

1 file changed

+60
-0
lines changed

1 file changed

+60
-0
lines changed

std/algorithm/iteration.d

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2447,6 +2447,21 @@ if (isInputRange!RoR && isInputRange!(ElementType!RoR))
24472447
return copy;
24482448
}
24492449
}
2450+
2451+
static if (hasAssignableElements!(ElementType!RoR))
2452+
{
2453+
@property void front(ElementType!(ElementType!RoR) element)
2454+
{
2455+
assert(!empty, "Attempting to assign to front of an empty joiner.");
2456+
_current.front = element;
2457+
}
2458+
2459+
@property void front(ref ElementType!(ElementType!RoR) element)
2460+
{
2461+
assert(!empty, "Attempting to assign to front of an empty joiner.");
2462+
_current.front = element;
2463+
}
2464+
}
24502465
}
24512466
return Result(r);
24522467
}
@@ -2606,6 +2621,51 @@ if (isInputRange!RoR && isInputRange!(ElementType!RoR))
26062621
assert(str == "abcd");
26072622
}
26082623

2624+
@safe unittest
2625+
{
2626+
import std.range : repeat;
2627+
2628+
class AssignableRange
2629+
{
2630+
@safe:
2631+
int element;
2632+
@property int front()
2633+
{
2634+
return element;
2635+
}
2636+
2637+
enum empty = false;
2638+
2639+
void popFront()
2640+
{
2641+
}
2642+
2643+
@property void front(int newValue)
2644+
{
2645+
element = newValue;
2646+
}
2647+
}
2648+
2649+
static assert(isInputRange!AssignableRange);
2650+
static assert(is(ElementType!AssignableRange == int));
2651+
static assert(hasAssignableElements!AssignableRange);
2652+
static assert(!hasLvalueElements!AssignableRange);
2653+
2654+
auto range = new AssignableRange();
2655+
assert(range.element == 0);
2656+
2657+
auto joined = joiner(repeat(range));
2658+
joined.front = 5;
2659+
assert(range.element == 5);
2660+
assert(joined.front == 5);
2661+
2662+
joined.popFront;
2663+
int byRef = 7;
2664+
joined.front = byRef;
2665+
assert(range.element == byRef);
2666+
assert(joined.front == byRef);
2667+
}
2668+
26092669
/++
26102670
Implements the homonym function (also known as $(D accumulate), $(D
26112671
compress), $(D inject), or $(D foldl)) present in various programming

0 commit comments

Comments
 (0)