acme
Foundational cross-platform layer of the ca2 framework
Loading...
Searching...
No Matches
_impl_const_string_range.h
1// Created by camilo on 2025-04-24 18:57 <3ThomasBorregaardSorensen!!
2#pragma once
3
4
5
6
7template < prototype_character CHARACTER >
8::string_base < const CHARACTER* > operator + (
9 const ::range < const CHARACTER* >& range1,
10 const ::range < const CHARACTER* >& range2)
11{
12
13 return { range1, range2 };
14
15}
16
17
18
19template < prototype_character CHARACTER, character_count n >
20::string_base < const CHARACTER* > operator + (
21 const ::range < const CHARACTER* >& range1,
22 const CHARACTER(&s)[n])
23{
24
25 return { range1, ::as_string_literal <CHARACTER,n>(s) };
26
27}
28
29
30template < typename ITERATOR_TYPE >
31const_string_range < ITERATOR_TYPE >::THIS_RANGE const_string_range < ITERATOR_TYPE >::right(character_count count) const
32{
33
34 if (count < 0)
35 {
36
37 count = 0;
38
39 }
40
41 character_count nLength = this->size();
42
43 if (count >= nLength)
44 {
45
46 return *this;
47
48 }
49
50 return _begin_set(this->begin() + nLength - count);
51
52}
53
54
55// Return the substring consisting of the leftmost 'count' characters
56template < typename ITERATOR_TYPE >
57const_string_range < ITERATOR_TYPE > const_string_range < ITERATOR_TYPE >::left(character_count count) const
58{
59
60 // count is in XCHARs
61 if (count < 0)
62 {
63
64 count = 0;
65
66 }
67
68 character_count nLength = this->size();
69
70 if (count >= nLength)
71 {
72
73 return *this;
74
75 }
76
77 return _end_set(this->begin() + count);
78
79}
80
81
82// Return the substring consisting of the leftmost characters in the set 'pszCharSet'
83template < typename ITERATOR_TYPE >
84const_string_range < ITERATOR_TYPE > const_string_range < ITERATOR_TYPE >::left_including_any_character_in(const SCOPED_STRING& scopedstrCharacters) const
85{
86
87 auto pbegin = this->skip_any_character_in(scopedstrCharacters);
88
89 return _begin_set(pbegin);
90
91}
92
93
94// Return the substring consisting of the leftmost characters not in the set 'pszCharSet'
95template < typename ITERATOR_TYPE >
96const_string_range < ITERATOR_TYPE > const_string_range < ITERATOR_TYPE >::left_skipping_any_character_in(const SCOPED_STRING& scopedstrCharacters) const
97{
98
99 auto pbegin = this->skip_any_character_in(scopedstrCharacters);
100
101 return _begin_set(pbegin);
102
103}
104
105
106//template < typename ITERATOR_TYPE >
107//typename ::const_string_range < ITERATOR_TYPE >::THIS_RANGE const_string_range < ITERATOR_TYPE > ::consume_token_until_any_character_in(const SCOPED_STRING& scopedstrCharacters, bool bReturnSeparator, bool bSkipAnyCharactersIn) const
108//{
109//
110// auto p1 = this->find_first_character_in(scopedstrCharacters);
111//
112// if (!p1)
113// {
114//
115// return *this;
116// //auto range = (*this)();
117//
118// //if (this->m_begin != this->m_end)
119// //{
120//
121// // this->m_begin = this->m_end;
122//
123// // this->m_erange = ;
124//
125// //}
126//
127// //return { this->m_end, this->m_end, (enum_range)(this->m_erange & ~e_range_string) };
128//
129// }
130//
131// if (bSkipAnyCharactersIn)
132// {
133//
134// auto p2 = (*this)(p1).skip_any_character_in(scopedstrCharacters);
135//
136// if (bReturnSeparator)
137// {
138//
139// auto range = const_string_range < ITERATOR_TYPE >(this->m_begin, p2);
140//
141// this->set_begin(p2);
142//
143// return range;
144//
145// }
146//
147// auto range = string_range < ITERATOR_TYPE >(this->m_begin, p1);
148//
149// this->set_begin(p2);
150//
151// return range;
152//
153// }
154//
155// if (bReturnSeparator)
156// {
157//
158// auto range = string_range < ITERATOR_TYPE >(this->m_begin, p1 + 1);
159//
160// this->set_begin(p1 + 1);
161//
162// return range;
163//
164// }
165//
166// auto range = string_range < ITERATOR_TYPE >(this->m_begin, p1);
167//
168// this->set_begin(p1 + 1);
169//
170// return range;
171//
172//}
173
174
175template < typename ITERATOR_TYPE >
176bool const_string_range < ITERATOR_TYPE >::xml_is_comment() const
177{
178
179 return this->size() > 3 && this->m_begin[0] == '<' && this->m_begin[1] == '!' && this->m_begin[2] == '-';
180
181}
182
183
184
185//========================================================
186// Name : _tcsenicmp
187// Desc : similar with case_insensitive_ansi_count_compare with escape process
188// Param : escape - will be escape character
189// Return :
190//--------------------------------------------------------
191// Coder Date Desc
192// bro 2002-10-29
193//========================================================
194template < typename ITERATOR_TYPE >
195::std::strong_ordering const_string_range < ITERATOR_TYPE >::escape_case_insensitive_count_order(const ::scoped_string& scopedstr, ::i32 escape) const
196{
197
198 auto rangeCompare = scopedstr();
199
200 ::std::strong_ordering order = ::std::strong_ordering::equal;
201
202 const CHARACTER* prev_escape = nullptr;
203
204 auto r = (*this)();
205
206 while (r.has_character() && *r.m_begin && rangeCompare.has_character())
207 {
208
209 if (escape != 0 && *r.m_begin == escape && prev_escape == nullptr)
210 {
211
212 prev_escape = r.m_begin;
213
214 }
215 else
216 {
217
218 prev_escape = nullptr;
219
220 order = unicode_to_lower_case(unicode_index(r.m_begin)) <=> unicode_to_lower_case(unicode_index(rangeCompare.m_begin));
221
222 if (order != 0)
223 {
224
225 break;
226
227 }
228
229 rangeCompare.m_begin++;
230
231 }
232
233 r.m_begin++;
234
235 }
236
237 return order;
238
239}
240
241
242template < typename ITERATOR_TYPE >
243typename const_string_range < ITERATOR_TYPE >::THIS_RANGE const_string_range < ITERATOR_TYPE >::get_utf8_char() const
244{
245
246 auto pszStart = this->m_begin;
247
248 auto pszNext = unicode_next(pszStart);
249
250 return { pszStart, minimum(pszNext, this->m_end) };
251
252}
253
254
255
256
257
::std::strong_ordering escape_case_insensitive_count_order(const ::scoped_string &scopedstr, ::i32 escape) const
Definition _impl_const_string_range.h:195