diff options
| author | Martial Simon <msimon_fr@hotmail.com> | 2025-09-15 01:08:27 +0200 |
|---|---|---|
| committer | Martial Simon <msimon_fr@hotmail.com> | 2025-09-15 01:08:27 +0200 |
| commit | c9b6b9a5ca082fe7c1b6f58d7713f785a9eb6a5c (patch) | |
| tree | 3e4f42f93c7ae89a364e4d51fff6e5cec4e55fa9 /graphs/cpp/path | |
add: graphs et rushs
Diffstat (limited to 'graphs/cpp/path')
| -rw-r--r-- | graphs/cpp/path/path.cc | 10 | ||||
| -rw-r--r-- | graphs/cpp/path/path.hh | 25 | ||||
| -rw-r--r-- | graphs/cpp/path/path_example.cc | 22 | ||||
| -rw-r--r-- | graphs/cpp/path/unix_path.cc | 25 | ||||
| -rw-r--r-- | graphs/cpp/path/unix_path.hh | 13 | ||||
| -rw-r--r-- | graphs/cpp/path/windows_path.cc | 37 | ||||
| -rw-r--r-- | graphs/cpp/path/windows_path.hh | 14 |
7 files changed, 146 insertions, 0 deletions
diff --git a/graphs/cpp/path/path.cc b/graphs/cpp/path/path.cc new file mode 100644 index 0000000..bff3a55 --- /dev/null +++ b/graphs/cpp/path/path.cc @@ -0,0 +1,10 @@ +#include "path.hh" + +Path& Path::join(const std::string& tail, bool is_file) +{ + if (final_) + return *this; + path_.push_back(tail); + final_ = is_file; + return *this; +}
\ No newline at end of file diff --git a/graphs/cpp/path/path.hh b/graphs/cpp/path/path.hh new file mode 100644 index 0000000..0a09d05 --- /dev/null +++ b/graphs/cpp/path/path.hh @@ -0,0 +1,25 @@ +#pragma once + +#include <string> +#include <vector> + +class Path +{ +public: + Path() = default; + virtual ~Path() = default; + + /* + ** Return the complete path as a string. + */ + virtual std::string to_string() const = 0; + + /* + ** Add a directory or a file at the end of the path. + */ + virtual Path& join(const std::string& tail, bool is_file = false); + +protected: + std::vector<std::string> path_; + bool final_ = false; +}; diff --git a/graphs/cpp/path/path_example.cc b/graphs/cpp/path/path_example.cc new file mode 100644 index 0000000..f35c605 --- /dev/null +++ b/graphs/cpp/path/path_example.cc @@ -0,0 +1,22 @@ +#include <iostream> + +#include "unix_path.hh" +#include "windows_path.hh" + +int main() +{ + auto windows_path = WindowsPath('E'); + + std::cout << windows_path.join("Users").join("YAKA").join("cpp").to_string() + << '\n'; /* E:\Users\YAKA\cpp\ */ + + auto unix_path = UnixPath(); + + std::cout << unix_path.join("home").join("yaka").join("cpp").to_string() + << '\n'; // /home/yaka/cpp/ + + std::cout << unix_path.join("main.cc", true).to_string() + << '\n'; // /home/yaka/cpp/main.cc + + return 0; +} diff --git a/graphs/cpp/path/unix_path.cc b/graphs/cpp/path/unix_path.cc new file mode 100644 index 0000000..dfd51b5 --- /dev/null +++ b/graphs/cpp/path/unix_path.cc @@ -0,0 +1,25 @@ +// +// Created by martial.simon on 2/25/25. +// + +#include "unix_path.hh" + +#include <sstream> +UnixPath::UnixPath() + : Path() +{} + +std::string UnixPath::to_string() const +{ + if (path_.empty()) + return "/"; + std::ostringstream os; + os << "/" << path_[0]; + for (size_t i = 1; i < path_.size(); i++) + { + os << "/" << path_[i]; + } + if (!final_) + os << "/"; + return os.str(); +}
\ No newline at end of file diff --git a/graphs/cpp/path/unix_path.hh b/graphs/cpp/path/unix_path.hh new file mode 100644 index 0000000..22976ed --- /dev/null +++ b/graphs/cpp/path/unix_path.hh @@ -0,0 +1,13 @@ +// +// Created by martial.simon on 2/25/25. +// + +#pragma once +#include "path.hh" + +class UnixPath : public Path +{ +public: + UnixPath(); + std::string to_string() const override; +}; diff --git a/graphs/cpp/path/windows_path.cc b/graphs/cpp/path/windows_path.cc new file mode 100644 index 0000000..cc94afa --- /dev/null +++ b/graphs/cpp/path/windows_path.cc @@ -0,0 +1,37 @@ +// +// Created by martial.simon on 2/25/25. +// + +#include "windows_path.hh" + +#include <sstream> +WindowsPath::WindowsPath(char drive) + : Path() +{ + path_.push_back(std::string{ drive } + std::string{ ':' }); +} +std::string WindowsPath::to_string() const +{ + if (path_.empty()) + return ""; + std::ostringstream os; + os << path_[0]; + for (size_t i = 1; i < path_.size(); i++) + { + os << "\\" << path_[i]; + } + if (!final_) + os << "\\"; + return os.str(); +} +Path& WindowsPath::join(const std::string& tail, bool is_file) +{ + // :, ", |, ?, * + if (tail.find(':') != std::string::npos + || tail.find('\"') != std::string::npos + || tail.find('|') != std::string::npos + || tail.find('?') != std::string::npos + || tail.find('*') != std::string::npos) + return *this; + return Path::join(tail, is_file); +}
\ No newline at end of file diff --git a/graphs/cpp/path/windows_path.hh b/graphs/cpp/path/windows_path.hh new file mode 100644 index 0000000..4bd9e2b --- /dev/null +++ b/graphs/cpp/path/windows_path.hh @@ -0,0 +1,14 @@ +// +// Created by martial.simon on 2/25/25. +// + +#pragma once +#include "path.hh" + +class WindowsPath : public Path +{ +public: + WindowsPath(char drive); + std::string to_string() const override; + Path& join(const std::string& tail, bool is_file = false) override; +}; |
