summaryrefslogtreecommitdiff
path: root/graphs/cpp/path
diff options
context:
space:
mode:
Diffstat (limited to 'graphs/cpp/path')
-rw-r--r--graphs/cpp/path/path.cc10
-rw-r--r--graphs/cpp/path/path.hh25
-rw-r--r--graphs/cpp/path/path_example.cc22
-rw-r--r--graphs/cpp/path/unix_path.cc25
-rw-r--r--graphs/cpp/path/unix_path.hh13
-rw-r--r--graphs/cpp/path/windows_path.cc37
-rw-r--r--graphs/cpp/path/windows_path.hh14
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;
+};