A naive attempt at a refcounted class proxy
aldanor via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Tue Jan 13 10:14:40 PST 2015
On Tuesday, 13 January 2015 at 18:12:45 UTC, aldanor wrote:
> On Tuesday, 13 January 2015 at 16:43:09 UTC, ketmar via
> Digitalmars-d-learn wrote:
>> On Tue, 13 Jan 2015 16:17:51 +0000
>> aldanor via Digitalmars-d-learn
>> <digitalmars-d-learn at puremagic.com>
>> wrote:
>>
>>> This discussion:
>>> http://forum.dlang.org/thread/bqtcdpsopxmnfbjyrrzf@forum.dlang.org
>>> -- led me wondering if it would be possible to create some
>>> crippled version of a class proxy that is based on RefCounted
>>> and came up with something like this:
>>>
>>> struct Box(T) if (is(T == class)) {
>>> @disable this();
>>>
>>> this(Args...)(Args args) {
>>> _payload._refCounted.initialize(new T(args));
>>> }
>>>
>>> private {
>>> struct _Box(T) {
>>> private T _instance;
>>>
>>> ~this() {
>>> destroy(_instance);
>>> }
>>> }
>>> RefCounted!(_Box!T) _payload;
>>> }
>>>
>>> ~this() {
>>> }
>>>
>>> auto opDispatch(string name, Args...)(Args args) {
>>> return
>>> mixin("_payload._instance.%s(args)".format(name));
>>> }
>>> }
>>>
>>> which lets you create Box!SomeClass(args) and it will be
>>> refcounted unless you escape references and do other weird
>>> stuff.
>>>
>>> It actually sort of seems to work at first glance, at least
>>> it seems like it does... But with my D experience being
>>> fairly limited I wonder what the potential pitfalls would be?
>>>
>>> Full source code with example and stdout:
>>> https://gist.github.com/aldanor/d5fb5e45ddf3dd2cb642
>> it's not that hard to make a boxed class. what is really hard
>> is to
>> make functions that expects the class itself to accept it's
>> boxed
>> variant too and behave correctly with it.
>>
>> either you have to unbox it (and then hope that it will not
>> leak), or
>> write two set of functions, for "real" class and for boxed
>> one. and
>> then you may want to inherit from your class and pass that
>> inherited
>> class to one of the functions... and now you have three sets.
>> and so
>> on...
>>
>> as structs can't be inherited, there is no such problem for
>> structs.
>
> That's completely valid. Where it would work though, I think,
> is if all classes are private/package and only expect/return
> boxed classes and never the references. This way you sort of
> get multiple inheritance (for the internal implementation)
> without polymorphism, but with value semantics and ref counting
> for the outward interface.
// thanks ketmar for answering another one of my stupid questions
on n.g. :)
More information about the Digitalmars-d-learn
mailing list