(defun riece-lru-make-node (key value &optional previous next) "Make riece-lru-node object." (vector key value previous next)) (defun riece-lru-node-key (node) "Return key of NODE." (aref node 0)) (defun riece-lru-node-value (node) "Return value of NODE." (aref node 1)) (defun riece-lru-node-next (node) "Return next of NODE." (aref node 3)) (defun riece-lru-node-set-next (node next) "Set next of NODE to NEXT." (aset node 3 next)) (defun riece-lru-node-previous (node) "Return previous of NODE." (aref node 2)) (defun riece-lru-node-set-previous (node previous) "Set previous of NODE to PREVIOUS." (aset node 2 previous)) (defun riece-lru-make-map (max-length) "Make riece-lru-map object." (vector max-length (make-vector (* max-length 2) 0) 0 nil nil)) (defun riece-lru-map-max-length (map) "Return max-length of MAP." (aref map 0)) (defun riece-lru-map-hash-obarray (map) "Return hash-obarray of MAP." (aref map 1)) (defun riece-lru-map-hash-length (map) "Return hash-length of MAP." (aref map 2)) (defun riece-lru-map-set-hash-length (map hash-length) "Set hash-length of MAP to HASH-LENGTH." (aset map 2 hash-length)) (defun riece-lru-map-first (map) "Return first of MAP." (aref map 3)) (defun riece-lru-map-set-first (map first) "Set first of MAP to FIRST." (aset map 3 first)) (defun riece-lru-map-last (map) "Return last of MAP." (aref map 4)) (defun riece-lru-map-set-last (map last) "Set last of MAP to LAST." (aset map 4 last)) (defalias 'riece-make-lru 'riece-lru-make-map) (defun riece-lru-contains (map key) (intern-soft key (riece-lru-map-hash-obarray map))) (defun riece-lru-get (map key) (let ((node (riece-lru-get-node map key))) (if node (riece-lru-node-value node)))) (defun riece-lru-get-node (map key) (let ((symbol (intern-soft key (riece-lru-map-hash-obarray map))) previous next first last node) (when symbol (setq node (symbol-value symbol) previous (riece-lru-node-previous node) next (riece-lru-node-next node) first (riece-lru-map-first map) last (riece-lru-map-last map)) (if previous (riece-lru-node-set-next previous next)) (if next (riece-lru-node-set-previous next previous)) (riece-lru-node-set-next node nil) (riece-lru-node-set-previous node last) (riece-lru-node-set-next last node) (riece-lru-map-set-last map node) (if (and (eq node (riece-lru-map-first map)) next) (riece-lru-map-set-first map next)) node))) (defun riece-lru-delete (map key) (let ((symbol (intern-soft key (riece-lru-map-hash-obarray map))) previous next node) (when symbol (setq node (symbol-value symbol) previous (riece-lru-node-previous node) next (riece-lru-node-next node)) (if previous (riece-lru-node-set-next previous next)) (if next (riece-lru-node-set-previous next previous)) (if (eq (riece-lru-map-last map) node) (riece-lru-map-set-last map previous)) (if (eq (riece-lru-map-first map) node) (riece-lru-map-set-first map next)) (unintern symbol (riece-lru-map-hash-obarray map)) (riece-lru-map-set-hash-length map (1- (riece-lru-map-hash-length map))) (riece-lru-node-value node)))) (defun riece-lru-set (map key value) (let ((node (riece-lru-get-node map key)) symbol) (if node (aset node 1 value) (if (>= (riece-lru-map-hash-length map) (riece-lru-map-max-length map)) (riece-lru-delete map (riece-lru-node-key (riece-lru-map-first map)))) (setq node (riece-lru-make-node key value (riece-lru-map-last map) nil)) (set (intern key (riece-lru-map-hash-obarray map)) node) (riece-lru-map-set-hash-length map (1+ (riece-lru-map-hash-length map))) (unless (riece-lru-map-first map) (riece-lru-map-set-first map node)) (if (riece-lru-map-last map) (progn (riece-lru-node-set-next (riece-lru-map-last map) node) (riece-lru-node-set-previous node (riece-lru-map-last map)))) (riece-lru-map-set-last map node))))