permit multiline comments and strings in macros
[bpt/coccinelle.git] / commons / oassoc.ml
1 open Common
2
3 open Ocollection
4
5 (* assoc, also called map or dictionnary *)
6 class virtual ['a,'b] oassoc =
7 object(o: 'o)
8 inherit ['a * 'b] ocollection
9
10 method virtual assoc: 'a -> 'b
11 method virtual delkey: 'a -> 'o
12
13 (* pre: must be in *)
14 method replkey: ('a * 'b) -> 'o =
15 fun (k,v) -> o#add (k,v)
16
17 (* pre: must not be in *)
18 (* method add: ('a * 'b) -> 'o = *)
19
20 (*
21 method keys =
22 List.map fst (o#tolist)
23 *)
24 method virtual keys: 'a list (* or 'a oset ? *)
25
26 method find: 'a -> 'b = fun k ->
27 o#assoc k
28
29 method find_opt: 'a -> 'b option = fun k ->
30 try
31 let res = o#assoc k in
32 Some res
33 with Not_found -> None
34
35 method haskey: 'a -> bool = fun k ->
36 try (ignore(o#assoc k); true)
37 with Not_found -> false
38
39 method apply: 'a -> ('b -> 'b) -> 'o = fun k f ->
40 let old = o#assoc k in
41 o#replkey (k, f old)
42
43 (* apply default, assoc_default, take in class parameters a default value *)
44 method apply_with_default: 'a -> ('b -> 'b) -> (unit -> 'b) -> 'o =
45 fun k f default ->
46 let old =
47 try o#assoc k
48 with Not_found -> default ()
49 in
50 o#replkey (k, f old)
51
52 method apply_with_default2 = fun k f default ->
53 o#apply_with_default k f default +> ignore
54
55
56 end