summaryrefslogtreecommitdiff
path: root/src/std/memory.tpp
blob: fdfe72b2d58a7ce6386ac6212ac2045d51b40beb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#pragma once

#include "memory.hpp"

#include "utils.hpp"

#include <Arduino.h>
#include <stdlib.h>

template <typename memType>
memType *malloc_s(unsigned int size)
{
	auto *mem = malloc(size);

	if (mem == nullptr)
	{
		Serial.println("Error: Memory allocation failed");
		while (true) {}
	}

	return static_cast<memType *>(mem);
}

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)))
{
}

template <class Target>
UniquePtr<Target>::UniquePtr(UniquePtr &&unique_ptr) noexcept
	: _target(unique_ptr._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()
{
	delete _target;
}

template <class Target>
Target UniquePtr<Target>::operator*() const
{
	return *(_target);
}

template <class Target>
Target *UniquePtr<Target>::operator->() const
{
	return _target;
}

template <class Target, typename... Args>
UniquePtr<Target> make_unique(Args... args)
{
	return UniquePtr<Target>(new Target(args...));
}