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