mirror of
				https://git.zaroz.cloud/nintendo-back-up/yuzu/yuzu-mainline.git
				synced 2025-03-21 01:53:15 +00:00 
			
		
		
		
	fsp_srv: Remove unnecessary std::vector construction in IDirectory's Read() function
We were using a second std::vector as a buffer to convert another std::vector's data into a byte sequence, however we can just use pointers to the original data and use them directly with WriteBuffer, which avoids copying the data at all into a separate std::vector. We simply cast the pointers to u8* (which is allowed by the standard, given std::uint8_t is an alias for unsigned char on platforms that we support).
This commit is contained in:
		
							parent
							
								
									f317080f40
								
							
						
					
					
						commit
						3e9b79e088
					
				@ -4,6 +4,7 @@
 | 
			
		||||
 | 
			
		||||
#include <cinttypes>
 | 
			
		||||
#include <cstring>
 | 
			
		||||
#include <iterator>
 | 
			
		||||
#include <string>
 | 
			
		||||
#include <utility>
 | 
			
		||||
#include <vector>
 | 
			
		||||
@ -229,23 +230,20 @@ private:
 | 
			
		||||
        LOG_DEBUG(Service_FS, "called, unk=0x{:X}", unk);
 | 
			
		||||
 | 
			
		||||
        // Calculate how many entries we can fit in the output buffer
 | 
			
		||||
        u64 count_entries = ctx.GetWriteBufferSize() / sizeof(FileSys::Entry);
 | 
			
		||||
        const u64 count_entries = ctx.GetWriteBufferSize() / sizeof(FileSys::Entry);
 | 
			
		||||
 | 
			
		||||
        // Cap at total number of entries.
 | 
			
		||||
        u64 actual_entries = std::min(count_entries, entries.size() - next_entry_index);
 | 
			
		||||
        const u64 actual_entries = std::min(count_entries, entries.size() - next_entry_index);
 | 
			
		||||
 | 
			
		||||
        // Read the data from the Directory backend
 | 
			
		||||
        std::vector<FileSys::Entry> entry_data(entries.begin() + next_entry_index,
 | 
			
		||||
                                               entries.begin() + next_entry_index + actual_entries);
 | 
			
		||||
        // Determine data start and end
 | 
			
		||||
        const auto* begin = reinterpret_cast<u8*>(entries.data() + next_entry_index);
 | 
			
		||||
        const auto* end = reinterpret_cast<u8*>(entries.data() + next_entry_index + actual_entries);
 | 
			
		||||
        const auto range_size = static_cast<std::size_t>(std::distance(begin, end));
 | 
			
		||||
 | 
			
		||||
        next_entry_index += actual_entries;
 | 
			
		||||
 | 
			
		||||
        // Convert the data into a byte array
 | 
			
		||||
        std::vector<u8> output(entry_data.size() * sizeof(FileSys::Entry));
 | 
			
		||||
        std::memcpy(output.data(), entry_data.data(), output.size());
 | 
			
		||||
 | 
			
		||||
        // Write the data to memory
 | 
			
		||||
        ctx.WriteBuffer(output);
 | 
			
		||||
        ctx.WriteBuffer(begin, range_size);
 | 
			
		||||
 | 
			
		||||
        IPC::ResponseBuilder rb{ctx, 4};
 | 
			
		||||
        rb.Push(RESULT_SUCCESS);
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user