Why does this declaration exist inside std.range.put?
Meta via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Thu Nov 6 13:19:14 PST 2014
This is the code for std.range.put:
void put(R, E)(ref R r, E e)
{
//Why?
@property ref E[] EArrayInit(); //@@@9186@@@: Can't use
(E[]).init
//First level: simply straight up put.
static if (is(typeof(doPut(r, e))))
{
doPut(r, e);
}
//Optional optimization block for straight up array to array
copy.
else static if (isDynamicArray!R && !isNarrowString!R &&
isDynamicArray!E && is(typeof(r[] = e[])))
{
immutable len = e.length;
r[0 .. len] = e[];
r = r[len .. $];
}
//Accepts E[] ?
else static if (is(typeof(doPut(r, [e]))) &&
!isDynamicArray!R)
{
if (__ctfe)
doPut(r, [e]);
else
doPut(r, (&e)[0..1]);
}
//special case for char to string.
else static if (isSomeChar!E && is(typeof(putChar(r, e))))
{
putChar(r, e);
}
//Extract each element from the range
//We can use "put" here, so we can recursively test a RoR of
E.
else static if (isInputRange!E && is(typeof(put(r, e.front))))
{
//Special optimization: If E is a narrow string, and r
accepts characters no-wider than the string's
//Then simply feed the characters 1 by 1.
static if (isNarrowString!E && (
(is(E : const char[]) && is(typeof(doPut(r,
char.max))) && !is(typeof(doPut(r, dchar.max))) &&
!is(typeof(doPut(r, wchar.max)))) ||
(is(E : const wchar[]) && is(typeof(doPut(r,
wchar.max))) && !is(typeof(doPut(r, dchar.max)))) ) )
{
foreach(c; e)
doPut(r, c);
}
else
{
for (; !e.empty; e.popFront())
put(r, e.front);
}
}
else
{
import std.string;
static assert (false, format("Cannot put a %s into a
%s.", E.stringof, R.stringof));
}
}
What is the reason for that first function declaration,
EArrayInit? It's not referenced anywhere else in the function,
and it doesn't even have a body.
More information about the Digitalmars-d-learn
mailing list