aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/Basic/VirtualFileSystem.cpp
diff options
context:
space:
mode:
authorBen Langmuir <blangmuir@apple.com>2014-06-25 20:25:40 +0000
committerBen Langmuir <blangmuir@apple.com>2014-06-25 20:25:40 +0000
commit7c9f6c86c9fcbc60f8701e3bae13d7a0cc294939 (patch)
tree23b99c51f83873a122f4ec3d541c244cb60a085a /clang/lib/Basic/VirtualFileSystem.cpp
parent8b91d365dd191c7c7ad3d50f6f97d847114e80c1 (diff)
downloadllvm-7c9f6c86c9fcbc60f8701e3bae13d7a0cc294939.zip
llvm-7c9f6c86c9fcbc60f8701e3bae13d7a0cc294939.tar.gz
llvm-7c9f6c86c9fcbc60f8701e3bae13d7a0cc294939.tar.bz2
Add vfs::recursive_directory_iterator
For now, this is only used by its unit tests. It is similar to the API in llvm::sys::fs::recursive_directory_iterator, but without some of the more complex features like requesting that the iterator not recurse into the next directory, for example. llvm-svn: 211732
Diffstat (limited to 'clang/lib/Basic/VirtualFileSystem.cpp')
-rw-r--r--clang/lib/Basic/VirtualFileSystem.cpp35
1 files changed, 35 insertions, 0 deletions
diff --git a/clang/lib/Basic/VirtualFileSystem.cpp b/clang/lib/Basic/VirtualFileSystem.cpp
index 253680e..3d5e1ad 100644
--- a/clang/lib/Basic/VirtualFileSystem.cpp
+++ b/clang/lib/Basic/VirtualFileSystem.cpp
@@ -1168,3 +1168,38 @@ std::error_code VFSFromYamlDirIterImpl::increment() {
}
return std::error_code();
}
+
+vfs::recursive_directory_iterator::recursive_directory_iterator(FileSystem &FS_,
+ const Twine &Path,
+ std::error_code &EC)
+ : FS(&FS_) {
+ directory_iterator I = FS->dir_begin(Path, EC);
+ if (!EC && I != directory_iterator()) {
+ State = std::make_shared<IterState>();
+ State->push(I);
+ }
+}
+
+vfs::recursive_directory_iterator &
+recursive_directory_iterator::increment(std::error_code &EC) {
+ assert(FS && State && !State->empty() && "incrementing past end");
+ assert(State->top()->isStatusKnown() && "non-canonical end iterator");
+ vfs::directory_iterator End;
+ if (State->top()->isDirectory()) {
+ vfs::directory_iterator I = FS->dir_begin(State->top()->getName(), EC);
+ if (EC)
+ return *this;
+ if (I != End) {
+ State->push(I);
+ return *this;
+ }
+ }
+
+ while (!State->empty() && State->top().increment(EC) == End)
+ State->pop();
+
+ if (State->empty())
+ State.reset(); // end iterator
+
+ return *this;
+} \ No newline at end of file