refactor(mkdwarfs_main): avoid potentially throwing globals

This commit is contained in:
Marcus Holland-Moritz 2025-03-15 12:00:49 +01:00
parent 437f81a4b8
commit 830bed5d39

View File

@ -241,89 +241,95 @@ constexpr std::array<level_defaults, 10> levels{{
// clang-format on // clang-format on
}}; }};
const std::unordered_map<std::string, std::vector<std::string>> using categorize_defaults_type =
categorize_defaults_common{ std::unordered_map<std::string, std::vector<std::string>>;
// clang-format off
{"--compression", {"incompressible::null"}},
// clang-format on
};
const std::unordered_map<std::string, std::vector<std::string>> categorize_defaults_type const& categorize_defaults_common() {
categorize_defaults_fast{ static categorize_defaults_type const defaults{
// clang-format off // clang-format off
{"--order", {"pcmaudio/waveform::revpath", "fits/image::revpath"}}, {"--compression", {"incompressible::null"}},
{"--window-size", {"pcmaudio/waveform::0", "fits/image::0"}}, // clang-format on
{"--compression", { };
return defaults;
}
categorize_defaults_type const& categorize_defaults_level(unsigned level) {
static categorize_defaults_type const defaults_fast{
// clang-format off
{"--order", {"pcmaudio/waveform::revpath", "fits/image::revpath"}},
{"--window-size", {"pcmaudio/waveform::0", "fits/image::0"}},
{"--compression", {
#ifdef DWARFS_HAVE_FLAC #ifdef DWARFS_HAVE_FLAC
"pcmaudio/waveform::flac:level=3", "pcmaudio/waveform::flac:level=3",
#else #else
"pcmaudio/waveform::zstd:level=3", "pcmaudio/waveform::zstd:level=3",
#endif #endif
#ifdef DWARFS_HAVE_RICEPP #ifdef DWARFS_HAVE_RICEPP
"fits/image::ricepp", "fits/image::ricepp",
#else #else
"fits/image::zstd:level=3", "fits/image::zstd:level=3",
#endif #endif
}}, }},
// clang-format on // clang-format on
}; };
const std::unordered_map<std::string, std::vector<std::string>> static categorize_defaults_type const defaults_medium{
categorize_defaults_medium{ // clang-format off
// clang-format off {"--order", {"pcmaudio/waveform::revpath", "fits/image::revpath"}},
{"--order", {"pcmaudio/waveform::revpath", "fits/image::revpath"}}, {"--window-size", {"pcmaudio/waveform::20", "fits/image::0"}},
{"--window-size", {"pcmaudio/waveform::20", "fits/image::0"}}, {"--compression", {
{"--compression", {
#ifdef DWARFS_HAVE_FLAC #ifdef DWARFS_HAVE_FLAC
"pcmaudio/waveform::flac:level=5", "pcmaudio/waveform::flac:level=5",
#else #else
"pcmaudio/waveform::zstd:level=5", "pcmaudio/waveform::zstd:level=5",
#endif #endif
#ifdef DWARFS_HAVE_RICEPP #ifdef DWARFS_HAVE_RICEPP
"fits/image::ricepp", "fits/image::ricepp",
#else #else
"fits/image::zstd:level=5", "fits/image::zstd:level=5",
#endif #endif
}}, }},
// clang-format on // clang-format on
}; };
const std::unordered_map<std::string, std::vector<std::string>> static categorize_defaults_type const defaults_slow{
categorize_defaults_slow{ // clang-format off
// clang-format off {"--order", {"fits/image::revpath"}},
{"--order", {"fits/image::revpath"}}, {"--window-size", {"pcmaudio/waveform::16", "fits/image::0"}},
{"--window-size", {"pcmaudio/waveform::16", "fits/image::0"}}, {"--compression", {
{"--compression", {
#ifdef DWARFS_HAVE_FLAC #ifdef DWARFS_HAVE_FLAC
"pcmaudio/waveform::flac:level=8", "pcmaudio/waveform::flac:level=8",
#else #else
"pcmaudio/waveform::zstd:level=8", "pcmaudio/waveform::zstd:level=8",
#endif #endif
#ifdef DWARFS_HAVE_RICEPP #ifdef DWARFS_HAVE_RICEPP
"fits/image::ricepp", "fits/image::ricepp",
#else #else
"fits/image::zstd:level=8", "fits/image::zstd:level=8",
#endif #endif
}}, }},
// clang-format on // clang-format on
}; };
constexpr std::array< static constexpr std::array<categorize_defaults_type const*, 10>
std::unordered_map<std::string, std::vector<std::string>> const*, 10> defaults_level{{
categorize_defaults_level{{ // clang-format off
// clang-format off /* 0 */ &defaults_fast,
/* 0 */ &categorize_defaults_fast, /* 1 */ &defaults_fast,
/* 1 */ &categorize_defaults_fast, /* 2 */ &defaults_fast,
/* 2 */ &categorize_defaults_fast, /* 3 */ &defaults_fast,
/* 3 */ &categorize_defaults_fast, /* 4 */ &defaults_fast,
/* 4 */ &categorize_defaults_fast, /* 5 */ &defaults_medium,
/* 5 */ &categorize_defaults_medium, /* 6 */ &defaults_medium,
/* 6 */ &categorize_defaults_medium, /* 7 */ &defaults_medium,
/* 7 */ &categorize_defaults_medium, /* 8 */ &defaults_slow,
/* 8 */ &categorize_defaults_slow, /* 9 */ &defaults_slow,
/* 9 */ &categorize_defaults_slow, // clang-format on
// clang-format on }};
}};
return *defaults_level.at(level);
}
constexpr unsigned default_level = 7; constexpr unsigned default_level = 7;
@ -350,9 +356,7 @@ class categorize_optval {
} }
} }
void void add_defaults(categorize_defaults_type const& defaults) {
add_defaults(std::unordered_map<std::string, std::vector<std::string>> const&
defaults) {
for (auto const& [key, values] : defaults) { for (auto const& [key, values] : defaults) {
auto& vs = defaults_[key]; auto& vs = defaults_[key];
vs.insert(vs.end(), values.begin(), values.end()); vs.insert(vs.end(), values.begin(), values.end());
@ -360,7 +364,7 @@ class categorize_optval {
} }
private: private:
std::unordered_map<std::string, std::vector<std::string>> defaults_; categorize_defaults_type defaults_;
}; };
std::ostream& operator<<(std::ostream& os, categorize_optval const& optval) { std::ostream& operator<<(std::ostream& os, categorize_optval const& optval) {
@ -777,8 +781,8 @@ int mkdwarfs_main(int argc, sys_char** argv, iolayer const& iol) {
auto const& defaults = levels[level]; auto const& defaults = levels[level];
categorizer_list.add_defaults(categorize_defaults_common); categorizer_list.add_defaults(categorize_defaults_common());
categorizer_list.add_defaults(*categorize_defaults_level[level]); categorizer_list.add_defaults(categorize_defaults_level(level));
if (!vm.count("block-size-bits")) { if (!vm.count("block-size-bits")) {
sf_config.block_size_bits = defaults.block_size_bits; sf_config.block_size_bits = defaults.block_size_bits;