digitalmars.D.learn - identic ref/inout parameter
- Wilhelm (20/20) Sep 14 2007 Who do I determine in a function (probably with a assert statement) that...
- Regan Heath (9/34) Sep 14 2007 Maybe...
- Regan Heath (5/42) Sep 14 2007 It's a pity that this doesn't work:
- Downs (18/57) Sep 14 2007 -----BEGIN PGP SIGNED MESSAGE-----
- Jarrett Billingsley (6/12) Sep 14 2007 Probably not _quite_ what you'd expect. "ref T[]" means "ref(T[])", not...
- Downs (18/35) Sep 14 2007 -----BEGIN PGP SIGNED MESSAGE-----
- Jarrett Billingsley (16/21) Sep 15 2007 Hm. It doesn't compile with the 'ref' for the foreach loop values, but ...
Who do I determine in a function (probably with a assert statement) that the function with more the one ref/inout parameters of the same type are not called with the same variable like: private import std.stdio; int main(char[][] args) { int i=3; test( i,i,i,i); return 0; } void test(ref int r1, ref int r2, inout int i1, inout int i2) { writefln (" Ref: r1=%d r2=%d", r1, r2); writefln (" InOut: i1=%d i2=%d", i1, i2); r1 += 2; writefln ("r1 += 2; Ref: r1=%d r2=%d", r1, r2); writefln ("r1 += 2; InOut: i1=%d i2=%d", i1, i2); i2 += 2; writefln ("i1 += 2; Ref: r1=%d r2=%d", r1, r2); writefln ("i1 += 2; InOut: i1=%d i2=%d", i1, i2); } !! That may cause interesting results !!
Sep 14 2007
Wilhelm wrote:Who do I determine in a function (probably with a assert statement) that the function with more the one ref/inout parameters of the same type are not called with the same variable like: private import std.stdio; int main(char[][] args) { int i=3; test( i,i,i,i); return 0; } void test(ref int r1, ref int r2, inout int i1, inout int i2) { writefln (" Ref: r1=%d r2=%d", r1, r2); writefln (" InOut: i1=%d i2=%d", i1, i2); r1 += 2; writefln ("r1 += 2; Ref: r1=%d r2=%d", r1, r2); writefln ("r1 += 2; InOut: i1=%d i2=%d", i1, i2); i2 += 2; writefln ("i1 += 2; Ref: r1=%d r2=%d", r1, r2); writefln ("i1 += 2; InOut: i1=%d i2=%d", i1, i2); } !! That may cause interesting results !!Maybe... assert(&r1 != &r2); assert(&r1 != &i1); assert(&r1 != &i2); assert(&r2 != &i1); assert(&r2 != &i2); assert(&i1 != &i2); Regan
Sep 14 2007
Regan Heath wrote:Wilhelm wrote:It's a pity that this doesn't work: assert(r1 is r2); ..etc.. ReganWho do I determine in a function (probably with a assert statement) that the function with more the one ref/inout parameters of the same type are not called with the same variable like: private import std.stdio; int main(char[][] args) { int i=3; test( i,i,i,i); return 0; } void test(ref int r1, ref int r2, inout int i1, inout int i2) { writefln (" Ref: r1=%d r2=%d", r1, r2); writefln (" InOut: i1=%d i2=%d", i1, i2); r1 += 2; writefln ("r1 += 2; Ref: r1=%d r2=%d", r1, r2); writefln ("r1 += 2; InOut: i1=%d i2=%d", i1, i2); i2 += 2; writefln ("i1 += 2; Ref: r1=%d r2=%d", r1, r2); writefln ("i1 += 2; InOut: i1=%d i2=%d", i1, i2); } !! That may cause interesting results !!Maybe... assert(&r1 != &r2); assert(&r1 != &i1); assert(&r1 != &i2); assert(&r2 != &i1); assert(&r2 != &i2); assert(&i1 != &i2);
Sep 14 2007
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Regan Heath wrote:Wilhelm wrote:To clean it up a little void assertUnique(T)(ref T[] values...) { foreach (index, ref value; values[0..$-1]) foreach (ref value2; values[index+1..$]) assert(&value != &value2); } Untested, but should work. --downs -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.7 (GNU/Linux) Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org iD8DBQFG6oe3pEPJRr05fBERAviDAJ4ohNm2PvD1pWq9Z9AuZ5AdPqUT8wCeLkkW skn/AMq7xrLSUaN3vKy/R9c= =MfLi -----END PGP SIGNATURE-----Who do I determine in a function (probably with a assert statement) that the function with more the one ref/inout parameters of the same type are not called with the same variable like: private import std.stdio; int main(char[][] args) { int i=3; test( i,i,i,i); return 0; } void test(ref int r1, ref int r2, inout int i1, inout int i2) { writefln (" Ref: r1=%d r2=%d", r1, r2); writefln (" InOut: i1=%d i2=%d", i1, i2); r1 += 2; writefln ("r1 += 2; Ref: r1=%d r2=%d", r1, r2); writefln ("r1 += 2; InOut: i1=%d i2=%d", i1, i2); i2 += 2; writefln ("i1 += 2; Ref: r1=%d r2=%d", r1, r2); writefln ("i1 += 2; InOut: i1=%d i2=%d", i1, i2); } !! That may cause interesting results !!Maybe... assert(&r1 != &r2); assert(&r1 != &i1); assert(&r1 != &i2); assert(&r2 != &i1); assert(&r2 != &i2); assert(&i1 != &i2); Regan
Sep 14 2007
"Downs" <default_357-line yahoo.de> wrote in message news:fce15c$1h7e$1 digitalmars.com...To clean it up a little void assertUnique(T)(ref T[] values...) { foreach (index, ref value; values[0..$-1]) foreach (ref value2; values[index+1..$]) assert(&value != &value2); }Probably not _quite_ what you'd expect. "ref T[]" means "ref(T[])", not "(ref T)[]". That is, a reference to an array, not an array of references. So it'd have to be "T*[] values..." instead, and called as "assertUnique(&r1, &r2, &i1, &i2)".
Sep 14 2007
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Jarrett Billingsley wrote:"Downs" <default_357-line yahoo.de> wrote in message news:fce15c$1h7e$1 digitalmars.com...Damn, you're right. How about this? void assertUnique(T...)(ref T tuple) { foreach (index, ref v1; tuple[0..$-1]) foreach (ref v2; tuple[index+1..$]) assert(&v1 != &v2); } --downs -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.7 (GNU/Linux) Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org iD8DBQFG6vrqpEPJRr05fBERAsaGAKCYdvYlmyrI7ZnXend63q4YFMthwQCeLKNx wLtitWH8V2R4bCu5SBRTcZ0= =L2tS -----END PGP SIGNATURE-----To clean it up a little void assertUnique(T)(ref T[] values...) { foreach (index, ref value; values[0..$-1]) foreach (ref value2; values[index+1..$]) assert(&value != &value2); }Probably not _quite_ what you'd expect. "ref T[]" means "ref(T[])", not "(ref T)[]". That is, a reference to an array, not an array of references. So it'd have to be "T*[] values..." instead, and called as "assertUnique(&r1, &r2, &i1, &i2)".
Sep 14 2007
"Downs" <default_357-line yahoo.de> wrote in message news:fcetv4$6ii$1 digitalmars.com...void assertUnique(T...)(ref T tuple) { foreach (index, ref v1; tuple[0..$-1]) foreach (ref v2; tuple[index+1..$]) assert(&v1 != &v2); }Hm. It doesn't compile with the 'ref' for the foreach loop values, but when you take those out, it doesn't work. It works if you just index the tuple instead, though: void assertUnique(T...)(ref T tuple) { foreach(i1, v1; tuple[0 .. $ - 1]) foreach(i2, v2; tuple[i1 + 1 .. $]) assert(&tuple[i1] != &tuple[i1 + 1 + i2]); } Sadly, this can't be used in a function precondition because it gives the error "cannot modify parameter in precondition". The compiler thinks you're trying to modify the parameters when you pass them to assertUnique. (A case where "const ref" would be useful! How about that.) But you can still call it at the beginning of the function.
Sep 15 2007