From 998d6a77c37bb9c6d05924fdb8d48b488238b1a9 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Thu, 5 Sep 2019 21:40:49 -0400 Subject: [PATCH 1/8] General: Remove redundant inline keyword Functions defined within the class declaration are already inline by default, so we don't need to specify the keyword here. --- include/nod/DiscBase.hpp | 80 ++++++++++++++++++++-------------------- include/nod/Util.hpp | 16 ++++---- 2 files changed, 48 insertions(+), 48 deletions(-) diff --git a/include/nod/DiscBase.hpp b/include/nod/DiscBase.hpp index ef791d0..a2d80b2 100644 --- a/include/nod/DiscBase.hpp +++ b/include/nod/DiscBase.hpp @@ -35,10 +35,10 @@ public: offset = SBig(off); length = SBig(len); } - inline bool isDir() const { return ((SBig(typeAndNameOffset) >> 24) != 0); } - inline uint32_t getNameOffset() const { return SBig(typeAndNameOffset) & 0xffffff; } - inline uint32_t getOffset() const { return SBig(offset); } - inline uint32_t getLength() const { return SBig(length); } + bool isDir() const { return ((SBig(typeAndNameOffset) >> 24) != 0); } + uint32_t getNameOffset() const { return SBig(typeAndNameOffset) & 0xffffff; } + uint32_t getOffset() const { return SBig(offset); } + uint32_t getLength() const { return SBig(length); } void incrementLength() { uint32_t orig = SBig(length); ++orig; @@ -187,13 +187,13 @@ private: public: Node(const IPartition& parent, const FSTNode& node, std::string_view name); - inline Kind getKind() const { return m_kind; } - inline std::string_view getName() const { return m_name; } - inline uint64_t size() const { return m_discLength; } + Kind getKind() const { return m_kind; } + std::string_view getName() const { return m_name; } + uint64_t size() const { return m_discLength; } std::unique_ptr beginReadStream(uint64_t offset = 0) const; std::unique_ptr getBuf() const; - inline std::vector::iterator rawBegin() const { return m_childrenBegin; } - inline std::vector::iterator rawEnd() const { return m_childrenEnd; } + std::vector::iterator rawBegin() const { return m_childrenBegin; } + std::vector::iterator rawEnd() const { return m_childrenEnd; } class DirectoryIterator { friend class Node; @@ -207,21 +207,21 @@ public: using pointer = Node*; using reference = Node&; - inline bool operator!=(const DirectoryIterator& other) { return m_it != other.m_it; } - inline bool operator==(const DirectoryIterator& other) { return m_it == other.m_it; } - inline DirectoryIterator& operator++() { + bool operator!=(const DirectoryIterator& other) { return m_it != other.m_it; } + bool operator==(const DirectoryIterator& other) { return m_it == other.m_it; } + DirectoryIterator& operator++() { if (m_it->m_kind == Kind::Directory) m_it = m_it->rawEnd(); else ++m_it; return *this; } - inline Node& operator*() { return *m_it; } - inline Node* operator->() { return &*m_it; } + Node& operator*() { return *m_it; } + Node* operator->() { return &*m_it; } }; - inline DirectoryIterator begin() const { return DirectoryIterator(m_childrenBegin); } - inline DirectoryIterator end() const { return DirectoryIterator(m_childrenEnd); } - inline DirectoryIterator find(std::string_view name) const { + DirectoryIterator begin() const { return DirectoryIterator(m_childrenBegin); } + DirectoryIterator end() const { return DirectoryIterator(m_childrenEnd); } + DirectoryIterator find(std::string_view name) const { if (m_kind == Kind::Directory) { DirectoryIterator it = begin(); for (; it != end(); ++it) { @@ -289,47 +289,47 @@ public: IPartition(const DiscBase& parent, PartitionKind kind, bool isWii, uint64_t offset) : m_parent(parent), m_kind(kind), m_offset(offset), m_isWii(isWii) {} virtual uint64_t normalizeOffset(uint64_t anOffset) const { return anOffset; } - inline PartitionKind getKind() const { return m_kind; } - inline bool isWii() const { return m_isWii; } - inline uint64_t getDiscOffset() const { return m_offset; } + PartitionKind getKind() const { return m_kind; } + bool isWii() const { return m_isWii; } + uint64_t getDiscOffset() const { return m_offset; } virtual std::unique_ptr beginReadStream(uint64_t offset = 0) const = 0; - inline std::unique_ptr beginDOLReadStream(uint64_t offset = 0) const { + std::unique_ptr beginDOLReadStream(uint64_t offset = 0) const { return beginReadStream(m_dolOff + offset); } - inline std::unique_ptr beginFSTReadStream(uint64_t offset = 0) const { + std::unique_ptr beginFSTReadStream(uint64_t offset = 0) const { return beginReadStream(m_fstOff + offset); } - inline std::unique_ptr beginApploaderReadStream(uint64_t offset = 0) const { + std::unique_ptr beginApploaderReadStream(uint64_t offset = 0) const { return beginReadStream(0x2440 + offset); } - inline const Node& getFSTRoot() const { return m_nodes[0]; } - inline Node& getFSTRoot() { return m_nodes[0]; } + const Node& getFSTRoot() const { return m_nodes[0]; } + Node& getFSTRoot() { return m_nodes[0]; } bool extractToDirectory(SystemStringView path, const ExtractionContext& ctx); - inline uint64_t getDOLSize() const { return m_dolSz; } - inline std::unique_ptr getDOLBuf() const { + uint64_t getDOLSize() const { return m_dolSz; } + std::unique_ptr getDOLBuf() const { std::unique_ptr buf(new uint8_t[m_dolSz]); beginDOLReadStream()->read(buf.get(), m_dolSz); return buf; } - inline uint64_t getFSTSize() const { return m_fstSz; } - inline std::unique_ptr getFSTBuf() const { + uint64_t getFSTSize() const { return m_fstSz; } + std::unique_ptr getFSTBuf() const { std::unique_ptr buf(new uint8_t[m_fstSz]); beginFSTReadStream()->read(buf.get(), m_fstSz); return buf; } - inline uint64_t getApploaderSize() const { return m_apploaderSz; } - inline std::unique_ptr getApploaderBuf() const { + uint64_t getApploaderSize() const { return m_apploaderSz; } + std::unique_ptr getApploaderBuf() const { std::unique_ptr buf(new uint8_t[m_apploaderSz]); beginApploaderReadStream()->read(buf.get(), m_apploaderSz); return buf; } - inline size_t getNodeCount() const { return m_nodes.size(); } - inline const Header& getHeader() const { return m_header; } - inline const BI2Header& getBI2() const { return m_bi2Header; } + size_t getNodeCount() const { return m_nodes.size(); } + const Header& getHeader() const { return m_header; } + const BI2Header& getBI2() const { return m_bi2Header; } virtual bool extractCryptoFiles(SystemStringView path, const ExtractionContext& ctx) const { return true; } bool extractSysFiles(SystemStringView path, const ExtractionContext& ctx) const; }; @@ -346,29 +346,29 @@ protected: public: DiscBase(std::unique_ptr&& dio, bool& err) : m_discIO(std::move(dio)), m_header(*m_discIO, err) {} - inline const Header& getHeader() const { return m_header; } - inline const IDiscIO& getDiscIO() const { return *m_discIO; } - inline size_t getPartitonNodeCount(size_t partition = 0) const { + const Header& getHeader() const { return m_header; } + const IDiscIO& getDiscIO() const { return *m_discIO; } + size_t getPartitonNodeCount(size_t partition = 0) const { if (partition > m_partitions.size()) return -1; return m_partitions[partition]->getNodeCount(); } - inline IPartition* getDataPartition() { + IPartition* getDataPartition() { for (const std::unique_ptr& part : m_partitions) if (part->getKind() == PartitionKind::Data) return part.get(); return nullptr; } - inline IPartition* getUpdatePartition() { + IPartition* getUpdatePartition() { for (const std::unique_ptr& part : m_partitions) if (part->getKind() == PartitionKind::Update) return part.get(); return nullptr; } - inline void extractToDirectory(SystemStringView path, const ExtractionContext& ctx) { + void extractToDirectory(SystemStringView path, const ExtractionContext& ctx) { for (std::unique_ptr& part : m_partitions) part->extractToDirectory(path, ctx); } diff --git a/include/nod/Util.hpp b/include/nod/Util.hpp index 490f2b4..82e2df5 100644 --- a/include/nod/Util.hpp +++ b/include/nod/Util.hpp @@ -94,8 +94,8 @@ public: m_utf8.assign(len, '\0'); WideCharToMultiByte(CP_UTF8, 0, str.data(), str.size(), &m_utf8[0], len, nullptr, nullptr); } - inline std::string_view utf8_str() const { return m_utf8; } - inline const char* c_str() const { return m_utf8.c_str(); } + std::string_view utf8_str() const { return m_utf8; } + const char* c_str() const { return m_utf8.c_str(); } }; class SystemStringConv { std::wstring m_sys; @@ -106,8 +106,8 @@ public: m_sys.assign(len, L'\0'); MultiByteToWideChar(CP_UTF8, 0, str.data(), str.size(), &m_sys[0], len); } - inline SystemStringView sys_str() const { return m_sys; } - inline const SystemChar* c_str() const { return m_sys.c_str(); } + SystemStringView sys_str() const { return m_sys; } + const SystemChar* c_str() const { return m_sys.c_str(); } }; #ifndef _SYS_STR #define _SYS_STR(val) L##val @@ -124,16 +124,16 @@ class SystemUTF8Conv { public: explicit SystemUTF8Conv(SystemStringView str) : m_utf8(str) {} - inline std::string_view utf8_str() const { return m_utf8; } - inline const char* c_str() const { return m_utf8.data(); } + std::string_view utf8_str() const { return m_utf8; } + const char* c_str() const { return m_utf8.data(); } }; class SystemStringConv { SystemStringView m_sys; public: explicit SystemStringConv(std::string_view str) : m_sys(str) {} - inline SystemStringView sys_str() const { return m_sys; } - inline const SystemChar* c_str() const { return m_sys.data(); } + SystemStringView sys_str() const { return m_sys; } + const SystemChar* c_str() const { return m_sys.data(); } }; #ifndef _SYS_STR #define _SYS_STR(val) val From f443b60bdeec6de869f06d10402cad65e4a599eb Mon Sep 17 00:00:00 2001 From: Lioncash Date: Thu, 5 Sep 2019 21:51:17 -0400 Subject: [PATCH 2/8] DiscBase: Mark member functions as const where applicable These don't modify instance state, so they can be marked as const. --- include/nod/DiscBase.hpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/include/nod/DiscBase.hpp b/include/nod/DiscBase.hpp index a2d80b2..4448217 100644 --- a/include/nod/DiscBase.hpp +++ b/include/nod/DiscBase.hpp @@ -207,8 +207,8 @@ public: using pointer = Node*; using reference = Node&; - bool operator!=(const DirectoryIterator& other) { return m_it != other.m_it; } - bool operator==(const DirectoryIterator& other) { return m_it == other.m_it; } + bool operator==(const DirectoryIterator& other) const { return m_it == other.m_it; } + bool operator!=(const DirectoryIterator& other) const { return !operator==(other); } DirectoryIterator& operator++() { if (m_it->m_kind == Kind::Directory) m_it = m_it->rawEnd(); @@ -217,7 +217,9 @@ public: return *this; } Node& operator*() { return *m_it; } + const Node& operator*() const { return *m_it; } Node* operator->() { return &*m_it; } + const Node* operator->() const { return &*m_it; } }; DirectoryIterator begin() const { return DirectoryIterator(m_childrenBegin); } DirectoryIterator end() const { return DirectoryIterator(m_childrenEnd); } From 4bba7af2c2cc2c6e0a457e6b98c6fe3fb304d099 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Thu, 5 Sep 2019 21:52:40 -0400 Subject: [PATCH 3/8] DiscBase: std::move std::function instance std::function isn't a trivial type (it's allowed to heap allocate to store any necessary captures), so we can move it in the constructor to avoid any unnecessary allocations --- include/nod/DiscBase.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/nod/DiscBase.hpp b/include/nod/DiscBase.hpp index 4448217..87ac776 100644 --- a/include/nod/DiscBase.hpp +++ b/include/nod/DiscBase.hpp @@ -457,7 +457,7 @@ public: : m_outPath(outPath) , m_fileIO(NewFileIO(outPath, discCapacity)) , m_discCapacity(discCapacity) - , m_progressCB(progressCB) {} + , m_progressCB(std::move(progressCB)) {} DiscBuilderBase(DiscBuilderBase&&) = default; DiscBuilderBase& operator=(DiscBuilderBase&&) = default; From 7ddff919c1b020cc729b49db67f820fea033c09c Mon Sep 17 00:00:00 2001 From: Lioncash Date: Thu, 5 Sep 2019 21:55:56 -0400 Subject: [PATCH 4/8] DiscBase: Prevent potential off-by-one case within getPartitonNodeCount() We should be comparing with >= instead of >. --- include/nod/DiscBase.hpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/include/nod/DiscBase.hpp b/include/nod/DiscBase.hpp index 87ac776..f5d54be 100644 --- a/include/nod/DiscBase.hpp +++ b/include/nod/DiscBase.hpp @@ -351,8 +351,9 @@ public: const Header& getHeader() const { return m_header; } const IDiscIO& getDiscIO() const { return *m_discIO; } size_t getPartitonNodeCount(size_t partition = 0) const { - if (partition > m_partitions.size()) + if (partition >= m_partitions.size()) { return -1; + } return m_partitions[partition]->getNodeCount(); } From f5c3cbdcd7321e9335f2a10c4df6f53b3af3c999 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Thu, 5 Sep 2019 21:57:41 -0400 Subject: [PATCH 5/8] DiscBase: Amend typo within getPartitonNodeCount() name Adds an extra 'i' to correct a typo. --- include/nod/DiscBase.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/nod/DiscBase.hpp b/include/nod/DiscBase.hpp index f5d54be..b666f25 100644 --- a/include/nod/DiscBase.hpp +++ b/include/nod/DiscBase.hpp @@ -350,7 +350,7 @@ public: const Header& getHeader() const { return m_header; } const IDiscIO& getDiscIO() const { return *m_discIO; } - size_t getPartitonNodeCount(size_t partition = 0) const { + size_t getPartitionNodeCount(size_t partition = 0) const { if (partition >= m_partitions.size()) { return -1; } From 091262ace105d49276b5f4bafba0b5b8c1f0c645 Mon Sep 17 00:00:00 2001 From: Henrique Gemignani Passos Lima Date: Sat, 21 Jul 2018 06:03:59 +0200 Subject: [PATCH 6/8] Use std::optional for CalculateTotalSizeBuild --- driver/main.cpp | 8 ++++---- include/nod/DiscBase.hpp | 5 +++-- include/nod/DiscGCN.hpp | 4 ++-- include/nod/DiscWii.hpp | 4 ++-- lib/DiscBase.cpp | 14 +++++++------- lib/DiscGCN.cpp | 28 ++++++++++++++-------------- lib/DiscWii.cpp | 32 ++++++++++++++++---------------- 7 files changed, 48 insertions(+), 47 deletions(-) diff --git a/driver/main.cpp b/driver/main.cpp index cd13144..2f62443 100644 --- a/driver/main.cpp +++ b/driver/main.cpp @@ -96,7 +96,7 @@ int main(int argc, char* argv[]) return 1; } - if (nod::DiscBuilderGCN::CalculateTotalSizeRequired(argv[2]) == UINT64_MAX) + if (!nod::DiscBuilderGCN::CalculateTotalSizeRequired(argv[2])) return 1; nod::EBuildResult ret; @@ -123,7 +123,7 @@ int main(int argc, char* argv[]) } bool dual = false; - if (nod::DiscBuilderWii::CalculateTotalSizeRequired(argv[2], dual) == UINT64_MAX) + if (!nod::DiscBuilderWii::CalculateTotalSizeRequired(argv[2], dual)) return 1; nod::EBuildResult ret; @@ -164,7 +164,7 @@ int main(int argc, char* argv[]) return 1; } - if (nod::DiscMergerGCN::CalculateTotalSizeRequired(static_cast(*disc), argv[2]) == UINT64_MAX) + if (!nod::DiscMergerGCN::CalculateTotalSizeRequired(static_cast(*disc), argv[2])) return 1; nod::EBuildResult ret; @@ -206,7 +206,7 @@ int main(int argc, char* argv[]) } bool dual = false; - if (nod::DiscMergerWii::CalculateTotalSizeRequired(static_cast(*disc), argv[2], dual) == UINT64_MAX) + if (!nod::DiscMergerWii::CalculateTotalSizeRequired(static_cast(*disc), argv[2], dual)) return 1; nod::EBuildResult ret; diff --git a/include/nod/DiscBase.hpp b/include/nod/DiscBase.hpp index b666f25..7503881 100644 --- a/include/nod/DiscBase.hpp +++ b/include/nod/DiscBase.hpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include @@ -425,9 +426,9 @@ public: : m_parent(parent), m_kind(kind), m_isWii(isWii) {} virtual std::unique_ptr beginWriteStream(uint64_t offset) = 0; bool buildFromDirectory(IPartWriteStream& ws, SystemStringView dirIn); - static uint64_t CalculateTotalSizeBuild(SystemStringView dirIn, PartitionKind kind, bool isWii); + static std::optional CalculateTotalSizeBuild(SystemStringView dirIn, PartitionKind kind, bool isWii); bool mergeFromDirectory(IPartWriteStream& ws, const IPartition* partIn, SystemStringView dirIn); - static uint64_t CalculateTotalSizeMerge(const IPartition* partIn, SystemStringView dirIn); + static std::optional CalculateTotalSizeMerge(const IPartition* partIn, SystemStringView dirIn); }; protected: diff --git a/include/nod/DiscGCN.hpp b/include/nod/DiscGCN.hpp index 040070c..a16b897 100644 --- a/include/nod/DiscGCN.hpp +++ b/include/nod/DiscGCN.hpp @@ -20,7 +20,7 @@ class DiscBuilderGCN : public DiscBuilderBase { public: DiscBuilderGCN(SystemStringView outPath, FProgress progressCB); EBuildResult buildFromDirectory(SystemStringView dirIn); - static uint64_t CalculateTotalSizeRequired(SystemStringView dirIn); + static std::optional CalculateTotalSizeRequired(SystemStringView dirIn); }; class DiscMergerGCN { @@ -30,7 +30,7 @@ class DiscMergerGCN { public: DiscMergerGCN(SystemStringView outPath, DiscGCN& sourceDisc, FProgress progressCB); EBuildResult mergeFromDirectory(SystemStringView dirIn); - static uint64_t CalculateTotalSizeRequired(DiscGCN& sourceDisc, SystemStringView dirIn); + static std::optional CalculateTotalSizeRequired(DiscGCN& sourceDisc, SystemStringView dirIn); }; } // namespace nod diff --git a/include/nod/DiscWii.hpp b/include/nod/DiscWii.hpp index 8ef8d5a..ee9abc4 100644 --- a/include/nod/DiscWii.hpp +++ b/include/nod/DiscWii.hpp @@ -16,7 +16,7 @@ class DiscBuilderWii : public DiscBuilderBase { public: DiscBuilderWii(SystemStringView outPath, bool dualLayer, FProgress progressCB); EBuildResult buildFromDirectory(SystemStringView dirIn); - static uint64_t CalculateTotalSizeRequired(SystemStringView dirIn, bool& dualLayer); + static std::optional CalculateTotalSizeRequired(SystemStringView dirIn, bool& dualLayer); }; class DiscMergerWii { @@ -26,7 +26,7 @@ class DiscMergerWii { public: DiscMergerWii(SystemStringView outPath, DiscWii& sourceDisc, bool dualLayer, FProgress progressCB); EBuildResult mergeFromDirectory(SystemStringView dirIn); - static uint64_t CalculateTotalSizeRequired(DiscWii& sourceDisc, SystemStringView dirIn, bool& dualLayer); + static std::optional CalculateTotalSizeRequired(DiscWii& sourceDisc, SystemStringView dirIn, bool& dualLayer); }; } // namespace nod diff --git a/lib/DiscBase.cpp b/lib/DiscBase.cpp index 296015d..75e5c3b 100644 --- a/lib/DiscBase.cpp +++ b/lib/DiscBase.cpp @@ -769,8 +769,8 @@ bool DiscBuilderBase::PartitionBuilderBase::buildFromDirectory(IPartWriteStream& return true; } -uint64_t DiscBuilderBase::PartitionBuilderBase::CalculateTotalSizeBuild(SystemStringView dirIn, PartitionKind kind, - bool isWii) { +std::optional DiscBuilderBase::PartitionBuilderBase::CalculateTotalSizeBuild(SystemStringView dirIn, + PartitionKind kind, bool isWii) { SystemString dirStr(dirIn); SystemString basePath = isWii ? dirStr + _SYS_STR("/") + getKindString(kind) : dirStr; SystemString dolIn = basePath + _SYS_STR("/sys/main.dol"); @@ -779,11 +779,11 @@ uint64_t DiscBuilderBase::PartitionBuilderBase::CalculateTotalSizeBuild(SystemSt Sstat dolStat; if (Stat(dolIn.c_str(), &dolStat)) { LogModule.report(logvisor::Error, fmt(_SYS_STR("unable to stat {}")), dolIn); - return UINT64_MAX; + return std::nullopt; } uint64_t totalSz = ROUND_UP_32(dolStat.st_size); if (!RecursiveCalculateTotalSize(totalSz, nullptr, filesIn.c_str())) - return UINT64_MAX; + return std::nullopt; return totalSz; } @@ -843,15 +843,15 @@ bool DiscBuilderBase::PartitionBuilderBase::mergeFromDirectory(IPartWriteStream& return true; } -uint64_t DiscBuilderBase::PartitionBuilderBase::CalculateTotalSizeMerge(const IPartition* partIn, - SystemStringView dirIn) { +std::optional DiscBuilderBase::PartitionBuilderBase::CalculateTotalSizeMerge(const IPartition* partIn, + SystemStringView dirIn) { SystemString dirStr(dirIn); SystemString basePath = partIn->isWii() ? dirStr + _SYS_STR("/") + getKindString(partIn->getKind()) : dirStr; SystemString filesIn = basePath + _SYS_STR("/files"); uint64_t totalSz = ROUND_UP_32(partIn->getDOLSize()); if (!RecursiveCalculateTotalSize(totalSz, &partIn->getFSTRoot(), filesIn.c_str())) - return UINT64_MAX; + return std::nullopt; return totalSz; } diff --git a/lib/DiscGCN.cpp b/lib/DiscGCN.cpp index ebe0dbc..22bd82d 100644 --- a/lib/DiscGCN.cpp +++ b/lib/DiscGCN.cpp @@ -372,14 +372,14 @@ EBuildResult DiscBuilderGCN::buildFromDirectory(SystemStringView dirIn) { return pb.buildFromDirectory(dirIn) ? EBuildResult::Success : EBuildResult::Failed; } -uint64_t DiscBuilderGCN::CalculateTotalSizeRequired(SystemStringView dirIn) { - uint64_t sz = DiscBuilderBase::PartitionBuilderBase::CalculateTotalSizeBuild(dirIn, PartitionKind::Data, false); - if (sz == UINT64_MAX) - return UINT64_MAX; - sz += 0x30000; +std::optional DiscBuilderGCN::CalculateTotalSizeRequired(SystemStringView dirIn) { + std::optional sz = DiscBuilderBase::PartitionBuilderBase::CalculateTotalSizeBuild(dirIn, PartitionKind::Data, false); + if (!sz) + return sz; + *sz += 0x30000; if (sz > 0x57058000) { - LogModule.report(logvisor::Error, fmt(_SYS_STR("disc capacity exceeded [{} / {}]")), sz, 0x57058000); - return UINT64_MAX; + LogModule.report(logvisor::Error, fmt(_SYS_STR("disc capacity exceeded [{} / {}]")), *sz, 0x57058000); + return std::nullopt; } return sz; } @@ -416,14 +416,14 @@ EBuildResult DiscMergerGCN::mergeFromDirectory(SystemStringView dirIn) { : EBuildResult::Failed; } -uint64_t DiscMergerGCN::CalculateTotalSizeRequired(DiscGCN& sourceDisc, SystemStringView dirIn) { - uint64_t sz = DiscBuilderBase::PartitionBuilderBase::CalculateTotalSizeMerge(sourceDisc.getDataPartition(), dirIn); - if (sz == UINT64_MAX) - return UINT64_MAX; - sz += 0x30000; +std::optional DiscMergerGCN::CalculateTotalSizeRequired(DiscGCN& sourceDisc, SystemStringView dirIn) { + std::optional sz = DiscBuilderBase::PartitionBuilderBase::CalculateTotalSizeMerge(sourceDisc.getDataPartition(), dirIn); + if (!sz) + return std::nullopt; + *sz += 0x30000; if (sz > 0x57058000) { - LogModule.report(logvisor::Error, fmt(_SYS_STR("disc capacity exceeded [{} / {}]")), sz, 0x57058000); - return -1; + LogModule.report(logvisor::Error, fmt(_SYS_STR("disc capacity exceeded [{} / {}]")), *sz, 0x57058000); + return std::nullopt; } return sz; } diff --git a/lib/DiscWii.cpp b/lib/DiscWii.cpp index 0bf17ef..0b525b8 100644 --- a/lib/DiscWii.cpp +++ b/lib/DiscWii.cpp @@ -1229,19 +1229,19 @@ EBuildResult DiscBuilderWii::buildFromDirectory(SystemStringView dirIn) { return EBuildResult::Success; } -uint64_t DiscBuilderWii::CalculateTotalSizeRequired(SystemStringView dirIn, bool& dualLayer) { - uint64_t sz = DiscBuilderBase::PartitionBuilderBase::CalculateTotalSizeBuild(dirIn, PartitionKind::Data, true); - if (sz == UINT64_MAX) - return UINT64_MAX; - auto szDiv = std::lldiv(sz, 0x1F0000); +std::optional DiscBuilderWii::CalculateTotalSizeRequired(SystemStringView dirIn, bool& dualLayer) { + std::optional sz = DiscBuilderBase::PartitionBuilderBase::CalculateTotalSizeBuild(dirIn, PartitionKind::Data, true); + if (!sz) + return sz; + auto szDiv = std::lldiv(*sz, 0x1F0000); if (szDiv.rem) ++szDiv.quot; sz = szDiv.quot * 0x200000; - sz += 0x200000; + *sz += 0x200000; dualLayer = (sz > 0x118240000); if (sz > 0x1FB4E0000) { - LogModule.report(logvisor::Error, fmt(_SYS_STR("disc capacity exceeded [{} / {}]")), sz, 0x1FB4E0000); - return UINT64_MAX; + LogModule.report(logvisor::Error, fmt(_SYS_STR("disc capacity exceeded [{} / {}]")), *sz, 0x1FB4E0000); + return std::nullopt; } return sz; } @@ -1336,19 +1336,19 @@ EBuildResult DiscMergerWii::mergeFromDirectory(SystemStringView dirIn) { return EBuildResult::Success; } -uint64_t DiscMergerWii::CalculateTotalSizeRequired(DiscWii& sourceDisc, SystemStringView dirIn, bool& dualLayer) { - uint64_t sz = DiscBuilderBase::PartitionBuilderBase::CalculateTotalSizeMerge(sourceDisc.getDataPartition(), dirIn); - if (sz == UINT64_MAX) - return UINT64_MAX; - auto szDiv = std::lldiv(sz, 0x1F0000); +std::optional DiscMergerWii::CalculateTotalSizeRequired(DiscWii& sourceDisc, SystemStringView dirIn, bool& dualLayer) { + std::optional sz = DiscBuilderBase::PartitionBuilderBase::CalculateTotalSizeMerge(sourceDisc.getDataPartition(), dirIn); + if (!sz) + return std::nullopt; + auto szDiv = std::lldiv(*sz, 0x1F0000); if (szDiv.rem) ++szDiv.quot; sz = szDiv.quot * 0x200000; - sz += 0x200000; + *sz += 0x200000; dualLayer = (sz > 0x118240000); if (sz > 0x1FB4E0000) { - LogModule.report(logvisor::Error, fmt(_SYS_STR("disc capacity exceeded [{} / {}]")), sz, 0x1FB4E0000); - return UINT64_MAX; + LogModule.report(logvisor::Error, fmt(_SYS_STR("disc capacity exceeded [{} / {}]")), *sz, 0x1FB4E0000); + return std::nullopt; } return sz; } From d65890994867736b29c5df97020f77f85be269ea Mon Sep 17 00:00:00 2001 From: Phillip Stephens Date: Fri, 6 Sep 2019 23:31:44 -0700 Subject: [PATCH 7/8] Update athena --- logvisor | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/logvisor b/logvisor index f623ace..8c2e711 160000 --- a/logvisor +++ b/logvisor @@ -1 +1 @@ -Subproject commit f623ace3b4620c56722a1460ff2d9db61621f659 +Subproject commit 8c2e7113629f49f4eb1185af92f770f0bffaf85e From 221bc7c7f2e25cd5e90c6b0fc595fbda0711d029 Mon Sep 17 00:00:00 2001 From: Lioncash Date: Sun, 8 Sep 2019 17:26:51 -0400 Subject: [PATCH 8/8] General: Be explicit about athena's SeekOrigin type Allows this code to function if the enum is turned into an enum class. --- include/nod/IDiscIO.hpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/include/nod/IDiscIO.hpp b/include/nod/IDiscIO.hpp index 732f567..2999597 100644 --- a/include/nod/IDiscIO.hpp +++ b/include/nod/IDiscIO.hpp @@ -49,10 +49,11 @@ public: AthenaPartReadStream(std::unique_ptr&& rs) : m_rs(std::move(rs)) {} void seek(atInt64 off, athena::SeekOrigin origin) override { - if (origin == athena::Begin) + if (origin == athena::SeekOrigin::Begin) { m_rs->seek(off, SEEK_SET); - else if (origin == athena::Current) + } else if (origin == athena::SeekOrigin::Current) { m_rs->seek(off, SEEK_CUR); + } } atUint64 position() const override { return m_rs->position(); } atUint64 length() const override { return 0; }