Gneric linkedList range adaptor

Ruby The Roobster rubytheroobster at yandex.com
Fri Feb 10 23:39:11 UTC 2023


On Friday, 10 February 2023 at 22:10:20 UTC, Ben Jones wrote:
> I'm trying to write a range adaptor for linked list types.  The 
> range type seems to work OK, but my helper function to deduce 
> the node type has a compiler error.  My hunch is that 
> `nextField` loses its association with T when I'm trying to 
> pass it as a template parameter inside the helper method, but I 
> can't use __traits(child) there to fix it.
>
> Any idea how to fix the helper method?
>
> Is this something that would be useful to add to std.range 
> somewhere?  Or is something like it already in Phobos?
>
> Thanks
>
> ```
> import std.stdio;
> import std.range;
>
> struct LinkedListAdaptor(alias nextField, T){
>  	T current;
>     @safe:
>    	nothrow:
>
>     this(T head){
>      	current = head;
>     }
>
>     bool empty() const {
>     	return current == null;
>     }	
>
>     T front() {
>      	return current;
>     }
>
>     void popFront() {
> 		current = __traits(child, current, nextField);
>     }
> }
>
> auto linkedListAdaptor(alias nextField, T)(T head) if(is(T == 
> U*, U)){
>  	return LinkedListAdaptor!(nextField, T)(head);
>
>     //fails with:
>     //onlineapp.d(27): Error: symbol or expression expected as 
> first argument of __traits `child` instead of `Node*`
>     // return LinkedListAdaptor!(__traits(child, T, nextField), 
> T)(head);
> }
>
> struct Node{
>  	int data;
>     Node* next;
> }
>
> void main(){
> 	Node* head = new Node(10, new Node(20, null));
>
>     auto rng1 = LinkedListAdaptor!(Node.next, Node*)(head);
>     auto rng = linkedListAdaptor!(Node.next)(head);
>     foreach(const x; rng){
>         writeln(x.data);
>     }
> }
> ```
>
> This fails with:
>
> Error: need `this` for `linkedListAdaptor` of type `pure 
> nothrow @nogc @safe LinkedListAdaptor!(next, Node*)(Node* head)`

The problem is that Node.next is not, and cannot be `static`.  
Thus, there is no way for you to pass it as an alias template 
parameter, and this should be considered a compiler bug that this 
doesn't error out.


More information about the Digitalmars-d-learn mailing list