From: Christopher W. <crw...@gm...> - 2005-02-12 20:19:08
|
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 |