Escaping the Tyranny of the GC: std.rcstring, first blood
Rikki Cattermole via Digitalmars-d
digitalmars-d at puremagic.com
Sun Sep 14 21:51:35 PDT 2014
> The one wrinkle is that you need to wrap string literals "abc"
> with explicit constructor calls, e.g. RCString("abc"). This
> puts RCString on a lower footing than built-in strings and
> makes swapping configurations a tad more difficult.
A few ideas:
import std.traits : isSomeString;
auto refCounted(T)(T value) if (isSomeString!T) {
static if (is(T == string))
return new RCXString!(immutable char)(value);
//....
static assert(0);
}
static assert("abc".refCounted == "abc");
Wrapper type scenario. May look nicer.
Other which would require a language change of:
struct MyType {
string value;
alias value this;
this(string value) {
this.value = value;
}
}
static assert("abc".MyType == "abc");
*shudder* does remind me a little too much of the Jade
programming language with its casts like that.
There is one other thing which I don't think people are taking
too seriously is my idea of using with statement to swap out e.g.
the GC during runtime.
with(myAllocator) {
Foo foo = new Foo; // calls the allocator to assign memory for
new instance of Foo
}
// tell allocator to free foo
with(myAllocator) {
Foo foo = new Foo; // calls the allocator to assign memory for
new instance of Foo
myFunc(foo);
}
// if myFunc modifies foo or if myFunc passes foo to another
function then:
// tell GC it has to free it when able to
// otherwise:
// tell allocator to free foo
class MyAllocator : Allocator {
void opWithIn(string file = __MODULE__, int line = __LINE__,
string function = ?) {
GC.pushAllocator(this);
}
void opWithOut(string file = __MODULE__, int line = __LINE__,
string function = ?) {
GC.popAllocator();
}
}
By using the with statement this is possible:
void something() {
with(new RCAllocator) {
string value = "Hello World!"; // allocates memory via
RCAllocator
} // frees here
}
More information about the Digitalmars-d
mailing list