acme
Foundational cross-platform layer of the ca2 framework
Loading...
Searching...
No Matches
character_range.h
1// Created by camilo on 2025-04-17 09:37 <3ThomasBorregaardSorensen!!
2#pragma once
3#include <format>
4
5
6#include "acme/prototype/collection/range.h"
7#include "acme/prototype/string/string_heap_data.h"
8
9
10template < typename TYPE >
11inline const TYPE & for_copy(TYPE && t)
12{
13
14 return (const TYPE &) t;
15
16}
17
18
19// template < typename ITERATOR_TYPE >
20// inline void string_base_increment_reference_count(ITERATOR_TYPE piterator);
21//
22//
23// template < typename ITERATOR_TYPE >
24// inline void string_base_release(ITERATOR_TYPE piterator);
25
26
27//template < typename RANGE, typename ITERATOR_TYPE >
28//inline RANGE & create_string(RANGE & rangeTarget, const ::character_range < ITERATOR_TYPE > & rangeSource)
29//requires (::std::is_base_of < ::character_range < ITERATOR_TYPE >, RANGE >::value);
30// {
31//
32// this->m_begin =
33//
34// }
35//
36//
37// //template < character_count n >
38// //scoped_string_base(const ::i8 (&cha)[n]) :m_str(e_zero_initialize), BASE_RANGE(e_zero_initialize) { _construct1(cha); }
39// //template < typed_character_pointer < typename scoped_string_base < ITERATOR_TYPE >::CHARACTER > CHARACTER_POINTER >
40// template < typename RANGE, typename ITERATOR_TYPE >
41// RANGE & create_string(RANGE & range, ITERATOR_TYPE start, ITERATOR_TYPE end, enum_range erange = e_range_none)
42// requires (::std::is_base_of < ::character_range < ITERATOR_TYPE >, RANGE >::value);
43//
44//
45// template < typename RANGE, typename OTHER_ITERATOR_TYPE >
46// RANGE & create_string(RANGE & range, OTHER_ITERATOR_TYPE start, OTHER_ITERATOR_TYPE end, enum_range erange = e_range_none)
47// requires (sizeof(get_iterator_item < OTHER_ITERATOR_TYPE >) != sizeof(typename RANGE::ITEM)
48// && ::std::is_base_of < ::character_range < typename RANGE::this_iterator >, RANGE >::value);
49//
50//
51// template < typename ITERATOR_TYPE >
52// inline ITERATOR_TYPE character_range_defer_increment_reference_count(ITERATOR_TYPE piterator, enum_range erange);
53//
54//
55// template < typename RANGE >
56// inline RANGE & character_range_defer_increment_reference_count(RANGE & range);
57//
58//
59// template < typename RANGE >
60// inline RANGE & character_range_defer_release(RANGE & range);
61//
62
63//
64//
65//if (::is_set(this->m_pbasedata))
66//{
67//
68// this->m_pbasedata->base_data_increment_reference_count();
69//
70//}
71
72
73
74template < typename ITERATOR_TYPE >
75class character_range :
76 public ::block_range < ITERATOR_TYPE >
77{
78public:
79
80 using THIS_CHARACTER_RANGE = character_range < ITERATOR_TYPE >;
81 using RAW_CHARACTER_RANGE = THIS_CHARACTER_RANGE;
82
83 using BASE_RANGE = ::character_range < ITERATOR_TYPE >;
84 using BASE_RAW_RANGE = ::block_range < ITERATOR_TYPE >;
85 using _BASE_RAW_RANGE = ::block_range < ITERATOR_TYPE >;
86
87 using this_iterator = typename _BASE_RAW_RANGE::this_iterator;
88
89 using CHARACTER = typename BASE_RANGE::ITEM;
90 using BASE_DATA = ::base_data < CHARACTER >;
91
92 BASE_DATA * m_pbasedata;
93
94 constexpr character_range(no_initialize_t) :
95 _BASE_RAW_RANGE(no_initialize_t{}) { }
96
97 constexpr character_range() : _BASE_RAW_RANGE()
98 {
99 m_pbasedata = nullptr;
100 }
101
102 constexpr character_range(nullptr_t) : _BASE_RAW_RANGE(nullptr)
103 {
104 m_pbasedata = nullptr;
105 }
106
107 template < typed_character_pointer < typename character_range < ITERATOR_TYPE >::CHARACTER > CHARACTER_POINTER >
108 character_range(CHARACTER_POINTER begin, CHARACTER_POINTER end, enum_range erange = e_range_none, BASE_DATA * pbasedata = nullptr) :
109 _BASE_RAW_RANGE(begin, end, erange)
110 {
111
112 this->m_begin = begin;
113
114 this->m_pbasedata = pbasedata;
115
116// if (::is_set(this->m_pbasedata) && !(erange & e_range_scoped_ownership))
117 if (::is_set(this->m_pbasedata))
118 {
119
120 this->m_pbasedata->base_data_increment_reference_count();
121
122 }
123
124 }
125
126
127 template < other_character_pointer < typename character_range < ITERATOR_TYPE >::CHARACTER > OTHER_CHARACTER_POINTER >
128 character_range(OTHER_CHARACTER_POINTER start, OTHER_CHARACTER_POINTER end, enum_range erange = e_range_none) = delete;
129
130
131 template < character_count length >
132 character_range(const CHARACTER (&s)[length]) :
133 _BASE_RAW_RANGE(no_initialize_t{})
134 {
135
136 auto lengthNew = string_safe_length2(s, length);
137
138 this->m_begin = s;
139
140 this->m_end = s + lengthNew;
141
142 this->m_erange = e_range_none;
143
144 this->m_pbasedata = nullptr;
145
146 //this->m_erange = *this->m_end ? e_range_none : e_range_null_terminated;
147
148 }
149
150 template < character_pointer CHARACTER_POINTER >
151 //character_range(CHARACTER_POINTER start) : character_range(start, start + string_safe_length(start), e_range_null_terminated) { }
152 character_range(CHARACTER_POINTER start) : character_range(start, start + string_safe_length(start), e_range_none) { }
153
154
155 template < character_pointer CHARACTER_POINTER >
156 character_range(CHARACTER_POINTER start, character_count length) = delete;
157
158
159 template < other_primitive_character <CHARACTER> OTHER_CHARACTER, character_count length >
160 character_range(const CHARACTER(&s)[length]) = delete;
161
162
163 character_range(const character_range& characterrange) :
164 _BASE_RAW_RANGE(characterrange)
165 {
166
167 this->m_pbasedata = characterrange.m_pbasedata;
168
169 //if (::is_set(this->m_pbasedata) && !(this->m_erange & e_range_scoped_ownership))
170 if (::is_set(this->m_pbasedata))
171 {
172
173 this->m_pbasedata->base_data_increment_reference_count();
174
175 }
176
177 }
178
179 character_range(character_range&& characterrange) :
180 _BASE_RAW_RANGE(::transfer(characterrange))
181 {
182
183 m_pbasedata = characterrange.m_pbasedata;
184
185 characterrange.m_pbasedata = nullptr;
186
187 }
188
189
190 template < typename TYPED_RANGE >
191 character_range(const TYPED_RANGE& range) requires
193 && !std::is_same_v<std::decay_t<TYPED_RANGE>, character_range>) :
194 character_range(range.m_begin, range.m_end, range.m_erange, range.m_pbasedata) { }
195
196 template < typename OTHER_RANGE >
197 character_range(const OTHER_RANGE& range) requires
199
200 // constexpr character_range(this_iterator begin, this_iterator end, enum_range erange = e_range_none) :
201 // BASE_RANGE(character_range_defer_increment_reference_count(begin, erange), end, erange) { }
202
203
204 BASE_DATA * create_string_data2(character_count lengthNew, enum_range erange)
205 {
206
207 auto allocationSize = lengthNew;
208
209 if (erange & e_range_buffer)
210 {
211
212 allocationSize *= 2;
213
214 }
215
216 auto pbasedata = BASE_DATA::create_base_data2(allocationSize + 1);
217
218 this->m_pbasedata = pbasedata;
219
220 this->m_erange = erange & ~e_range_string_literal;
221
222 return pbasedata;
223
224 }
225
226
227 inline memsize storage_count() const
228 {
229
230 auto pbasedata = this->m_pbasedata;
231
232 if (is_null(pbasedata))
233 {
234
235 return 0;
236
237 }
238
239 return pbasedata->storage_count();
240
241 }
242
243
244 inline character_count storage_character_count() const
245 {
246
247 auto pbasedata = this->m_pbasedata;
248
249 if (is_null(pbasedata))
250 {
251
252 return 0;
253
254 }
255
256 return pbasedata->storage_character_count();
257
258 }
259
260 inline character_count length() const { return this->m_end - this->m_begin; }
261 inline character_count size() const { return this->length(); }
262 inline memsize character_count_in_bytes() const { return this->length() * sizeof(CHARACTER); };
263 inline memsize null_terminated_character_count_in_bytes() const { return (this->length() + 1) * sizeof(CHARACTER); }
264
265 character_range& operator=(const character_range& range)
266 {
267 _BASE_RAW_RANGE::operator=(range);
268 this->m_pbasedata = range.m_pbasedata;
269 return *this;
270 }
271
272
273 character_range& operator=(character_range&& range) {
274 _BASE_RAW_RANGE::operator=(::transfer(range));
275 this->m_pbasedata = range.m_pbasedata;
276 range.m_pbasedata = nullptr;
277 return *this;
278 }
279
280
281 // inline ::character_count storage_character_count() const
282 // {
283 //
284 // if (!m_pbasedata)
285 // {
286 //
287 // return 0;
288 //
289 // }
290 //
291 // return (::character_count);
292 //
293 // }
294
295 constexpr bool has_string_storage() const { return m_pbasedata != nullptr; }
296
297
298 constexpr bool is_null_terminated() const { return !*this->m_end; }
299
300
301 constexpr bool is_working_string_range() const { return !this->has_string_storage(); }
302
303
304 void set_null()
305 {
306
307 _BASE_RAW_RANGE::set_null();
308
309 this->m_pbasedata = nullptr;
310
311 }
312
313 // inline static BASE_DATA * create_base_data(character_count character_count)
314 // {
315 //
316 // auto pbasedata = BASE_DATA::heap_data_create(character_count);
317 //
318 // return pbasedata;
319 //
320 // }
321
322
323 void _set_length(::character_count count)
324 {
325
326 this->m_end = this->m_begin + count;
327
328 *((CHARACTER *)this->m_end) = {};
329
330 }
331
332
333 template < typename SAME_ITERATOR_TYPE >
334 void construct_string(SAME_ITERATOR_TYPE start, SAME_ITERATOR_TYPE end, enum_range erange = e_range_none, typename ::character_range<SAME_ITERATOR_TYPE>::BASE_DATA * pbasedata = nullptr)
335 requires (sizeof(get_iterator_item < SAME_ITERATOR_TYPE >) == sizeof(CHARACTER))
336 {
337
338 auto length = end - start;
339
340 auto lengthNew = string_safe_length2(start, length);
341
342 if (::is_set(pbasedata))
343 {
344
345 if (pbasedata->data() != start || length > pbasedata->storage_character_count())
346 {
347
348 throw "wrong state in construct string (1)";
349
350 }
351
352 pbasedata->base_data_increment_reference_count();
353
354 this->m_pbasedata = pbasedata;
355
356 this->m_erange = erange;
357
358 this->m_begin = start;
359
360 }
361 else
362 {
363
364 auto pbasedata = this->create_string_data2(lengthNew, erange);
365
366 auto pdata = pbasedata->data();
367
368 this->m_begin = pdata;
369
370 memory_transfer(pdata, start, lengthNew);
371
372 }
373
374 this->_set_length(lengthNew);
375
376 }
377
378
379 template < typename OTHER_ITERATOR_TYPE >
380 void construct_string(OTHER_ITERATOR_TYPE start, OTHER_ITERATOR_TYPE end, enum_range erange = e_range_none)
381 requires (sizeof(get_iterator_item < OTHER_ITERATOR_TYPE >) != sizeof(CHARACTER))
382 {
383
384 auto srclen = end - start;
385
386 character_count lengthSrc = srclen;
387
388 auto lengthNew = utf_to_utf_length2(this->m_begin, start, lengthSrc);
389
390 auto pbasedata = this->create_string_data2(lengthNew, erange);
391
392 auto pdata = pbasedata->data();
393
394 this->m_begin = pdata;
395
396 utf_to_utf(pdata, start, lengthSrc);
397
398 this->_set_length(lengthNew);
399
400 }
401
402
403};
404
405
406//
407//template <typename ITERATOR_TYPE>
408//struct std::formatter<character_range<ITERATOR_TYPE>> : std::formatter<std::string_view>
409//{
410// template <typename FormatContext>
411// auto format(const character_range<ITERATOR_TYPE>& s, FormatContext& ctx) const
412// {
413// return std::formatter<std::string_view>::format(
414// std::string_view(s.begin(), s.size()), ctx);
415// }
416//};
417//
418//
419//
420
421
423//template <typename CharT>
424//struct std::formatter<::character_range<const CharT *>, CharT> {
425// // Reuse the existing string_view formatter
426// std::formatter<std::basic_string_view<CharT>, CharT> formatter;
427//
428// constexpr auto parse(std::basic_format_parse_context<CharT>& ctx) {
429// // Delegate parsing to string_view's formatter
430// return formatter.parse(ctx);
431// }
432//
433// template <typename FormatContext>
434// auto format(const ::character_range<const CharT *>& s, FormatContext& ctx) {
435// // Wrap in string_view and forward
436// return formatter.format(
437// std::basic_string_view<CharT>(s.data(), s.size()), ctx);
438// }
439//
440//
441//};
442
443
444template<class T>
446{
447 typedef T type;
448};
449
450template< >
451struct character_decay_struct < ansi_character >
452{
453 typedef ::i8 type;
454};
455
456#if defined(WINDOWS)
457
458template< >
459struct character_decay_struct < wd16_character >
460{
461 typedef wchar_t type;
462};
463
464template< >
465struct character_decay_struct < wd32_character >
466{
467 typedef char32_t type;
468};
469
470#else
471
472template< >
473struct character_decay_struct < wd16_character >
474{
475 typedef char16_t type;
476};
477
478template< >
479struct character_decay_struct < wd32_character >
480{
481 typedef wchar_t type;
482};
483
484
485#endif
486
487
488
489template<typename T>
490using character_decay = typename character_decay_struct<T>::type;
491
492
493//template <typename ITERATOR_TYPE, typename CharT >
494// requires(::std::is_same_v < CharT, ::character_decay < ::non_pointer< ITERATOR_TYPE > > >)
495//struct std::formatter<::character_range<ITERATOR_TYPE>, CharT >
496//{
497//
498// using character_type = CharT;
499// using string_view_type = ::std::basic_string_view<character_type>;
500// using target_iterator = const character_type *;
501//
502// ::std::formatter<string_view_type, character_type> base;
503//
504// // Forward parse explicitly
505// constexpr auto parse(std::format_parse_context& ctx) {
506// return base.parse(ctx);
507// }
508//
509// template <typename FormatContext>
510// auto format(const ::character_range<ITERATOR_TYPE>& range, FormatContext& ctx) const {
511// // Construct string_view safely from iterators
512// string_view_type sv(
513// (target_iterator)range.begin(),
514// (target_iterator)range.end());
515// return base.format(sv, ctx);
516// }
517//};
518//
519//#include <format>
520//#include <string_view>
521//#include <type_traits>
522//
523//template <typename ITERATOR_TYPE>
524//struct std::formatter<::character_range<ITERATOR_TYPE>, ::i8>
525//{
526//
527// using character_type_check = ::character_decay < ::non_pointer < ::non_const < ITERATOR_TYPE > > >;
528//
529// std::formatter<::std::string_view, ::i8> base;
530//
531// // Must be exactly std::format_parse_context&
532// constexpr auto parse(std::format_parse_context& ctx) {
533// return base.parse(ctx);
534// }
535//
536// template <typename FormatContext>
537// auto format(const ::character_range<ITERATOR_TYPE>& range, FormatContext& ctx) const {
538// static_assert(std::is_same_v<character_type_check, ::i8>,
539// "FormatContext char_type must match formatter ::i8");
540// ::std::string_view sv(range.begin(), range.end());
541// return base.format(sv, ctx);
542// }
543//};
544//
545//
546//template <typename ITERATOR_TYPE>
547//struct std::formatter<::character_range<ITERATOR_TYPE>, wchar_t>
548//{
549//
550// using character_type_check = ::character_decay < ::non_pointer < ITERATOR_TYPE > >;
551//
552// std::formatter<::std::wstring_view, wchar_t> base;
553//
554// constexpr auto parse(std::wformat_parse_context& ctx) { return base.parse(ctx); }
555//
556// template <typename FormatContext>
557// auto format(const ::character_range<ITERATOR_TYPE>& range, FormatContext& ctx) const {
558// static_assert(std::is_same_v<character_type_check, wchar_t>,
559// "FormatContext char_type must match formatter ::i8");
560// ::std::wstring_view sv(range.begin(), range.end());
561// return base.format(sv, ctx);
562// }
563//};
564
565
566template <prototype_character_range CHARACTER_RANGE >
567requires(sizeof(::character_decay<::non_pointer<::non_const< typename CHARACTER_RANGE::this_iterator>>>) == 1)
568struct std::formatter<CHARACTER_RANGE>
569{
570 using BASE_TYPE = CHARACTER_RANGE;
571 using this_iterator = typename BASE_TYPE::this_iterator;
572 using character_type = ::character_decay<::non_pointer<::non_const< this_iterator>>>;
573 using string_view_type = ::std::basic_string_view<character_type>;
574 using target_iterator = const character_type*;
575
576 std::formatter<string_view_type> base;
577
578 // Forward parse explicitly
579 template <typename FormatContext>
580 constexpr auto parse(FormatContext& ctx) {
581 return base.parse(ctx);
582 }
583
584 template <typename FormatContext>
585 auto format(const BASE_TYPE & characterrange, FormatContext& ctx) const {
586 return base.format(
587 string_view_type{
588 (target_iterator) characterrange.begin(),
589 (target_iterator) characterrange.end()
590 },
591 ctx
592 );
593 }
594};
595
596
597template <typename ITERATOR_TYPE>
598struct std::formatter<::character_range<ITERATOR_TYPE>>
599{
600 using character_type = ::character_decay<::non_pointer<::non_const< ITERATOR_TYPE>>>;
601 using string_view_type = ::std::basic_string_view<character_type>;
602 using target_iterator = const character_type*;
603
604 std::formatter<string_view_type> base;
605
606 // Forward parse explicitly
607 template <typename FormatContext>
608 constexpr auto parse(FormatContext& ctx) {
609 return base.parse(ctx);
610 }
611
612 template <typename FormatContext>
613 auto format(const ::character_range<ITERATOR_TYPE>& characterrange, FormatContext& ctx) const {
614 return base.format(
615 string_view_type{
616 (target_iterator)characterrange.begin(),
617 (target_iterator)characterrange.end()
618 },
619 ctx
620 );
621 }
622};
623
624
625
626
627
628inline void test_u03485203845()
629{
630
631 //::std::string_view stringview;
632
633 character_range < const ::ansi_character *> a;
634
635 a.m_begin = "test";
636 a.m_end = a.m_begin + strlen(a.m_begin);
637 a.m_erange = e_range_string_literal;
638
639 //::std::basic_format_string<::i8, character_range<const ansi_character*>&>::basic_format_string<::i8[11]>(const _Ty(&));
640
641 auto str = ::std::format("test is {}", a);
642
643 printf("Test is %s", str.c_str());
644
645}
character_count storage_character_count() const
Definition natural_pointer.h:118
Definition character_range.h:77
Definition _initial_concepts.h:383
Definition _initial_concepts.h:136
Definition character_range.h:446
Definition _tags.h:5