diff options
| author | whitequark | 2018-06-21 03:29:14 +0000 |
|---|---|---|
| committer | Pierre-Marie Pédrot | 2018-11-16 17:43:14 +0100 |
| commit | 54930207d4e0ba22ef079b36e89cd2c1287760f7 (patch) | |
| tree | 8a6c5b79916dfb0b5bf1a98dd018fbd02aa810d6 /clib/dyn.ml | |
| parent | 778213b89d893b55e572fc1813c7209d647ed6b0 (diff) | |
Add Dyn.anonymous, a more efficient version of Dyn.create (string_of_int n).
Diffstat (limited to 'clib/dyn.ml')
| -rw-r--r-- | clib/dyn.ml | 22 |
1 files changed, 15 insertions, 7 deletions
diff --git a/clib/dyn.ml b/clib/dyn.ml index 6c45767246..22c49706be 100644 --- a/clib/dyn.ml +++ b/clib/dyn.ml @@ -38,6 +38,7 @@ sig type t = Dyn : 'a tag * 'a -> t val create : string -> 'a tag + val anonymous : int -> 'a tag val eq : 'a tag -> 'b tag -> ('a, 'b) CSig.eq option val repr : 'a tag -> string @@ -81,15 +82,22 @@ module Self : PreS = struct let create (s : string) = let hash = Hashtbl.hash s in - let () = - if Int.Map.mem hash !dyntab then - let old = Int.Map.find hash !dyntab in - let () = Printf.eprintf "Dynamic tag collision: %s vs. %s\n%!" s old in - assert false - in - let () = dyntab := Int.Map.add hash s !dyntab in + if Int.Map.mem hash !dyntab then begin + let old = Int.Map.find hash !dyntab in + Printf.eprintf "Dynamic tag collision: %s vs. %s\n%!" s old; + assert false + end; + dyntab := Int.Map.add hash s !dyntab; hash + let anonymous n = + if Int.Map.mem n !dyntab then begin + Printf.eprintf "Dynamic tag collision: %d\n%!" n; + assert false + end; + dyntab := Int.Map.add n "<anonymous>" !dyntab; + n + let eq : 'a 'b. 'a tag -> 'b tag -> ('a, 'b) CSig.eq option = fun h1 h2 -> if Int.equal h1 h2 then Some (Obj.magic CSig.Refl) else None |
