|
84 | 84 | "Answers the number of valid key/value pairs contained in `tree'"
|
85 | 85 | (node-count node))
|
86 | 86 |
|
| 87 | +(defgeneric wbtree-test (object)) |
| 88 | + |
87 | 89 | (defun wbtree-node-value (node)
|
88 | 90 | "Obtains the value associated with `node'. If `node' is the empty
|
89 | 91 | tree, raises a condition of type `simple-error'."
|
|
1011 | 1013 | (defmethod wbtree-rebalance ((,tree-var ,name))
|
1012 | 1014 | (wbtree-rebalance-1 ,tree-var #',node-constructor ,empty-node))
|
1013 | 1015 |
|
| 1016 | + (defmethod wbtree-test ((,tree-var ,name)) |
| 1017 | + (declare (ignore ,tree-var)) #',lessp-function) |
| 1018 | + |
1014 | 1019 | (defmethod make-load-form ((,tree-var ,name) &optional environment)
|
1015 | 1020 | (declare (ignore environment))
|
1016 | 1021 | (wbtree-load-form ,tree-var ',node-constructor ',empty-node))
|
|
1054 | 1059 | ,setter
|
1055 | 1060 | ,value-temp)
|
1056 | 1061 | `(wbtree-find ,key-temp ,getter ,@(when have-default (list default-temp))))))))
|
| 1062 | + |
| 1063 | + |
| 1064 | +(defun wbtree-correlate (function tree1 tree2 |
| 1065 | + &key test (direction :forward)) |
| 1066 | + (let* ((predicate (or test (wbtree-test tree1))) |
| 1067 | + (test (if (eq direction :forward) predicate (lambda (o1 o2) (funcall predicate o2 o1)))) |
| 1068 | + (iter1 (wbtree-iterator tree1 :direction direction)) |
| 1069 | + (iter2 (wbtree-iterator tree2 :direction direction)) |
| 1070 | + (node1 (funcall iter1)) |
| 1071 | + (node2 (funcall iter2))) |
| 1072 | + (loop |
| 1073 | + while (and node1 node2) |
| 1074 | + do (let ((key1 (wbtree-node-key node1)) |
| 1075 | + (key2 (wbtree-node-key node2))) |
| 1076 | + (cond |
| 1077 | + ((funcall test key1 key2) |
| 1078 | + (funcall function node1 nil) |
| 1079 | + (setf node1 (funcall iter1))) |
| 1080 | + ((funcall test key2 key1) |
| 1081 | + (funcall function nil node2) |
| 1082 | + (setf node2 (funcall iter2))) |
| 1083 | + (t |
| 1084 | + (funcall function node1 node2) |
| 1085 | + (setf node1 (funcall iter1)) |
| 1086 | + (setf node2 (funcall iter2)))))) |
| 1087 | + (loop |
| 1088 | + while node1 |
| 1089 | + do (funcall function node1 nil) |
| 1090 | + (setf node1 (funcall iter1))) |
| 1091 | + (loop |
| 1092 | + while node2 |
| 1093 | + do (funcall function nil node2) |
| 1094 | + (setf node2 (funcall iter2))))) |
| 1095 | + |
| 1096 | +(defmacro do-correlated-wbtree-nodes (((bind1 tree1) (bind2 tree2) &rest options) &body body) |
| 1097 | + `(block nil |
| 1098 | + (wbtree-correlate (lambda (,bind1 ,bind2) ,@body) |
| 1099 | + ,tree1 ,tree2 |
| 1100 | + ,@options))) |
| 1101 | + |
0 commit comments