r201635 - Add an OverlayFileSystem class

Dmitri Gribenko gribozavr at gmail.com
Wed Feb 19 02:03:03 PST 2014


On Wed, Feb 19, 2014 at 3:29 AM, Ben Langmuir <blangmuir at apple.com> wrote:
> Author: benlangmuir
> Date: Tue Feb 18 21:29:17 2014
> New Revision: 201635
>
> URL: http://llvm.org/viewvc/llvm-project?rev=201635&view=rev
> Log:
> Add an OverlayFileSystem class
>
> Provides a way to merge multiple vfs::FileSystem objects into a single
> filesystem.
>
> Added:
>     cfe/trunk/unittests/Basic/VirtualFileSystemTest.cpp
> Modified:
>     cfe/trunk/include/clang/Basic/VirtualFileSystem.h
>     cfe/trunk/lib/Basic/VirtualFileSystem.cpp
>     cfe/trunk/unittests/Basic/CMakeLists.txt
>
> Modified: cfe/trunk/include/clang/Basic/VirtualFileSystem.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/VirtualFileSystem.h?rev=201635&r1=201634&r2=201635&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Basic/VirtualFileSystem.h (original)
> +++ cfe/trunk/include/clang/Basic/VirtualFileSystem.h Tue Feb 18 21:29:17 2014
> @@ -122,6 +122,42 @@ public:
>  /// the operating system.
>  llvm::IntrusiveRefCntPtr<FileSystem> getRealFileSystem();
>
> +/// \brief A file system that allows overlaying one \p AbstractFileSystem on top
> +/// of another.
> +///
> +/// Consists of a stack of >=1 \p FileSytem objects, which are treated as being
> +/// one merged file system. When there is a directory that exists in more than
> +/// one file system, the \p OverlayFileSystem contains a directory containing
> +/// the union of their contents.  The attributes (permissions, etc.) of the
> +/// top-most (most recently added) directory are used.  When there is a file
> +/// that exists in more than one file system, the file in the top-most file
> +/// system overrides the other(s).
> +class OverlayFileSystem : public FileSystem {
> +  typedef llvm::SmallVector<llvm::IntrusiveRefCntPtr<FileSystem>, 1>
> +    FileSystemList;
> +  typedef FileSystemList::reverse_iterator iterator;
> +
> +  /// \brief The stack of file systems, implemented as a list in order of
> +  /// their addition.
> +  FileSystemList FSList;
> +
> +  /// \brief Get an iterator pointing to the most recently added file system.
> +  iterator overlays_begin() { return FSList.rbegin(); }
> +
> +  /// \brief Get an iterator pointing one-past the least recently added file
> +  /// system.
> +  iterator overlays_end() { return FSList.rend(); }
> +
> +public:
> +  OverlayFileSystem(llvm::IntrusiveRefCntPtr<FileSystem> Base);
> +  /// \brief Pushes a file system on top of the stack.
> +  void pushOverlay(llvm::IntrusiveRefCntPtr<FileSystem> FS);
> +
> +  llvm::ErrorOr<Status> status(const llvm::Twine &Path) LLVM_OVERRIDE;
> +  llvm::error_code openFileForRead(const llvm::Twine &Path,
> +                                   llvm::OwningPtr<File> &Result) LLVM_OVERRIDE;

You can drop qualifiers on SmallVector, OwningPtr, Twine and
IntrusiveRefCntPtr if you #include "clang/Basic/LLVM.h".

> +TEST(VirtualFileSystemTest, status_queries) {

We usually name gtest test cases in camel case as well.

Dmitri

-- 
main(i,j){for(i=2;;i++){for(j=2;j<i;j++){if(!(i%j)){j=0;break;}}if
(j){printf("%d\n",i);}}} /*Dmitri Gribenko <gribozavr at gmail.com>*/



More information about the cfe-commits mailing list