#dbugfix 17592
Basile B.
b2.temp at gmx.com
Thu Mar 22 22:02:43 UTC 2018
On Tuesday, 20 March 2018 at 21:27:53 UTC, 12345swordy wrote:
> This is very important to me as I am very interested in using
> the language for game development.
>
> Yes I know that it's marked as "Duplicated", but I strongly
> disagree as it is different enough to consider is own issue.
>
> Alex
Here's something you can study. It's the only solution i've found
so far and it's implemented in my user library called "IZ"
(https://github.com/BBasile/iz). You can run the stuff simply by
passing it as a file name to DUB (aka single file package):
```
/+dub.sdl:
name "destruct_demo"
dependency "iz" version="*"
+/
module runnable;
import std.stdio, iz.memory, iz.enumset;
enum Foo {f1,f2,f3}
alias SetOfFoo = EnumSet!(Foo,Set8);
SetOfFoo foos;
class Foo1
{
this() @nogc {foos = 0;}
mixin inheritedDtor;
~this() @nogc
{
foos.include(Foo.f1);
callInheritedDtor();
}
}
class Foo2 : Foo1
{
mixin inheritedDtor;
~this() @nogc
{
foos.include(Foo.f2);
callInheritedDtor();
}
}
class Foo3 : Foo2
{
mixin inheritedDtor;
~this() @nogc
{
foos.include(Foo.f3);
callInheritedDtor();
}
}
void testTrustedStaticType() @nogc
{
Foo1 f1 = construct!Foo3;
assert(foos.none);
destruct(f1);
// destruct trusts f1 static type, which is wrong
// with a dynamic destruct() we should get [Foo.f1, Foo.f2,
Foo.f3]
assert(foos == SetOfFoo(Foo.f1));
Foo3 f3 = construct!Foo3;
assert(foos.none);
destruct(f3);
// destruct trusts f3 static type, which is right
assert(foos == SetOfFoo(Foo.f1, Foo.f2, Foo.f3));
}
void testDynamicType() // cant be @nogc
{
Foo1 f1 = construct!Foo3;
assert(foos.none);
destruct(cast(Object) f1);
// an Object is passed to "destruct" which means "detect
dynamic type"
assert(foos == [Foo.f1, Foo.f2, Foo.f3]);
Foo1 f2 = construct!Foo3;
assert(foos.none);
destruct(cast(Object) f2);
// an Object is passed to "destruct" which means "detect
dynamic type"
assert(foos == [Foo.f1, Foo.f2, Foo.f3]);
}
void main()
{
testTrustedStaticType();
testDynamicType();
}
```
Important points:
- not compatible with D runtime
- use mixins to overcome the fact that destructor are not virtual
(it's a lie)
- to be @nogc, the static type has to be known, really.
More information about the Digitalmars-d
mailing list