| author | wenzelm | 
| Sun, 22 Oct 2023 12:18:23 +0200 | |
| changeset 78813 | 1829ba610c36 | 
| parent 77708 | f137bf5d3d94 | 
| permissions | -rw-r--r-- | 
| 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: 
77109diff
changeset | 10 | import java.util.Locale | 
| 
6608de52a3b5
support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
 wenzelm parents: 
77109diff
changeset | 11 | |
| 
6608de52a3b5
support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
 wenzelm parents: 
77109diff
changeset | 12 | import scala.annotation.tailrec | 
| 
6608de52a3b5
support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
 wenzelm parents: 
77109diff
changeset | 13 | |
| 
6608de52a3b5
support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
 wenzelm parents: 
77109diff
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) | 
| 
e3a2b3536030
prefer typed bytes count, but retain toString of original Long for robustness of Java/Scala string composition;
 wenzelm parents: diff
changeset | 17 | val zero: Space = bytes(0L) | 
| 77114 
6608de52a3b5
support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
 wenzelm parents: 
77109diff
changeset | 18 | |
| 
6608de52a3b5
support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
 wenzelm parents: 
77109diff
changeset | 19 |   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: 
77109diff
changeset | 20 | |
| 77116 | 21 | def B(x: Double): Space = bytes(x.round) | 
| 22 | def KiB(x: Double): Space = B(x * 1024) | |
| 77114 
6608de52a3b5
support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
 wenzelm parents: 
77109diff
changeset | 23 | def MiB(x: Double): Space = KiB(x * 1024) | 
| 
6608de52a3b5
support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
 wenzelm parents: 
77109diff
changeset | 24 | def GiB(x: Double): Space = MiB(x * 1024) | 
| 
6608de52a3b5
support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
 wenzelm parents: 
77109diff
changeset | 25 | def TiB(x: Double): Space = GiB(x * 1024) | 
| 
6608de52a3b5
support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
 wenzelm parents: 
77109diff
changeset | 26 | def PiB(x: Double): Space = TiB(x * 1024) | 
| 
6608de52a3b5
support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
 wenzelm parents: 
77109diff
changeset | 27 | 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 | 28 | } | 
| 
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 | final class Space private(val bytes: Long) extends AnyVal {
 | 
| 77687 | 31 | def + (other: Space): Space = new Space(bytes + other.bytes) | 
| 32 | def - (other: Space): Space = new Space(bytes - other.bytes) | |
| 33 | def * (scalar: Double): Space = new Space((bytes * scalar).round) | |
| 77694 | 34 | def / (other: Space): Double = B / other.B | 
| 77687 | 35 | |
| 77120 | 36 | def is_proper: Boolean = bytes > 0 | 
| 37 | def is_relevant: Boolean = MiB >= 1.0 | |
| 38 | ||
| 77708 | 39 | def used(free: Space): Space = new Space((bytes - free.bytes) max 0) | 
| 40 | def used_fraction(free: Space): Double = | |
| 41 | if (is_proper && used(free).is_proper) used(free).B / B else 0.0 | |
| 42 | ||
| 77116 | 43 | def B: Double = bytes.toDouble | 
| 44 | def KiB: Double = B / 1024 | |
| 77114 
6608de52a3b5
support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
 wenzelm parents: 
77109diff
changeset | 45 | def MiB: Double = KiB / 1024 | 
| 
6608de52a3b5
support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
 wenzelm parents: 
77109diff
changeset | 46 | def GiB: Double = MiB / 1024 | 
| 
6608de52a3b5
support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
 wenzelm parents: 
77109diff
changeset | 47 | def TiB: Double = GiB / 1024 | 
| 
6608de52a3b5
support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
 wenzelm parents: 
77109diff
changeset | 48 | def PiB: Double = TiB / 1024 | 
| 
6608de52a3b5
support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
 wenzelm parents: 
77109diff
changeset | 49 | def EiB: Double = PiB / 1024 | 
| 
6608de52a3b5
support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
 wenzelm parents: 
77109diff
changeset | 50 | |
| 77122 | 51 | override def toString: String = Value.Long(bytes) | 
| 77114 
6608de52a3b5
support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
 wenzelm parents: 
77109diff
changeset | 52 | |
| 
6608de52a3b5
support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
 wenzelm parents: 
77109diff
changeset | 53 |   def print: String = {
 | 
| 
6608de52a3b5
support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
 wenzelm parents: 
77109diff
changeset | 54 | @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: 
77109diff
changeset | 55 |       if (x.abs < 1024 || units.tail.isEmpty) {
 | 
| 
6608de52a3b5
support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
 wenzelm parents: 
77109diff
changeset | 56 | 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: 
77109diff
changeset | 57 |         Library.perhaps_unsuffix(".0", s) + " " + units.head
 | 
| 
6608de52a3b5
support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
 wenzelm parents: 
77109diff
changeset | 58 | } | 
| 
6608de52a3b5
support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
 wenzelm parents: 
77109diff
changeset | 59 | else print_unit(x / 1024, units.tail) | 
| 
6608de52a3b5
support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
 wenzelm parents: 
77109diff
changeset | 60 | |
| 
6608de52a3b5
support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
 wenzelm parents: 
77109diff
changeset | 61 | print_unit(bytes.toDouble, Space.units) | 
| 
6608de52a3b5
support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
 wenzelm parents: 
77109diff
changeset | 62 | } | 
| 77120 | 63 | |
| 64 | def print_relevant: Option[String] = if (is_relevant) Some(print) else None | |
| 77109 
e3a2b3536030
prefer typed bytes count, but retain toString of original Long for robustness of Java/Scala string composition;
 wenzelm parents: diff
changeset | 65 | } |