summaryrefslogtreecommitdiff
path: root/src/utils/memory.tpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/utils/memory.tpp')
-rw-r--r--src/utils/memory.tpp65
1 files changed, 55 insertions, 10 deletions
diff --git a/src/utils/memory.tpp b/src/utils/memory.tpp
index 276b0b4..6261c81 100644
--- a/src/utils/memory.tpp
+++ b/src/utils/memory.tpp
@@ -1,8 +1,9 @@
-#include "memory.hpp"
+#pragma once
-#include "Arduino.h"
#include "general.hpp"
+#include <Arduino.h>
+
template <typename memType>
memType *malloc_s(unsigned int size)
{
@@ -18,31 +19,75 @@ memType *malloc_s(unsigned int size)
}
template <class Target>
-unique_ptr<Target>::unique_ptr(Target *target)
+UniquePtr<Target>::UniquePtr() = default;
+
+template <class Target>
+UniquePtr<Target>::UniquePtr(Target *target) : _target(target)
+{
+}
+
+template <class Target>
+UniquePtr<Target>::UniquePtr(const UniquePtr &unique_ptr)
+ : _target(new Target(*(unique_ptr._target)))
{
- this->_target = target;
}
template <class Target>
-unique_ptr<Target>::~unique_ptr()
+UniquePtr<Target>::UniquePtr(UniquePtr &&unique_ptr) noexcept
+ : _target(unique_ptr._target)
{
- delete this->_target;
+ unique_ptr._target = nullptr;
+}
+
+template <class Target>
+UniquePtr<Target> &UniquePtr<Target>::operator=(const UniquePtr &unique_ptr)
+{
+ if (&unique_ptr != this)
+ {
+ delete _target;
+ _target = nullptr;
+ _target = new Target(*(unique_ptr._target));
+ }
+
+ return *this;
+}
+
+template <class Target>
+UniquePtr<Target> &UniquePtr<Target>::operator=(UniquePtr &&unique_ptr) noexcept
+{
+ if (&unique_ptr != this)
+ {
+ delete _target;
+ _target = unique_ptr._target;
+ unique_ptr._target = nullptr;
+ }
+
+ return *this;
+}
+
+template <class Target>
+UniquePtr<Target>::~UniquePtr()
+{
+ if (this->_target != nullptr)
+ {
+ delete this->_target;
+ }
}
template <class Target>
-Target unique_ptr<Target>::operator*() const
+Target UniquePtr<Target>::operator*() const
{
return *(this->_target);
}
template <class Target>
-Target *unique_ptr<Target>::operator->() const
+Target *UniquePtr<Target>::operator->() const
{
return this->_target;
}
template <class Target, typename... Args>
-unique_ptr<Target> make_unique(Args... args)
+UniquePtr<Target> make_unique(Args... args)
{
- return unique_ptr<Target>(new Target(args...));
+ return UniquePtr<Target>(new Target(args...));
}