If a Dllist has only two nodes, it breaks when one uses
the demote and promote functions.
(* Example code: *)
let lst = Dllist.create 1 ;;
Dllist.append lst 2 ;;
Dllist.demote lst ;;
Dllist.length lst ;; (* <-- hangs here *)
let lst = Dllist.create 1 ;;
Dllist.append lst 2 ;;
Dllist.promote lst ;;
Dllist.length lst ;; (* <-- returns 1, but should be 2 *)
(* End code *)
The patch is trivial. If a node's next and prev fields point to the
same node, don't do anything. A patch follows in the body of this
email.
-
Christopher R. Wedman
Index: dllist.ml
===================================================================
RCS file: /cvsroot/ocaml-lib/extlib-dev/dllist.ml,v
retrieving revision 1.1
diff -u -r1.1 dllist.ml
--- dllist.ml 20 Sep 2004 04:44:38 -0000 1.1
+++ dllist.ml 12 Feb 2005 19:58:41 -0000
@@ -62,22 +62,28 @@
let promote node =
let next = node.next in
let prev = node.prev in
- next.next.prev <- node;
- node.next <- next.next;
- node.prev <- next;
- next.next <- node;
- next.prev <- prev;
- prev.next <- next
+ if not (next == prev) then
+ begin
+ next.next.prev <- node;
+ node.next <- next.next;
+ node.prev <- next;
+ next.next <- node;
+ next.prev <- prev;
+ prev.next <- next
+ end
let demote node =
let next = node.next in
let prev = node.prev in
- prev.prev.next <- node;
- node.prev <- prev.prev;
- node.next <- prev;
- prev.prev <- node;
- prev.next <- next;
- next.prev <- prev
+ if not (next == prev) then
+ begin
+ prev.prev.next <- node;
+ node.prev <- prev.prev;
+ node.next <- prev;
+ prev.prev <- node;
+ prev.next <- next;
+ next.prev <- prev
+ end
let remove node =
let next = node.next in
|