// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef SRC_LIB_CHUNKED_COMPRESSION_COMPRESSION_PARAMS_H_
#define SRC_LIB_CHUNKED_COMPRESSION_COMPRESSION_PARAMS_H_

#include <zircon/types.h>

namespace chunked_compression {

// CompressionParams describes the configuration for compression.
struct CompressionParams {
 public:
  CompressionParams() = default;
  ~CompressionParams() = default;

  // Validates the configured parameters.
  bool IsValid();

  // Returns the minimum size that a buffer must be to hold the result of compressing |len| bytes,
  // given the configured parameters.
  size_t ComputeOutputSizeLimit(size_t len);

  // How aggressively to compress.
  // MinCompressionLevel() <= compression_level <= MaxCompressionLevel()
  int compression_level = DefaultCompressionLevel();

  // Size of chunks. Will be rounded up to a multiple of 4096 bytes.
  // MinChunkSize() <= chunk_size <= MaxChunkSize()
  size_t chunk_size = MinChunkSize();

  // Whether to include a per-frame checksum.
  // Each frame is independently validated with its checksum when decompressed.
  bool frame_checksum = false;

  static int DefaultCompressionLevel();
  static int MinCompressionLevel();
  static int MaxCompressionLevel();

  // Estimates a good chunk size for the given input size.
  // |len| is the data input size.
  // |target_size| is the frame size to target. A frame size greater than or equal to this
  // will be returned (greater when the data is too large to support the target size.)
  static size_t ChunkSizeForInputSize(size_t len, size_t target_size);
  static size_t MinChunkSize();
};

}  // namespace chunked_compression

#endif  // SRC_LIB_CHUNKED_COMPRESSION_COMPRESSION_PARAMS_H_
