src/Pure/General/space.scala
author wenzelm
Fri, 27 Jan 2023 17:33:49 +0100
changeset 77114 6608de52a3b5
parent 77109 e3a2b3536030
child 77116 00d1db8e496e
permissions -rw-r--r--
support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
77109
e3a2b3536030 prefer typed bytes count, but retain toString of original Long for robustness of Java/Scala string composition;
wenzelm
parents:
diff changeset
     1
/*  Title:      Pure/General/space.scala
e3a2b3536030 prefer typed bytes count, but retain toString of original Long for robustness of Java/Scala string composition;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
e3a2b3536030 prefer typed bytes count, but retain toString of original Long for robustness of Java/Scala string composition;
wenzelm
parents:
diff changeset
     3
e3a2b3536030 prefer typed bytes count, but retain toString of original Long for robustness of Java/Scala string composition;
wenzelm
parents:
diff changeset
     4
Storage space based on bytes.
e3a2b3536030 prefer typed bytes count, but retain toString of original Long for robustness of Java/Scala string composition;
wenzelm
parents:
diff changeset
     5
*/
e3a2b3536030 prefer typed bytes count, but retain toString of original Long for robustness of Java/Scala string composition;
wenzelm
parents:
diff changeset
     6
e3a2b3536030 prefer typed bytes count, but retain toString of original Long for robustness of Java/Scala string composition;
wenzelm
parents:
diff changeset
     7
package isabelle
e3a2b3536030 prefer typed bytes count, but retain toString of original Long for robustness of Java/Scala string composition;
wenzelm
parents:
diff changeset
     8
e3a2b3536030 prefer typed bytes count, but retain toString of original Long for robustness of Java/Scala string composition;
wenzelm
parents:
diff changeset
     9
77114
6608de52a3b5 support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
wenzelm
parents: 77109
diff changeset
    10
import java.util.Locale
6608de52a3b5 support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
wenzelm
parents: 77109
diff changeset
    11
6608de52a3b5 support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
wenzelm
parents: 77109
diff changeset
    12
import scala.annotation.tailrec
6608de52a3b5 support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
wenzelm
parents: 77109
diff changeset
    13
6608de52a3b5 support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
wenzelm
parents: 77109
diff changeset
    14
77109
e3a2b3536030 prefer typed bytes count, but retain toString of original Long for robustness of Java/Scala string composition;
wenzelm
parents:
diff changeset
    15
object Space {
e3a2b3536030 prefer typed bytes count, but retain toString of original Long for robustness of Java/Scala string composition;
wenzelm
parents:
diff changeset
    16
  def bytes(bs: Long): Space = new Space(bs)
77114
6608de52a3b5 support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
wenzelm
parents: 77109
diff changeset
    17
  def bytes(bs: Double): Space = bytes(bs.round)
6608de52a3b5 support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
wenzelm
parents: 77109
diff changeset
    18
77109
e3a2b3536030 prefer typed bytes count, but retain toString of original Long for robustness of Java/Scala string composition;
wenzelm
parents:
diff changeset
    19
  val zero: Space = bytes(0L)
77114
6608de52a3b5 support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
wenzelm
parents: 77109
diff changeset
    20
6608de52a3b5 support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
wenzelm
parents: 77109
diff changeset
    21
  private val units: List[String] = List("B", "KiB", "MiB", "GiB", "TiB", "PiB", "EiB")
6608de52a3b5 support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
wenzelm
parents: 77109
diff changeset
    22
6608de52a3b5 support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
wenzelm
parents: 77109
diff changeset
    23
  def KiB(x: Double): Space = bytes((x * 1024).round)
6608de52a3b5 support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
wenzelm
parents: 77109
diff changeset
    24
  def MiB(x: Double): Space = KiB(x * 1024)
6608de52a3b5 support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
wenzelm
parents: 77109
diff changeset
    25
  def GiB(x: Double): Space = MiB(x * 1024)
6608de52a3b5 support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
wenzelm
parents: 77109
diff changeset
    26
  def TiB(x: Double): Space = GiB(x * 1024)
6608de52a3b5 support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
wenzelm
parents: 77109
diff changeset
    27
  def PiB(x: Double): Space = TiB(x * 1024)
6608de52a3b5 support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
wenzelm
parents: 77109
diff changeset
    28
  def EiB(x: Double): Space = PiB(x * 1024)
77109
e3a2b3536030 prefer typed bytes count, but retain toString of original Long for robustness of Java/Scala string composition;
wenzelm
parents:
diff changeset
    29
}
e3a2b3536030 prefer typed bytes count, but retain toString of original Long for robustness of Java/Scala string composition;
wenzelm
parents:
diff changeset
    30
e3a2b3536030 prefer typed bytes count, but retain toString of original Long for robustness of Java/Scala string composition;
wenzelm
parents:
diff changeset
    31
final class Space private(val bytes: Long) extends AnyVal {
77114
6608de52a3b5 support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
wenzelm
parents: 77109
diff changeset
    32
  def KiB: Double = bytes.toDouble / 1024
6608de52a3b5 support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
wenzelm
parents: 77109
diff changeset
    33
  def MiB: Double = KiB / 1024
6608de52a3b5 support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
wenzelm
parents: 77109
diff changeset
    34
  def GiB: Double = MiB / 1024
6608de52a3b5 support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
wenzelm
parents: 77109
diff changeset
    35
  def TiB: Double = GiB / 1024
6608de52a3b5 support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
wenzelm
parents: 77109
diff changeset
    36
  def PiB: Double = TiB / 1024
6608de52a3b5 support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
wenzelm
parents: 77109
diff changeset
    37
  def EiB: Double = PiB / 1024
6608de52a3b5 support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
wenzelm
parents: 77109
diff changeset
    38
77109
e3a2b3536030 prefer typed bytes count, but retain toString of original Long for robustness of Java/Scala string composition;
wenzelm
parents:
diff changeset
    39
  override def toString: String = bytes.toString
77114
6608de52a3b5 support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
wenzelm
parents: 77109
diff changeset
    40
6608de52a3b5 support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
wenzelm
parents: 77109
diff changeset
    41
  def print: String = {
6608de52a3b5 support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
wenzelm
parents: 77109
diff changeset
    42
    @tailrec def print_unit(x: Double, units: List[String]): String =
6608de52a3b5 support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
wenzelm
parents: 77109
diff changeset
    43
      if (x.abs < 1024 || units.tail.isEmpty) {
6608de52a3b5 support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
wenzelm
parents: 77109
diff changeset
    44
        val s = String.format(Locale.ROOT, "%.1f", x.asInstanceOf[AnyRef])
6608de52a3b5 support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
wenzelm
parents: 77109
diff changeset
    45
        Library.perhaps_unsuffix(".0", s) + " " + units.head
6608de52a3b5 support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
wenzelm
parents: 77109
diff changeset
    46
      }
6608de52a3b5 support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
wenzelm
parents: 77109
diff changeset
    47
      else print_unit(x / 1024, units.tail)
6608de52a3b5 support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
wenzelm
parents: 77109
diff changeset
    48
6608de52a3b5 support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
wenzelm
parents: 77109
diff changeset
    49
    print_unit(bytes.toDouble, Space.units)
6608de52a3b5 support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
wenzelm
parents: 77109
diff changeset
    50
  }
77109
e3a2b3536030 prefer typed bytes count, but retain toString of original Long for robustness of Java/Scala string composition;
wenzelm
parents:
diff changeset
    51
}