@@ -3504,20 +3504,24 @@ let remove (h : _ Hash_set_gen.t) key =
35043504
35053505let add (h : _ Hash_set_gen.t ) key =
35063506 (* 4103 *) let i = key_index h key in
3507- if not (Hash_set_gen. small_bucket_mem eq_key key (Array. unsafe_get h.data i)) then
3507+ let h_data = h.data in
3508+ let old_bucket = (Array. unsafe_get h_data i) in
3509+ if not (Hash_set_gen. small_bucket_mem eq_key key old_bucket) then
35083510 begin
3509- h.data.(i) < - key :: h.data.(i );
3511+ Array. unsafe_set h_data i ( key :: old_bucket );
35103512 h.size < - h.size + 1 ;
3511- if h.size > Array. length h.data lsl 1 then Hash_set_gen. resize key_index h
3513+ if h.size > Array. length h_data lsl 1 then Hash_set_gen. resize key_index h
35123514 end
35133515
35143516let check_add (h : _ Hash_set_gen.t ) key =
35153517 (* 0 *) let i = key_index h key in
3516- if not (Hash_set_gen. small_bucket_mem eq_key key (Array. unsafe_get h.data i)) then
3518+ let h_data = h.data in
3519+ let old_bucket = (Array. unsafe_get h_data i) in
3520+ if not (Hash_set_gen. small_bucket_mem eq_key key old_bucket) then
35173521 begin
3518- h.data.(i) < - key :: h.data.(i );
3522+ Array. unsafe_set h_data i ( key :: old_bucket );
35193523 h.size < - h.size + 1 ;
3520- if h.size > Array. length h.data lsl 1 then Hash_set_gen. resize key_index h;
3524+ if h.size > Array. length h_data lsl 1 then Hash_set_gen. resize key_index h;
35213525 true
35223526 end
35233527 else false
@@ -3526,7 +3530,7 @@ let check_add (h : _ Hash_set_gen.t) key =
35263530let mem (h : _ Hash_set_gen.t ) key =
35273531 (* 3102 *) Hash_set_gen. small_bucket_mem eq_key key (Array. unsafe_get h.data (key_index h key))
35283532
3529- # 106
3533+ # 110
35303534end
35313535
35323536
@@ -3641,20 +3645,24 @@ let remove (h : _ Hash_set_gen.t) key =
36413645
36423646let add (h : _ Hash_set_gen.t ) key =
36433647 (* 15004 *) let i = key_index h key in
3644- if not (Hash_set_gen. small_bucket_mem eq_key key (Array. unsafe_get h.data i)) then
3648+ let h_data = h.data in
3649+ let old_bucket = (Array. unsafe_get h_data i) in
3650+ if not (Hash_set_gen. small_bucket_mem eq_key key old_bucket) then
36453651 begin
3646- h.data.(i) < - key :: h.data.(i );
3652+ Array. unsafe_set h_data i ( key :: old_bucket );
36473653 h.size < - h.size + 1 ;
3648- if h.size > Array. length h.data lsl 1 then Hash_set_gen. resize key_index h
3654+ if h.size > Array. length h_data lsl 1 then Hash_set_gen. resize key_index h
36493655 end
36503656
36513657let check_add (h : _ Hash_set_gen.t ) key =
36523658 (* 0 *) let i = key_index h key in
3653- if not (Hash_set_gen. small_bucket_mem eq_key key (Array. unsafe_get h.data i)) then
3659+ let h_data = h.data in
3660+ let old_bucket = (Array. unsafe_get h_data i) in
3661+ if not (Hash_set_gen. small_bucket_mem eq_key key old_bucket) then
36543662 begin
3655- h.data.(i) < - key :: h.data.(i );
3663+ Array. unsafe_set h_data i ( key :: old_bucket );
36563664 h.size < - h.size + 1 ;
3657- if h.size > Array. length h.data lsl 1 then Hash_set_gen. resize key_index h;
3665+ if h.size > Array. length h_data lsl 1 then Hash_set_gen. resize key_index h;
36583666 true
36593667 end
36603668 else false
@@ -4069,20 +4077,24 @@ let remove (h : _ Hash_set_gen.t) key =
40694077
40704078let add (h : _ Hash_set_gen.t ) key =
40714079 (* 101 *) let i = key_index h key in
4072- if not (Hash_set_gen. small_bucket_mem eq_key key (Array. unsafe_get h.data i)) then
4080+ let h_data = h.data in
4081+ let old_bucket = (Array. unsafe_get h_data i) in
4082+ if not (Hash_set_gen. small_bucket_mem eq_key key old_bucket) then
40734083 begin
4074- h.data.(i) < - key :: h.data.(i );
4084+ Array. unsafe_set h_data i ( key :: old_bucket );
40754085 h.size < - h.size + 1 ;
4076- if h.size > Array. length h.data lsl 1 then Hash_set_gen. resize key_index h
4086+ if h.size > Array. length h_data lsl 1 then Hash_set_gen. resize key_index h
40774087 end
40784088
40794089let check_add (h : _ Hash_set_gen.t ) key =
40804090 (* 8 *) let i = key_index h key in
4081- if not (Hash_set_gen. small_bucket_mem eq_key key (Array. unsafe_get h.data i)) then
4091+ let h_data = h.data in
4092+ let old_bucket = (Array. unsafe_get h_data i) in
4093+ if not (Hash_set_gen. small_bucket_mem eq_key key old_bucket) then
40824094 begin
4083- h.data.(i) < - key :: h.data.(i );
4095+ Array. unsafe_set h_data i ( key :: old_bucket );
40844096 h.size < - h.size + 1 ;
4085- if h.size > Array. length h.data lsl 1 then Hash_set_gen. resize key_index h;
4097+ if h.size > Array. length h_data lsl 1 then Hash_set_gen. resize key_index h;
40864098 true
40874099 end
40884100 else false
@@ -4319,20 +4331,24 @@ let remove (h : _ Hash_set_gen.t) key =
43194331
43204332let add (h : _ Hash_set_gen.t ) key =
43214333 (* 0 *) let i = key_index h key in
4322- if not (Hash_set_gen. small_bucket_mem eq_key key (Array. unsafe_get h.data i)) then
4334+ let h_data = h.data in
4335+ let old_bucket = (Array. unsafe_get h_data i) in
4336+ if not (Hash_set_gen. small_bucket_mem eq_key key old_bucket) then
43234337 begin
4324- h.data.(i) < - key :: h.data.(i );
4338+ Array. unsafe_set h_data i ( key :: old_bucket );
43254339 h.size < - h.size + 1 ;
4326- if h.size > Array. length h.data lsl 1 then Hash_set_gen. resize key_index h
4340+ if h.size > Array. length h_data lsl 1 then Hash_set_gen. resize key_index h
43274341 end
43284342
43294343let check_add (h : _ Hash_set_gen.t ) key =
43304344 (* 0 *) let i = key_index h key in
4331- if not (Hash_set_gen. small_bucket_mem eq_key key (Array. unsafe_get h.data i)) then
4345+ let h_data = h.data in
4346+ let old_bucket = (Array. unsafe_get h_data i) in
4347+ if not (Hash_set_gen. small_bucket_mem eq_key key old_bucket) then
43324348 begin
4333- h.data.(i) < - key :: h.data.(i );
4349+ Array. unsafe_set h_data i ( key :: old_bucket );
43344350 h.size < - h.size + 1 ;
4335- if h.size > Array. length h.data lsl 1 then Hash_set_gen. resize key_index h;
4351+ if h.size > Array. length h_data lsl 1 then Hash_set_gen. resize key_index h;
43364352 true
43374353 end
43384354 else false
@@ -4665,10 +4681,10 @@ let stats = Hashtbl_gen.stats
46654681
46664682let add (h : _ t ) key info =
46674683 (* 2000 *) let i = key_index h key in
4668- let bucket : _ bucketlist = Cons (key, info, h.data.(i)) in
4669- h.data.(i) < - bucket ;
4684+ let h_data = h.data in
4685+ Array. unsafe_set h_data i ( Cons (key, info, ( Array. unsafe_get h_data i))) ;
46704686 h.size < - h.size + 1 ;
4671- if h.size > Array. length h.data lsl 1 then Hashtbl_gen. resize key_index h
4687+ if h.size > Array. length h_data lsl 1 then Hashtbl_gen. resize key_index h
46724688
46734689(* after upgrade to 4.04 we should provide an efficient [replace_or_init] *)
46744690let modify_or_init (h : _ t ) key modf default =
@@ -4679,86 +4695,98 @@ let modify_or_init (h : _ t) key modf default =
46794695 else find_bucket next
46804696 | Empty -> (* 0 *) true in
46814697 let i = key_index h key in
4682- if find_bucket h.data.(i) then
4698+ let h_data = h.data in
4699+ if find_bucket (Array. unsafe_get h_data i) then
46834700 begin
4684- h.data.(i) < - Cons (key,default () ,h.data.( i));
4701+ Array. unsafe_set h_data i ( Cons (key,default () , Array. unsafe_get h_data i));
46854702 h.size < - h.size + 1 ;
4686- if h.size > Array. length h.data lsl 1 then Hashtbl_gen. resize key_index h
4703+ if h.size > Array. length h_data lsl 1 then Hashtbl_gen. resize key_index h
46874704 end
46884705
4706+
4707+ let rec remove_bucket key (h : _ t ) (bucketlist : _ bucketlist ) : _ bucketlist =
4708+ (* 0 *) match bucketlist with
4709+ | Empty ->
4710+ (* 0 *) Empty
4711+ | Cons (k , i , next ) ->
4712+ (* 0 *) if eq_key k key
4713+ then begin h.size < - h.size - 1 ; next end
4714+ else Cons (k, i, remove_bucket key h next)
4715+
46894716let remove (h : _ t ) key =
4690- (* 0 *) let rec remove_bucket (bucketlist : _ bucketlist ) : _ bucketlist = (* 0 *) match bucketlist with
4691- | Empty ->
4692- (* 0 *) Empty
4693- | Cons (k , i , next ) ->
4694- (* 0 *) if eq_key k key
4695- then begin h.size < - h.size - 1 ; next end
4696- else Cons (k, i, remove_bucket next) in
4697- let i = key_index h key in
4698- h.data.(i) < - remove_bucket h.data.(i)
4717+ (* 0 *) let i = key_index h key in
4718+ let h_data = h.data in
4719+ let old_h_szie = h.size in
4720+ let new_bucket = remove_bucket key h (Array. unsafe_get h_data i) in
4721+ if old_h_szie <> h.size then
4722+ Array. unsafe_set h_data i new_bucket
46994723
47004724let rec find_rec key (bucketlist : _ bucketlist ) = (* 0 *) match bucketlist with
47014725 | Empty ->
4702- (* 0 *) raise Not_found
4726+ (* 0 *) raise Not_found
47034727 | Cons (k , d , rest ) ->
4704- (* 0 *) if eq_key key k then d else find_rec key rest
4728+ (* 0 *) if eq_key key k then d else find_rec key rest
47054729
47064730let find_exn (h : _ t ) key =
4707- (* 0 *) match h.data. (key_index h key) with
4731+ (* 0 *) match Array. unsafe_get h.data (key_index h key) with
47084732 | Empty -> (* 0 *) raise Not_found
47094733 | Cons (k1 , d1 , rest1 ) ->
4710- (* 0 *) if eq_key key k1 then d1 else
4734+ (* 0 *) if eq_key key k1 then d1 else
47114735 match rest1 with
47124736 | Empty -> (* 0 *) raise Not_found
47134737 | Cons (k2 , d2 , rest2 ) ->
4714- (* 0 *) if eq_key key k2 then d2 else
4738+ (* 0 *) if eq_key key k2 then d2 else
47154739 match rest2 with
47164740 | Empty -> (* 0 *) raise Not_found
47174741 | Cons (k3 , d3 , rest3 ) ->
4718- (* 0 *) if eq_key key k3 then d3 else find_rec key rest3
4742+ (* 0 *) if eq_key key k3 then d3 else find_rec key rest3
47194743
47204744let find_opt (h : _ t ) key =
47214745 (* 0 *) Hashtbl_gen. small_bucket_opt eq_key key (Array. unsafe_get h.data (key_index h key))
47224746let find_default (h : _ t ) key default =
47234747 (* 0 *) Hashtbl_gen. small_bucket_default eq_key key default (Array. unsafe_get h.data (key_index h key))
47244748let find_all (h : _ t ) key =
47254749 (* 0 *) let rec find_in_bucket (bucketlist : _ bucketlist ) = (* 0 *) match bucketlist with
4726- | Empty ->
4750+ | Empty ->
47274751 (* 0 *) []
4728- | Cons (k , d , rest ) ->
4752+ | Cons (k , d , rest ) ->
47294753 (* 0 *) if eq_key k key
47304754 then d :: find_in_bucket rest
47314755 else find_in_bucket rest in
4732- find_in_bucket h.data. (key_index h key)
4756+ find_in_bucket ( Array. unsafe_get h.data (key_index h key) )
47334757
47344758let replace h key info =
47354759 (* 2000 *) let rec replace_bucket (bucketlist : _ bucketlist ) : _ bucketlist = (* 4462 *) match bucketlist with
47364760 | Empty ->
4737- (* 1000 *) raise_notrace Not_found
4761+ (* 1000 *) raise_notrace Not_found
47384762 | Cons (k , i , next ) ->
4739- (* 3462 *) if eq_key k key
4740- then Cons (key, info, next)
4741- else Cons (k, i, replace_bucket next) in
4763+ (* 3462 *) if eq_key k key
4764+ then Cons (key, info, next)
4765+ else Cons (k, i, replace_bucket next) in
47424766 let i = key_index h key in
4743- let l = h.data.(i) in
4767+ let h_data = h.data in
4768+ let l = Array. unsafe_get h_data i in
47444769 try
4745- h.data.(i) < - replace_bucket l
4770+ Array. unsafe_set h_data i ( replace_bucket l)
47464771 with Not_found ->
4747- h.data.(i) < - Cons (key, info, l);
4748- h.size < - h.size + 1 ;
4749- if h.size > Array. length h.data lsl 1 then Hashtbl_gen. resize key_index h
4772+ begin
4773+ Array. unsafe_set h_data i (Cons (key, info, l));
4774+ h.size < - h.size + 1 ;
4775+ if h.size > Array. length h_data lsl 1 then Hashtbl_gen. resize key_index h;
4776+ end
47504777
47514778let mem (h : _ t ) key =
47524779 (* 0 *) let rec mem_in_bucket (bucketlist : _ bucketlist ) = (* 0 *) match bucketlist with
4753- | Empty ->
4780+ | Empty ->
47544781 (* 0 *) false
4755- | Cons (k , d , rest ) ->
4782+ | Cons (k , d , rest ) ->
47564783 (* 0 *) eq_key k key || mem_in_bucket rest in
4757- mem_in_bucket h.data. (key_index h key)
4784+ mem_in_bucket ( Array. unsafe_get h.data (key_index h key) )
47584785
47594786
47604787let of_list2 ks vs =
4761- (* 0 *) let map = create 51 in
4788+ (* 0 *) let len = List. length ks in
4789+ let map = create len in
47624790 List. iter2 (fun k v -> (* 0 *) add map k v) ks vs ;
47634791 map
47644792
0 commit comments