@ -39,6 +39,41 @@ ConcatenatedVfsFile::ConcatenatedVfsFile(std::map<u64, VirtualFile> files_, std:
ConcatenatedVfsFile : : ~ ConcatenatedVfsFile ( ) = default ;
VirtualFile ConcatenatedVfsFile : : MakeConcatenatedFile ( std : : vector < VirtualFile > files ,
std : : string name ) {
if ( files . empty ( ) )
return nullptr ;
if ( files . size ( ) = = 1 )
return files [ 0 ] ;
return std : : shared_ptr < VfsFile > ( new ConcatenatedVfsFile ( std : : move ( files ) , std : : move ( name ) ) ) ;
}
VirtualFile ConcatenatedVfsFile : : MakeConcatenatedFile ( u8 filler_byte ,
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 ) ) ) ;
}
std : : string ConcatenatedVfsFile : : GetName ( ) const {
if ( files . empty ( ) )
return " " ;
@ -101,36 +136,4 @@ bool ConcatenatedVfsFile::Rename(std::string_view name) {
return false ;
}
VirtualFile ConcatenateFiles ( std : : vector < VirtualFile > files , std : : string name ) {
if ( files . empty ( ) )
return nullptr ;
if ( files . size ( ) = = 1 )
return files [ 0 ] ;
return std : : shared_ptr < VfsFile > ( new ConcatenatedVfsFile ( std : : move ( files ) , std : : move ( name ) ) ) ;
}
VirtualFile ConcatenateFiles ( u8 filler_byte , 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 ) ) ) ;
}
} // namespace FileSys