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
This commit is contained in:
Ben Langmuir
2014-06-25 20:25:40 +00:00
parent 8b91d365dd
commit 7c9f6c86c9
3 changed files with 168 additions and 8 deletions

View File

@@ -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;
}