refs #12, added more tests to recursive directory iterator, fixed additional issue with pop().

This commit is contained in:
Steffen Schuemann 2019-05-04 08:47:41 +02:00
parent cce8c431c2
commit 5ea334899a
2 changed files with 65 additions and 19 deletions

View File

@ -4885,10 +4885,11 @@ GHC_INLINE void recursive_directory_iterator::pop(std::error_code& ec)
*this = recursive_directory_iterator(); *this = recursive_directory_iterator();
} }
else { else {
while (depth() && _impl->_dir_iter_stack.top() == directory_iterator()) { do {
_impl->_dir_iter_stack.pop(); _impl->_dir_iter_stack.pop();
_impl->_dir_iter_stack.top().increment(ec); _impl->_dir_iter_stack.top().increment(ec);
} }
while (depth() && _impl->_dir_iter_stack.top() == directory_iterator());
} }
} }

View File

@ -36,6 +36,7 @@
#include <functional> #include <functional>
#include <iomanip> #include <iomanip>
#include <iostream> #include <iostream>
#include <map>
#include <random> #include <random>
#include <sstream> #include <sstream>
#include <thread> #include <thread>
@ -1205,29 +1206,73 @@ TEST_CASE("30.10.14 class recursive_directory_iterator", "[filesystem][recursive
fs::recursive_directory_iterator rd5; fs::recursive_directory_iterator rd5;
rd5 = rd4; rd5 = rd4;
} }
/* {
if(1) { TemporaryDirectory t(TempOpt::change_path);
fs::path d = ".."; generateFile("a");
int maxDepth = 2; fs::create_directory("d1");
fs::recursive_directory_iterator dit(d); fs::create_directory("d1/d2");
std::cout << d << std::endl; generateFile("d1/b");
for(auto & f : dit) { generateFile("d1/c");
#if 1 generateFile("d1/d2/d");
if(dit.depth()<=maxDepth) { generateFile("e");
std::cout << dit.depth() << ": " << f.path() << std::endl; auto iter = fs::recursive_directory_iterator(".");
std::multimap<std::string, int> result;
while(iter != fs::recursive_directory_iterator()) {
result.insert(std::make_pair(iter->path().string(), iter.depth()));
++iter;
}
std::stringstream os;
for(auto p : result) {
os << "[" << p.first << "," << p.second << "],";
}
CHECK(os.str() == "[./a,0],[./d1,0],[./d1/b,1],[./d1/c,1],[./d1/d2,1],[./d1/d2/d,2],[./e,0],");
}
{
TemporaryDirectory t(TempOpt::change_path);
generateFile("a");
fs::create_directory("d1");
fs::create_directory("d1/d2");
generateFile("d1/d2/b");
generateFile("e");
auto iter = fs::recursive_directory_iterator(".");
std::multimap<std::string, int> result;
while(iter != fs::recursive_directory_iterator()) {
result.insert(std::make_pair(iter->path().string(), iter.depth()));
if(iter->path() == "./d1/d2") {
iter.disable_recursion_pending();
}
++iter;
}
std::stringstream os;
for(auto p : result) {
os << "[" << p.first << "," << p.second << "],";
}
CHECK(os.str() == "[./a,0],[./d1,0],[./d1/d2,1],[./e,0],");
}
{
TemporaryDirectory t(TempOpt::change_path);
generateFile("a");
fs::create_directory("d1");
fs::create_directory("d1/d2");
generateFile("d1/d2/b");
generateFile("e");
auto iter = fs::recursive_directory_iterator(".");
std::multimap<std::string, int> result;
while(iter != fs::recursive_directory_iterator()) {
result.insert(std::make_pair(iter->path().string(), iter.depth()));
if(iter->path() == "./d1/d2") {
iter.pop();
} }
else { else {
dit.pop(); ++iter;
}
#else
std::cout << dit.depth() << ": " << f.path() << std::endl;
if(dit.depth()>maxDepth) {
dit.disable_recursion_pending();
}
#endif
} }
} }
*/ std::stringstream os;
for(auto p : result) {
os << "[" << p.first << "," << p.second << "],";
}
CHECK(os.str() == "[./a,0],[./d1,0],[./d1/d2,1],[./e,0],");
}
} }
TEST_CASE("30.10.15.1 absolute", "[filesystem][operations][fs.op.absolute]") TEST_CASE("30.10.15.1 absolute", "[filesystem][operations][fs.op.absolute]")