fix algorithm::find_last + filesystem module fixes

This commit is contained in:
q66 2015-09-04 18:46:28 +01:00
parent 75a9f284a4
commit c33fb68d89
2 changed files with 13 additions and 4 deletions

View file

@ -285,7 +285,7 @@ R find_last(R range, const T &v) {
R r = find(prev, v); R r = find(prev, v);
if (r.empty()) if (r.empty())
break; break;
prev = r; range = r;
} }
return range; return range;
} }

View file

@ -167,9 +167,10 @@ private:
struct DirectoryRange; struct DirectoryRange;
struct DirectoryStream { struct DirectoryStream {
DirectoryStream(): p_d(), p_owned(false) {} DirectoryStream(): p_d(), p_path(), p_owned(false) {}
DirectoryStream(const DirectoryStream &) = delete; DirectoryStream(const DirectoryStream &) = delete;
DirectoryStream(DirectoryStream &&s): p_d(s.p_d), p_owned(s.p_owned) { DirectoryStream(DirectoryStream &&s): p_d(s.p_d), p_path(move(s.p_path)),
p_owned(s.p_owned) {
s.p_d = nullptr; s.p_d = nullptr;
s.p_owned = false; s.p_owned = false;
} }
@ -193,6 +194,7 @@ struct DirectoryStream {
memcpy(buf, &path[0], path.size()); memcpy(buf, &path[0], path.size());
buf[path.size()] = '\0'; buf[path.size()] = '\0';
p_d = opendir(buf); p_d = opendir(buf);
p_path = path;
p_owned = true; p_owned = true;
return is_open(); return is_open();
} }
@ -227,11 +229,17 @@ struct DirectoryStream {
if (!p_d) return FileInfo(); if (!p_d) return FileInfo();
auto rd = readdir(p_d); auto rd = readdir(p_d);
if (!rd) return FileInfo(); if (!rd) return FileInfo();
return FileInfo((const char *)rd->d_name); if (!strcmp(rd->d_name, ".") || !strcmp(rd->d_name, ".."))
return read();
String ap = p_path;
ap += PATH_SEPARATOR;
ap += (const char *)rd->d_name;
return FileInfo(ap);
} }
void swap(DirectoryStream &s) { void swap(DirectoryStream &s) {
detail::swap_adl(p_d, s.p_d); detail::swap_adl(p_d, s.p_d);
detail::swap_adl(p_path, s.p_path);
detail::swap_adl(p_owned, s.p_owned); detail::swap_adl(p_owned, s.p_owned);
} }
@ -239,6 +247,7 @@ struct DirectoryStream {
private: private:
DIR *p_d; DIR *p_d;
String p_path;
bool p_owned; bool p_owned;
}; };