|
@@ -179,13 +179,12 @@ recursive_directory_iterator::recursive_directory_iterator(const path& p,
|
|
void recursive_directory_iterator::__pop(error_code* ec)
|
|
void recursive_directory_iterator::__pop(error_code* ec)
|
|
{
|
|
{
|
|
_LIBCPP_ASSERT(__imp_, "Popping the end iterator");
|
|
_LIBCPP_ASSERT(__imp_, "Popping the end iterator");
|
|
|
|
+ if (ec) ec->clear();
|
|
__imp_->__stack_.pop();
|
|
__imp_->__stack_.pop();
|
|
- if (__imp_->__stack_.size() == 0) {
|
|
|
|
|
|
+ if (__imp_->__stack_.size() == 0)
|
|
__imp_.reset();
|
|
__imp_.reset();
|
|
- if (ec) ec->clear();
|
|
|
|
- } else {
|
|
|
|
|
|
+ else
|
|
__advance(ec);
|
|
__advance(ec);
|
|
- }
|
|
|
|
}
|
|
}
|
|
|
|
|
|
directory_options recursive_directory_iterator::options() const {
|
|
directory_options recursive_directory_iterator::options() const {
|
|
@@ -203,6 +202,7 @@ const directory_entry& recursive_directory_iterator::__deref() const {
|
|
recursive_directory_iterator&
|
|
recursive_directory_iterator&
|
|
recursive_directory_iterator::__increment(error_code *ec)
|
|
recursive_directory_iterator::__increment(error_code *ec)
|
|
{
|
|
{
|
|
|
|
+ if (ec) ec->clear();
|
|
if (recursion_pending()) {
|
|
if (recursion_pending()) {
|
|
if (__try_recursion(ec) || (ec && *ec))
|
|
if (__try_recursion(ec) || (ec && *ec))
|
|
return *this;
|
|
return *this;
|
|
@@ -213,22 +213,19 @@ recursive_directory_iterator::__increment(error_code *ec)
|
|
}
|
|
}
|
|
|
|
|
|
void recursive_directory_iterator::__advance(error_code* ec) {
|
|
void recursive_directory_iterator::__advance(error_code* ec) {
|
|
|
|
+ // REQUIRES: ec must be cleared before calling this function.
|
|
const directory_iterator end_it;
|
|
const directory_iterator end_it;
|
|
auto& stack = __imp_->__stack_;
|
|
auto& stack = __imp_->__stack_;
|
|
std::error_code m_ec;
|
|
std::error_code m_ec;
|
|
while (stack.size() > 0) {
|
|
while (stack.size() > 0) {
|
|
- if (stack.top().advance(m_ec)) {
|
|
|
|
- if (ec) ec->clear();
|
|
|
|
|
|
+ if (stack.top().advance(m_ec))
|
|
return;
|
|
return;
|
|
- }
|
|
|
|
if (m_ec) break;
|
|
if (m_ec) break;
|
|
stack.pop();
|
|
stack.pop();
|
|
}
|
|
}
|
|
__imp_.reset();
|
|
__imp_.reset();
|
|
if (m_ec)
|
|
if (m_ec)
|
|
set_or_throw(m_ec, ec, "recursive_directory_iterator::operator++()");
|
|
set_or_throw(m_ec, ec, "recursive_directory_iterator::operator++()");
|
|
- else if (ec)
|
|
|
|
- ec->clear();
|
|
|
|
}
|
|
}
|
|
|
|
|
|
bool recursive_directory_iterator::__try_recursion(error_code *ec) {
|
|
bool recursive_directory_iterator::__try_recursion(error_code *ec) {
|