summaryrefslogtreecommitdiffhomepage
path: root/dev/LibCompiler/NFC/StringView.h
blob: 51fb8b899ab66cf69460000415097b6879d20291 (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
/*
 *	========================================================
 *
 *	LibCompiler
 * 	Copyright (C) 2024-2025 Amlal EL Mahrouss, all rights reserved.
 *
 * 	========================================================
 */

#pragma once

#include <LibCompiler/Defines.h>
#include <LibCompiler/NFC/ErrorOr.h>

namespace LibCompiler
{
	/**
	 * @brief StringView class, contains a C string and manages it.
	 * @note No need to manage it it's getting deleted by default.
	 */

	class StringView final
	{
	public:
		explicit StringView() = delete;

		explicit StringView(SizeType Sz) noexcept
			: m_Sz(Sz)
		{
			m_Data = new CharType[Sz];
			assert(m_Data);
		}

		~StringView() noexcept
		{
			if (m_Data)
			{
				memset(m_Data, 0, m_Sz);
				delete[] m_Data;

				m_Data = nullptr;
			}
		}

		LIBCOMPILER_COPY_DEFAULT(StringView);

		CharType*		Data();
		const CharType* CData() const;
		SizeType		Length() const;

		bool operator==(const CharType* rhs) const;
		bool operator!=(const CharType* rhs) const;

		bool operator==(const StringView& rhs) const;
		bool operator!=(const StringView& rhs) const;

		StringView& operator+=(const CharType* rhs);
		StringView& operator+=(const StringView& rhs);

		operator bool()
		{
			return m_Data && m_Data[0] != 0;
		}

		bool operator!()
		{
			return !m_Data || m_Data[0] == 0;
		}

	private:
		CharType* m_Data{nullptr};
		SizeType  m_Sz{0};
		SizeType  m_Cur{0};

		friend class StringBuilder;
	};

	/**
	 * @brief StringBuilder class
	 * @note These results shall call delete[] after they're used.
	 */
	struct StringBuilder final
	{
		static StringView  Construct(const CharType* data);
		static const char* FromInt(const char* fmt, int n);
		static const char* FromBool(const char* fmt, bool n);
		static const char* Format(const char* fmt, const char* from);
		static bool		   Equals(const char* lhs, const char* rhs);
	};
} // namespace LibCompiler