typedef struct Queue{ union Data* queue; union Data* data; __code whenEmpty(...); __code clear(Impl* queue, __code next(...)); __code put(Impl* queue, union Data* data, __code next(...)); __code take(Impl* queue, __code next(union Data*, ...)); __code isEmpty(Impl* queue, __code next(...), __code whenEmpty(...)); __code next(...); } Queue;