Implement SList.popFirstOf
Fix #36. Slicing for the SList on top of the existing SRange would be inefficent. There would be two cases: - Range iterates till the end of the list. - Range iterates till some element "end". If both cases are implemented in the same range, this range should check for both conditions (end of the list and "begin == end") instead of only one (end of the list). Introducing a different range is undesirable since all containers have currently only one range.
This commit is contained in:
parent
ddb02e41eb
commit
d267a9cc64
@ -719,6 +719,50 @@ struct SList(T)
|
|||||||
assert(l1 == l2);
|
assert(l1 == l2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Removes the fron element of the $(D_PARAM range) from the list.
|
||||||
|
*
|
||||||
|
* Params:
|
||||||
|
* range = Range whose front element should be removed.
|
||||||
|
*
|
||||||
|
* Returns: $(D_PSYMBOL range) with the first element removed.
|
||||||
|
*
|
||||||
|
* Precondition: $(D_INLINECODE !range.empty).
|
||||||
|
* $(D_PARAM range) is extracted from this list.
|
||||||
|
*/
|
||||||
|
Range popFirstOf(Range range)
|
||||||
|
in
|
||||||
|
{
|
||||||
|
assert(!range.empty);
|
||||||
|
assert(checkRangeBelonging(range));
|
||||||
|
}
|
||||||
|
do
|
||||||
|
{
|
||||||
|
auto next = (*range.head).next;
|
||||||
|
|
||||||
|
allocator.dispose(*range.head);
|
||||||
|
*range.head = next;
|
||||||
|
|
||||||
|
return range;
|
||||||
|
}
|
||||||
|
|
||||||
|
///
|
||||||
|
@nogc nothrow pure @safe unittest
|
||||||
|
{
|
||||||
|
auto list = SList!int([5, 234, 30]);
|
||||||
|
auto range = list[];
|
||||||
|
|
||||||
|
range.popFront();
|
||||||
|
assert(list.popFirstOf(range).front == 30);
|
||||||
|
|
||||||
|
range = list[];
|
||||||
|
assert(range.front == 5);
|
||||||
|
range.popFront;
|
||||||
|
assert(range.front == 30);
|
||||||
|
range.popFront;
|
||||||
|
assert(range.empty);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns: Range that iterates over all elements of the container, in
|
* Returns: Range that iterates over all elements of the container, in
|
||||||
* forward order.
|
* forward order.
|
||||||
|
Loading…
Reference in New Issue
Block a user