Possible ways forward extending ct values into ct data structures?
monkyyy
crazymonkyyy at gmail.com
Mon Jun 2 00:35:14 UTC 2025
On Sunday, 1 June 2025 at 15:29:56 UTC, monkyyy wrote:
>
```d
dmd -unittest -i -main -run foo.d
--- meta.d
import std;
enum counter=cast(immutable(void)*)[0].ptr;
auto count()=>(*(cast(int*)counter))++;
auto getcount()=>(*(cast(int*)counter));
template ctval(T,int i){
enum point=cast(immutable(void)*)[T.init].ptr;
auto get()=>(*(cast(T*)point));
auto set(T t){(*(cast(T*)point))=t; return true;}
auto apply(alias F)(){
enum _=set(F(get()));
return true;
}
}
struct linked(T){
T val;
typeof(this) function() next;
auto front()=>val;
void popFront(){this=next();}
bool empty()=>next==null;
}
auto delelinked(T,int I)(){
return ctval!(linked!T,I).get;
}
template add(alias V){
enum int I=count;
alias L=ctval!(linked!(typeof(V)),I);
alias _=L.apply!((p){p.val=V;return p;});
static if(I>0){
_=ctval!(linked!(typeof(V)),I-1).apply!((p){p.next=&delelinked!(typeof(V),I); return p;});
}
}
--- foo.d
import std;
import meta;
unittest{
alias a=add!1;
alias b=add!2;
alias c=add!3;
alias d=add!4;
foreach(e; ctval!(linked!int,0).get){
e.writeln;
}
}
import bar;
--- bar.d
import meta;
alias a=add!5;
alias b=add!6;
alias c=add!7;
alias d=add!8;
```
off by one but this direction should work
More information about the Digitalmars-d-learn
mailing list