1#ifndef MRU_H 2#define MRU_H 3 4/** 5 * A simple most-recently-used cache, backed by a doubly-linked list. 6 * 7 * Usage is roughly: 8 * 9 * // Create a list. Zero-initialization is required. 10 * static struct mru cache; 11 * mru_append(&cache, item); 12 * ... 13 * 14 * // Iterate in MRU order. 15 * struct mru_entry *p; 16 * for (p = cache.head; p; p = p->next) { 17 * if (matches(p->item)) 18 * break; 19 * } 20 * 21 * // Mark an item as used, moving it to the front of the list. 22 * mru_mark(&cache, p); 23 * 24 * // Reset the list to empty, cleaning up all resources. 25 * mru_clear(&cache); 26 * 27 * Note that you SHOULD NOT call mru_mark() and then continue traversing the 28 * list; it reorders the marked item to the front of the list, and therefore 29 * you will begin traversing the whole list again. 30 */ 31 32struct mru_entry { 33void*item; 34struct mru_entry *prev, *next; 35}; 36 37struct mru { 38struct mru_entry *head, *tail; 39}; 40 41voidmru_append(struct mru *mru,void*item); 42voidmru_mark(struct mru *mru,struct mru_entry *entry); 43voidmru_clear(struct mru *mru); 44 45#endif/* MRU_H */