9 |
9 |
10 import java.util.{Collections, WeakHashMap, Map => JMap} |
10 import java.util.{Collections, WeakHashMap, Map => JMap} |
11 import java.lang.ref.WeakReference |
11 import java.lang.ref.WeakReference |
12 |
12 |
13 |
13 |
14 object Cache |
14 object Cache { |
15 { |
|
16 val default_max_string = 100 |
15 val default_max_string = 100 |
17 val default_initial_size = 131071 |
16 val default_initial_size = 131071 |
18 |
17 |
19 def make( |
18 def make( |
20 max_string: Int = default_max_string, |
19 max_string: Int = default_max_string, |
22 new Cache(max_string, initial_size) |
21 new Cache(max_string, initial_size) |
23 |
22 |
24 val none: Cache = make(max_string = 0) |
23 val none: Cache = make(max_string = 0) |
25 } |
24 } |
26 |
25 |
27 class Cache(max_string: Int, initial_size: Int) |
26 class Cache(max_string: Int, initial_size: Int) { |
28 { |
|
29 val no_cache: Boolean = max_string == 0 |
27 val no_cache: Boolean = max_string == 0 |
30 |
28 |
31 private val table: JMap[Any, WeakReference[Any]] = |
29 private val table: JMap[Any, WeakReference[Any]] = |
32 if (max_string == 0) null |
30 if (max_string == 0) null |
33 else Collections.synchronizedMap(new WeakHashMap[Any, WeakReference[Any]](initial_size)) |
31 else Collections.synchronizedMap(new WeakHashMap[Any, WeakReference[Any]](initial_size)) |
34 |
32 |
35 override def toString: String = |
33 override def toString: String = |
36 if (no_cache) "Cache.none" else "Cache(size = " + table.size + ")" |
34 if (no_cache) "Cache.none" else "Cache(size = " + table.size + ")" |
37 |
35 |
38 protected def lookup[A](x: A): Option[A] = |
36 protected def lookup[A](x: A): Option[A] = { |
39 { |
|
40 if (table == null) None |
37 if (table == null) None |
41 else { |
38 else { |
42 val ref = table.get(x) |
39 val ref = table.get(x) |
43 if (ref == null) None |
40 if (ref == null) None |
44 else Option(ref.asInstanceOf[WeakReference[A]].get) |
41 else Option(ref.asInstanceOf[WeakReference[A]].get) |
45 } |
42 } |
46 } |
43 } |
47 |
44 |
48 protected def store[A](x: A): A = |
45 protected def store[A](x: A): A = { |
49 { |
|
50 if (table == null || x == null) x |
46 if (table == null || x == null) x |
51 else { |
47 else { |
52 table.put(x, new WeakReference[Any](x)) |
48 table.put(x, new WeakReference[Any](x)) |
53 x |
49 x |
54 } |
50 } |
55 } |
51 } |
56 |
52 |
57 protected def cache_string(x: String): String = |
53 protected def cache_string(x: String): String = { |
58 { |
|
59 if (x == null) null |
54 if (x == null) null |
60 else if (x == "") "" |
55 else if (x == "") "" |
61 else if (x == "true") "true" |
56 else if (x == "true") "true" |
62 else if (x == "false") "false" |
57 else if (x == "false") "false" |
63 else if (x == "0.0") "0.0" |
58 else if (x == "0.0") "0.0" |