1 #define _LISTIMPL(X, Z) \
4 mk##X##L(Z hd, X##L *tl) \
8 l = emallocnz(sizeof *l); \
19 return mk##X##L(l->hd, copy##X##L(l->tl)); \
57 nth##X##L(X##L *l, int i) \
65 add##X##L(X##L *l, X##L *ll) \
80 sort##X##L(X##L *l, int (*cmp)(typeof(((X##L*)0)->hd), typeof(((X##L*)0)->hd))) \
82 assert(sizeof(l->hd) == sizeof(void*)); \
83 return (X##L*)listsort((PtrL*)l, (int(*)(void*, void*))cmp); \
92 while(l->tl && l->hd == l->tl->hd) \
99 #define LISTIMPL(X) _LISTIMPL(X, X*)