10 template<
typename Ptr> [[nodiscard]]
const std::string&
operator()(
const Ptr& p)
const {
15 GetURLFromDecompressed,
XXHasher> decompressCache;
19 : file(std::move(file_))
26 auto it = decompressCache.find(
getURL());
27 assert(it !=
end(decompressCache));
28 assert(it->get() == decompressed);
30 if ((*it)->useCount == 0) {
32 decompressCache.erase(it);
37 void CompressedFileAdapter::decompress()
39 if (decompressed)
return;
41 const std::string& url =
getURL();
42 auto it = decompressCache.find(url);
43 if (it ==
end(decompressCache)) {
44 auto d = std::make_unique<Decompressed>();
45 decompress(*file, *d);
48 it = decompressCache.insert_noDuplicateCheck(std::move(d));
51 decompressed = it->get();
60 if (decompressed->
size < (pos + num)) {
63 const auto& buf = decompressed->
buf;
64 memcpy(buffer, buf.data() + pos, num);
70 throw FileException(
"Writing to compressed files not yet supported");
76 return { decompressed->
buf.
data(), decompressed->
size };
87 return decompressed->
size;
102 throw FileException(
"Truncating compressed files not yet supported.");
112 return file ? file->getURL() : decompressed->
cachedURL;
128 return file ? file->getModificationDate()
std::string_view getOriginalName() final
virtual void decompress(FileBase &file, Decompressed &decompressed)=0
std::span< const uint8_t > mmap() final
void write(const void *buffer, size_t num) final
void truncate(size_t size) final
bool isReadOnly() const final
~CompressedFileAdapter() override
const std::string & getURL() const final
CompressedFileAdapter(std::unique_ptr< FileBase > file)
void seek(size_t pos) final
time_t getModificationDate() final
void read(void *buffer, size_t num) final
const T * data() const
Returns pointer to the start of the memory buffer.
This file implemented 3 utility functions:
time_t cachedModificationDate
const std::string & operator()(const Ptr &p) const
constexpr auto end(const zstring_view &x)