digitalmars.D.learn - PrimitiveRef ?
Hi, I read that if a structure only contains a reference, it will behave like a reference type in function calls (needed for specifying reference behavior in a type tuple). I need exactly that behavior. I am currently unsure whether it is possible at all to have such a construct which works at user side exactly like a boolean (booleans can be assigned and directly compared with ==) but internally are pointers... (The coding does not compile) Kind regards André struct PrimitiveRef(T) { private T* _value; alias _value this; void opAssign(T v) { _value = v; } } alias BoolRef = PrimitiveRef!bool; void test(BoolRef b) { b = true; } void main() { BoolRef b = false; test(b); assert(b == true); }
Mar 23 2015
Something like that? struct PrimitiveRef(T) { private T* _value; property ref inout(T) get() inout pure nothrow { assert(_value); return *_value; } alias get this; this(T val) { _value = new T(val); } } alias BoolRef = PrimitiveRef!bool; void test(BoolRef b) { b = true; } void main() { BoolRef b = false; test(b); assert(b == true); }
Mar 23 2015
Thanks a lot. I read it in the D Cookbook from Adam D. Ruppe. In the chapter of memory management there is a topic, how to build reference counted objects. Here this construct is explained. Kind regards André On Monday, 23 March 2015 at 20:58:48 UTC, Namespace wrote:Something like that? struct PrimitiveRef(T) { private T* _value; property ref inout(T) get() inout pure nothrow { assert(_value); return *_value; } alias get this; this(T val) { _value = new T(val); } } alias BoolRef = PrimitiveRef!bool; void test(BoolRef b) { b = true; } void main() { BoolRef b = false; test(b); assert(b == true); }
Mar 23 2015
On Monday, 23 March 2015 at 16:58:49 UTC, Andre wrote:Hi, " (needed for specifying reference behavior in a type tuple). I need exactly that behavior. I am currently unsure whether it is possible at all to have such a construct which works at user side exactly like a boolean (booleans can be assigned and directly compared with ==) but internally are pointers... (The coding does not compile) Kind regards André struct PrimitiveRef(T) { private T* _value; alias _value this; void opAssign(T v) { _value = v; } } alias BoolRef = PrimitiveRef!bool; void test(BoolRef b) { b = true; } void main() { BoolRef b = false; test(b); assert(b == true); }even if the code would compile you'd get an AV because _value is null. Then when you initalize b with false this could not work because false is not a a pointer to a bool. struct PrimitiveRef(T) { private T* _value; alias _value this; void opAssign(T v) { *_value = v; } } alias BoolRef = PrimitiveRef!bool; void test(BoolRef b) { b = true; } bool btarget; void main() { BoolRef b; b._value = &btarget; test(b); assert(*b == true); } I don't know where you've read this, but i 'm interseted too. Maybe it's an ABI thing: since the only member is a reference (so `size_t.sizeof` bytes) the `struct` can be passed in a register during the function call, instead of being copied on the stack... --- void foo(BoolRef aRef) { // x86: aRef is in EAX // X86_64 aRef is in RAX } --- What is the source of "I read that if a structure only contains a reference, it will behave like a reference type in function calls" ?
Mar 23 2015