summaryrefslogtreecommitdiff
path: root/include/SSVOpenHexagon/Utils/UniquePtrArray.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'include/SSVOpenHexagon/Utils/UniquePtrArray.hpp')
-rw-r--r--include/SSVOpenHexagon/Utils/UniquePtrArray.hpp108
1 files changed, 108 insertions, 0 deletions
diff --git a/include/SSVOpenHexagon/Utils/UniquePtrArray.hpp b/include/SSVOpenHexagon/Utils/UniquePtrArray.hpp
new file mode 100644
index 00000000..3b2da868
--- /dev/null
+++ b/include/SSVOpenHexagon/Utils/UniquePtrArray.hpp
@@ -0,0 +1,108 @@
+// Copyright (c) 2013-2020 Vittorio Romeo
+// License: Academic Free License ("AFL") v. 3.0
+// AFL License page: https://opensource.org/licenses/AFL-3.0
+
+#pragma once
+
+#include "SSVOpenHexagon/Global/Assert.hpp"
+
+namespace hg::Utils {
+
+template <typename T>
+class UniquePtrArray
+{
+private:
+ using SizeT = decltype(sizeof(int));
+
+ T* _ptr;
+
+public:
+ [[nodiscard, gnu::always_inline]] explicit UniquePtrArray() noexcept
+ : _ptr{nullptr}
+ {}
+
+ [[nodiscard, gnu::always_inline]] explicit UniquePtrArray(T* ptr) noexcept
+ : _ptr{ptr}
+ {}
+
+ [[gnu::always_inline]] ~UniquePtrArray() noexcept
+ {
+ delete[] _ptr;
+ }
+
+ UniquePtrArray(const UniquePtrArray&) = delete;
+ UniquePtrArray& operator=(const UniquePtrArray&) = delete;
+
+ [[nodiscard, gnu::always_inline]] UniquePtrArray(
+ UniquePtrArray&& rhs) noexcept
+ : _ptr{rhs._ptr}
+ {
+ rhs._ptr = nullptr;
+ }
+
+ UniquePtrArray& operator=(UniquePtrArray&& rhs) noexcept
+ {
+ delete[] _ptr;
+
+ _ptr = rhs._ptr;
+ rhs._ptr = nullptr;
+
+ return *this;
+ }
+
+ [[nodiscard, gnu::always_inline]] T* get() noexcept
+ {
+ return _ptr;
+ }
+
+ [[nodiscard, gnu::always_inline]] const T* get() const noexcept
+ {
+ return _ptr;
+ }
+
+ [[nodiscard, gnu::always_inline]] T& operator[](const SizeT i) noexcept
+ {
+ SSVOH_ASSERT(_ptr != nullptr);
+ return _ptr[i];
+ }
+
+ [[nodiscard, gnu::always_inline]] const T& operator[](
+ const SizeT i) const noexcept
+ {
+ SSVOH_ASSERT(_ptr != nullptr);
+ return _ptr[i];
+ }
+
+ [[nodiscard, gnu::always_inline]] bool operator==(
+ const T* ptr) const noexcept
+ {
+ return _ptr == ptr;
+ }
+
+ [[nodiscard, gnu::always_inline]] bool operator!=(
+ const T* ptr) const noexcept
+ {
+ return _ptr != ptr;
+ }
+
+ [[nodiscard, gnu::always_inline]] bool operator==(
+ decltype(nullptr)) const noexcept
+ {
+ return _ptr == nullptr;
+ }
+
+ [[nodiscard, gnu::always_inline]] bool operator!=(
+ decltype(nullptr)) const noexcept
+ {
+ return _ptr != nullptr;
+ }
+};
+
+template <typename T>
+[[nodiscard, gnu::always_inline]] inline UniquePtrArray<T> makeUniqueArray(
+ decltype(sizeof(int)) capacity)
+{
+ return UniquePtrArray<T>{new T[capacity]};
+}
+
+} // namespace hg::Utils