@ -561,3 +561,49 @@ if (isInputRange!Range && hasLvalueElements!Range)
|
||||
NonCopyable[] nonCopyable;
|
||||
initializeAll(nonCopyable);
|
||||
}
|
||||
|
||||
/**
|
||||
* Destroys all elements in the $(D_PARAM range).
|
||||
*
|
||||
* This function has effect only if the element type of $(D_PARAM Range) has
|
||||
* an elaborate destructor, i.e. it is a $(D_PSYMBOL struct) with an explicit
|
||||
* or generated by the compiler destructor.
|
||||
*
|
||||
* Params:
|
||||
* Range = Input range type.
|
||||
* range = Input range.
|
||||
*/
|
||||
void destroyAll(Range)(Range range)
|
||||
if (isInputRange!Range && hasLvalueElements!Range)
|
||||
{
|
||||
static if (hasElaborateDestructor!(ElementType!Range))
|
||||
{
|
||||
foreach (ref e; range)
|
||||
{
|
||||
destroy(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
///
|
||||
@nogc nothrow pure @trusted unittest
|
||||
{
|
||||
static struct WithDtor
|
||||
{
|
||||
private size_t* counter;
|
||||
~this() @nogc nothrow pure
|
||||
{
|
||||
if (this.counter !is null)
|
||||
{
|
||||
++(*this.counter);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
size_t counter;
|
||||
WithDtor[2] withDtor = [WithDtor(&counter), WithDtor(&counter)];
|
||||
|
||||
destroyAll(withDtor[]);
|
||||
|
||||
assert(counter == 2);
|
||||
}
|
||||
|
Reference in New Issue
Block a user