DIP49 - Define qualified postblit

Kenji Hara k.hara.pg at gmail.com
Sun Nov 10 04:03:34 PST 2013


2013/11/10 Timon Gehr <timon.gehr at gmx.ch>

> On 11/10/2013 12:07 PM, Kenji Hara wrote:
>
>> Condider a case that copying "inout struct" inside inout function.
>>
>> struct S {
>>      int[] arr;
>>      this(this) ??? { }
>> }
>> int[] foo(inout S src)
>> {
>>      S dst = src; // copy inout S to S
>>      return dst.arr;
>> }
>>
>> If the struct S has postblit, what shold be done for "copying S from
>> inout to mutable"?
>>
>> 1. You cannot modify elements of arr field, because originally it may be
>> immutable.
>> 2. You must re-initialize arr field by unique expression, otherwise it
>> may break type system
>> ...
>>
>
> 2. is not necessary in the following case:
>
> inout(int)[] foo(inout S src){
>     inout(S) dst = src; // copy inout S to inout S
>     return dst.arr;
> }
>
> But as far as I understand, there is no other postblit than inout to
> invoke under the current proposal, hence this could be wasteful.
>
>
>
>  The requirements are exactly same as what necessary for unique postblit.
>> Essentially "creating unique copy" is exactly same as "treating the copy
>> source as inout".
>>
>
> I think it is a good design, but maybe still incomplete.
>
> We could eg. keep
>
> this(this)inout{ ... }
>
> as the unique postblit and have
>
> this(inout this)inout{ ... }
>
> as a postblit for identically qualified source and target.
>

Hmm.
As a side note, I'm planning unique constructor definition.

struct S {
    // If constructor has one or more inout parameters, it will become
inout constructor
    // The constructed object qualifier will be restricted by the argument
types.
    this(inout int[] arr) inout { ... }

    // If constructor has no inout parameters, it will become unique
constructor
    // The constructed object type can have arbitrary qualifier
    this(int[] arr) inout { ... }
}

So, separating "inout postblit' and 'unique postblit' may be reasonable.

(However, it seems to me that the syntax "this(inout this) inout;" looks
weird...

Kenji Hara
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.puremagic.com/pipermail/digitalmars-d/attachments/20131110/b82cbee1/attachment.html>


More information about the Digitalmars-d mailing list