@@ -5,7 +5,7 @@ let (=~) = OUnit.assert_equal
5
5
6
6
module Set_poly = struct
7
7
include Set_int
8
-
8
+ let of_sorted_list xs = Array. of_list xs |> of_sorted_array
9
9
let of_array l =
10
10
Ext_array. fold_left l empty add
11
11
end
@@ -86,21 +86,28 @@ let compare_ident x y =
86
86
if b <> 0 then b
87
87
else compare (x.flags : int ) y.flags
88
88
89
- let rec add x ( tree : _ Set_gen.t ) : _ Set_gen.t =
90
- match tree with
89
+
90
+ let rec add ( tree : _ Set_gen.t ) x = match tree with
91
91
| Empty -> Set_gen. singleton x
92
- | Node {l; v; r} as t ->
92
+ | Leaf v ->
93
93
let c = compare_ident x v in
94
- if c = 0 then t else
95
- if c < 0 then Set_gen. internal_bal (add x l) v r else Set_gen. internal_bal l v (add x r)
96
-
97
- let rec mem x (tree : _ Set_gen.t ) =
98
- match tree with
99
- | Empty -> false
100
- | Node {l; v; r} ->
94
+ if c = 0 then tree else
95
+ if c < 0 then
96
+ Set_gen. unsafe_create v (Set_gen. singleton x) Set_gen. empty 2
97
+ else
98
+ Set_gen. unsafe_create x (Set_gen. singleton v) Set_gen. empty 2
99
+ | Node {l; v; r} as t ->
101
100
let c = compare_ident x v in
102
- c = 0 || mem x (if c < 0 then l else r)
101
+ if c = 0 then t else
102
+ if c < 0 then Set_gen. internal_bal (add l x ) v r else Set_gen. internal_bal l v (add r x )
103
103
104
+ let rec mem (tree : _ Set_gen.t ) x = match tree with
105
+ | Empty -> false
106
+ | Leaf v -> compare_ident x v = 0
107
+ | Node {l; v; r} ->
108
+ let c = compare_ident x v in
109
+ c = 0 || mem (if c < 0 then l else r) x
110
+
104
111
module Ident_set2 = Set. Make (struct type t = ident
105
112
let compare = compare_ident
106
113
end )
@@ -139,10 +146,10 @@ let bench () =
139
146
Ounit_tests_util. time " poly set (specialized)" begin fun _ ->
140
147
let v = ref Set_gen. empty in
141
148
for i = 0 to times do
142
- v := add {stamp = i ; name = " name" ; flags = - 1 } ! v
149
+ v := add ! v {stamp = i ; name = " name" ; flags = - 1 }
143
150
done ;
144
151
for i = 0 to times do
145
- ignore @@ mem {stamp = i; name = " name" ; flags = - 1 } ! v
152
+ ignore @@ mem ! v {stamp = i; name = " name" ; flags = - 1 }
146
153
done
147
154
148
155
end ;
0 commit comments