GC for noobs

Szymon Gatner noemail at gmail.com
Thu Feb 27 08:21:15 PST 2014


On Thursday, 27 February 2014 at 16:10:34 UTC, Adam D. Ruppe 
wrote:
> On Thursday, 27 February 2014 at 14:37:14 UTC, Szymon Gatner 
> wrote:
>> They actually don't have all the necessary features in D 
>> afaiu. They do have value semantics but can't represent 
>> uniqueness because of missing move d-tor.
>
> struct MovingStruct {
>     @disable this(this);
>     typeof(this) release() {
>         auto p = this.payload;
>         this.payload = null;
>         return typeof(this)(p);
>     }
> }
>
>
> That does moving via an explicit release call which is 
> statically forced upon you by the disabled copy.
>
> MovingStruct s = some_payload;
> // MovingStruct s2 = s; // compile error
> MovingStruct s2 = s.release;
> assert(s.payload is null); // passes
> assert(s2.payload is some_payload); // we good
>
>
> You can also easily do structs with reference semantics:
>
> struct RefStruct {
>     private struct Impl {
>       // implementation here
>     }
>     Impl* payload;
>     alias payload this;
> }
>
> RefStruct is now just a thin wrapper over a pointer and thus 
> inherits the pointer's semantics.
>
> You can add a destructor to RefStruct to free it 
> deterministically with RAII as well. To avoid double free, you 
> can use the move technique or refcounting:
>
>
> struct RefCountingStruct {
>     private struct Impl {
>       // implementation here
>
>       int refcount;
>     }
>     Impl* payload;
>     alias payload this;
>
>     @disable this(); // disable default constructor to force 
> factory
>     static RefCountingStruct create() {
>          RefCountingStruct t = void;
>          t.payload = new Impl();
>          t.payload.refcount = 1;
>          return t;
>     }
>     this(this) { if(payload !is null) payload.refcount++; }
>     ~this() {
>           if(payload !is null) {
>               payload.refcount--;
>               if(payload.refcount == 0)
>                    whatever_free(payload);
>           }
>     }
> }
>
>
>
> i wish my book was out but it is still only half done... but i 
> wrote a chapter with like eight different struct tricks like 
> this. structs rock.

Wow, that is pretty great stuff. Bit verbose, but gets the job 
done. Is there a way to factor it out for reuse? As a mixin 
probably? Thanks! Will surely try this. And I want your book.


More information about the Digitalmars-d-learn mailing list