src/Pure/General/compress.scala
author wenzelm
Mon, 17 Jul 2023 12:22:39 +0200
changeset 78378 2f16f23baefd
parent 76362 1928405a409b
permissions -rw-r--r--
tuned source structure;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
76351
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
     1
/*  Title:      Pure/General/compress.scala
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
     2
    Author:     Makarius
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
     3
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
     4
Support for generic data compression.
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
     5
*/
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
     6
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
     7
package isabelle
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
     8
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
     9
76353
3698d0f3da18 clarified signature;
wenzelm
parents: 76352
diff changeset
    10
import org.tukaani.xz
3698d0f3da18 clarified signature;
wenzelm
parents: 76352
diff changeset
    11
import com.github.luben.zstd
76351
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    12
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    13
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    14
object Compress {
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    15
  /* options */
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    16
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    17
  object Options {
76362
1928405a409b prefer Zstd compression, notably for database exports;
wenzelm
parents: 76353
diff changeset
    18
    def apply(): Options = Options_Zstd()
76351
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    19
  }
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    20
  sealed abstract class Options
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    21
  case class Options_XZ(level: Int = 3) extends Options {
76353
3698d0f3da18 clarified signature;
wenzelm
parents: 76352
diff changeset
    22
    def make: xz.LZMA2Options = {
3698d0f3da18 clarified signature;
wenzelm
parents: 76352
diff changeset
    23
      val opts = new xz.LZMA2Options
76351
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    24
      opts.setPreset(level)
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    25
      opts
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    26
    }
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    27
  }
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    28
  case class Options_Zstd(level: Int = 3) extends Options
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    29
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    30
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    31
  /* cache */
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    32
76353
3698d0f3da18 clarified signature;
wenzelm
parents: 76352
diff changeset
    33
  class Cache private(val for_xz: xz.ArrayCache, val for_zstd: zstd.BufferPool)
76351
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    34
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    35
  object Cache {
76353
3698d0f3da18 clarified signature;
wenzelm
parents: 76352
diff changeset
    36
    def none: Cache = {
3698d0f3da18 clarified signature;
wenzelm
parents: 76352
diff changeset
    37
      Zstd.init()
3698d0f3da18 clarified signature;
wenzelm
parents: 76352
diff changeset
    38
      new Cache(xz.ArrayCache.getDummyCache(), zstd.NoPool.INSTANCE)
3698d0f3da18 clarified signature;
wenzelm
parents: 76352
diff changeset
    39
  }
76352
f2b98eb6a7a9 prefer new instance, following "make" signature terminology;
wenzelm
parents: 76351
diff changeset
    40
    def make(): Cache = {
f2b98eb6a7a9 prefer new instance, following "make" signature terminology;
wenzelm
parents: 76351
diff changeset
    41
      Zstd.init()
76353
3698d0f3da18 clarified signature;
wenzelm
parents: 76352
diff changeset
    42
      val pool = Untyped.constructor(classOf[zstd.RecyclingBufferPool]).newInstance()
3698d0f3da18 clarified signature;
wenzelm
parents: 76352
diff changeset
    43
      new Cache(new xz.BasicArrayCache, pool)
76352
f2b98eb6a7a9 prefer new instance, following "make" signature terminology;
wenzelm
parents: 76351
diff changeset
    44
    }
76351
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    45
  }
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    46
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    47
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    48
  /* Scala functions in ML */
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    49
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    50
  object XZ_Compress extends Scala.Fun_Bytes("XZ.compress") {
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    51
    val here = Scala_Project.here
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    52
    def apply(arg: Bytes): Bytes = arg.compress(Options_XZ())
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    53
  }
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    54
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    55
  object XZ_Uncompress extends Scala.Fun_Bytes("XZ.uncompress") {
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    56
    val here = Scala_Project.here
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    57
    def apply(arg: Bytes): Bytes = arg.uncompress_xz()
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    58
  }
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    59
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    60
  object Zstd_Compress extends Scala.Fun_Bytes("Zstd.compress") {
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    61
    val here = Scala_Project.here
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    62
    def apply(arg: Bytes): Bytes = arg.compress(Options_Zstd())
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    63
  }
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    64
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    65
  object Zstd_Uncompress extends Scala.Fun_Bytes("Zstd.uncompress") {
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    66
    val here = Scala_Project.here
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    67
    def apply(arg: Bytes): Bytes = arg.uncompress_zstd()
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    68
  }
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    69
}