Support/FileSystem: Implement recursive_directory_iterator and make

directory_iterator preserve InputIterator semantics on copy.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@146200 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Michael J. Spencer
2011-12-08 22:50:09 +00:00
parent c9b98ad7a7
commit a81ac8f2b5
5 changed files with 199 additions and 43 deletions

View File

@ -223,6 +223,57 @@ TEST_F(FileSystemTest, DirectoryIteration) {
error_code ec;
for (fs::directory_iterator i(".", ec), e; i != e; i.increment(ec))
ASSERT_NO_ERROR(ec);
// Create a known hierarchy to recurse over.
bool existed;
ASSERT_NO_ERROR(fs::create_directories(Twine(TestDirectory)
+ "/recursive/a0/aa1", existed));
ASSERT_NO_ERROR(fs::create_directories(Twine(TestDirectory)
+ "/recursive/a0/ab1", existed));
ASSERT_NO_ERROR(fs::create_directories(Twine(TestDirectory)
+ "/recursive/dontlookhere/da1", existed));
ASSERT_NO_ERROR(fs::create_directories(Twine(TestDirectory)
+ "/recursive/z0/za1", existed));
ASSERT_NO_ERROR(fs::create_directories(Twine(TestDirectory)
+ "/recursive/pop/p1", existed));
typedef std::vector<std::string> v_t;
v_t visited;
for (fs::recursive_directory_iterator i(Twine(TestDirectory)
+ "/recursive", ec), e; i != e; i.increment(ec)){
ASSERT_NO_ERROR(ec);
if (path::filename(i->path()) == "dontlookhere")
i.no_push();
if (path::filename(i->path()) == "p1")
i.pop();
visited.push_back(path::filename(i->path()));
}
v_t::const_iterator a0 = std::find(visited.begin(), visited.end(), "a0");
v_t::const_iterator aa1 = std::find(visited.begin(), visited.end(), "aa1");
v_t::const_iterator ab1 = std::find(visited.begin(), visited.end(), "ab1");
v_t::const_iterator dontlookhere = std::find(visited.begin(), visited.end(),
"dontlookhere");
v_t::const_iterator da1 = std::find(visited.begin(), visited.end(), "da1");
v_t::const_iterator z0 = std::find(visited.begin(), visited.end(), "z0");
v_t::const_iterator za1 = std::find(visited.begin(), visited.end(), "za1");
v_t::const_iterator pop = std::find(visited.begin(), visited.end(), "pop");
v_t::const_iterator p1 = std::find(visited.begin(), visited.end(), "p1");
// Make sure that each path was visited correctly.
ASSERT_NE(a0, visited.end());
ASSERT_NE(aa1, visited.end());
ASSERT_NE(ab1, visited.end());
ASSERT_NE(dontlookhere, visited.end());
ASSERT_EQ(da1, visited.end()); // Not visited.
ASSERT_NE(z0, visited.end());
ASSERT_NE(za1, visited.end());
ASSERT_NE(pop, visited.end());
ASSERT_EQ(p1, visited.end()); // Not visited.
// Make sure that parents were visited before children. No other ordering
// guarantees can be made across siblings.
ASSERT_LT(a0, aa1);
ASSERT_LT(a0, ab1);
ASSERT_LT(z0, za1);
}
TEST_F(FileSystemTest, Magic) {