summaryrefslogtreecommitdiffstats
path: root/src/common
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/common/CMakeLists.txt1
-rw-r--r--src/common/common_funcs.h25
-rw-r--r--src/common/fs/fs_util.cpp14
-rw-r--r--src/common/fs/fs_util.h33
-rw-r--r--src/common/fs/path_util.cpp6
-rw-r--r--src/common/fs/path_util.h9
-rw-r--r--src/common/page_table.cpp1
-rw-r--r--src/common/page_table.h6
-rw-r--r--src/common/point.h57
9 files changed, 112 insertions, 40 deletions
diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt
index eafb96b0b..7a4d9e354 100644
--- a/src/common/CMakeLists.txt
+++ b/src/common/CMakeLists.txt
@@ -154,6 +154,7 @@ add_library(common STATIC
param_package.cpp
param_package.h
parent_of_member.h
+ point.h
quaternion.h
ring_buffer.h
scm_rev.cpp
diff --git a/src/common/common_funcs.h b/src/common/common_funcs.h
index 17d1ee86b..53bd7da60 100644
--- a/src/common/common_funcs.h
+++ b/src/common/common_funcs.h
@@ -97,17 +97,6 @@ __declspec(dllimport) void __stdcall DebugBreak(void);
return static_cast<T>(key) == 0; \
}
-/// Evaluates a boolean expression, and returns a result unless that expression is true.
-#define R_UNLESS(expr, res) \
- { \
- if (!(expr)) { \
- if (res.IsError()) { \
- LOG_ERROR(Kernel, "Failed with result: {}", res.raw); \
- } \
- return res; \
- } \
- }
-
#define YUZU_NON_COPYABLE(cls) \
cls(const cls&) = delete; \
cls& operator=(const cls&) = delete
@@ -116,20 +105,6 @@ __declspec(dllimport) void __stdcall DebugBreak(void);
cls(cls&&) = delete; \
cls& operator=(cls&&) = delete
-#define R_SUCCEEDED(res) (res.IsSuccess())
-
-/// Evaluates an expression that returns a result, and returns the result if it would fail.
-#define R_TRY(res_expr) \
- { \
- const auto _tmp_r_try_rc = (res_expr); \
- if (_tmp_r_try_rc.IsError()) { \
- return _tmp_r_try_rc; \
- } \
- }
-
-/// Evaluates a boolean expression, and succeeds if that expression is true.
-#define R_SUCCEED_IF(expr) R_UNLESS(!(expr), RESULT_SUCCESS)
-
namespace Common {
[[nodiscard]] constexpr u32 MakeMagic(char a, char b, char c, char d) {
diff --git a/src/common/fs/fs_util.cpp b/src/common/fs/fs_util.cpp
index 0ddfc3131..357cf5855 100644
--- a/src/common/fs/fs_util.cpp
+++ b/src/common/fs/fs_util.cpp
@@ -2,6 +2,8 @@
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
+#include <algorithm>
+
#include "common/fs/fs_util.h"
namespace Common::FS {
@@ -10,4 +12,16 @@ std::u8string ToU8String(std::string_view utf8_string) {
return std::u8string{utf8_string.begin(), utf8_string.end()};
}
+std::u8string BufferToU8String(std::span<const u8> buffer) {
+ return std::u8string{buffer.begin(), std::ranges::find(buffer, u8{0})};
+}
+
+std::string ToUTF8String(std::u8string_view u8_string) {
+ return std::string{u8_string.begin(), u8_string.end()};
+}
+
+std::string PathToUTF8String(const std::filesystem::path& path) {
+ return ToUTF8String(path.u8string());
+}
+
} // namespace Common::FS
diff --git a/src/common/fs/fs_util.h b/src/common/fs/fs_util.h
index 951df53b6..ec9950ee7 100644
--- a/src/common/fs/fs_util.h
+++ b/src/common/fs/fs_util.h
@@ -5,9 +5,13 @@
#pragma once
#include <concepts>
+#include <filesystem>
+#include <span>
#include <string>
#include <string_view>
+#include "common/common_types.h"
+
namespace Common::FS {
template <typename T>
@@ -22,4 +26,33 @@ concept IsChar = std::same_as<T, char>;
*/
[[nodiscard]] std::u8string ToU8String(std::string_view utf8_string);
+/**
+ * Converts a buffer of bytes to a UTF8-encoded std::u8string.
+ * This converts from the start of the buffer until the first encountered null-terminator.
+ * If no null-terminator is found, this converts the entire buffer instead.
+ *
+ * @param buffer Buffer of bytes
+ *
+ * @returns UTF-8 encoded std::u8string.
+ */
+[[nodiscard]] std::u8string BufferToU8String(std::span<const u8> buffer);
+
+/**
+ * Converts a std::u8string or std::u8string_view to a UTF-8 encoded std::string.
+ *
+ * @param u8_string UTF-8 encoded u8string
+ *
+ * @returns UTF-8 encoded std::string.
+ */
+[[nodiscard]] std::string ToUTF8String(std::u8string_view u8_string);
+
+/**
+ * Converts a filesystem path to a UTF-8 encoded std::string.
+ *
+ * @param path Filesystem path
+ *
+ * @returns UTF-8 encoded std::string.
+ */
+[[nodiscard]] std::string PathToUTF8String(const std::filesystem::path& path);
+
} // namespace Common::FS
diff --git a/src/common/fs/path_util.cpp b/src/common/fs/path_util.cpp
index 8b732a21c..6cdd14f13 100644
--- a/src/common/fs/path_util.cpp
+++ b/src/common/fs/path_util.cpp
@@ -129,12 +129,6 @@ private:
std::unordered_map<YuzuPath, fs::path> yuzu_paths;
};
-std::string PathToUTF8String(const fs::path& path) {
- const auto utf8_string = path.u8string();
-
- return std::string{utf8_string.begin(), utf8_string.end()};
-}
-
bool ValidatePath(const fs::path& path) {
if (path.empty()) {
LOG_ERROR(Common_Filesystem, "Input path is empty, path={}", PathToUTF8String(path));
diff --git a/src/common/fs/path_util.h b/src/common/fs/path_util.h
index a9fadbceb..14e8c35d7 100644
--- a/src/common/fs/path_util.h
+++ b/src/common/fs/path_util.h
@@ -26,15 +26,6 @@ enum class YuzuPath {
};
/**
- * Converts a filesystem path to a UTF-8 encoded std::string.
- *
- * @param path Filesystem path
- *
- * @returns UTF-8 encoded std::string.
- */
-[[nodiscard]] std::string PathToUTF8String(const std::filesystem::path& path);
-
-/**
* Validates a given path.
*
* A given path is valid if it meets these conditions:
diff --git a/src/common/page_table.cpp b/src/common/page_table.cpp
index 8fd8620fd..9fffd816f 100644
--- a/src/common/page_table.cpp
+++ b/src/common/page_table.cpp
@@ -14,6 +14,7 @@ void PageTable::Resize(size_t address_space_width_in_bits, size_t page_size_in_b
const size_t num_page_table_entries{1ULL << (address_space_width_in_bits - page_size_in_bits)};
pointers.resize(num_page_table_entries);
backing_addr.resize(num_page_table_entries);
+ current_address_space_width_in_bits = address_space_width_in_bits;
}
} // namespace Common
diff --git a/src/common/page_table.h b/src/common/page_table.h
index 61c5552e0..e92b66b2b 100644
--- a/src/common/page_table.h
+++ b/src/common/page_table.h
@@ -98,6 +98,10 @@ struct PageTable {
*/
void Resize(size_t address_space_width_in_bits, size_t page_size_in_bits);
+ size_t GetAddressSpaceBits() const {
+ return current_address_space_width_in_bits;
+ }
+
/**
* Vector of memory pointers backing each page. An entry can only be non-null if the
* corresponding attribute element is of type `Memory`.
@@ -105,6 +109,8 @@ struct PageTable {
VirtualBuffer<PageInfo> pointers;
VirtualBuffer<u64> backing_addr;
+
+ size_t current_address_space_width_in_bits;
};
} // namespace Common
diff --git a/src/common/point.h b/src/common/point.h
new file mode 100644
index 000000000..c0a52ad8d
--- /dev/null
+++ b/src/common/point.h
@@ -0,0 +1,57 @@
+// Copyright 2021 yuzu Emulator Project
+// Licensed under GPLv2 or any later version
+// Refer to the license.txt file included.
+
+#pragma once
+
+#include <type_traits>
+
+namespace Common {
+
+// Represents a point within a 2D space.
+template <typename T>
+struct Point {
+ static_assert(std::is_arithmetic_v<T>, "T must be an arithmetic type!");
+
+ T x{};
+ T y{};
+
+#define ARITHMETIC_OP(op, compound_op) \
+ friend constexpr Point operator op(const Point& lhs, const Point& rhs) noexcept { \
+ return { \
+ .x = static_cast<T>(lhs.x op rhs.x), \
+ .y = static_cast<T>(lhs.y op rhs.y), \
+ }; \
+ } \
+ friend constexpr Point operator op(const Point& lhs, T value) noexcept { \
+ return { \
+ .x = static_cast<T>(lhs.x op value), \
+ .y = static_cast<T>(lhs.y op value), \
+ }; \
+ } \
+ friend constexpr Point operator op(T value, const Point& rhs) noexcept { \
+ return { \
+ .x = static_cast<T>(value op rhs.x), \
+ .y = static_cast<T>(value op rhs.y), \
+ }; \
+ } \
+ friend constexpr Point& operator compound_op(Point& lhs, const Point& rhs) noexcept { \
+ lhs.x = static_cast<T>(lhs.x op rhs.x); \
+ lhs.y = static_cast<T>(lhs.y op rhs.y); \
+ return lhs; \
+ } \
+ friend constexpr Point& operator compound_op(Point& lhs, T value) noexcept { \
+ lhs.x = static_cast<T>(lhs.x op value); \
+ lhs.y = static_cast<T>(lhs.y op value); \
+ return lhs; \
+ }
+ ARITHMETIC_OP(+, +=)
+ ARITHMETIC_OP(-, -=)
+ ARITHMETIC_OP(*, *=)
+ ARITHMETIC_OP(/, /=)
+#undef ARITHMETIC_OP
+
+ friend constexpr bool operator==(const Point&, const Point&) = default;
+};
+
+} // namespace Common