From 48da27144c07be523b6f86555c847f37d694c73a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fre=CC=81de=CC=81ric=20Bour?= Date: Thu, 4 Jan 2024 08:07:05 +0900 Subject: [PATCH] Lwd_table: stackless compute_sub_size --- lib/lwd/lwd_table.ml | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/lib/lwd/lwd_table.ml b/lib/lwd/lwd_table.ml index cf19b10..48dc8b3 100644 --- a/lib/lwd/lwd_table.ml +++ b/lib/lwd/lwd_table.ml @@ -270,17 +270,22 @@ and balance version = function else (node.version <- version; node.size <- 1 + sl + sr; self) ) -let rec _compute_sub_size1 version = function +let rec compute_sub_size version = function | Root _ -> () | Leaf -> () | Node node as self -> - if node.size = 0 then begin - _compute_sub_size1 version node.left; - _compute_sub_size1 version node.right; - ignore (balance version self) - end - -let compute_sub_size = _compute_sub_size1 + if node.size = 0 then + match node.left with + | Node {size = 0; _} -> + compute_sub_size version node.left + | _ -> + match node.right with + | Node {size = 0; _} -> + compute_sub_size version node.right + | _ -> + let parent = node.parent in + ignore (balance version self); + compute_sub_size version parent let rec reset_version version = function | Leaf -> ()