| author | wenzelm | 
| Fri, 27 Jan 2023 17:33:49 +0100 | |
| changeset 77114 | 6608de52a3b5 | 
| parent 77109 | e3a2b3536030 | 
| child 77116 | 00d1db8e496e | 
| 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)  | 
| 
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  | 
}  |