| author | wenzelm |
| Mon, 13 Feb 2023 10:49:33 +0100 | |
| changeset 77287 | d060545f01a2 |
| parent 77122 | 25a497bb7b0b |
| child 77687 | 07e2cafcc97e |
| 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:
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) |
|
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:
77109
diff
changeset
|
18 |
|
|
6608de52a3b5
support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
wenzelm
parents:
77109
diff
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:
77109
diff
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:
77109
diff
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:
77109
diff
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:
77109
diff
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:
77109
diff
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:
77109
diff
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 {
|
| 77120 | 31 |
def is_proper: Boolean = bytes > 0 |
32 |
def is_relevant: Boolean = MiB >= 1.0 |
|
33 |
||
| 77116 | 34 |
def B: Double = bytes.toDouble |
35 |
def KiB: Double = B / 1024 |
|
|
77114
6608de52a3b5
support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
wenzelm
parents:
77109
diff
changeset
|
36 |
def MiB: Double = KiB / 1024 |
|
6608de52a3b5
support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
wenzelm
parents:
77109
diff
changeset
|
37 |
def GiB: Double = MiB / 1024 |
|
6608de52a3b5
support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
wenzelm
parents:
77109
diff
changeset
|
38 |
def TiB: Double = GiB / 1024 |
|
6608de52a3b5
support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
wenzelm
parents:
77109
diff
changeset
|
39 |
def PiB: Double = TiB / 1024 |
|
6608de52a3b5
support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
wenzelm
parents:
77109
diff
changeset
|
40 |
def EiB: Double = PiB / 1024 |
|
6608de52a3b5
support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
wenzelm
parents:
77109
diff
changeset
|
41 |
|
| 77122 | 42 |
override def toString: String = Value.Long(bytes) |
|
77114
6608de52a3b5
support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
wenzelm
parents:
77109
diff
changeset
|
43 |
|
|
6608de52a3b5
support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
wenzelm
parents:
77109
diff
changeset
|
44 |
def print: String = {
|
|
6608de52a3b5
support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
wenzelm
parents:
77109
diff
changeset
|
45 |
@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
|
46 |
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
|
47 |
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
|
48 |
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
|
49 |
} |
|
6608de52a3b5
support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
wenzelm
parents:
77109
diff
changeset
|
50 |
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
|
51 |
|
|
6608de52a3b5
support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
wenzelm
parents:
77109
diff
changeset
|
52 |
print_unit(bytes.toDouble, Space.units) |
|
6608de52a3b5
support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
wenzelm
parents:
77109
diff
changeset
|
53 |
} |
| 77120 | 54 |
|
55 |
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
|
56 |
} |