RFC: moving forward with @nogc Phobos
via Digitalmars-d
digitalmars-d at puremagic.com
Thu Oct 2 04:55:07 PDT 2014
On Wednesday, 1 October 2014 at 15:48:39 UTC, Oren Tirosh wrote:
> On Tuesday, 30 September 2014 at 19:10:19 UTC, Marc Schütz
> wrote:
>> (I'll try to make a sketch on how this can be implemented in
>> another post.)
>
> Do elaborate!
Here's an example implementation of what I have in mind (totally
untested and won't compile because of `scope`):
http://wiki.dlang.org/User:Schuetzm/RC,_Owned_and_allocators
This is just a sketch to explain the general idea. Some things
probably won't work as implemented, especially the disable
postblit and opAssign() of Owned!T. I think it needs to implement
implicit moving, otherwise one would have to call `release()`
everywhere.
As in the other post, the function that produces the value
returns Owned!T. The types don't require @unique however
(although integration with DMD's idea of unique would still be
useful).
Because of auto-borrowing via alias this, Owned!T and RC!T both
can pass their payloads to functions that accept them by `scope`.
The ref-count is not touched for borrowing.
Usage examples:
Owned!string setExtension(in char[] path, in char[] ext);
void saveFileAs(in char[] name) {
import std.path: setExtension;
import std.file: write;
name. // scope const(char[])
setExtension("txt"). // Owned!string
write(data);
}
RC!string[] stringList;
void addToGlobalList(scope RC!string s) {
stringList ~= s; // increments ref-count
}
RC!string foo;
addToGlobalList(foo); // borrowing doesn't change ref-count
auto newFileName = "hello-world".setExtension("txt");
auto tmp1 = newFileName; // ERROR: cannot copy
scope tmp2 = newFileName; // OK, borrowing
foo = newFileName; // ERROR: cannot copy
foo = newFileName.release(); // OK, move
auto bar = newFileName.toRC(); // ditto
More information about the Digitalmars-d
mailing list