wip: compressor memory usage

This commit is contained in:
Marcus Holland-Moritz 2025-05-20 18:45:36 +02:00
parent 2ea6c2420b
commit acf2df1a09
8 changed files with 613 additions and 0 deletions

View File

@ -78,6 +78,10 @@ class block_compressor {
return impl_->get_compression_constraints(metadata);
}
size_t estimate_memory_usage(size_t data_size) const {
return impl_->estimate_memory_usage(data_size);
}
explicit operator bool() const { return static_cast<bool>(impl_); }
class impl {
@ -96,6 +100,8 @@ class block_compressor {
virtual compression_constraints
get_compression_constraints(std::string const& metadata) const = 0;
virtual size_t estimate_memory_usage(size_t data_size) const = 0;
};
private:

View File

@ -26,6 +26,7 @@
* SPDX-License-Identifier: MIT
*/
#include <algorithm>
#include <cassert>
#include <brotli/decode.h>
@ -47,6 +48,495 @@ namespace dwarfs {
namespace {
#ifndef BROTLI_BUILD_ENC_EXTRA_API
constexpr size_t kBrotliMemUsageGranularity = 262144;
constexpr std::array<uint16_t, 12 * 21 * 21> brotli_memory_usage{
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1,
2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 2,
3, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 1, 1, 1, 1, 1, 2, 3,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 1, 1, 1, 1, 1, 2, 3, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 1, 1, 1, 1, 1, 2, 3, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 1, 1, 1, 1, 1, 2, 3, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
1, 1, 1, 1, 1, 2, 3, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1,
1, 1, 1, 1, 2, 3, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 1, 1,
1, 1, 1, 2, 3, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 1, 1, 1,
1, 1, 2, 3, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 1, 1, 1, 1,
1, 2, 3, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 1, 1, 1, 1, 1,
2, 3, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 1, 1, 1, 1, 1, 2,
3, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 1, 1, 1, 1, 1, 2, 3,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 1, 1, 1, 1, 1, 2, 3, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 2, 2, 2, 2, 2, 3, 3, 3, 3,
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
3, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3,
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3,
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2,
2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3,
3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2,
2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2,
2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3,
3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2,
3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,
4, 4, 4, 4, 4, 4, 2, 2, 2, 2, 3,
3, 4, 5, 6, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 2, 2, 2, 2, 4, 4,
5, 6, 7, 9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 2, 2, 2, 2, 6, 6, 7,
8, 9, 11, 15, 15, 15, 15, 15, 15, 15, 15,
15, 15, 15, 2, 2, 2, 2, 10, 10, 11, 12,
13, 15, 19, 27, 27, 27, 27, 27, 27, 27, 27,
27, 27, 2, 2, 2, 2, 18, 18, 19, 20, 21,
23, 27, 35, 51, 51, 51, 51, 51, 51, 51, 51,
51, 2, 2, 2, 2, 34, 34, 35, 36, 37, 39,
43, 51, 67, 99, 99, 99, 99, 99, 99, 99, 99,
2, 2, 2, 2, 66, 66, 67, 68, 69, 71, 75,
83, 99, 131, 195, 195, 195, 195, 195, 195, 195, 2,
2, 2, 2, 130, 130, 131, 132, 133, 135, 139, 147,
163, 195, 259, 259, 259, 259, 259, 259, 259, 2, 2,
2, 2, 130, 130, 131, 132, 133, 135, 139, 147, 163,
195, 259, 259, 259, 259, 259, 259, 259, 2, 2, 2,
2, 130, 130, 131, 132, 133, 135, 139, 147, 163, 195,
259, 259, 259, 259, 259, 259, 259, 2, 2, 2, 2,
130, 130, 131, 132, 133, 135, 139, 147, 163, 195, 259,
259, 259, 259, 259, 259, 259, 2, 2, 2, 2, 130,
130, 131, 132, 133, 135, 139, 147, 163, 195, 259, 259,
259, 259, 259, 259, 259, 2, 2, 2, 2, 130, 130,
131, 132, 133, 135, 139, 147, 163, 195, 259, 259, 259,
259, 259, 259, 259, 2, 2, 2, 2, 130, 130, 131,
132, 133, 135, 139, 147, 163, 195, 259, 259, 259, 259,
259, 259, 259, 2, 2, 2, 2, 2, 3, 3, 3,
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
3, 3, 2, 2, 2, 2, 2, 3, 3, 3, 3,
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
3, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3,
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3,
3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2,
2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3,
3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2,
2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,
3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2,
2, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4,
4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 2,
3, 3, 4, 5, 6, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 2, 2, 2, 2, 4,
4, 5, 6, 7, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 2, 2, 2, 2, 6, 6,
7, 8, 9, 11, 15, 15, 15, 15, 15, 15, 15,
15, 15, 15, 15, 2, 2, 2, 2, 10, 10, 11,
12, 13, 15, 19, 27, 27, 27, 27, 27, 27, 27,
27, 27, 27, 2, 2, 2, 2, 18, 18, 19, 20,
21, 23, 27, 35, 51, 51, 51, 51, 51, 51, 51,
51, 51, 2, 2, 2, 2, 34, 34, 35, 36, 37,
39, 43, 51, 67, 99, 99, 99, 99, 99, 99, 99,
99, 2, 2, 2, 2, 66, 66, 67, 68, 69, 71,
75, 83, 99, 131, 195, 195, 195, 195, 195, 195, 195,
2, 2, 2, 2, 130, 130, 131, 132, 133, 135, 139,
147, 163, 195, 259, 259, 259, 259, 259, 259, 259, 258,
258, 258, 258, 514, 514, 515, 516, 517, 519, 523, 531,
547, 579, 643, 643, 643, 643, 643, 643, 643, 258, 258,
258, 258, 770, 770, 771, 772, 773, 775, 779, 787, 803,
835, 899, 899, 899, 899, 899, 899, 899, 258, 258, 258,
258, 1282, 1282, 1283, 1284, 1285, 1287, 1291, 1299, 1315, 1347,
1411, 1411, 1411, 1411, 1411, 1411, 1411, 258, 258, 258, 258,
2306, 2306, 2307, 2308, 2309, 2311, 2315, 2323, 2339, 2371, 2435,
2435, 2435, 2435, 2435, 2435, 2435, 258, 258, 258, 258, 4354,
4354, 4355, 4356, 4357, 4359, 4363, 4371, 4387, 4419, 4483, 4483,
4483, 4483, 4483, 4483, 4483, 258, 258, 258, 258, 8450, 8450,
8451, 8452, 8453, 8455, 8459, 8467, 8483, 8515, 8579, 8579, 8579,
8579, 8579, 8579, 8579, 3, 3, 3, 3, 3, 4, 6,
7, 7, 7, 21, 21, 21, 21, 21, 21, 21, 21,
21, 21, 21, 3, 3, 3, 3, 3, 4, 6, 7,
7, 7, 21, 21, 21, 21, 21, 21, 21, 21, 21,
21, 21, 3, 3, 3, 3, 3, 4, 6, 7, 7,
7, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
21, 3, 3, 3, 3, 3, 4, 6, 7, 7, 7,
21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
3, 3, 3, 3, 3, 4, 6, 7, 7, 7, 21,
21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 3,
3, 3, 3, 3, 4, 6, 7, 7, 7, 21, 21,
21, 21, 21, 21, 21, 21, 21, 21, 21, 3, 3,
3, 3, 3, 4, 6, 7, 7, 7, 21, 21, 21,
21, 21, 21, 21, 21, 21, 21, 21, 3, 3, 3,
3, 3, 4, 6, 8, 10, 10, 24, 24, 24, 24,
24, 24, 24, 24, 24, 24, 24, 3, 3, 3, 3,
3, 4, 7, 9, 11, 16, 30, 30, 30, 30, 30,
30, 30, 30, 30, 30, 30, 3, 3, 3, 3, 3,
4, 9, 11, 13, 18, 42, 42, 42, 42, 42, 42,
42, 42, 42, 42, 42, 3, 3, 3, 3, 3, 4,
13, 15, 17, 22, 46, 64, 64, 64, 64, 64, 64,
64, 64, 64, 64, 3, 3, 3, 3, 3, 4, 21,
23, 25, 30, 54, 72, 104, 104, 104, 104, 104, 104,
104, 104, 104, 3, 3, 3, 3, 3, 4, 37, 39,
41, 46, 70, 88, 120, 184, 184, 184, 184, 184, 184,
184, 184, 3, 3, 3, 3, 3, 4, 69, 71, 73,
78, 102, 120, 152, 216, 344, 344, 344, 344, 344, 344,
344, 3, 3, 3, 3, 3, 4, 133, 135, 137, 142,
166, 184, 216, 280, 408, 408, 408, 408, 408, 408, 408,
3, 3, 3, 3, 3, 4, 261, 263, 265, 270, 550,
568, 600, 664, 792, 792, 792, 792, 792, 792, 792, 3,
3, 3, 3, 3, 4, 517, 519, 521, 526, 806, 824,
856, 920, 1048, 1048, 1048, 1048, 1048, 1048, 1048, 3, 3,
3, 3, 3, 4, 1029, 1031, 1033, 1038, 1318, 1336, 1368,
1432, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 3, 3, 3,
3, 3, 4, 2053, 2055, 2057, 2062, 2342, 2360, 2392, 2456,
2584, 2584, 2584, 2584, 2584, 2584, 2584, 3, 3, 3, 3,
3, 4, 4101, 4103, 4105, 4110, 4390, 4408, 4440, 4504, 4632,
4632, 4632, 4632, 4632, 4632, 4632, 3, 3, 3, 3, 3,
4, 8197, 8199, 8201, 8206, 8486, 8504, 8536, 8600, 8728, 8728,
8728, 8728, 8728, 8728, 8728, 3, 3, 3, 3, 3, 4,
6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 3, 3, 3, 3, 3, 4, 6,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 3, 3, 3, 3, 3, 4, 6, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 3, 3, 3, 3, 3, 4, 6, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 3, 3, 3, 3, 3, 4, 6, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
3, 3, 3, 3, 3, 4, 6, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 3,
3, 3, 3, 3, 4, 6, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 5, 5,
5, 5, 5, 6, 9, 10, 12, 12, 12, 12, 12,
12, 12, 12, 12, 12, 12, 12, 12, 5, 5, 5,
5, 5, 6, 10, 11, 13, 18, 18, 18, 18, 18,
18, 18, 18, 18, 18, 18, 18, 5, 5, 5, 5,
5, 6, 12, 13, 15, 20, 34, 34, 34, 34, 34,
34, 34, 34, 34, 34, 34, 5, 5, 5, 5, 5,
6, 16, 17, 19, 24, 38, 56, 56, 56, 56, 56,
56, 56, 56, 56, 56, 5, 5, 5, 5, 5, 6,
24, 25, 27, 32, 46, 64, 96, 96, 96, 96, 96,
96, 96, 96, 96, 5, 5, 5, 5, 5, 6, 40,
41, 43, 48, 62, 80, 112, 176, 176, 176, 176, 176,
176, 176, 176, 5, 5, 5, 5, 5, 6, 72, 73,
75, 80, 94, 112, 144, 208, 336, 336, 336, 336, 336,
336, 336, 5, 5, 5, 5, 5, 6, 136, 137, 139,
144, 158, 176, 208, 272, 400, 400, 400, 400, 400, 400,
400, 5, 5, 5, 5, 5, 6, 264, 265, 267, 272,
542, 560, 592, 656, 784, 784, 784, 784, 784, 784, 784,
5, 5, 5, 5, 5, 6, 520, 521, 523, 528, 798,
816, 848, 912, 1040, 1040, 1040, 1040, 1040, 1040, 1040, 5,
5, 5, 5, 5, 6, 1032, 1033, 1035, 1040, 1310, 1328,
1360, 1424, 1552, 1552, 1552, 1552, 1552, 1552, 1552, 5, 5,
5, 5, 5, 6, 2056, 2057, 2059, 2064, 2334, 2352, 2384,
2448, 2576, 2576, 2576, 2576, 2576, 2576, 2576, 5, 5, 5,
5, 5, 6, 4104, 4105, 4107, 4112, 4382, 4400, 4432, 4496,
4624, 4624, 4624, 4624, 4624, 4624, 4624, 5, 5, 5, 5,
5, 6, 8200, 8201, 8203, 8208, 8478, 8496, 8528, 8592, 8720,
8720, 8720, 8720, 8720, 8720, 8720, 3, 3, 3, 3, 3,
4, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 3, 3, 3, 3, 3, 4,
6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 3, 3, 3, 3, 3, 4, 6,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 3, 3, 3, 3, 3, 4, 6, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 3, 3, 3, 3, 3, 4, 6, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 3, 3, 3, 3, 3, 4, 6, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
3, 3, 3, 3, 3, 4, 6, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 9,
9, 9, 9, 9, 10, 13, 14, 16, 16, 16, 16,
16, 16, 16, 16, 16, 16, 16, 16, 16, 9, 9,
9, 9, 9, 10, 14, 15, 17, 22, 22, 22, 22,
22, 22, 22, 22, 22, 22, 22, 22, 9, 9, 9,
9, 9, 10, 16, 17, 19, 24, 42, 42, 42, 42,
42, 42, 42, 42, 42, 42, 42, 9, 9, 9, 9,
9, 10, 20, 21, 23, 28, 46, 64, 64, 64, 64,
64, 64, 64, 64, 64, 64, 9, 9, 9, 9, 9,
10, 28, 29, 31, 36, 54, 72, 104, 104, 104, 104,
104, 104, 104, 104, 104, 9, 9, 9, 9, 9, 10,
44, 45, 47, 52, 70, 88, 120, 184, 184, 184, 184,
184, 184, 184, 184, 9, 9, 9, 9, 9, 10, 76,
77, 79, 84, 102, 120, 152, 216, 344, 344, 344, 344,
344, 344, 344, 9, 9, 9, 9, 9, 10, 140, 141,
143, 148, 166, 184, 216, 280, 408, 408, 408, 408, 408,
408, 408, 9, 9, 9, 9, 9, 10, 268, 269, 271,
276, 550, 568, 600, 664, 792, 792, 792, 792, 792, 792,
792, 9, 9, 9, 9, 9, 10, 524, 525, 527, 532,
806, 824, 856, 920, 1048, 1048, 1048, 1048, 1048, 1048, 1048,
9, 9, 9, 9, 9, 10, 1036, 1037, 1039, 1044, 1318,
1336, 1368, 1432, 1560, 1560, 1560, 1560, 1560, 1560, 1560, 9,
9, 9, 9, 9, 10, 2060, 2061, 2063, 2068, 2342, 2360,
2392, 2456, 2584, 2584, 2584, 2584, 2584, 2584, 2584, 9, 9,
9, 9, 9, 10, 4108, 4109, 4111, 4116, 4390, 4408, 4440,
4504, 4632, 4632, 4632, 4632, 4632, 4632, 4632, 9, 9, 9,
9, 9, 10, 8204, 8205, 8207, 8212, 8486, 8504, 8536, 8600,
8728, 8728, 8728, 8728, 8728, 8728, 8728, 3, 3, 3, 3,
3, 4, 6, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 3, 3, 3, 3, 3,
4, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 3, 3, 3, 3, 3, 4,
6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 3, 3, 3, 3, 3, 4, 6,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 3, 3, 3, 3, 3, 4, 6, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 3, 3, 3, 3, 3, 4, 6, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 3, 3, 3, 3, 3, 4, 6, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
33, 33, 33, 33, 33, 34, 37, 38, 40, 40, 40,
40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 33,
33, 33, 33, 33, 34, 38, 39, 41, 46, 46, 46,
46, 46, 46, 46, 46, 46, 46, 46, 46, 33, 33,
33, 33, 33, 34, 40, 41, 43, 48, 58, 58, 58,
58, 58, 58, 58, 58, 58, 58, 58, 33, 33, 33,
33, 33, 34, 44, 45, 47, 52, 62, 80, 80, 80,
80, 80, 80, 80, 80, 80, 80, 33, 33, 33, 33,
33, 34, 52, 53, 55, 60, 70, 88, 120, 120, 120,
120, 120, 120, 120, 120, 120, 33, 33, 33, 33, 33,
34, 68, 69, 71, 76, 86, 104, 136, 200, 200, 200,
200, 200, 200, 200, 200, 33, 33, 33, 33, 33, 34,
100, 101, 103, 108, 118, 136, 168, 232, 360, 360, 360,
360, 360, 360, 360, 33, 33, 33, 33, 33, 34, 164,
165, 167, 172, 182, 200, 232, 296, 424, 424, 424, 424,
424, 424, 424, 33, 33, 33, 33, 33, 34, 292, 293,
295, 300, 566, 584, 616, 680, 808, 808, 808, 808, 808,
808, 808, 33, 33, 33, 33, 33, 34, 548, 549, 551,
556, 822, 840, 872, 936, 1064, 1064, 1064, 1064, 1064, 1064,
1064, 33, 33, 33, 33, 33, 34, 1060, 1061, 1063, 1068,
1334, 1352, 1384, 1448, 1576, 1576, 1576, 1576, 1576, 1576, 1576,
33, 33, 33, 33, 33, 34, 2084, 2085, 2087, 2092, 2358,
2376, 2408, 2472, 2600, 2600, 2600, 2600, 2600, 2600, 2600, 33,
33, 33, 33, 33, 34, 4132, 4133, 4135, 4140, 4406, 4424,
4456, 4520, 4648, 4648, 4648, 4648, 4648, 4648, 4648, 33, 33,
33, 33, 33, 34, 8228, 8229, 8231, 8236, 8502, 8520, 8552,
8616, 8744, 8744, 8744, 8744, 8744, 8744, 8744, 3, 3, 3,
3, 3, 4, 6, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 3, 3, 3, 3,
3, 4, 6, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 3, 3, 3, 3, 3,
4, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 3, 3, 3, 3, 3, 4,
6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 3, 3, 3, 3, 3, 4, 6,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 3, 3, 3, 3, 3, 4, 6, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 3, 3, 3, 3, 3, 4, 6, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 65, 65, 65, 65, 65, 66, 69, 70, 72, 72,
72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72,
65, 65, 65, 65, 65, 66, 70, 71, 73, 78, 78,
78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 65,
65, 65, 65, 65, 66, 72, 73, 75, 80, 90, 90,
90, 90, 90, 90, 90, 90, 90, 90, 90, 65, 65,
65, 65, 65, 66, 76, 77, 79, 84, 94, 112, 112,
112, 112, 112, 112, 112, 112, 112, 112, 65, 65, 65,
65, 65, 66, 84, 85, 87, 92, 102, 120, 152, 152,
152, 152, 152, 152, 152, 152, 152, 65, 65, 65, 65,
65, 66, 100, 101, 103, 108, 118, 136, 168, 232, 232,
232, 232, 232, 232, 232, 232, 65, 65, 65, 65, 65,
66, 132, 133, 135, 140, 150, 168, 200, 264, 392, 392,
392, 392, 392, 392, 392, 65, 65, 65, 65, 65, 66,
196, 197, 199, 204, 214, 232, 264, 328, 456, 456, 456,
456, 456, 456, 456, 65, 65, 65, 65, 65, 66, 324,
325, 327, 332, 598, 616, 648, 712, 840, 840, 840, 840,
840, 840, 840, 65, 65, 65, 65, 65, 66, 580, 581,
583, 588, 854, 872, 904, 968, 1096, 1096, 1096, 1096, 1096,
1096, 1096, 65, 65, 65, 65, 65, 66, 1092, 1093, 1095,
1100, 1366, 1384, 1416, 1480, 1608, 1608, 1608, 1608, 1608, 1608,
1608, 65, 65, 65, 65, 65, 66, 2116, 2117, 2119, 2124,
2390, 2408, 2440, 2504, 2632, 2632, 2632, 2632, 2632, 2632, 2632,
65, 65, 65, 65, 65, 66, 4164, 4165, 4167, 4172, 4438,
4456, 4488, 4552, 4680, 4680, 4680, 4680, 4680, 4680, 4680, 65,
65, 65, 65, 65, 66, 8260, 8261, 8263, 8268, 8534, 8552,
8584, 8648, 8776, 8776, 8776, 8776, 8776, 8776, 8776, 6, 6,
6, 6, 6, 7, 9, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 6, 6, 6,
6, 6, 7, 9, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 6, 6, 6, 6,
6, 7, 9, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 6, 6, 6, 6, 6,
7, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 6, 6, 6, 6, 6, 7,
9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 6, 6, 6, 6, 6, 7, 9,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 6, 6, 6, 6, 6, 7, 9, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 129, 129, 129, 129, 129, 130, 132, 136, 138,
138, 138, 138, 138, 138, 138, 138, 138, 138, 138, 138,
138, 129, 129, 129, 129, 129, 130, 132, 135, 143, 148,
148, 148, 148, 148, 148, 148, 148, 148, 148, 148, 148,
129, 129, 129, 129, 129, 130, 132, 135, 145, 150, 160,
160, 160, 160, 160, 160, 160, 160, 160, 160, 160, 129,
129, 129, 129, 129, 130, 132, 135, 149, 154, 164, 182,
182, 182, 182, 182, 182, 182, 182, 182, 182, 129, 129,
129, 129, 129, 130, 132, 135, 157, 162, 172, 190, 222,
222, 222, 222, 222, 222, 222, 222, 222, 129, 129, 129,
129, 129, 130, 132, 135, 173, 178, 188, 206, 238, 302,
302, 302, 302, 302, 302, 302, 302, 129, 129, 129, 129,
129, 130, 132, 135, 205, 210, 220, 238, 270, 334, 462,
462, 462, 462, 462, 462, 462, 129, 129, 129, 129, 129,
130, 132, 135, 269, 274, 284, 302, 334, 398, 526, 526,
526, 526, 526, 526, 526, 129, 129, 129, 129, 129, 130,
132, 135, 397, 402, 668, 686, 718, 782, 910, 910, 910,
910, 910, 910, 910, 129, 129, 129, 129, 129, 130, 132,
135, 653, 658, 924, 942, 974, 1038, 1166, 1166, 1166, 1166,
1166, 1166, 1166, 129, 129, 129, 129, 129, 130, 132, 135,
1165, 1170, 1436, 1454, 1486, 1550, 1678, 1678, 1678, 1678, 1678,
1678, 1678, 129, 129, 129, 129, 129, 130, 132, 135, 2189,
2194, 2460, 2478, 2510, 2574, 2702, 2702, 2702, 2702, 2702, 2702,
2702, 129, 129, 129, 129, 129, 130, 132, 135, 4237, 4242,
4508, 4526, 4558, 4622, 4750, 4750, 4750, 4750, 4750, 4750, 4750,
129, 129, 129, 129, 129, 130, 132, 135, 8333, 8338, 8604,
8622, 8654, 8718, 8846, 8846, 8846, 8846, 8846, 8846, 8846, 803,
803, 803, 803, 803, 804, 806, 807, 807, 807, 807, 807,
807, 807, 807, 807, 807, 807, 807, 807, 807, 803, 803,
803, 803, 803, 804, 806, 807, 807, 807, 807, 807, 807,
807, 807, 807, 807, 807, 807, 807, 807, 803, 803, 803,
803, 803, 804, 806, 807, 807, 807, 807, 807, 807, 807,
807, 807, 807, 807, 807, 807, 807, 803, 803, 803, 803,
803, 804, 806, 807, 807, 807, 807, 807, 807, 807, 807,
807, 807, 807, 807, 807, 807, 803, 803, 803, 803, 804,
804, 806, 807, 807, 807, 807, 807, 807, 807, 807, 807,
807, 807, 807, 807, 807, 803, 803, 803, 803, 804, 805,
807, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808,
808, 808, 808, 808, 803, 803, 803, 803, 804, 805, 808,
809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809,
809, 809, 809, 803, 803, 803, 803, 804, 805, 807, 813,
815, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815,
815, 815, 803, 803, 803, 803, 804, 805, 807, 812, 824,
828, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828,
828, 803, 803, 803, 803, 804, 805, 807, 812, 826, 838,
846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846,
803, 803, 803, 803, 804, 805, 807, 812, 830, 842, 866,
882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 803,
803, 803, 803, 804, 805, 807, 812, 838, 850, 874, 922,
954, 954, 954, 954, 954, 954, 954, 954, 954, 803, 803,
803, 803, 804, 805, 807, 812, 854, 866, 890, 938, 1034,
1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 803, 803, 803,
803, 804, 805, 807, 812, 886, 898, 922, 970, 1066, 1258,
1386, 1386, 1386, 1386, 1386, 1386, 1386, 803, 803, 803, 803,
804, 805, 807, 812, 950, 962, 986, 1034, 1130, 1322, 1706,
1706, 1706, 1706, 1706, 1706, 1706, 803, 803, 803, 803, 804,
805, 807, 812, 1078, 1090, 1114, 1162, 1258, 1450, 1834, 2346,
2346, 2346, 2346, 2346, 2346, 803, 803, 803, 803, 804, 805,
807, 812, 1334, 1346, 1370, 1418, 1514, 1706, 2090, 2602, 3626,
3626, 3626, 3626, 3626, 803, 803, 803, 803, 804, 805, 807,
812, 1846, 1858, 1882, 1930, 2026, 2218, 2602, 3114, 4138, 6186,
6186, 6186, 6186, 803, 803, 803, 803, 804, 805, 807, 812,
2870, 2882, 2906, 2954, 3050, 3242, 3626, 4138, 5162, 7210, 11306,
11306, 11306, 803, 803, 803, 803, 804, 805, 807, 812, 4918,
4930, 4954, 5002, 5098, 5290, 5674, 6186, 7210, 9258, 13354, 21546,
21546, 803, 803, 803, 803, 804, 805, 807, 812, 9014, 9026,
9050, 9098, 9194, 9386, 9770, 10282, 11306, 13354, 17450, 25642, 42026,
803, 803, 803, 803, 803, 804, 806, 807, 807, 807, 807,
807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 803,
803, 803, 803, 803, 804, 806, 807, 807, 807, 807, 807,
807, 807, 807, 807, 807, 807, 807, 807, 807, 803, 803,
803, 803, 803, 804, 806, 807, 807, 807, 807, 807, 807,
807, 807, 807, 807, 807, 807, 807, 807, 803, 803, 803,
803, 803, 804, 806, 807, 807, 807, 807, 807, 807, 807,
807, 807, 807, 807, 807, 807, 807, 803, 803, 803, 803,
804, 804, 806, 807, 807, 807, 807, 807, 807, 807, 807,
807, 807, 807, 807, 807, 807, 803, 803, 803, 803, 804,
805, 807, 808, 808, 808, 808, 808, 808, 808, 808, 808,
808, 808, 808, 808, 808, 803, 803, 803, 803, 804, 805,
808, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809,
809, 809, 809, 809, 803, 803, 803, 803, 804, 805, 807,
813, 815, 815, 815, 815, 815, 815, 815, 815, 815, 815,
815, 815, 815, 803, 803, 803, 803, 804, 805, 807, 812,
824, 828, 828, 828, 828, 828, 828, 828, 828, 828, 828,
828, 828, 803, 803, 803, 803, 804, 805, 807, 812, 826,
838, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846,
846, 803, 803, 803, 803, 804, 805, 807, 812, 830, 842,
866, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882,
803, 803, 803, 803, 804, 805, 807, 812, 838, 850, 874,
922, 954, 954, 954, 954, 954, 954, 954, 954, 954, 803,
803, 803, 803, 804, 805, 807, 812, 854, 866, 890, 938,
1034, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 1098, 803, 803,
803, 803, 804, 805, 807, 812, 886, 898, 922, 970, 1066,
1258, 1386, 1386, 1386, 1386, 1386, 1386, 1386, 803, 803, 803,
803, 804, 805, 807, 812, 950, 962, 986, 1034, 1130, 1322,
1706, 1706, 1706, 1706, 1706, 1706, 1706, 803, 803, 803, 803,
804, 805, 807, 812, 1078, 1090, 1114, 1162, 1258, 1450, 1834,
2346, 2346, 2346, 2346, 2346, 2346, 803, 803, 803, 803, 804,
805, 807, 812, 1334, 1346, 1370, 1418, 1514, 1706, 2090, 2602,
3626, 3626, 3626, 3626, 3626, 803, 803, 803, 803, 804, 805,
807, 812, 1846, 1858, 1882, 1930, 2026, 2218, 2602, 3114, 4138,
6186, 6186, 6186, 6186, 803, 803, 803, 803, 804, 805, 807,
812, 2870, 2882, 2906, 2954, 3050, 3242, 3626, 4138, 5162, 7210,
11306, 11306, 11306, 803, 803, 803, 803, 804, 805, 807, 812,
4918, 4930, 4954, 5002, 5098, 5290, 5674, 6186, 7210, 9258, 13354,
21546, 21546, 803, 803, 803, 803, 804, 805, 807, 812, 9014,
9026, 9050, 9098, 9194, 9386, 9770, 10282, 11306, 13354, 17450, 25642,
42026,
};
#endif
class brotli_block_compressor final : public block_compressor::impl {
public:
brotli_block_compressor(uint32_t quality, uint32_t window_bits)
@ -92,6 +582,24 @@ class brotli_block_compressor final : public block_compressor::impl {
return {};
}
size_t estimate_memory_usage(size_t data_size) const override {
#ifdef BROTLI_BUILD_ENC_EXTRA_API
return ::BrotliEncoderEstimatePeakMemoryUsage(quality_, window_bits_,
data_size) +
data_size;
#else
auto const q = std::clamp<int>(quality_, 0, 11);
auto const lg_win = std::clamp<int>(window_bits_, 10, 30) - 10;
auto const lg_data_size =
std::clamp<int>(static_cast<int>(std::ceil(std::log2(data_size))), 10,
30) -
10;
auto const index = (q * 21 + lg_win) * 21 + lg_data_size;
return kBrotliMemUsageGranularity * brotli_memory_usage.at(index) +
data_size;
#endif
}
private:
uint32_t const quality_;
uint32_t const window_bits_;

View File

@ -393,6 +393,11 @@ class flac_block_compressor final : public block_compressor::impl {
return cc;
}
size_t estimate_memory_usage(size_t data_size) const override {
// TODO: can we estimate the FLAC encoder state size?
return data_size;
}
private:
uint32_t const level_;
bool const exhaustive_;

View File

@ -54,6 +54,8 @@ struct lz4_compression_policy {
}
static std::string describe(int /*level*/) { return "lz4"; }
static size_t state_size(size_t /*data_size*/) { return LZ4_sizeofState(); }
};
struct lz4hc_compression_policy {
@ -67,6 +69,8 @@ struct lz4hc_compression_policy {
static std::string describe(int level) {
return fmt::format("lz4hc [level={}]", level);
}
static size_t state_size(size_t /*data_size*/) { return LZ4_sizeofStateHC(); }
};
template <typename Policy>
@ -113,6 +117,10 @@ class lz4_block_compressor final : public block_compressor::impl {
return {};
}
size_t estimate_memory_usage(size_t data_size) const override {
return Policy::state_size(data_size) + data_size;
}
private:
int const level_;
};

View File

@ -136,6 +136,13 @@ class lzma_block_compressor final : public block_compressor::impl {
return {};
}
size_t estimate_memory_usage(size_t data_size) const override {
auto lzma_opts = opt_lzma_;
std::array<lzma_filter, 2> filters{
{{LZMA_FILTER_LZMA2, &lzma_opts}, {LZMA_VLI_UNKNOWN, nullptr}}};
return lzma_raw_encoder_memusage(filters.data()) + data_size;
}
private:
shared_byte_buffer
compress(shared_byte_buffer const& data, lzma_filter const* filters) const;

View File

@ -66,6 +66,11 @@ class null_block_compressor final : public block_compressor::impl {
get_compression_constraints(std::string const&) const override {
return {};
}
size_t estimate_memory_usage(size_t /*data_size*/) const override {
// we're re-using the input buffer, so we don't need any extra memory
return 0;
}
};
class null_block_decompressor final : public block_decompressor_base {

View File

@ -171,6 +171,11 @@ class ricepp_block_compressor final : public block_compressor::impl {
return cc;
}
size_t estimate_memory_usage(size_t data_size) const override {
// ricepp encoder basically has no memory overhead by itself
return data_size;
}
private:
size_t const block_size_;
};

View File

@ -50,6 +50,59 @@ namespace dwarfs {
namespace {
#ifndef ZSTD_STATIC_LINKING_ONLY
constexpr size_t kZstdMemUsageGranularity = 16384;
constexpr std::array<uint16_t, 23 * 21> zstd_memory_usage{
3, 4, 6, 10, 18, 34, 41, 56, 64, 80, 80,
80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 3,
4, 5, 8, 14, 12, 19, 34, 36, 36, 36, 36,
36, 36, 36, 36, 36, 36, 36, 36, 36, 3, 4,
5, 8, 14, 18, 25, 40, 40, 48, 48, 48, 48,
48, 48, 48, 48, 48, 48, 48, 48, 3, 4, 6,
10, 18, 34, 41, 56, 64, 80, 80, 80, 80, 80,
80, 80, 80, 80, 80, 80, 80, 3, 4, 6, 10,
14, 34, 65, 96, 80, 160, 160, 160, 160, 160, 160,
160, 160, 160, 160, 160, 160, 3, 4, 6, 10, 14,
34, 65, 80, 128, 224, 224, 224, 224, 224, 224, 224,
224, 224, 224, 224, 224, 3, 4, 6, 10, 14, 34,
65, 80, 224, 224, 224, 224, 224, 224, 224, 224, 224,
224, 224, 224, 224, 3, 4, 6, 10, 14, 34, 65,
80, 224, 416, 416, 416, 416, 416, 416, 416, 416, 416,
416, 416, 416, 3, 4, 6, 10, 14, 34, 65, 80,
224, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416,
416, 416, 3, 5, 7, 12, 18, 34, 65, 80, 224,
416, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800,
800, 3, 5, 7, 12, 18, 34, 65, 80, 224, 416,
800, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568,
12, 14, 16, 21, 27, 42, 81, 96, 224, 416, 800,
1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 1568, 13,
14, 17, 24, 32, 42, 81, 128, 288, 416, 800, 1568,
3104, 3104, 3104, 3104, 3104, 3104, 3104, 3104, 3104, 13, 14,
17, 24, 32, 51, 90, 137, 233, 544, 1056, 2080, 2080,
2080, 2080, 2080, 2080, 2080, 2080, 2080, 2080, 13, 14, 17,
24, 36, 61, 110, 177, 273, 544, 1056, 2080, 3104, 3104,
3104, 3104, 3104, 3104, 3104, 3104, 3104, 13, 14, 17, 24,
36, 61, 110, 177, 273, 544, 1056, 2080, 4128, 4128, 4128,
4128, 4128, 4128, 4128, 4128, 4128, 13, 14, 17, 24, 36,
61, 110, 177, 337, 553, 1065, 2089, 2089, 2089, 2089, 2089,
2089, 2089, 2089, 2089, 2089, 13, 14, 17, 24, 36, 61,
110, 177, 337, 553, 1065, 2089, 3113, 3113, 3113, 3113, 3113,
3113, 3113, 3113, 3113, 13, 14, 17, 24, 36, 61, 110,
177, 337, 593, 1105, 2129, 3153, 3153, 3153, 3153, 3153, 3153,
3153, 3153, 3153, 13, 14, 17, 24, 36, 61, 110, 177,
337, 593, 1105, 2129, 3153, 5201, 5201, 5201, 5201, 5201, 5201,
5201, 5201, 13, 14, 17, 24, 36, 61, 110, 177, 337,
593, 1105, 2129, 4177, 6225, 10321, 10321, 10321, 10321, 10321, 10321,
10321, 13, 14, 17, 24, 36, 61, 110, 177, 337, 593,
1105, 2129, 4177, 8273, 12369, 20561, 20561, 20561, 20561, 20561, 20561,
13, 14, 17, 24, 36, 61, 110, 177, 337, 593, 1105,
2129, 4177, 8273, 16465, 24657, 41041, 41562, 41562, 41562, 41562,
};
#endif
class zstd_block_compressor final : public block_compressor::impl {
public:
explicit zstd_block_compressor(int level)
@ -77,6 +130,22 @@ class zstd_block_compressor final : public block_compressor::impl {
return {};
}
size_t estimate_memory_usage(size_t data_size) const override {
#ifdef ZSTD_STATIC_LINKING_ONLY
// TODO: check if dictSize == 0 is correct
auto params = ZSTD_getCParams(level_, data_size, 0);
return ZSTD_estimateCCtxSize_usingCParams(params) + data_size;
#else
auto const l = std::clamp<int>(level_, 0, 22);
auto const lg_data_size =
std::clamp<int>(static_cast<int>(std::ceil(std::log2(data_size))), 10,
30) -
10;
auto const index = l * 21 + lg_data_size;
return kZstdMemUsageGranularity * zstd_memory_usage.at(index) + data_size;
#endif
}
private:
int const level_;
};