52template <
typename ITERATOR_TYPE >
54template <
typename OTHER_CHARACTER >
55inline void string_base < ITERATOR_TYPE >::construct20(
const OTHER_CHARACTER * psz, character_count srclen, enum_range erange)
56 requires (other_primitive_character < OTHER_CHARACTER, CHARACTER >)
59 auto lengthSrc = srclen;
61 auto lengthNew = utf_to_utf_length2(this->m_begin, psz, lengthSrc);
63 auto pbasedata = this->create_string_data2(lengthNew, erange);
65 auto pdata = pbasedata->data();
67 this->m_begin = pdata;
69 utf_to_utf(pdata, psz, lengthSrc);
71 this->_set_length(lengthNew);
76template <
typename ITERATOR_TYPE >
77inline string_base < ITERATOR_TYPE >::string_base(
CHARACTER chSrc, character_count repeat) :
90 auto lengthNew = repeat;
92 auto pbasedata = this->create_string_data2(lengthNew, e_range_none);
94 auto pdata = pbasedata->data();
96 this->m_begin = pdata;
109 this->_set_length(lengthNew);
114template <
typename ITERATOR_TYPE >
115template <
typename OTHER_CHARACTER >
116inline string_base < ITERATOR_TYPE >::string_base(OTHER_CHARACTER chSrc, character_count repeat)
117requires other_primitive_character < OTHER_CHARACTER, CHARACTER > :
130 auto lenUnit = utf_to_utf_length1(this->begin(), &chSrc, 1);
132 auto lengthNew = lenUnit * repeat;
134 auto pbasedata = this->create_string_data2(lengthNew, e_range_none);
136 auto pdata = pbasedata->data();
138 this->m_begin = pdata;
142 utf_to_utf(sz, &chSrc, 1);
166 this->_set_length(lengthNew);
197template <
typename ITERATOR_TYPE >
198template < prototype_
character CHARACTER2 >
199string_base < ITERATOR_TYPE > & string_base < ITERATOR_TYPE > ::assign(
const CHARACTER2 * start,
const CHARACTER2 * end)
202 return assign(start, end - start);
207template <
typename ITERATOR_TYPE >
208template < prototype_
character CHARACTER2 >
209inline ::string_base < ITERATOR_TYPE > & string_base < ITERATOR_TYPE >::assign(
const CHARACTER2 * start, character_count len)
219template <
typename ITERATOR_TYPE >
220template < prototype_
character SAME_SIZE_CHARACTER >
221inline string_base < ITERATOR_TYPE > & string_base < ITERATOR_TYPE >::_assign(
const SAME_SIZE_CHARACTER * pszSource, character_count length)
222requires (
sizeof(SAME_SIZE_CHARACTER) ==
sizeof(
CHARACTER))
253 auto lengthNew = string_safe_length2(pszSource, length);
255 auto pdataThis = this->m_pbasedata;
270 if (::is_null(pszSource) || lengthNew <= 0)
273 this->default_construct();
279 if (::is_set(pdataThis) &&
280 !pdataThis->base_data_is_shared() &&
281 lengthNew <= pdataThis->storage_character_count()
291 auto pbasedata = this->create_string_data2(lengthNew, this->m_erange);
293 this->m_begin = pbasedata->data();
297 ::memory_transfer((
void*) this->m_begin, pszSource, lengthNew *
sizeof(
CHARACTER));
299 this->_set_length(lengthNew);
306 ::base_data_defer_release(pdataThis);
316template <
typename ITERATOR_TYPE >
317template < prototype_
character OTHER_SIZE_CHARACTER >
318inline string_base < ITERATOR_TYPE > & string_base < ITERATOR_TYPE >::_assign(
const OTHER_SIZE_CHARACTER * pszSource, character_count srclen)
319requires (
sizeof(OTHER_SIZE_CHARACTER) !=
sizeof(
CHARACTER))
322 ASSERT((
void * )(pszSource + srclen) < (
void*)this->m_begin
323 || (
void * )pszSource > (
void*)(this->m_end))
353 auto pdataThis = this->m_pbasedata;
355 if (::is_null(pszSource) || srclen <= 0)
358 this->default_construct();
364 auto lengthSrc = srclen;
366 auto lengthNew = utf_to_utf_length2(this->begin(), pszSource, lengthSrc);
371 this->default_construct();
377 if ((::is_set(pdataThis) && !pdataThis->base_data_is_shared() &&
378 lengthNew <= pdataThis->storage_character_count()))
387 auto pbasedata = this->create_string_data2(lengthNew, this->m_erange);
389 this->m_begin = pbasedata->data();
392 utf_to_utf((
CHARACTER *)this->m_begin, pszSource, lengthSrc);
394 this->_set_length(lengthNew);
403 ::base_data_defer_release(pdataThis);
412template <
typename ITERATOR_TYPE >
413template < prototype_
character CHARACTER2 >
414inline string_base < ITERATOR_TYPE > & string_base < ITERATOR_TYPE >::assign(CHARACTER2 chSrc, character_count repeat)
420 auto lenUnit = utf_to_utf_length1(this->begin(), &chSrc, 1);
422 auto len = lenUnit * repeat;
424 auto psz = get_buffer(len);
428 utf_to_utf(sz, &chSrc, 1);
437 for (::collection::index j = 0; j < lenUnit; j++)
440 *pTarget++ = *pSource;
465template <
typename ITERATOR_TYPE >
466inline string_base < ITERATOR_TYPE > & string_base < ITERATOR_TYPE >::_append(
const CHARACTER * pszSrc, character_count srclen)
469 if (this->is_empty())
472 return _assign(pszSrc, srclen);
476 auto old_len = this->length();
485 auto lengthSrc = srclen;
487 auto add_len = utf_to_utf_length2(this->m_begin, pszSrc, lengthSrc);
489 auto new_len = old_len + add_len;
491 auto p = get_buffer<true>(new_len);
493 utf_to_utf(p + old_len, pszSrc, lengthSrc);
495 this->_set_length(new_len);
502template <
typename ITERATOR_TYPE >
503template <
typename OTHER_CHARACTER >
504inline string_base < ITERATOR_TYPE > & string_base < ITERATOR_TYPE >::_append(
const OTHER_CHARACTER * pszSrc, character_count count)
505requires other_primitive_character < OTHER_CHARACTER, CHARACTER >
508 auto old_len = this->length();
517 auto lengthSrcAppend = count;
519 auto add_len = utf_to_utf_length2(this->m_begin, pszSrc, lengthSrcAppend);
521 auto new_len = old_len + add_len;
523 auto p = get_buffer<true>(new_len);
527 utf_to_utf(p, pszSrc, lengthSrcAppend);
529 this->_set_length(new_len);
537template <
typename ITERATOR_TYPE >
538inline string_base < ITERATOR_TYPE > & string_base < ITERATOR_TYPE >::append_character(::ansi_character ch)
541 return append(&ch, 1);
546template <
typename ITERATOR_TYPE >
547inline string_base < ITERATOR_TYPE > & string_base < ITERATOR_TYPE >::append_character(::wd16_character wch)
550 return append(&wch, 1);
555template <
typename ITERATOR_TYPE >
556inline string_base < ITERATOR_TYPE > & string_base < ITERATOR_TYPE >::append_character(::wd32_character wch)
559 return append(&wch, 1);
564template <
typename ITERATOR_TYPE >
565inline string_base < ITERATOR_TYPE > & string_base < ITERATOR_TYPE >::append(character_count len,
CHARACTER ch)
571 character_count nOldLength = this->size();
573 character_count nNewLength = nOldLength + len;
575 auto p = this->get_buffer<true>(nNewLength);
577 auto padd = p + len - 1;
588 this->release_buffer(nNewLength);
597template <
typename ITERATOR_TYPE >
598void string_base< ITERATOR_TYPE >::construct_from_string(
const string_base& str)
601 this->m_begin = str.m_begin;
603 this->m_end = str.m_end;
605 this->m_erange = str.m_erange;
607 this->m_pbasedata = str.m_pbasedata;
609 if (this->m_pbasedata)
612 this->m_pbasedata->base_data_increment_reference_count();
619template <
typename ITERATOR_TYPE >
620inline void string_base< ITERATOR_TYPE >::construct_from_range(ITERATOR_TYPE pSrc, character_count length)
623 auto lengthNew = string_safe_length2(pSrc, length);
625 if (::is_null(pSrc) || lengthNew <= 0)
634 auto pbasedata = this->create_string_data2(lengthNew, e_range_none);
636 auto pdata = pbasedata->data();
638 this->m_begin = pdata;
640 string_count_copy(pdata, pSrc, lengthNew);
642 this->_set_length(lengthNew);
647template <
typename ITERATOR_TYPE >
648template <
typename OTHER_CHARACTER_POINTER >
649inline void string_base< ITERATOR_TYPE >::construct_from_range(OTHER_CHARACTER_POINTER pSrc, character_count srclen)
650requires other_character_pointer < OTHER_CHARACTER_POINTER, ITERATOR_TYPE >
653 auto lengthSrc = srclen;
655 auto lengthNew = utf_to_utf_length2(this->begin(), pSrc, lengthSrc);
657 if (::is_null(pSrc) || lengthNew <= 0)
666 auto pbasedata = this->create_string_data2(lengthNew, e_range_none);
668 auto pdata = pbasedata->data();
670 this->m_begin = pdata;
672 utf_to_utf(pdata, pSrc, lengthSrc);
674 this->_set_length(lengthNew);
679template <
typename ITERATOR_TYPE >
680template <
character_po
inter CHARACTER_POINTER >
681string_base< ITERATOR_TYPE >::string_base(CHARACTER_POINTER s1, CHARACTER_POINTER e1, CHARACTER_POINTER s2, CHARACTER_POINTER e2) :
689template <
typename ITERATOR_TYPE >
690template <
typename RANGE1,
typename RANGE2 >
691void string_base< ITERATOR_TYPE >::construct_from_two_ranges_concatenation(
const RANGE1& range1,
const RANGE2& range2)
694 if (range1.is_empty())
697 if (range2.is_empty())
706 construct_from_a_range(range2);
713 else if (range2.is_empty())
716 construct_from_a_range(range1);
722 auto len1 = range1.size();
724 auto lenNew1 = string_safe_length2(range1.m_begin, len1);
726 auto len2 = range2.size();
728 auto lenNew2 = string_safe_length2(range2.m_begin, len2);
730 auto lengthNew = lenNew1 + lenNew2;
732 auto pbasedata = this->create_string_data2(lengthNew, e_range_none);
734 auto pdata = pbasedata->data();
736 this->m_begin = pdata;
740 string_count_copy(p, range1.m_begin, lenNew1);
742 string_count_copy(p + lenNew1, range2.m_begin, lenNew2);
744 this->_set_length(lengthNew);
Definition string_base.h:90