src/Pure/General/cache.scala
changeset 75393 87ebf5a50283
parent 73031 f93f0597f4fb
equal deleted inserted replaced
75388:b3ca4a6ed74b 75393:87ebf5a50283
     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"