Re: Deriving a struct from another one via template: Easy way to propagate UDAs?

2024-03-17 Thread Adam D Ruppe via Digitalmars-d-learn

On Saturday, 16 March 2024 at 20:34:57 UTC, Inkrementator wrote:
Nice. Btw I vaguely remember you also wrote about how and why 
to reduce the usage string mixins, with some real example of 
alternative techniques you used


go to the main page: http://dpldocs.info/this-week-in-d/Blog.html 
and use ctrl+f and hope i said it in the summary lol


but the two that pop up there are:

http://dpldocs.info/this-week-in-d/Blog.Posted_2022_12_26.html#more-mixin-techniques

and

https://forum.dlang.org/post/fbcltjuysmjrxmebe...@forum.dlang.org


The general rule is to try to use the local name inside the 
string instead of concatenating its result, and remember the 
built in compiler-tuple - which is what __traits(getAttributes) 
and the parameters reflection and other things - can be used 
directly in a lot of places, you can very often substitute one of 
those for a value and it will put it in for you. I encourage you 
to experiment with plugging these things directly in at the use 
site and seeing what happens before falling back to strings.


fyi don't really follow this forum anymore, you got a bit lucky 
that i popped in for the dconf online link, so i might not see 
any further replies to this.


Re: Deriving a struct from another one via template: Easy way to propagate UDAs?

2024-03-16 Thread Inkrementator via Digitalmars-d-learn

On Saturday, 16 March 2024 at 13:09:13 UTC, Adam D Ruppe wrote:

On Thursday, 14 March 2024 at 23:19:37 UTC, Inkrementator wrote:
@(__traits(getAttributes, thingYouWantToForward))
void yourNewThing() {}

Thanks, that should solve my problem.


http://dpldocs.info/this-week-in-d/Blog.Posted_2020_01_20.html#understanding-mixin-templates
Nice. Btw I vaguely remember you also wrote about how and why to 
reduce the usage string mixins, with some real example of 
alternative techniques you used, but I can't find it anymore. The 
search query 'site:dpldocs.info string mixin "This week in D"' as 
well as "site:arsdnet.net mixin" don't produce it. Can you link 
it to me?


Re: Deriving a struct from another one via template: Easy way to propagate UDAs?

2024-03-16 Thread Inkrementator via Digitalmars-d-learn

On Friday, 15 March 2024 at 19:13:38 UTC, cc wrote:
This is trivially easy if your types are visible at module 
level, and mixin is a fine tool for the job.  It doesn't work 
quite so well with [Voldemort 
types](https://wiki.dlang.org/Voldemort_types).
I used the following lines to make it work for Unknown and I 
think even Voldemort types.

```d
static foreach(att; allFieldTypes){
//pragma(msg, "alias %s =att;\n".format(att.stringof));
mixin("alias %s = att;\n".format(att.stringof));
}
```
But I don't know how to do this (in a general) for UDAs, since 
they can be values instead of types too, i.e. @UDA(Voldemort!2(3))


Re: Deriving a struct from another one via template: Easy way to propagate UDAs?

2024-03-16 Thread Adam D Ruppe via Digitalmars-d-learn

On Thursday, 14 March 2024 at 23:19:37 UTC, Inkrementator wrote:

* Is UDA propagation possible without string mixins?


@(__traits(getAttributes, thingYouWantToForward))
void yourNewThing() {}


* Are template mixins vulnerable to name collisions?


http://dpldocs.info/this-week-in-d/Blog.Posted_2020_01_20.html#understanding-mixin-templates


Re: Deriving a struct from another one via template: Easy way to propagate UDAs?

2024-03-15 Thread cc via Digitalmars-d-learn

On Thursday, 14 March 2024 at 23:19:37 UTC, Inkrementator wrote:
I am trying to derive a struct from another. I want to modify 
each field such that type of it goes from some T to Nullable!T, 
preserving all fieldnames and UDAs.


This is trivially easy if your types are visible at module level, 
and mixin is a fine tool for the job.  It doesn't work quite so 
well with [Voldemort 
types](https://wiki.dlang.org/Voldemort_types).


```d
struct MyUDA { int q; }
struct Foo { int f; }
struct MyStruct {
@MyUDA(3) int x;
@MyUDA(4) Foo f;
@MyUDA(5) @MyUDA(7) string s;
}
auto generateUDAs(A...)() {
string[] udaStrs;
static foreach (uda; A)
udaStrs ~= "@(" ~ uda.stringof ~ ")";
return udaStrs;
}
struct Wrapped(S) {
static foreach (idx, field; S.tupleof) {
//pragma(msg, format(... can be used to preview
		mixin(format("%s %s %s;", generateUDAs!(__traits(getAttributes, 
field)).join(' '), Nullable!(typeof(field)).stringof, 
field.stringof));

}
}
void main() {
MyStruct s;
s.x = 3;
s.f = Foo(1);
s.s = null;
Wrapped!MyStruct w;
w.x = s.x;
w.f = s.f;
w.s = s.s;
w.x.nullify;
w.f.nullify;
w.s.nullify; // strings/objects are already nullable though
	static assert(__traits(getAttributes, w.s) == 
AliasSeq!(MyUDA(5), MyUDA(7)));

}
```

If you absolutely must though, you could do something like
```d
enum WrapMixin = q{
struct Wrapped(S) {
static foreach (field; S.tupleof)
			mixin(format("%s %s %s;", 
generateUDAs!(__traits(getAttributes, field)).join(' '), 
Nullable!(typeof(field)).stringof, field.stringof));

}
};
void main() {
struct MyUDA { .
struct MyStruct { .
mixin(WrapMixin);
Wrapped!MyStruct w;
}
```