| LRU Design |
| ========== |
| |
| This got slightly complex, because I tried to be clever. But the concept is easy, a |
| list and an unordered map keeps the LRU state. |
| |
| |
| +-----------------------+ +----------------------------------+ |
| | LRUList | | LRUMap | |
| | ------- | | ------ | |
| |+---------------------+| |+--------------------------------+| |
| +---------------------+ +---------------------+ || LRUEntry <+----+| {LRUHash *, LRUList::iterator} || |
| | LRUHash | | LRUEntry | |+---------------------+| |+--------------------------------+| |
| | -------- |<--+ -------- |<--+| LRUEntry <+----+| {LRUHash *, LRUList::iterator} || |
| | u_char _hash[20] | | <LRUHash, unsigned> | |+---------------------+| |+--------------------------------+| |
| +---------------------+ +---------------------+ || LRUEntry <+----+| {LRUHash *, LRUList::iterator} || |
| +-----------------+ |+---------------------+| |+--------------------------------+| |
| | first = LRUHash | | | | | |
| |second = unsigned| | * | | * | |
| +-----------------+ | * | | * | |
| | * | | * | |
| | | | | |
| |+---------------------+| |+--------------------------------+| |
| || LRUEntry || || {LRUHash *, LRUList::iterator} || |
| |+---------------------+| |+--------------------------------+| |
| +-----------------------+ +----------------------------------+ |
| +--------------------------+ |
| | first = LRUHash* | |
| |second = LRUList::iterator| |
| +--------------------------+ |