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:
@@ -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;
|
||||
}
|
||||
Reference in New Issue
Block a user