вы можете указать функции front
, popfront()
и empty
: (но это будет использовать вашу коллекцию, если вы не используете save ())
public class Collection(T) { ... private T head; private Collection!(T) queue;
@property T front(){
return head;
}
@property bool empty(){
return queue is null;
}
void popfront(){
head = queue.head;
queue = queue.queue;
}
Collection!T save(){
return new Collection!T(head,queue);
}
}
или используйте выделенную структуру для итерации (как это делается в модуле std.container
public class Collection(T) { ... private T head; private Collection!(T) queue;
Range opSlice(){
return Range(head,queue);
}
struct Range{
T h;
Collection!(T) q;
this(T he, Collection!(T) qu){
h=he;
q=qu;
}
@property T front(){
return h;
}
@property bool empty(){
return q is null;
}
void popfront(){
h = q.head;
q= q.queue;
}
Collection!T save(){
return this;
}
}
}
так итерация выполняется так
Collection!(int) temp; foreach (int t;temp[]) { ... }
Вы также можете добавить opApply
для обычного foreach:
public int opApply(int delegate(ref T) dg){
int res=0;
foreach(ref T;this[]){
res = dg(t);
if(res)return res;
}
return res;
}