| author | wenzelm | 
| Mon, 14 Oct 2024 11:13:26 +0200 | |
| changeset 81162 | 9067932c2182 | 
| 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: 
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 {
 | 
| 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: 
77109 
diff
changeset
 | 
45  | 
def MiB: Double = KiB / 1024  | 
| 
 
6608de52a3b5
support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
 
wenzelm 
parents: 
77109 
diff
changeset
 | 
46  | 
def GiB: Double = MiB / 1024  | 
| 
 
6608de52a3b5
support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
 
wenzelm 
parents: 
77109 
diff
changeset
 | 
47  | 
def TiB: Double = GiB / 1024  | 
| 
 
6608de52a3b5
support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
 
wenzelm 
parents: 
77109 
diff
changeset
 | 
48  | 
def PiB: Double = TiB / 1024  | 
| 
 
6608de52a3b5
support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
 
wenzelm 
parents: 
77109 
diff
changeset
 | 
49  | 
def EiB: Double = PiB / 1024  | 
| 
 
6608de52a3b5
support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
 
wenzelm 
parents: 
77109 
diff
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: 
77109 
diff
changeset
 | 
52  | 
|
| 
 
6608de52a3b5
support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
 
wenzelm 
parents: 
77109 
diff
changeset
 | 
53  | 
  def print: String = {
 | 
| 
 
6608de52a3b5
support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
 
wenzelm 
parents: 
77109 
diff
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: 
77109 
diff
changeset
 | 
55  | 
      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
 | 
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: 
77109 
diff
changeset
 | 
57  | 
        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
 | 
58  | 
}  | 
| 
 
6608de52a3b5
support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
 
wenzelm 
parents: 
77109 
diff
changeset
 | 
59  | 
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
 | 
60  | 
|
| 
 
6608de52a3b5
support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
 
wenzelm 
parents: 
77109 
diff
changeset
 | 
61  | 
print_unit(bytes.toDouble, Space.units)  | 
| 
 
6608de52a3b5
support units, e.g. java.lang.Long.MAX_VALUE is 8 EiB;
 
wenzelm 
parents: 
77109 
diff
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  | 
}  |