All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.twitter.util.LruMap.scala Maven / Gradle / Ivy

The newest version!
package com.twitter.util

import java.{util => ju}

import scala.collection.JavaConverters._
import scala.collection.mutable.{Map, MapLike, SynchronizedMap}

import org.apache.commons.collections.map.LRUMap

/**
 * A wrapper trait for java.util.Map implementations to make them behave as scala Maps.
 * This is useful if you want to have more specifically-typed wrapped objects instead
 * of the generic maps returned by JavaConverters
 */
trait JMapWrapperLike[A, B, +Repr <: MapLike[A, B, Repr] with Map[A, B]] extends Map[A, B] with MapLike[A, B, Repr] {
  def underlying: ju.Map[A, B]

  override def size = underlying.size

  override def get(k: A) = underlying.asScala.get(k)

  override def +=(kv: (A, B)): this.type = { underlying.put(kv._1, kv._2); this }
  override def -=(key: A): this.type = { underlying remove key; this }

  override def put(k: A, v: B): Option[B] = underlying.asScala.put(k, v)

  override def update(k: A, v: B) { underlying.put(k, v) }

  override def remove(k: A): Option[B] = underlying.asScala.remove(k)

  override def clear() = underlying.clear()

  override def empty: Repr = null.asInstanceOf[Repr]

  override def iterator = underlying.asScala.iterator
}

@deprecated("use scala.collection.JavaConverters instead", "2014/12/2")
case class JMapWrapper[A, B](underlying : ju.Map[A, B]) extends JMapWrapperLike[A, B, JMapWrapper[A, B]] {
  override def empty = JMapWrapper(new ju.HashMap[A, B])
}

object LruMap {
  def makeUnderlying[K, V](maxSize: Int) = new LRUMap(maxSize).asInstanceOf[ju.Map[K, V]]
}

/**
 * A scala `Map` backed by an [[org.apache.commons.collections.map.LRUMap]]
 */
class LruMap[K, V](val maxSize: Int, val underlying: ju.Map[K, V])
  extends JMapWrapperLike[K, V, LruMap[K, V]]
{
  override def empty: LruMap[K, V] = new LruMap[K, V](maxSize)
  def this(maxSize: Int) = this(maxSize, LruMap.makeUnderlying(maxSize))
}

/**
 * A synchronized scala `Map` backed by an [[org.apache.commons.collections.map.LRUMap]]
 */
class SynchronizedLruMap[K, V](maxSize: Int, underlying: ju.Map[K, V])
  extends LruMap[K, V](maxSize, ju.Collections.synchronizedMap(underlying))
  with SynchronizedMap[K, V]
{
  override def empty: SynchronizedLruMap[K, V] = new SynchronizedLruMap[K, V](maxSize)
  def this(maxSize: Int) = this(maxSize, LruMap.makeUnderlying(maxSize))
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy