ifndef SymbolAsString sclass symbol_Tester { // compares by text (case-sensitive) Symbol symbol; *() {} *(Symbol *symbol) {} public int hashCode() { ret symbol.text.hashCode(); } public bool equals(O o) { if (!o instanceof symbol_Tester) false; ret eq(symbol.text, o/symbol_Tester.symbol.text); } toString { ret str(symbol); } } sclass symbol_MasterTester { // compares by text (case-insensitive) MasterSymbol symbol; *() {} *(MasterSymbol *symbol) {} public int hashCode() { ret symbol.lowerCase.hashCode(); } public bool equals(O o) { if (!o instanceof symbol_MasterTester) false; ret eq(symbol.lowerCase, o/symbol_MasterTester.symbol.lowerCase); } } static WeakHashMap<symbol_Tester, Bool> symbol_map = unsyncedWeakHashMap(); static WeakHashMap<symbol_MasterTester, Bool> masterSymbol_map = unsyncedWeakHashMap(); endifndef static Symbol symbol(S s) { ifdef SymbolAsString ret s; endifdef ifndef SymbolAsString if (s == null) null; synchronized(symbol_map) { // This is a trick that works because of how WeakHashMap compares keys. symbol_MasterTester masterTester = symbol_MasterTester(new MasterSymbol(s, true)); O e = call(masterSymbol_map, 'getEntry, masterTester); symbol_MasterTester existingMaster = e == null ? null : ((WeakReference<symbol_MasterTester>) e).get(); if (existingMaster == null) masterSymbol_map.put(existingMaster = masterTester, true); ifdef symbol_debug if (eqic(s, "Java")) print("existing master for " + s + ": " + existingMaster); endifdef // second lookup after master found bool isEq = eq(s, existingMaster.symbol.text); Symbol symbol = isEq ? existingMaster.symbol : new Symbol(s, existingMaster.symbol); ifdef symbol_debug //print("existing master text: " + existingMaster.symbol.text + ", eq=" + isEq + " => " + symbol); endifdef symbol_Tester tester = symbol_Tester(symbol); e = call(symbol_map, 'getEntry, tester); symbol_Tester sym = e == null ? null : ((WeakReference<symbol_Tester>) e).get(); if (sym == null) symbol_map.put(sym = tester, true); ifdef symbol_debug if (eqic(s, "Java")) print("Symbol for " + s + ": " + symbolToStringFull(sym.symbol); endifdef ret sym.symbol; } endifndef } static Symbol symbol(CharSequence s) { if (s == null) null; ifdef SymbolAsString ret str(s); endifdef ifndef SymbolAsString if (s instanceof Symbol) ret (Symbol) s; if (s instanceof S) ret symbol((S) s); ret symbol(str(s)); endifndef } static Symbol symbol(O o) { ret symbol((CharSequence) o); }
Began life as a copy of #1012686
download show line numbers debug dex old transpilations
Travelled to 13 computer(s): aoiabmzegqzx, bhatertpkbcr, cbybwowwnfue, cfunsshuasjs, gwrvuhgaqvyk, ishqpsrjomds, lpdgvwnxivlt, mqqgnosmbjvj, pyentgdyhuwx, pzhvpgtvlbxg, tslmcundralx, tvejysmllsmz, vouqrxazstgt
No comments. add comment
| Snippet ID: | #1012712 | 
| Snippet name: | symbol - make Symbol from String or CharSequence - case-insensitive version with MasterSymbol and testers [buggy] | 
| Eternal ID of this version: | #1012712/1 | 
| Text MD5: | 1962d0000fa8112069133ab81e4fec99 | 
| Author: | stefan | 
| Category: | javax | 
| Type: | JavaX fragment (include) | 
| Public (visible to everyone): | Yes | 
| Archived (hidden from active list): | No | 
| Created/modified: | 2017-12-10 20:42:05 | 
| Source code size: | 2734 bytes / 87 lines | 
| Pitched / IR pitched: | No / No | 
| Views / Downloads: | 686 / 743 | 
| Referenced in: | [show references] |