File indexing completed on 2025-08-28 08:27:07
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018 #pragma once
0019
0020 #include <cstdint>
0021 #include <limits>
0022 #include <memory>
0023 #include <optional>
0024 #include <string>
0025
0026 #include "arrow/result.h"
0027 #include "arrow/status.h"
0028 #include "arrow/util/type_fwd.h"
0029 #include "arrow/util/visibility.h"
0030
0031 namespace arrow {
0032 namespace util {
0033
0034 constexpr int kUseDefaultCompressionLevel = std::numeric_limits<int>::min();
0035
0036
0037
0038 class ARROW_EXPORT Compressor {
0039 public:
0040 virtual ~Compressor() = default;
0041
0042 struct CompressResult {
0043 int64_t bytes_read;
0044 int64_t bytes_written;
0045 };
0046 struct FlushResult {
0047 int64_t bytes_written;
0048 bool should_retry;
0049 };
0050 struct EndResult {
0051 int64_t bytes_written;
0052 bool should_retry;
0053 };
0054
0055
0056
0057
0058 virtual Result<CompressResult> Compress(int64_t input_len, const uint8_t* input,
0059 int64_t output_len, uint8_t* output) = 0;
0060
0061
0062
0063
0064
0065 virtual Result<FlushResult> Flush(int64_t output_len, uint8_t* output) = 0;
0066
0067
0068
0069
0070
0071
0072
0073 virtual Result<EndResult> End(int64_t output_len, uint8_t* output) = 0;
0074
0075
0076 };
0077
0078
0079
0080 class ARROW_EXPORT Decompressor {
0081 public:
0082 virtual ~Decompressor() = default;
0083
0084 struct DecompressResult {
0085
0086 int64_t bytes_read;
0087 int64_t bytes_written;
0088 bool need_more_output;
0089 };
0090
0091
0092
0093
0094
0095 virtual Result<DecompressResult> Decompress(int64_t input_len, const uint8_t* input,
0096 int64_t output_len, uint8_t* output) = 0;
0097
0098
0099
0100
0101
0102
0103 virtual bool IsFinished() = 0;
0104
0105
0106 virtual Status Reset() = 0;
0107
0108
0109 };
0110
0111
0112 class ARROW_EXPORT CodecOptions {
0113 public:
0114 explicit CodecOptions(int compression_level = kUseDefaultCompressionLevel)
0115 : compression_level(compression_level) {}
0116
0117 virtual ~CodecOptions() = default;
0118
0119 int compression_level;
0120 };
0121
0122
0123
0124
0125 enum class GZipFormat {
0126 ZLIB,
0127 DEFLATE,
0128 GZIP,
0129 };
0130
0131 class ARROW_EXPORT GZipCodecOptions : public CodecOptions {
0132 public:
0133 GZipFormat gzip_format = GZipFormat::GZIP;
0134 std::optional<int> window_bits;
0135 };
0136
0137
0138
0139
0140 class ARROW_EXPORT BrotliCodecOptions : public CodecOptions {
0141 public:
0142 std::optional<int> window_bits;
0143 };
0144
0145
0146 class ARROW_EXPORT Codec {
0147 public:
0148 virtual ~Codec() = default;
0149
0150
0151
0152 static int UseDefaultCompressionLevel();
0153
0154
0155 static const std::string& GetCodecAsString(Compression::type t);
0156
0157
0158 static Result<Compression::type> GetCompressionType(const std::string& name);
0159
0160
0161 static Result<std::unique_ptr<Codec>> Create(
0162 Compression::type codec, const CodecOptions& codec_options = CodecOptions{});
0163
0164
0165 static Result<std::unique_ptr<Codec>> Create(Compression::type codec,
0166 int compression_level);
0167
0168
0169 static bool IsAvailable(Compression::type codec);
0170
0171
0172 static bool SupportsCompressionLevel(Compression::type codec);
0173
0174
0175
0176 static Result<int> MinimumCompressionLevel(Compression::type codec);
0177
0178
0179
0180 static Result<int> MaximumCompressionLevel(Compression::type codec);
0181
0182
0183
0184 static Result<int> DefaultCompressionLevel(Compression::type codec);
0185
0186
0187 virtual int minimum_compression_level() const = 0;
0188
0189
0190 virtual int maximum_compression_level() const = 0;
0191
0192
0193 virtual int default_compression_level() const = 0;
0194
0195
0196
0197
0198
0199
0200
0201
0202
0203 virtual Result<int64_t> Decompress(int64_t input_len, const uint8_t* input,
0204 int64_t output_buffer_len,
0205 uint8_t* output_buffer) = 0;
0206
0207
0208
0209
0210
0211
0212
0213
0214
0215 virtual Result<int64_t> Compress(int64_t input_len, const uint8_t* input,
0216 int64_t output_buffer_len, uint8_t* output_buffer) = 0;
0217
0218 virtual int64_t MaxCompressedLen(int64_t input_len, const uint8_t* input) = 0;
0219
0220
0221 virtual Result<std::shared_ptr<Compressor>> MakeCompressor() = 0;
0222
0223
0224 virtual Result<std::shared_ptr<Decompressor>> MakeDecompressor() = 0;
0225
0226
0227 virtual Compression::type compression_type() const = 0;
0228
0229
0230 const std::string& name() const { return GetCodecAsString(compression_type()); }
0231
0232
0233 virtual int compression_level() const { return UseDefaultCompressionLevel(); }
0234
0235 private:
0236
0237 virtual Status Init();
0238 };
0239
0240 }
0241 }