mirror of
https://git.eden-emu.dev/eden-emu/eden
synced 2026-05-16 12:36:59 +02:00
[file_sys/system_archive] remove uneeded ctor/dtor initializations for std::map<> when creating system archives for nx_tzdb generated files (#3919)
sounds like word salad but let me say: - std::map<> created a static ctor for EVERY SINGLE ZONEINFO - fuck that, instead lets just use a raw array and construct things statically - works the same except with less baggage carried around (+ less heap allocations!!!) this should help reduce codesize due to the aforementioned global ctor/dtor Signed-off-by: lizzie <lizzie@eden-emu.dev> Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3919 Reviewed-by: crueter <crueter@eden-emu.dev>
This commit is contained in:
parent
bc9b9480fb
commit
02dee4a20b
3 changed files with 53 additions and 76 deletions
|
|
@ -1,86 +1,48 @@
|
|||
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
#include <span>
|
||||
#include <vector>
|
||||
|
||||
#include "common/swap.h"
|
||||
#include "core/file_sys/system_archive/time_zone_binary.h"
|
||||
#include "core/file_sys/vfs/vfs_static.h"
|
||||
#include "core/file_sys/vfs/vfs_types.h"
|
||||
#include "core/file_sys/vfs/vfs_vector.h"
|
||||
|
||||
#include "nx_tzdb.h"
|
||||
|
||||
namespace FileSys::SystemArchive {
|
||||
|
||||
const static std::map<std::string, const std::map<const char*, const std::vector<u8>>&>
|
||||
tzdb_zoneinfo_dirs = {{"Africa", NxTzdb::africa},
|
||||
{"America", NxTzdb::america},
|
||||
{"Antarctica", NxTzdb::antarctica},
|
||||
{"Arctic", NxTzdb::arctic},
|
||||
{"Asia", NxTzdb::asia},
|
||||
{"Atlantic", NxTzdb::atlantic},
|
||||
{"Australia", NxTzdb::australia},
|
||||
{"Brazil", NxTzdb::brazil},
|
||||
{"Canada", NxTzdb::canada},
|
||||
{"Chile", NxTzdb::chile},
|
||||
{"Etc", NxTzdb::etc},
|
||||
{"Europe", NxTzdb::europe},
|
||||
{"Indian", NxTzdb::indian},
|
||||
{"Mexico", NxTzdb::mexico},
|
||||
{"Pacific", NxTzdb::pacific},
|
||||
{"US", NxTzdb::us}};
|
||||
|
||||
const static std::map<std::string, const std::map<const char*, const std::vector<u8>>&>
|
||||
tzdb_america_dirs = {{"Argentina", NxTzdb::america_argentina},
|
||||
{"Indiana", NxTzdb::america_indiana},
|
||||
{"Kentucky", NxTzdb::america_kentucky},
|
||||
{"North_Dakota", NxTzdb::america_north_dakota}};
|
||||
|
||||
static void GenerateFiles(std::vector<VirtualFile>& directory,
|
||||
const std::map<const char*, const std::vector<u8>>& files) {
|
||||
for (const auto& [filename, data] : files) {
|
||||
const auto data_copy{data};
|
||||
const std::string filename_copy{filename};
|
||||
VirtualFile file{
|
||||
std::make_shared<VectorVfsFile>(std::move(data_copy), std::move(filename_copy))};
|
||||
directory.push_back(file);
|
||||
}
|
||||
}
|
||||
|
||||
static std::vector<VirtualFile> GenerateZoneinfoFiles() {
|
||||
std::vector<VirtualFile> zoneinfo_files;
|
||||
GenerateFiles(zoneinfo_files, NxTzdb::zoneinfo);
|
||||
return zoneinfo_files;
|
||||
}
|
||||
|
||||
VirtualDir TimeZoneBinary() {
|
||||
std::vector<VirtualDir> america_sub_dirs;
|
||||
for (const auto& [dir_name, files] : tzdb_america_dirs) {
|
||||
std::vector<VirtualFile> vfs_files;
|
||||
GenerateFiles(vfs_files, files);
|
||||
america_sub_dirs.push_back(std::make_shared<VectorVfsDirectory>(
|
||||
std::move(vfs_files), std::vector<VirtualDir>{}, dir_name));
|
||||
}
|
||||
|
||||
america_sub_dirs.push_back(std::make_shared<VectorVfsDirectory>(NxTzdb::CollectFiles_america_argentina(), std::vector<VirtualDir>{}, "Argentina"));
|
||||
america_sub_dirs.push_back(std::make_shared<VectorVfsDirectory>(NxTzdb::CollectFiles_america_indiana(), std::vector<VirtualDir>{}, "Indiana"));
|
||||
america_sub_dirs.push_back(std::make_shared<VectorVfsDirectory>(NxTzdb::CollectFiles_america_kentucky(), std::vector<VirtualDir>{}, "Kentucky"));
|
||||
america_sub_dirs.push_back(std::make_shared<VectorVfsDirectory>(NxTzdb::CollectFiles_america_north_dakota(), std::vector<VirtualDir>{}, "North_Dakota"));
|
||||
std::vector<VirtualDir> zoneinfo_sub_dirs;
|
||||
for (const auto& [dir_name, files] : tzdb_zoneinfo_dirs) {
|
||||
std::vector<VirtualFile> vfs_files;
|
||||
GenerateFiles(vfs_files, files);
|
||||
if (dir_name == "America") {
|
||||
zoneinfo_sub_dirs.push_back(std::make_shared<VectorVfsDirectory>(
|
||||
std::move(vfs_files), std::move(america_sub_dirs), dir_name));
|
||||
} else {
|
||||
zoneinfo_sub_dirs.push_back(std::make_shared<VectorVfsDirectory>(
|
||||
std::move(vfs_files), std::vector<VirtualDir>{}, dir_name));
|
||||
}
|
||||
}
|
||||
|
||||
std::vector<VirtualDir> zoneinfo_dir{std::make_shared<VectorVfsDirectory>(
|
||||
GenerateZoneinfoFiles(), std::move(zoneinfo_sub_dirs), "zoneinfo")};
|
||||
std::vector<VirtualFile> root_files;
|
||||
GenerateFiles(root_files, NxTzdb::base);
|
||||
|
||||
return std::make_shared<VectorVfsDirectory>(std::move(root_files), std::move(zoneinfo_dir),
|
||||
"data");
|
||||
zoneinfo_sub_dirs.push_back(std::make_shared<VectorVfsDirectory>(NxTzdb::CollectFiles_africa(), std::vector<VirtualDir>{}, "Africa"));
|
||||
zoneinfo_sub_dirs.push_back(std::make_shared<VectorVfsDirectory>(NxTzdb::CollectFiles_america(), std::move(america_sub_dirs), "America"));
|
||||
zoneinfo_sub_dirs.push_back(std::make_shared<VectorVfsDirectory>(NxTzdb::CollectFiles_antarctica(), std::vector<VirtualDir>{}, "Antarctica"));
|
||||
zoneinfo_sub_dirs.push_back(std::make_shared<VectorVfsDirectory>(NxTzdb::CollectFiles_arctic(), std::vector<VirtualDir>{}, "Arctic"));
|
||||
zoneinfo_sub_dirs.push_back(std::make_shared<VectorVfsDirectory>(NxTzdb::CollectFiles_asia(), std::vector<VirtualDir>{}, "Asia"));
|
||||
zoneinfo_sub_dirs.push_back(std::make_shared<VectorVfsDirectory>(NxTzdb::CollectFiles_atlantic(), std::vector<VirtualDir>{}, "Atlantic"));
|
||||
zoneinfo_sub_dirs.push_back(std::make_shared<VectorVfsDirectory>(NxTzdb::CollectFiles_australia(), std::vector<VirtualDir>{}, "Australia"));
|
||||
zoneinfo_sub_dirs.push_back(std::make_shared<VectorVfsDirectory>(NxTzdb::CollectFiles_brazil(), std::vector<VirtualDir>{}, "Brazil"));
|
||||
zoneinfo_sub_dirs.push_back(std::make_shared<VectorVfsDirectory>(NxTzdb::CollectFiles_canada(), std::vector<VirtualDir>{}, "Canada"));
|
||||
zoneinfo_sub_dirs.push_back(std::make_shared<VectorVfsDirectory>(NxTzdb::CollectFiles_chile(), std::vector<VirtualDir>{}, "Chile"));
|
||||
zoneinfo_sub_dirs.push_back(std::make_shared<VectorVfsDirectory>(NxTzdb::CollectFiles_etc(), std::vector<VirtualDir>{}, "Etc"));
|
||||
zoneinfo_sub_dirs.push_back(std::make_shared<VectorVfsDirectory>(NxTzdb::CollectFiles_europe(), std::vector<VirtualDir>{}, "Europe"));
|
||||
zoneinfo_sub_dirs.push_back(std::make_shared<VectorVfsDirectory>(NxTzdb::CollectFiles_indian(), std::vector<VirtualDir>{}, "Indian"));
|
||||
zoneinfo_sub_dirs.push_back(std::make_shared<VectorVfsDirectory>(NxTzdb::CollectFiles_mexico(), std::vector<VirtualDir>{}, "Mexico"));
|
||||
zoneinfo_sub_dirs.push_back(std::make_shared<VectorVfsDirectory>(NxTzdb::CollectFiles_pacific(), std::vector<VirtualDir>{}, "Pacific"));
|
||||
zoneinfo_sub_dirs.push_back(std::make_shared<VectorVfsDirectory>(NxTzdb::CollectFiles_us(), std::vector<VirtualDir>{}, "US"));
|
||||
std::vector<VirtualDir> zoneinfo_dir{std::make_shared<VectorVfsDirectory>(NxTzdb::CollectFiles_zoneinfo(), std::move(zoneinfo_sub_dirs), "zoneinfo")};
|
||||
// last files (root)
|
||||
return std::make_shared<VectorVfsDirectory>(NxTzdb::CollectFiles_base(), std::move(zoneinfo_dir), "data");
|
||||
}
|
||||
|
||||
} // namespace FileSys::SystemArchive
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue