On Sunday, 9 September 2012 at 15:32:01 UTC, kenji hara wrote:
I've posted two pull requests for the purpose.
https://github.com/D-Programming-Language/dmd/pull/1110
https://github.com/D-Programming-Language/druntime/pull/298
inout parameter and strongly purity function can realize this.
Details:
The new dup function's signature is:
auto dup(E)(inout(E)[] arr) pure @trusted;
If E has some mutable indirections (class, struct has mutable
pointers, array, etc),
dup would return inout(E). And the purity of dup function is
calculated to 'constant purity'.
Then the elements of returned value keep original type modifier.
class C {}
struct S { int* ptr; }
C[] carr;
S[] sarr;
int[][] aarr;
static assert(is(typeof(dup(carr)) == C[]));
static assert(is(typeof(dup(sarr)) == S[]));
static assert(is(typeof(dup(aarr)) == int[][]));
If E does not have mutable indirection (built-in types, struct
don't
have pointers, etc),
dup would return E[]. And the purity of dup function is
calculated to
'strong purity'.
Then returned value can be implicitly convertible to
immutable(E[]).
struct S { long value; }
S[] sarr;
int[] narr;
static assert(is(typeof(dup(sarr)) == S[]));
static assert(is(typeof(dup(parr)) == int*[]));
immutable S[] isarr = dup(sarr); // allowed!
immutable int[] inarr = dup(narr); // allowed!
And today, dup function is used with UFCS.
int[] marr;
immutable int[] iarr = marr.dup();
Finally, built-in dup and idup are merged into library dup().
Destroy!
Kenji Hara
Does anybody told you already that you freaking amazing?!
This rox, I've already seen it on GH.
Kenji for president++!