src/Pure/General/compress.scala
author wenzelm
Fri, 21 Oct 2022 16:39:31 +0200
changeset 76351 2cee31cd92f0
child 76352 f2b98eb6a7a9
permissions -rw-r--r--
generic support for XZ and Zstd compression in Isabelle/Scala; support for Zstd compression in Isabelle/ML;
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
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    10
import org.tukaani.xz.{LZMA2Options, ArrayCache, BasicArrayCache}
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    11
import com.github.luben.zstd.{BufferPool, NoPool, RecyclingBufferPool,
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    12
  ZstdInputStream, ZstdOutputStream}
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
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    15
object Compress {
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    16
  /* options */
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    17
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    18
  object Options {
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    19
    def apply(): Options = Options_XZ()
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    20
  }
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    21
  sealed abstract class Options
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    22
  case class Options_XZ(level: Int = 3) extends Options {
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    23
    def make: LZMA2Options = {
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    24
      val opts = new LZMA2Options
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    25
      opts.setPreset(level)
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    26
      opts
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
  }
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    29
  case class Options_Zstd(level: Int = 3) extends Options
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
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    32
  /* cache */
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    33
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    34
  class Cache private(val xz: ArrayCache, val zstd: BufferPool)
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    35
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    36
  object Cache {
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    37
    def none: Cache = { Zstd.init(); new Cache(ArrayCache.getDummyCache(), NoPool.INSTANCE) }
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    38
    def make(): Cache = { Zstd.init(); new Cache(new BasicArrayCache, RecyclingBufferPool.INSTANCE) } // FIXME new pool
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    39
  }
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    40
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    41
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    42
  /* Scala functions in ML */
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    43
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    44
  object XZ_Compress extends Scala.Fun_Bytes("XZ.compress") {
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    45
    val here = Scala_Project.here
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    46
    def apply(arg: Bytes): Bytes = arg.compress(Options_XZ())
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
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    49
  object XZ_Uncompress extends Scala.Fun_Bytes("XZ.uncompress") {
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    50
    val here = Scala_Project.here
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    51
    def apply(arg: Bytes): Bytes = arg.uncompress_xz()
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    52
  }
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
  object Zstd_Compress extends Scala.Fun_Bytes("Zstd.compress") {
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    55
    val here = Scala_Project.here
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    56
    def apply(arg: Bytes): Bytes = arg.compress(Options_Zstd())
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    57
  }
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
  object Zstd_Uncompress extends Scala.Fun_Bytes("Zstd.uncompress") {
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    60
    val here = Scala_Project.here
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    61
    def apply(arg: Bytes): Bytes = arg.uncompress_zstd()
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    62
  }
2cee31cd92f0 generic support for XZ and Zstd compression in Isabelle/Scala;
wenzelm
parents:
diff changeset
    63
}