Browse Source
[file_sys/system_archive] remove uneeded ctor/dtor initializations for std::map<> when creating system archives for nx_tzdb generated files (#3919)
[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>lizzie/stable-shader-pools
committed by
crueter
No known key found for this signature in database
GPG Key ID: 425ACD2D4830EBC6
3 changed files with 53 additions and 76 deletions
-
27externals/nx_tzdb/NxTzdbCreateHeader.cmake
-
6externals/nx_tzdb/tzdb_template.h.in
-
96src/core/file_sys/system_archive/time_zone_binary.cpp
@ -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
|
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue