diff options
| author | Tres Walsh <tres.walsh@mnmlstc.com> | 2015-01-11 12:46:22 -0800 |
|---|---|---|
| committer | Tres Walsh <tres.walsh@mnmlstc.com> | 2015-01-11 13:42:50 -0800 |
| commit | 9e541f6d2deb24c31c644b7556123279599beb1b (patch) | |
| tree | e5431dc0c317f1f291ebdad4f6ee1ec9188bff32 /Source/Core/DiscIO/FileSystemGCWii.cpp | |
| parent | 90c6ebfd86bb08d3426a390dfa94433a6e3dc024 (diff) | |
Reduce number of allocations in CFileSystemGCWii::BuildFilenames
Modify SFileInfo to use a default move constructor, and no copy constructor.
Modify SFileInfo to use member initializers.
Diffstat (limited to 'Source/Core/DiscIO/FileSystemGCWii.cpp')
| -rw-r--r-- | Source/Core/DiscIO/FileSystemGCWii.cpp | 68 |
1 files changed, 35 insertions, 33 deletions
diff --git a/Source/Core/DiscIO/FileSystemGCWii.cpp b/Source/Core/DiscIO/FileSystemGCWii.cpp index f9b1fa10e3..c94dffe6c2 100644 --- a/Source/Core/DiscIO/FileSystemGCWii.cpp +++ b/Source/Core/DiscIO/FileSystemGCWii.cpp @@ -206,8 +206,7 @@ u32 CFileSystemGCWii::Read32(u64 _Offset) const std::string CFileSystemGCWii::GetStringFromOffset(u64 _Offset) const { - std::string data; - data.resize(255); + std::string data(255, 0x00); m_rVolume->Read(_Offset, data.size(), (u8*)&data[0], m_Wii); data.erase(std::find(data.begin(), data.end(), 0x00), data.end()); @@ -263,40 +262,40 @@ bool CFileSystemGCWii::DetectFileSystem() void CFileSystemGCWii::InitFileSystem() { m_Initialized = true; + u32 const shift = GetOffsetShift(); // read the whole FST - u64 FSTOffset = (u64)Read32(0x424) << GetOffsetShift(); + u64 FSTOffset = static_cast<u64>(Read32(0x424)) << shift; // u32 FSTSize = Read32(0x428); // u32 FSTMaxSize = Read32(0x42C); // read all fileinfos - SFileInfo Root; - Root.m_NameOffset = Read32(FSTOffset + 0x0); - Root.m_Offset = (u64)Read32(FSTOffset + 0x4) << GetOffsetShift(); - Root.m_FileSize = Read32(FSTOffset + 0x8); - - if (Root.IsDirectory()) + SFileInfo Root { - if (m_FileInfoVector.size()) - PanicAlert("Wtf?"); - u64 NameTableOffset = FSTOffset; + Read32(FSTOffset + 0x0), + static_cast<u64>(FSTOffset + 0x4) << shift, + Read32(FSTOffset + 0x8) + }; - m_FileInfoVector.reserve((unsigned int)Root.m_FileSize); - for (u32 i = 0; i < Root.m_FileSize; i++) - { - SFileInfo sfi; - u64 Offset = FSTOffset + (i * 0xC); - sfi.m_NameOffset = Read32(Offset + 0x0); - sfi.m_Offset = (u64)Read32(Offset + 0x4) << GetOffsetShift(); - sfi.m_FileSize = Read32(Offset + 0x8); - - m_FileInfoVector.push_back(sfi); - NameTableOffset += 0xC; - } + if (!Root.IsDirectory()) { return; } - BuildFilenames(1, m_FileInfoVector.size(), "", NameTableOffset); + if (m_FileInfoVector.size()) + PanicAlert("Wtf?"); + u64 NameTableOffset = FSTOffset; + + m_FileInfoVector.reserve((size_t)Root.m_FileSize); + for (u32 i = 0; i < Root.m_FileSize; i++) + { + u64 const Offset = FSTOffset + (i * 0xC); + u64 const name_offset = Read32(Offset + 0x0); + u64 const offset = static_cast<u64>(Read32(Offset + 0x4)) << shift; + u64 const size = Read32(Offset + 0x8); + m_FileInfoVector.emplace_back(name_offset, offset, size); + NameTableOffset += 0xC; } + + BuildFilenames(1, m_FileInfoVector.size(), "", NameTableOffset); } size_t CFileSystemGCWii::BuildFilenames(const size_t _FirstIndex, const size_t _LastIndex, const std::string& _szDirectory, u64 _NameTableOffset) @@ -307,19 +306,22 @@ size_t CFileSystemGCWii::BuildFilenames(const size_t _FirstIndex, const size_t _ { SFileInfo& rFileInfo = m_FileInfoVector[CurrentIndex]; u64 const uOffset = _NameTableOffset + (rFileInfo.m_NameOffset & 0xFFFFFF); + std::string const offset_str { GetStringFromOffset(uOffset) }; + bool const is_dir = rFileInfo.IsDirectory(); + rFileInfo.m_FullPath.reserve(_szDirectory.size() + offset_str.size()); - rFileInfo.m_FullPath = _szDirectory + GetStringFromOffset(uOffset); + rFileInfo.m_FullPath.append(_szDirectory.data(), _szDirectory.size()) + .append(offset_str.data(), offset_str.size()) + .append("/", size_t(is_dir)); - // check next index - if (rFileInfo.IsDirectory()) - { - rFileInfo.m_FullPath += '/'; - CurrentIndex = BuildFilenames(CurrentIndex + 1, (size_t) rFileInfo.m_FileSize, rFileInfo.m_FullPath, _NameTableOffset); - } - else + if (!is_dir) { ++CurrentIndex; + continue; } + + // check next index + CurrentIndex = BuildFilenames(CurrentIndex + 1, (size_t) rFileInfo.m_FileSize, rFileInfo.m_FullPath, _NameTableOffset); } return CurrentIndex; |
