From c9b6b9a5ca082fe7c1b6f58d7713f785a9eb6a5c Mon Sep 17 00:00:00 2001 From: Martial Simon Date: Mon, 15 Sep 2025 01:08:27 +0200 Subject: add: graphs et rushs --- graphs/cpp/path/path.cc | 10 ++++++++++ graphs/cpp/path/path.hh | 25 +++++++++++++++++++++++++ graphs/cpp/path/path_example.cc | 22 ++++++++++++++++++++++ graphs/cpp/path/unix_path.cc | 25 +++++++++++++++++++++++++ graphs/cpp/path/unix_path.hh | 13 +++++++++++++ graphs/cpp/path/windows_path.cc | 37 +++++++++++++++++++++++++++++++++++++ graphs/cpp/path/windows_path.hh | 14 ++++++++++++++ 7 files changed, 146 insertions(+) create mode 100644 graphs/cpp/path/path.cc create mode 100644 graphs/cpp/path/path.hh create mode 100644 graphs/cpp/path/path_example.cc create mode 100644 graphs/cpp/path/unix_path.cc create mode 100644 graphs/cpp/path/unix_path.hh create mode 100644 graphs/cpp/path/windows_path.cc create mode 100644 graphs/cpp/path/windows_path.hh (limited to 'graphs/cpp/path') 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 +#include + +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 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 + +#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 +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 +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; +}; -- cgit v1.2.3