On Friday, 18 September 2020 at 18:20:41 UTC, Andrey Zherikov wrote:
How can I rewrite foo() function as a free-function that won't cause struct copying?

I found solution:
========
struct S
{
    int i = -1;
this(int n) {i=n;writeln(&this," ",i," ",__PRETTY_FUNCTION__);} this(ref return scope inout S rhs) inout {i=rhs.i+1;writeln(&this," ",i," ",__PRETTY_FUNCTION__);}
    ~this() {writeln(&this," ",i," ",__PRETTY_FUNCTION__);}
    ref auto getRef() return
    {
            writeln(&this," ",i," ",__PRETTY_FUNCTION__);
        return this;
    }
}

ref auto foo(return ref S s)
{
    writeln(&s," ",s.i," ",__PRETTY_FUNCTION__);
    return s;
}

void main()
{
    S(5).getRef().foo().foo().foo();
}
========

Output confirms that there is no copying happens:
========
7FFDE98BDDF0 5 S onlineapp.S.this(int n) ref
7FFDE98BDDF0 5 onlineapp.S.getRef() ref return
7FFDE98BDDF0 5 onlineapp.foo(return ref S s) ref @system
7FFDE98BDDF0 5 onlineapp.foo(return ref S s) ref @system
7FFDE98BDDF0 5 onlineapp.foo(return ref S s) ref @system
7FFDE98BDDF0 5 void onlineapp.S.~this()
========

Reply via email to