summaryrefslogtreecommitdiffhomepage
path: root/dev/LibCompiler/NFC/Ref.h
blob: 4c8c2e3c09aafd1e8903d83914d9f580547393fe (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
91
92
93
94
95
96
97
98
99
100
101
102
103

/*
 *	========================================================
 *
 *	LibCompiler
 * 	Copyright (C) 2024-2025 Amlal EL Mahrouss, all rights reserved.
 *
 * 	========================================================
 */

#pragma once

#include <LibCompiler/Defines.h>

namespace LibCompiler
{
	// @author EL Mahrouss Amlal
	// @brief Reference holder class, refers to a pointer of data in static memory.
	template <typename T>
	class Ref final
	{
	public:
		explicit Ref() = default;

		~Ref()
		{
			if (m_Strong)
			{
				(*m_Class).~T();
			}
		}

		LIBCOMPILER_COPY_DEFAULT(Ref);

	public:
		explicit Ref(T cls, const Bool& strong = false)
			: m_Class(&cls), m_Strong(strong)
		{
		}

		Ref& operator=(T ref)
		{
			*m_Class = ref;
			return *this;
		}

	public:
		T* operator->() const
		{
			return m_Class;
		}

		T& Leak()
		{
			return *m_Class;
		}

		T operator*()
		{
			return *m_Class;
		}

		Bool IsStrong() const
		{
			return m_Strong;
		}

		operator bool()
		{
			return *m_Class;
		}

	private:
		T*	 m_Class{nullptr};
		Bool m_Strong{false};
	};

	// @author EL Mahrouss Amlal
	// @brief Non null Reference holder class, refers to a pointer of data in static memory.
	template <typename T>
	class NonNullRef final
	{
	public:
		explicit NonNullRef() = delete;

		explicit NonNullRef(T* ref)
			: m_Ref(ref, true)
		{
		}

		Ref<T>& operator->()
		{
			MUST_PASS(m_Ref);
			return m_Ref;
		}

		NonNullRef& operator=(const NonNullRef<T>& ref) = delete;
		NonNullRef(const NonNullRef<T>& ref)			= default;

	private:
		Ref<T> m_Ref{nullptr};
	};
} // namespace LibCompiler