diff options
| author | Thien-Thi Nguyen | 2007-08-27 02:40:25 +0000 |
|---|---|---|
| committer | Thien-Thi Nguyen | 2007-08-27 02:40:25 +0000 |
| commit | 5fa11cc28db07e1ac0c06ad10fc45ed7caddb315 (patch) | |
| tree | b96a784e7f4015691ac9a1efa0875a1de1e64678 | |
| parent | bdf0a828423d27d8a0ea956da4eda1754631dc3b (diff) | |
| download | emacs-5fa11cc28db07e1ac0c06ad10fc45ed7caddb315.tar.gz emacs-5fa11cc28db07e1ac0c06ad10fc45ed7caddb315.zip | |
Move things around; munge whitespace, indentation; nfc.
| -rw-r--r-- | lisp/emacs-lisp/avl-tree.el | 89 |
1 files changed, 36 insertions, 53 deletions
diff --git a/lisp/emacs-lisp/avl-tree.el b/lisp/emacs-lisp/avl-tree.el index 0e37e718250..7dd4d18da7c 100644 --- a/lisp/emacs-lisp/avl-tree.el +++ b/lisp/emacs-lisp/avl-tree.el | |||
| @@ -54,6 +54,13 @@ | |||
| 54 | 54 | ||
| 55 | ;;; Code: | 55 | ;;; Code: |
| 56 | 56 | ||
| 57 | ;;; ================================================================ | ||
| 58 | ;;; Functions and macros handling an AVL tree node. | ||
| 59 | |||
| 60 | (defmacro avl-tree-node-create (left right data balance) | ||
| 61 | ;; Create and return an avl-tree node. | ||
| 62 | `(vector ,left ,right ,data ,balance)) | ||
| 63 | |||
| 57 | (defmacro avl-tree-node-left (node) | 64 | (defmacro avl-tree-node-left (node) |
| 58 | ;; Return the left pointer of NODE. | 65 | ;; Return the left pointer of NODE. |
| 59 | `(aref ,node 0)) | 66 | `(aref ,node 0)) |
| @@ -93,13 +100,6 @@ | |||
| 93 | ;; NEWVAL is new value of the branch." | 100 | ;; NEWVAL is new value of the branch." |
| 94 | `(aset ,node ,branch ,newval)) | 101 | `(aset ,node ,branch ,newval)) |
| 95 | 102 | ||
| 96 | ;;; ================================================================ | ||
| 97 | ;;; Functions and macros handling an AVL tree node. | ||
| 98 | |||
| 99 | (defmacro avl-tree-node-create (left right data balance) | ||
| 100 | ;; Create and return an avl-tree node. | ||
| 101 | `(vector ,left ,right ,data ,balance)) | ||
| 102 | |||
| 103 | (defmacro avl-tree-node-balance (node) | 103 | (defmacro avl-tree-node-balance (node) |
| 104 | ;; Return the balance field of a node. | 104 | ;; Return the balance field of a node. |
| 105 | `(aref ,node 3)) | 105 | `(aref ,node 3)) |
| @@ -130,11 +130,7 @@ | |||
| 130 | (defun avl-tree-del-balance1 (node branch) | 130 | (defun avl-tree-del-balance1 (node branch) |
| 131 | ;; Rebalance a tree and return t if the height of the tree has shrunk. | 131 | ;; Rebalance a tree and return t if the height of the tree has shrunk. |
| 132 | (let* ((br (avl-tree-node-branch node branch)) | 132 | (let* ((br (avl-tree-node-branch node branch)) |
| 133 | p1 | 133 | p1 b1 p2 b2 result) |
| 134 | b1 | ||
| 135 | p2 | ||
| 136 | b2 | ||
| 137 | result) | ||
| 138 | (cond | 134 | (cond |
| 139 | ((< (avl-tree-node-balance br) 0) | 135 | ((< (avl-tree-node-balance br) 0) |
| 140 | (avl-tree-node-set-balance br 0) | 136 | (avl-tree-node-set-balance br 0) |
| @@ -183,11 +179,7 @@ | |||
| 183 | 179 | ||
| 184 | (defun avl-tree-del-balance2 (node branch) | 180 | (defun avl-tree-del-balance2 (node branch) |
| 185 | (let* ((br (avl-tree-node-branch node branch)) | 181 | (let* ((br (avl-tree-node-branch node branch)) |
| 186 | p1 | 182 | p1 b1 p2 b2 result) |
| 187 | b1 | ||
| 188 | p2 | ||
| 189 | b2 | ||
| 190 | result) | ||
| 191 | (cond | 183 | (cond |
| 192 | ((> (avl-tree-node-balance br) 0) | 184 | ((> (avl-tree-node-balance br) 0) |
| 193 | (avl-tree-node-set-balance br 0) | 185 | (avl-tree-node-set-balance br 0) |
| @@ -235,14 +227,13 @@ | |||
| 235 | t))))) | 227 | t))))) |
| 236 | 228 | ||
| 237 | (defun avl-tree-do-del-internal (node branch q) | 229 | (defun avl-tree-do-del-internal (node branch q) |
| 238 | |||
| 239 | (let* ((br (avl-tree-node-branch node branch))) | 230 | (let* ((br (avl-tree-node-branch node branch))) |
| 240 | (if (avl-tree-node-right br) | 231 | (if (avl-tree-node-right br) |
| 241 | (if (avl-tree-do-del-internal br +1 q) | 232 | (if (avl-tree-do-del-internal br +1 q) |
| 242 | (avl-tree-del-balance2 node branch)) | 233 | (avl-tree-del-balance2 node branch)) |
| 243 | (avl-tree-node-set-data q (avl-tree-node-data br)) | 234 | (avl-tree-node-set-data q (avl-tree-node-data br)) |
| 244 | (avl-tree-node-set-branch node branch | 235 | (avl-tree-node-set-branch node branch |
| 245 | (avl-tree-node-left br)) | 236 | (avl-tree-node-left br)) |
| 246 | t))) | 237 | t))) |
| 247 | 238 | ||
| 248 | (defun avl-tree-do-delete (cmpfun root branch data) | 239 | (defun avl-tree-do-delete (cmpfun root branch data) |
| @@ -281,10 +272,7 @@ | |||
| 281 | (defun avl-tree-enter-balance1 (node branch) | 272 | (defun avl-tree-enter-balance1 (node branch) |
| 282 | ;; Rebalance a tree and return t if the height of the tree has grown. | 273 | ;; Rebalance a tree and return t if the height of the tree has grown. |
| 283 | (let* ((br (avl-tree-node-branch node branch)) | 274 | (let* ((br (avl-tree-node-branch node branch)) |
| 284 | p1 | 275 | p1 p2 b2 result) |
| 285 | p2 | ||
| 286 | b2 | ||
| 287 | result) | ||
| 288 | (cond | 276 | (cond |
| 289 | ((< (avl-tree-node-balance br) 0) | 277 | ((< (avl-tree-node-balance br) 0) |
| 290 | (avl-tree-node-set-balance br 0) | 278 | (avl-tree-node-set-balance br 0) |
| @@ -325,9 +313,7 @@ | |||
| 325 | (defun avl-tree-enter-balance2 (node branch) | 313 | (defun avl-tree-enter-balance2 (node branch) |
| 326 | ;; Return t if the tree has grown. | 314 | ;; Return t if the tree has grown. |
| 327 | (let* ((br (avl-tree-node-branch node branch)) | 315 | (let* ((br (avl-tree-node-branch node branch)) |
| 328 | p1 | 316 | p1 p2 b2) |
| 329 | p2 | ||
| 330 | b2) | ||
| 331 | (cond | 317 | (cond |
| 332 | ((> (avl-tree-node-balance br) 0) | 318 | ((> (avl-tree-node-balance br) 0) |
| 333 | (avl-tree-node-set-balance br 0) | 319 | (avl-tree-node-set-balance br 0) |
| @@ -371,20 +357,16 @@ | |||
| 371 | (cond | 357 | (cond |
| 372 | ((null br) | 358 | ((null br) |
| 373 | ;; Data not in tree, insert it. | 359 | ;; Data not in tree, insert it. |
| 374 | (avl-tree-node-set-branch root branch | 360 | (avl-tree-node-set-branch |
| 375 | (avl-tree-node-create nil nil data 0)) | 361 | root branch (avl-tree-node-create nil nil data 0)) |
| 376 | t) | 362 | t) |
| 377 | 363 | ||
| 378 | ((funcall cmpfun data (avl-tree-node-data br)) | 364 | ((funcall cmpfun data (avl-tree-node-data br)) |
| 379 | (and (avl-tree-do-enter cmpfun | 365 | (and (avl-tree-do-enter cmpfun br 0 data) |
| 380 | br | ||
| 381 | 0 data) | ||
| 382 | (avl-tree-enter-balance2 root branch))) | 366 | (avl-tree-enter-balance2 root branch))) |
| 383 | 367 | ||
| 384 | ((funcall cmpfun (avl-tree-node-data br) data) | 368 | ((funcall cmpfun (avl-tree-node-data br) data) |
| 385 | (and (avl-tree-do-enter cmpfun | 369 | (and (avl-tree-do-enter cmpfun br 1 data) |
| 386 | br | ||
| 387 | 1 data) | ||
| 388 | (avl-tree-enter-balance1 root branch))) | 370 | (avl-tree-enter-balance1 root branch))) |
| 389 | 371 | ||
| 390 | (t | 372 | (t |
| @@ -424,10 +406,11 @@ | |||
| 424 | ;; Highly recursive. INTERNAL USE ONLY. | 406 | ;; Highly recursive. INTERNAL USE ONLY. |
| 425 | (if (null root) | 407 | (if (null root) |
| 426 | nil | 408 | nil |
| 427 | (avl-tree-node-create (avl-tree-do-copy (avl-tree-node-left root)) | 409 | (avl-tree-node-create |
| 428 | (avl-tree-do-copy (avl-tree-node-right root)) | 410 | (avl-tree-do-copy (avl-tree-node-left root)) |
| 429 | (avl-tree-node-data root) | 411 | (avl-tree-do-copy (avl-tree-node-right root)) |
| 430 | (avl-tree-node-balance root)))) | 412 | (avl-tree-node-data root) |
| 413 | (avl-tree-node-balance root)))) | ||
| 431 | 414 | ||
| 432 | 415 | ||
| 433 | ;;; ================================================================ | 416 | ;;; ================================================================ |
| @@ -488,7 +471,6 @@ If there is no such element in the tree, the value is nil." | |||
| 488 | (setq node (avl-tree-node-right node))) | 471 | (setq node (avl-tree-node-right node))) |
| 489 | (t | 472 | (t |
| 490 | (setq found t)))) | 473 | (setq found t)))) |
| 491 | |||
| 492 | (if node | 474 | (if node |
| 493 | (avl-tree-node-data node) | 475 | (avl-tree-node-data node) |
| 494 | nil))) | 476 | nil))) |
| @@ -497,9 +479,9 @@ If there is no such element in the tree, the value is nil." | |||
| 497 | "Apply MAP-FUNCTION to all elements in the avl tree TREE." | 479 | "Apply MAP-FUNCTION to all elements in the avl tree TREE." |
| 498 | (avl-tree-mapc | 480 | (avl-tree-mapc |
| 499 | (function (lambda (node) | 481 | (function (lambda (node) |
| 500 | (avl-tree-node-set-data node | 482 | (avl-tree-node-set-data |
| 501 | (funcall __map-function__ | 483 | node (funcall __map-function__ |
| 502 | (avl-tree-node-data node))))) | 484 | (avl-tree-node-data node))))) |
| 503 | (avl-tree-root tree))) | 485 | (avl-tree-root tree))) |
| 504 | 486 | ||
| 505 | (defun avl-tree-first (tree) | 487 | (defun avl-tree-first (tree) |
| @@ -524,29 +506,30 @@ If there is no such element in the tree, the value is nil." | |||
| 524 | 506 | ||
| 525 | (defun avl-tree-copy (tree) | 507 | (defun avl-tree-copy (tree) |
| 526 | "Return a copy of the avl tree TREE." | 508 | "Return a copy of the avl tree TREE." |
| 527 | (let ((new-tree (avl-tree-create | 509 | (let ((new-tree (avl-tree-create (avl-tree-cmpfun tree)))) |
| 528 | (avl-tree-cmpfun tree)))) | ||
| 529 | (avl-tree-node-set-left (avl-tree-dummyroot new-tree) | 510 | (avl-tree-node-set-left (avl-tree-dummyroot new-tree) |
| 530 | (avl-tree-do-copy (avl-tree-root tree))) | 511 | (avl-tree-do-copy (avl-tree-root tree))) |
| 531 | new-tree)) | 512 | new-tree)) |
| 532 | 513 | ||
| 533 | (defun avl-tree-flatten (tree) | 514 | (defun avl-tree-flatten (tree) |
| 534 | "Return a sorted list containing all elements of TREE." | 515 | "Return a sorted list containing all elements of TREE." |
| 535 | (nreverse | 516 | (nreverse |
| 536 | (let ((treelist nil)) | 517 | (let ((treelist nil)) |
| 537 | (avl-tree-mapc (function (lambda (node) | 518 | (avl-tree-mapc |
| 538 | (setq treelist (cons (avl-tree-node-data node) | 519 | (function (lambda (node) |
| 539 | treelist)))) | 520 | (setq treelist (cons (avl-tree-node-data node) |
| 540 | (avl-tree-root tree)) | 521 | treelist)))) |
| 522 | (avl-tree-root tree)) | ||
| 541 | treelist))) | 523 | treelist))) |
| 542 | 524 | ||
| 543 | (defun avl-tree-size (tree) | 525 | (defun avl-tree-size (tree) |
| 544 | "Return the number of elements in TREE." | 526 | "Return the number of elements in TREE." |
| 545 | (let ((treesize 0)) | 527 | (let ((treesize 0)) |
| 546 | (avl-tree-mapc (function (lambda (data) | 528 | (avl-tree-mapc |
| 547 | (setq treesize (1+ treesize)) | 529 | (function (lambda (data) |
| 548 | data)) | 530 | (setq treesize (1+ treesize)) |
| 549 | (avl-tree-root tree)) | 531 | data)) |
| 532 | (avl-tree-root tree)) | ||
| 550 | treesize)) | 533 | treesize)) |
| 551 | 534 | ||
| 552 | (defun avl-tree-clear (tree) | 535 | (defun avl-tree-clear (tree) |