summaryrefslogtreecommitdiff
path: root/lib/nes/common/path-view.cc
diff options
context:
space:
mode:
Diffstat (limited to 'lib/nes/common/path-view.cc')
-rw-r--r--lib/nes/common/path-view.cc49
1 files changed, 49 insertions, 0 deletions
diff --git a/lib/nes/common/path-view.cc b/lib/nes/common/path-view.cc
new file mode 100644
index 0000000..47f198b
--- /dev/null
+++ b/lib/nes/common/path-view.cc
@@ -0,0 +1,49 @@
+#include "nes/common/path-view.hh"
+
+namespace nes
+{
+ auto path_view::iterator::operator*() const -> std::string_view
+ {
+ return current_ ? std::string_view{ current_, component_length_ } : "";
+ }
+
+ auto path_view::iterator::operator++() -> iterator&
+ {
+ // Move forward to next component
+ current_ += component_length_;
+ remaining_ -= component_length_;
+
+ // Skip over '/'.
+ while (remaining_ > 0 && *current_ == '/')
+ {
+ current_ += 1;
+ remaining_ -= 1;
+ }
+
+ // Scan until end of component to find its length.
+ component_length_ = 0;
+ while (component_length_ < remaining_ && current_[component_length_] != '/')
+ {
+ component_length_ += 1;
+ }
+
+ return *this;
+ }
+
+ auto path_view::iterator::operator++(int) -> iterator
+ {
+ auto const res = *this;
+ ++*this;
+ return res;
+ }
+
+ auto path_view::begin() const -> iterator
+ {
+ return ++iterator{ path_.data(), 0, static_cast<u32>(path_.size()) };
+ }
+
+ auto path_view::end() const -> iterator
+ {
+ return iterator{ path_.data() + path_.size(), 0, 0 };
+ }
+} // namespace nes \ No newline at end of file