45 lines
		
	
	
		
			996 B
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			45 lines
		
	
	
		
			996 B
		
	
	
	
		
			C++
		
	
	
	
	
	
| #ifndef OSRM_UTIL_MMAP_TAR_HPP
 | |
| #define OSRM_UTIL_MMAP_TAR_HPP
 | |
| 
 | |
| #include "storage/tar.hpp"
 | |
| 
 | |
| #include "util/mmap_file.hpp"
 | |
| 
 | |
| #include <boost/iostreams/device/mapped_file.hpp>
 | |
| 
 | |
| #include <tuple>
 | |
| #include <unordered_map>
 | |
| 
 | |
| namespace osrm
 | |
| {
 | |
| namespace util
 | |
| {
 | |
| using DataRange = std::pair<const char *, const char *>;
 | |
| using DataMap = std::unordered_map<std::string, DataRange>;
 | |
| 
 | |
| inline DataMap mmapTarFile(const boost::filesystem::path &path,
 | |
|                            boost::iostreams::mapped_file_source ®ion)
 | |
| {
 | |
|     DataMap map;
 | |
| 
 | |
|     storage::tar::FileReader reader{path, storage::tar::FileReader::VerifyFingerprint};
 | |
| 
 | |
|     std::vector<storage::tar::FileReader::FileEntry> entries;
 | |
|     reader.List(std::back_inserter(entries));
 | |
| 
 | |
|     auto raw_file = mmapFile<char>(path, region);
 | |
| 
 | |
|     for (const auto &entry : entries)
 | |
|     {
 | |
|         auto begin = raw_file.data() + entry.offset;
 | |
|         auto end = begin + entry.size;
 | |
|         map[entry.name] = DataRange{begin, end};
 | |
|     }
 | |
| 
 | |
|     return map;
 | |
| }
 | |
| }
 | |
| }
 | |
| 
 | |
| #endif
 |