OpenEnroth 73e68f7
|
#include <LowercaseFileSystem.h>
Public Member Functions | |
LowercaseFileSystem (FileSystem *base) | |
virtual | ~LowercaseFileSystem () |
void | refresh () |
Public Member Functions inherited from FileSystem | |
FileSystem ()=default | |
virtual | ~FileSystem ()=default |
bool | exists (std::string_view path) const |
bool | exists (FileSystemPathView path) const |
FileStat | stat (std::string_view path) const |
FileStat | stat (FileSystemPathView path) const |
std::vector< DirectoryEntry > | ls (std::string_view path) const |
std::vector< DirectoryEntry > | ls (FileSystemPathView path) const |
void | ls (std::string_view path, std::vector< DirectoryEntry > *entries) const |
void | ls (FileSystemPathView path, std::vector< DirectoryEntry > *entries) const |
Blob | read (std::string_view path) const |
Blob | read (FileSystemPathView path) const |
void | write (std::string_view path, const Blob &data) |
void | write (FileSystemPathView path, const Blob &data) |
std::unique_ptr< InputStream > | openForReading (std::string_view path) const |
std::unique_ptr< InputStream > | openForReading (FileSystemPathView path) const |
std::unique_ptr< OutputStream > | openForWriting (std::string_view path) |
std::unique_ptr< OutputStream > | openForWriting (FileSystemPathView path) |
void | rename (std::string_view srcPath, std::string_view dstPath) |
void | rename (FileSystemPathView srcPath, FileSystemPathView dstPath) |
bool | remove (std::string_view path) |
bool | remove (FileSystemPathView path) |
std::string | displayPath (std::string_view path) const |
std::string | displayPath (FileSystemPathView path) const |
Private Types | |
using | Node = FileSystemTrieNode< detail::LowercaseFileData > |
Private Member Functions | |
virtual bool | _exists (FileSystemPathView path) const override |
virtual FileStat | _stat (FileSystemPathView path) const override |
virtual void | _ls (FileSystemPathView path, std::vector< DirectoryEntry > *entries) const override |
virtual Blob | _read (FileSystemPathView path) const override |
virtual void | _write (FileSystemPathView path, const Blob &data) override |
virtual std::unique_ptr< InputStream > | _openForReading (FileSystemPathView path) const override |
virtual std::unique_ptr< OutputStream > | _openForWriting (FileSystemPathView path) override |
virtual void | _rename (FileSystemPathView srcPath, FileSystemPathView dstPath) override |
virtual bool | _remove (FileSystemPathView path) override |
virtual std::string | _displayPath (FileSystemPathView path) const override |
std::tuple< FileSystemPath, Node *, FileSystemPathView > | walk (FileSystemPathView path) const |
void | cacheLs (Node *node, FileSystemPathView basePath) const |
void | invalidateLs (Node *node) const |
void | cacheRemove (Node *node) const |
void | cacheInsert (Node *node, FileSystemPathView tail, FileType type) const |
FileSystemPath | locateForReading (FileSystemPathView path) const |
std::tuple< FileSystemPath, Node *, FileSystemPathView > | locateForWriting (FileSystemPathView path) |
Private Attributes | |
FileSystem * | _base = nullptr |
FileSystemTrie< detail::LowercaseFileData > | _trie |
Additional Inherited Members | |
Protected Types inherited from FileSystem | |
template<class T > | |
using | FileSystemTrieNode = detail::FileSystemTrieNode< T > |
template<class T > | |
using | FileSystemTrie = detail::FileSystemTrie< T > |
virtual bool | _exists (FileSystemPathView path) const =0 |
virtual FileStat | _stat (FileSystemPathView path) const =0 |
virtual void | _ls (FileSystemPathView path, std::vector< DirectoryEntry > *entries) const =0 |
virtual Blob | _read (FileSystemPathView path) const =0 |
virtual void | _write (FileSystemPathView path, const Blob &data)=0 |
virtual std::unique_ptr< InputStream > | _openForReading (FileSystemPathView path) const =0 |
virtual std::unique_ptr< OutputStream > | _openForWriting (FileSystemPathView path)=0 |
virtual void | _rename (FileSystemPathView srcPath, FileSystemPathView dstPath) |
virtual bool | _remove (FileSystemPathView path)=0 |
virtual std::string | _displayPath (FileSystemPathView path) const =0 |
Provides a lowercase view over another FileSystem
:
refresh
to clear cache.Some notes on why it is designed the way it is designed.
Previous iteration was a writeable FS that was always up to date with the underlying FS (was checking timestamps for all parents in each call). The code was messy, it was O(N)
on each call, and even after writing an implementation that actually worked, I hated it. Mostly because of the O(N)
- which led to a recursive implementation of FileSystem::rename
becoming O(N^2)
. It is possible to iron this out, but that would require to redo the FileSystem
interface & expose the Directory
abstraction directly. Which is just not worth it.
Next iteration was caching the whole file tree in constructor, but this was blowing up spectacularly when constructed for /
. Thus, we're now caching lazily.
The important point about the implementation is that there is no amplification of the number of calls into the underlying file system. Each of the methods in LowercaseFileSystem
calls into the underlying file system at most once.
|
private |
|
explicit |
|
virtualdefault |
|
overrideprivatevirtual |
Implements FileSystem.
|
overrideprivatevirtual |
Implements FileSystem.
|
overrideprivatevirtual |
Implements FileSystem.
|
overrideprivatevirtual |
Implements FileSystem.
|
overrideprivatevirtual |
Implements FileSystem.
|
overrideprivatevirtual |
Implements FileSystem.
|
overrideprivatevirtual |
Implements FileSystem.
|
overrideprivatevirtual |
Reimplemented from FileSystem.
|
overrideprivatevirtual |
Implements FileSystem.
|
overrideprivatevirtual |
Implements FileSystem.
|
private |
|
private |
|
private |
|
private |
|
private |
|
private |
void LowercaseFileSystem::refresh | ( | ) |
|
private |
|
private |
|
mutableprivate |