another cool RTInfo trick - i want in runtime

Namespace rswhite4 at googlemail.com
Thu Jan 16 11:32:09 PST 2014


On Thursday, 16 January 2014 at 19:13:42 UTC, Adam D. Ruppe wrote:
> On Thursday, 16 January 2014 at 18:44:54 UTC, Namespace wrote:
>> I guess that could work pretty well for a C++ friend emulation 
>> with UDA's! Were not you the one who wanted to show me an 
>> example for that with using RTInfo?
>
> I've played with rtinfo a lot before, but I don't remember 
> doing C++ friend emulation...
>
>> Offer your way the possibility to check automatically for null 
>> references? With an UDA e.g. @safe_ref or @not_null
>
> I think those would be better done with the type info, like 
> NotNull!t.
>
> What's cool about the RTInfo thing though is it is checked on 
> everything, so it can check for the *absence* of a UDA as well 
> as for the presence.
>
> You might say something must not have any nullable references 
> unless specially marked. The rtinfo checker can confirm that: 
> loop over all members, if it is potentially nullable and isn't 
> marked with either NotNull or 
> @i_know_this_is_nullable_and_that_is_ok, it can throw an error.
>
> It is possible to do that kind of thing with static assert on 
> the module level too.... sort of. See, the module level one for 
> one can be forgotten and it can't access nested things in 
> functions:
>
> void foo() {
>   struct InnerStruct {}
> }
>
> // can't see foo.InnerStuct here!
> static assert(ModulePassesCheck!(mixin("this_module")));
>
>
> But RTInfo *does* see InnerStruct, and you don't have to 
> remember to add the check to your module too.

All right, it wasn't you, it was Andrej Mitrovic on my thread 
http://forum.dlang.org/thread/pdshwedjqgquoibxhrxa@forum.dlang.org#post-mailman.1977.1381065059.1719.digitalmars-d-learn:40puremagic.com

The problem on a library NotNull struct is: nobody will use it, 
because it requires NotNull on both sides, by the caller and by 
the callee:

----
class A { }

void safe_foo(NotNull!A na) { }

void main() {
     NotNull!A na = NotNull!A(new A());
     safe_foo(na);
}
----

Which is a lot more effor than:

----
class A { }

void safe_foo(@safe_ref A na) { }

void main() {
     A a = new A();
     safe_foo(a);
}
----

because it moves the check to the callee.


More information about the Digitalmars-d mailing list