//@Description Sketches an enqueue method for a Queue represented as a linked list. int N = 5; struct Queue{ Node head; Node tail; } struct Node{ int val; Node next; } generator Node select(Queue q){ /* automatically rewritten */ return {| q(.head | .tail)(.next)?(.next)? | null |}; } generator bit cond(Queue q){ /* automatically rewritten */ Node n1 = select(q); Node n2 = select(q); return {| n1 (== | != ) n2 |}; } int enqueue(Queue q, int i){ /* automatically rewritten */ Node n = new Node(); n.val = i; n.next = null; repeat(??){ if(??){ if(cond(q)){ {| q( .head | .tail )(.next)? |} = n; } } // } return 1; } int dequeue(Queue q){ /* automatically rewritten */ Node n; n = q.head; assert q.head != null; if(q.head.next == null){ assert q.head == q.tail; q.head = null; q.tail = null; }else{ q.head = q.head.next; } return n.val; } int[N] test(int[N] in, bit[N] ctrl){ int [N] out =0; int [N] tmp=0; int head = 0; int tail = 0; for(int i=0; i<N; ++i){ if(ctrl[i]){ tmp[tail] = in[i]; tail = tail+1; out[i] = -1; }else{ if(head != tail){ out[i] = tmp[head]; head = head + 1; }else{ out[i] = -1; } } } return out; } int[N] rest(int[N] in, bit[N] ctrl) implements test{ int [N] out=0; Queue q = new Queue(); q.head = null; q.tail = null; for(int i=0; i<N; ++i){ if(ctrl[i]){ enqueue(q, in[i]); out[i] = -1; }else{ if(q.head != null){ out[i] = dequeue(q); }else{ out[i] = -1; } } } return out; }