NeKernel dev
Loading...
Searching...
No Matches
KString.inl
Go to the documentation of this file.
1/* ========================================
2
3 Copyright (C) 2024-2025, Amlal El Mahrouss, licensed under the Apache 2.0 license.
4
5======================================== */
6
9
10namespace Kernel {
11template <typename CharKind>
12inline void ort_string_append(CharKind* lhs, const CharKind* rhs, Int32 cur) {
13 SizeT sz_rhs = oe_string_len<CharKind>(rhs);
14 SizeT rhs_i = 0;
15
16 for (; rhs_i < sz_rhs; ++rhs_i) {
17 lhs[rhs_i + cur] = rhs[rhs_i];
18 }
19}
20
21template <typename CharKind, Int MinSz>
23 return this->fData;
24}
25
26template <typename CharKind, Int MinSz>
27inline const CharKind* KBasicString<CharKind, MinSz>::CData() const {
28 return const_cast<const CharKind*>(this->fData);
29}
30
31template <typename CharKind, Int MinSz>
33 return this->fDataSz;
34}
35
36template <typename CharKind, Int MinSz>
38 const KBasicString<CharKind, MinSz>& rhs) const {
39 if (rhs.Length() != this->Length()) return false;
40
41 for (Size index = 0; index < this->Length(); ++index) {
42 if (rhs.fData[index] != this->fData[index]) return false;
43 }
44
45 return true;
46}
47
48template <typename CharKind, Int MinSz>
49inline bool KBasicString<CharKind, MinSz>::operator==(const CharKind* rhs) const {
50 if (oe_string_len<CharKind>(rhs) != this->Length()) return false;
52 for (Size index = 0; index < oe_string_len<CharKind>(rhs); ++index) {
53 if (rhs[index] != this->fData[index]) return false;
54 }
55
56 return true;
57}
58
59template <typename CharKind, Int MinSz>
61 const KBasicString<CharKind, MinSz>& rhs) const {
62 if (rhs.Length() != this->Length()) return false;
63
64 for (Size index = 0; index < rhs.Length(); ++index) {
65 if (rhs.fData[index] == this->fData[index]) return false;
66 }
67
68 return true;
69}
70
71template <typename CharKind, Int MinSz>
72inline bool KBasicString<CharKind, MinSz>::operator!=(const CharKind* rhs) const {
73 if (oe_string_len<CharKind>(rhs) != this->Length()) return false;
74
75 for (Size index = 0; index < oe_string_len<CharKind>(rhs); ++index) {
76 if (rhs[index] == this->fData[index]) return false;
77 }
78
79 return true;
80}
81
82template <typename CharKind, Int MinSz>
85 if (oe_string_len<CharKind>(rhs.fData) > this->Length()) return *this;
86
87 ort_string_append(this->fData, const_cast<CharKind*>(rhs.fData), this->fCur);
88 this->fCur += oe_string_len<CharKind>(const_cast<CharKind*>(rhs.fData));
89
90 return *this;
91}
92
93template <typename CharKind, Int MinSz>
95 const CharKind* rhs) {
96 ort_string_append(this->fData, const_cast<CharKind*>(rhs), this->fCur);
97 this->fCur += oe_string_len<CharKind>(const_cast<CharKind*>(rhs));
98
99 return *this;
100}
101
102template <typename CharKind, Int MinSz>
104 if (!data || *data == 0) return ErrorOr<KBasicString<CharKind, MinSz>>(-kErrorInvalidData);
105
107 (*view) += data;
108
110}
111template <typename CharKind>
112inline const CharKind* KStringBuilder::FromBool(const CharKind* fmt, bool i) {
113 if (!fmt) return ("?");
114
115 const CharKind* boolean_expr = i ? "YES" : "NO";
116 CharKind* ret =
117 (CharKind*) RTL_ALLOCA(oe_string_len<CharKind>(boolean_expr) + oe_string_len<CharKind>(fmt));
118
119 if (!ret) return ("?");
120
121 const auto fmt_len = oe_string_len<CharKind>(fmt);
122 const auto res_len = oe_string_len<CharKind>(boolean_expr);
123
124 for (Size idx = 0; idx < fmt_len; ++idx) {
125 if (fmt[idx] == '%') {
126 SizeT result_cnt = idx;
127
128 for (auto y_idx = idx; y_idx < res_len; ++y_idx) {
129 ret[result_cnt] = boolean_expr[y_idx];
130 ++result_cnt;
131 }
132
133 break;
134 }
135
136 ret[idx] = fmt[idx];
137 }
138
139 return ret;
140}
141template <typename CharKind>
142inline bool KStringBuilder::Equals(const CharKind* lhs, const CharKind* rhs) {
143 if (oe_string_len<CharKind>(rhs) != oe_string_len<CharKind>(lhs)) return false;
144
145 for (Size index = 0; index < oe_string_len<CharKind>(rhs); ++index) {
146 if (rhs[index] != lhs[index]) return false;
147 }
148
149 return true;
150}
151template <typename CharKind>
152inline const CharKind* KStringBuilder::Format(const CharKind* fmt, const CharKind* fmt2) {
153 if (!fmt || !fmt2) return ("?");
154
155 CharKind* ret = (CharKind*) RTL_ALLOCA(
156 sizeof(char) * (oe_string_len<CharKind>(fmt2) + oe_string_len<CharKind>(fmt)));
157
158 if (!ret) return ("?");
159
160 const auto len = oe_string_len<CharKind>(fmt);
161
162 for (Size idx = 0; idx < len; ++idx) {
163 if (fmt[idx] == '%' && idx < oe_string_len<CharKind>(fmt) && fmt[idx] == 's') {
164 Size result_cnt = idx;
165
166 for (Size y_idx = 0; y_idx < oe_string_len<CharKind>(fmt2); ++y_idx) {
167 ret[result_cnt] = fmt2[y_idx];
168 ++result_cnt;
169 }
170 }
171
172 ret[idx] = fmt[idx];
173 }
174
175 return ret;
176}
177} // namespace Kernel
#define RTL_ALLOCA(sz)
ErrorOr class for error handling.
Definition ErrorOr.h:22
Kernel string class, not dynamic.
Definition KString.h:20
Size Length() const
Definition KString.inl:32
CharKind * Data()
Definition KString.inl:22
KBasicString()
Definition KString.h:22
bool operator!=(const CharKind *rhs) const
Definition KString.inl:72
bool operator==(const CharKind *rhs) const
Definition KString.inl:49
Size fDataSz
Definition KString.h:70
Size fCur
Definition KString.h:71
const CharKind * CData() const
Definition KString.inl:27
KBasicString< CharKind, MinSz > & operator+=(const CharKind *rhs)
Definition KString.inl:94
CharKind * fData
Definition KString.h:69
static const CharKind * FromBool(const CharKind *fmt, bool n)
Definition KString.inl:112
static const CharKind * Format(const CharKind *fmt, const CharKind *from)
Definition KString.inl:152
static bool Equals(const CharKind *lhs, const CharKind *rhs)
Definition KString.inl:142
static ErrorOr< KBasicString< CharKind, MinSz > > Construct(const CharKind *data)
Definition KString.inl:103
UPS inline definitions.
Definition Device.h:12
__SIZE_TYPE__ Size
Definition Config.h:59
__SIZE_TYPE__ SizeT
Definition Config.h:60
constexpr KPCError kErrorInvalidData
Definition KPC.h:56
__INT32_TYPE__ Int32
Definition Config.h:38
SizeT oe_string_len(const CharType *str)
OpenEncoding API =========================================================== ///.
Definition Utils.h:54
void ort_string_append(CharKind *lhs, const CharKind *rhs, Int32 cur)
Definition KString.inl:12