@@ -54,6 +54,12 @@ namespace sysstr
54
54
concept builder_appendable = requires(sys_string_builder_t <Storage> builder, T t) {
55
55
builder.append (t);
56
56
};
57
+
58
+ template <class T , class Storage >
59
+ concept addable = sys_string_or_char<T, Storage> || (
60
+ std::ranges::forward_range<T> &&
61
+ has_utf_encoding<std::ranges::range_value_t <T>>
62
+ );
57
63
}
58
64
59
65
namespace sysstr ::util
@@ -315,9 +321,9 @@ namespace sysstr
315
321
friend auto compare_no_case (const sys_string_t lhs, const sys_string_t & rhs) noexcept -> std::strong_ordering
316
322
{ return sys_string_t::compare_no_case (lhs, rhs); }
317
323
318
- template <sys_string_or_char <Storage> StringOrChar1, sys_string_or_char <Storage> StringOrChar2 >
319
- friend auto operator +(const StringOrChar1 lhs, const StringOrChar2 rhs) -> util::addition<Storage, StringOrChar1, StringOrChar2 >
320
- { return util::addition<Storage, StringOrChar1, StringOrChar2>( std::move ( lhs), std::move ( rhs) ); }
324
+ template <addable <Storage> Addend1, addable <Storage> Addend2 >
325
+ friend auto operator +(const Addend1 & lhs, const Addend2 & rhs) -> util::addition<Storage, Addend1, Addend2 >
326
+ { return util::addition<Storage, Addend1, Addend2>( lhs, rhs); }
321
327
322
328
auto to_lower () const -> sys_string_t;
323
329
auto to_upper () const -> sys_string_t;
@@ -567,44 +573,44 @@ namespace sysstr
567
573
template <has_utf_encoding Char>
568
574
iterator insert (iterator where, const Char * str)
569
575
{
570
- auto res = insert_many (m_impl, where.storage_current (), str, std::char_traits<Char>:: length (str));
576
+ auto res = insert_many (m_impl, where.storage_current (), std::basic_string_view (str));
571
577
return iterator (res, std::ranges::end (m_impl));
572
578
}
573
579
574
580
template <has_utf_encoding Char>
575
581
iterator insert (std::default_sentinel_t , const Char * str)
576
582
{
577
- auto res = insert_many (m_impl, std::ranges::end (m_impl), str, std::char_traits<Char>:: length (str));
583
+ auto res = insert_many (m_impl, std::ranges::end (m_impl), std::basic_string_view (str));
578
584
return iterator (res, std::ranges::end (m_impl));
579
585
}
580
586
581
587
template <has_utf_encoding Char>
582
588
iterator insert (iterator where, const Char * str, size_t len)
583
589
{
584
- auto res = insert_many (m_impl, where.storage_current (), str, len);
590
+ auto res = insert_many (m_impl, where.storage_current (), std::basic_string_view ( str, len) );
585
591
return iterator (res, std::ranges::end (m_impl));
586
592
}
587
593
588
594
template <has_utf_encoding Char>
589
595
iterator insert (std::default_sentinel_t , const Char * str, size_t len)
590
596
{
591
- auto res = insert_many (m_impl, std::ranges::end (m_impl), str, len);
597
+ auto res = insert_many (m_impl, std::ranges::end (m_impl), std::basic_string_view ( str, len) );
592
598
return iterator (res, std::ranges::end (m_impl));
593
599
}
594
600
595
- template <std::ranges::contiguous_range Range>
601
+ template <std::ranges::input_range Range>
596
602
requires (has_utf_encoding<std::ranges::range_value_t <Range>>)
597
603
iterator insert(iterator where, const Range & range)
598
604
{
599
- auto res = insert_many (m_impl, where.storage_current (), std::ranges::data ( range), std::ranges::size (range) );
605
+ auto res = insert_many (m_impl, where.storage_current (), range);
600
606
return iterator (res, std::ranges::end (m_impl));
601
607
}
602
608
603
- template <std::ranges::contiguous_range Range>
609
+ template <std::ranges::input_range Range>
604
610
requires (has_utf_encoding<std::ranges::range_value_t <Range>>)
605
611
iterator insert(std::default_sentinel_t , const Range & range)
606
612
{
607
- auto res = insert_many (m_impl, std::ranges::end (m_impl), std::ranges::data ( range), std::ranges::size (range) );
613
+ auto res = insert_many (m_impl, std::ranges::end (m_impl), range);
608
614
return iterator (res, std::ranges::end (m_impl));
609
615
}
610
616
@@ -631,19 +637,19 @@ namespace sysstr
631
637
632
638
template <has_utf_encoding Char>
633
639
sys_string_builder_t & append (const Char * str, size_t len)
634
- { append_many (m_impl, str, len); return *this ; }
640
+ { append_many (m_impl, std::basic_string_view ( str, len) ); return *this ; }
635
641
636
642
template <has_utf_encoding Char>
637
643
sys_string_builder_t & append (const Char * str)
638
- { append_many (m_impl, str, std::char_traits<Char>:: length (str)); return *this ; }
644
+ { append_many (m_impl, std::basic_string_view (str)); return *this ; }
639
645
640
- template <std::ranges::contiguous_range Range>
646
+ template <std::ranges::input_range Range>
641
647
requires (has_utf_encoding<std::ranges::range_value_t <Range>>)
642
648
sys_string_builder_t & append(const Range & range)
643
- { append_many (m_impl, std::ranges::data ( range), std::ranges::size (range) ); return *this ; }
649
+ { append_many (m_impl, range); return *this ; }
644
650
645
651
sys_string_builder_t & append (const sys_string_t <Storage> & str)
646
- { append_range ( typename sys_string_t <Storage>::char_access (str)); return *this ; }
652
+ { append_many (m_impl, typename sys_string_t <Storage>::char_access (str)); return *this ; }
647
653
648
654
sys_string_t <Storage> build () noexcept
649
655
{ return util::build<Storage>(m_impl); }
@@ -664,14 +670,15 @@ namespace sysstr
664
670
665
671
static typename impl_type::iterator insert_one (impl_type & impl, typename impl_type::iterator where, char32_t c);
666
672
667
- template <has_utf_encoding Char>
668
- static void append_many (impl_type & impl, const Char * str, size_t len);
669
-
670
- template <has_utf_encoding Char>
671
- static typename impl_type::iterator insert_many (impl_type & impl, typename impl_type::iterator pos, const Char * str, size_t len);
673
+ template <std::ranges::input_range Range>
674
+ requires (has_utf_encoding<std::ranges::range_value_t <Range>>)
675
+ static void append_many(impl_type & impl, const Range & range);
672
676
673
677
template <std::ranges::input_range Range>
674
- void append_range (const Range & range);
678
+ requires (has_utf_encoding<std::ranges::range_value_t <Range>>)
679
+ static typename impl_type::iterator insert_many(impl_type & impl, typename impl_type::iterator where, const Range & range);
680
+
681
+
675
682
676
683
private:
677
684
impl_type m_impl;
0 commit comments