@ -7,9 +7,7 @@
# include <map>
# include <memory>
# include <string_view>
# include <boost/container/flat_map.hpp>
# include "core/file_sys/vfs.h"
# include "core/file_sys/vfs_static.h"
namespace FileSys {
@ -17,9 +15,8 @@ namespace FileSys {
// read-only.
class ConcatenatedVfsFile : public VfsFile {
friend VirtualFile ConcatenateFiles ( std : : vector < VirtualFile > files , std : : string name ) ;
template < u8 filler_byte >
friend VirtualFile ConcatenateFiles ( std : : map < u64 , VirtualFile > files , std : : string name ) ;
friend VirtualFile ConcatenateFiles ( u8 filler_byte , std : : map < u64 , VirtualFile > files ,
std : : string name ) ;
ConcatenatedVfsFile ( std : : vector < VirtualFile > files , std : : string name ) ;
ConcatenatedVfsFile ( std : : map < u64 , VirtualFile > files , std : : string name ) ;
@ -47,29 +44,7 @@ private:
VirtualFile ConcatenateFiles ( std : : vector < VirtualFile > files , std : : string name ) ;
// Convenience function that turns a map of offsets to files into a concatenated file, filling gaps
// with template parameter.
template < u8 filler_byte >
VirtualFile ConcatenateFiles ( std : : map < u64 , VirtualFile > files , std : : string name ) {
if ( files . empty ( ) )
return nullptr ;
if ( files . size ( ) = = 1 )
return files . begin ( ) - > second ;
const auto last_valid = - - files . end ( ) ;
for ( auto iter = files . begin ( ) ; iter ! = last_valid ; ) {
const auto old = iter + + ;
if ( old - > first + old - > second - > GetSize ( ) ! = iter - > first ) {
files . emplace ( old - > first + old - > second - > GetSize ( ) ,
std : : make_shared < StaticVfsFile < filler_byte > > ( iter - > first - old - > first -
old - > second - > GetSize ( ) ) ) ;
}
}
// Ensure the map starts at offset 0 (start of file), otherwise pad to fill.
if ( files . begin ( ) - > first ! = 0 )
files . emplace ( 0 , std : : make_shared < StaticVfsFile < filler_byte > > ( files . begin ( ) - > first ) ) ;
return std : : shared_ptr < VfsFile > ( new ConcatenatedVfsFile ( std : : move ( files ) , std : : move ( name ) ) ) ;
}
// with a given filler byte.
VirtualFile ConcatenateFiles ( u8 filler_byte , std : : map < u64 , VirtualFile > files , std : : string name ) ;
} // namespace FileSys