mirror of
https://github.com/portapack-mayhem/mayhem-firmware.git
synced 2025-08-15 08:57:42 +00:00
Add filesystem directory enumeration.
Borrow API from std::filesystem -- Boost and C++17.
This commit is contained in:
@@ -27,6 +27,8 @@
|
||||
#include <cstddef>
|
||||
#include <string>
|
||||
#include <array>
|
||||
#include <memory>
|
||||
#include <iterator>
|
||||
|
||||
class File {
|
||||
public:
|
||||
@@ -55,4 +57,61 @@ private:
|
||||
FIL f;
|
||||
};
|
||||
|
||||
namespace std {
|
||||
namespace filesystem {
|
||||
|
||||
using file_status = BYTE;
|
||||
|
||||
struct directory_entry : public FILINFO {
|
||||
file_status status() const {
|
||||
return fattrib;
|
||||
}
|
||||
|
||||
const std::string path() const noexcept { return fname; };
|
||||
};
|
||||
|
||||
class directory_iterator {
|
||||
struct Impl {
|
||||
DIR dir;
|
||||
directory_entry filinfo;
|
||||
|
||||
~Impl() {
|
||||
f_closedir(&dir);
|
||||
}
|
||||
};
|
||||
|
||||
std::shared_ptr<Impl> impl;
|
||||
|
||||
friend bool operator!=(const directory_iterator& lhs, const directory_iterator& rhs);
|
||||
|
||||
public:
|
||||
using difference_type = std::ptrdiff_t;
|
||||
using value_type = directory_entry;
|
||||
using pointer = const directory_entry*;
|
||||
using reference = const directory_entry&;
|
||||
using iterator_category = std::input_iterator_tag;
|
||||
|
||||
directory_iterator() noexcept { };
|
||||
directory_iterator(const char* path, const char* wild);
|
||||
|
||||
~directory_iterator() { }
|
||||
|
||||
directory_iterator& operator++();
|
||||
|
||||
reference operator*() const {
|
||||
// TODO: Exception or assert if impl == nullptr.
|
||||
return impl->filinfo;
|
||||
}
|
||||
};
|
||||
|
||||
inline const directory_iterator& begin(const directory_iterator& iter) noexcept { return iter; };
|
||||
inline directory_iterator end(const directory_iterator&) noexcept { return { }; };
|
||||
|
||||
inline bool operator!=(const directory_iterator& lhs, const directory_iterator& rhs) { return lhs.impl != rhs.impl; };
|
||||
|
||||
bool is_regular_file(const file_status s);
|
||||
|
||||
} /* namespace filesystem */
|
||||
} /* namespace std */
|
||||
|
||||
#endif/*__FILE_H__*/
|
||||
|
Reference in New Issue
Block a user