1 (* Copyright (C) 2017 Matthew Fluet.
2 * Copyright (C) 1999-2006 Henry Cejtin, Matthew Fluet, Suresh
3 * Jagannathan, and Stephen Weeks.
4 * Copyright (C) 1997-2000 NEC Research Institute.
6 * MLton is released under a BSD-style license.
7 * See the file MLton-LICENSE for details.
10 structure UniqueString:
12 val unique: string -> string
15 val set: {counter: Counter.t,
17 original: string} HashSet.t =
18 HashSet.new {hash = #hash}
20 fun unique (s: string): string =
22 val hash = String.hash s
24 HashSet.lookupOrInsert
25 (set, hash, fn {original, ...} => s = original,
26 fn () => {counter = Counter.new 0,
30 concat [s, "_", Int.toString (Counter.next counter)]
34 functor Id (S: ID_STRUCTS): ID =
39 structure Plist = PropertyList
41 datatype t = T of {hash: word,
43 printName: string option ref,
47 fun make f (T r) = f r
50 val originalName = make #originalName
51 val plist = make #plist
54 fun isAlphaNum (s: string): bool =
55 String.forall (s, fn c => Char.isAlphaNum c orelse c = #"_")
57 fun clearPrintName (T {originalName, printName, ...}): unit =
58 if isAlphaNum originalName
60 else printName := NONE
62 val printNameAlphaNumeric: bool ref = ref false
64 fun toString (T {originalName, printName, ...}) =
69 if not (!printNameAlphaNumeric)
70 orelse isAlphaNum originalName
98 val s = UniqueString.unique s
99 val _ = printName := SOME s
105 val layout = String.layout o toString
107 fun equals (id, id') = Plist.equals (plist id, plist id')
110 fun make (originalName, printName) =
111 T {hash = Random.word (),
112 originalName = originalName,
113 printName = ref printName,
114 plist = Plist.new ()}
116 fun fromString s = make (s, SOME s)
117 fun newString s = make (s, NONE)
120 val new = newString o originalName
122 fun newNoname () = newString noname
124 val bogus = newString "bogus"
126 val clear = Plist.clear o plist