2e7443915348c93e25fe8d3b2b1999dffdcf7339
[bpt/coccinelle.git] / commons / oseth.ml
1 open Common
2
3 open Oset
4
5 (* !!take care!!: this class does side effect, not a pure oassoc *)
6 class ['a] oseth xs =
7 object(o)
8 inherit ['a] oset
9
10 val data = Hashtbl.create 100
11
12 (* if put [] then no segfault, if [11] then segfault *)
13 method toset = Obj.magic data
14
15 method empty = {< data = Hashtbl.create 100 >}
16 method add k =
17 Hashtbl.add data k true;
18 o
19
20 method iter f = Hashtbl.iter (fun k v -> f k) data
21 method view = raise Todo
22
23 method del k =
24 Hashtbl.remove data k;
25 o
26 method mem k =
27 try (ignore(Hashtbl.find data k); true)
28 with Not_found -> false
29
30 method null =
31 try (Hashtbl.iter (fun k v -> raise ReturnExn) data; false)
32 with ReturnExn -> true
33
34 (* TODO method length *)
35
36 method union s =
37 let v = Hashtbl.create 100 in
38 o#iter (fun k -> Hashtbl.add v k true);
39 s#iter (fun k -> Hashtbl.add v k true);
40 {< data = v >}
41 method inter s =
42 let v = Hashtbl.create 100 in
43 o#iter (fun k -> if s#mem k then Hashtbl.add v k true);
44 {< data = v >}
45 method minus s =
46 let v = Hashtbl.create 100 in
47 o#iter (fun k -> if not(s#mem k) then Hashtbl.add v k true);
48 {< data = v >}
49
50 (* override default *)
51 method getone =
52 let x = ref None in
53 try (
54 Hashtbl.iter (fun k _ -> x := Some k; raise ReturnExn) data;
55 raise Not_found
56 )
57 with ReturnExn -> some !x
58
59
60 end
61
62