@@ -423,48 +423,81 @@ auto sysstr::sys_string_t<Storage>::replace(const StringOrChar1 & old, const Str
423
423
424
424
template <class Storage >
425
425
template <class StringOrChar >
426
- auto sysstr::sys_string_t <Storage>::tailAfterFirst (const StringOrChar & divider) const ->
427
- std::enable_if_t <is_string_or_char<StringOrChar>, sys_string_t >
426
+ auto sysstr::sys_string_t <Storage>::suffix_after_first (const StringOrChar & divider) const ->
427
+ std::enable_if_t <is_string_or_char<StringOrChar>, std::optional< sys_string_t > >
428
428
{
429
429
sys_string_t <Storage>::char_access my_access (*this );
430
430
util::string_or_char32_char_access<Storage, StringOrChar> divider_access (divider);
431
431
auto it = std::search (my_access.begin (), my_access.end (), divider_access.begin (), divider_access.end ());
432
- if (it != my_access.end ())
433
- it += divider_access.size ();
432
+ if (it == my_access.end () && divider_access.size () != 0 )
433
+ return std::nullopt;
434
+ it += divider_access.size ();
434
435
return sys_string_t (it, my_access.end ());
435
436
}
436
437
437
438
template <class Storage >
438
439
template <class StringOrChar >
439
- auto sysstr::sys_string_t <Storage>::headBeforeFirst (const StringOrChar & divider) const ->
440
- std::enable_if_t <is_string_or_char<StringOrChar>, sys_string_t >
440
+ auto sysstr::sys_string_t <Storage>::prefix_before_first (const StringOrChar & divider) const ->
441
+ std::enable_if_t <is_string_or_char<StringOrChar>, std::optional< sys_string_t > >
441
442
{
442
443
sys_string_t <Storage>::char_access my_access (*this );
443
444
util::string_or_char32_char_access<Storage, StringOrChar> divider_access (divider);
444
445
auto it = std::search (my_access.begin (), my_access.end (), divider_access.begin (), divider_access.end ());
446
+ if (it == my_access.end () && divider_access.size () != 0 )
447
+ return std::nullopt;
445
448
return sys_string_t (my_access.begin (), it);
446
449
}
447
450
448
451
template <class Storage >
449
452
template <class StringOrChar >
450
- auto sysstr::sys_string_t <Storage>::tailAfterLast (const StringOrChar & divider) const ->
451
- std::enable_if_t <is_string_or_char<StringOrChar>, sys_string_t >
453
+ auto sysstr::sys_string_t <Storage>::suffix_after_last (const StringOrChar & divider) const ->
454
+ std::enable_if_t <is_string_or_char<StringOrChar>, std::optional< sys_string_t > >
452
455
{
453
456
sys_string_t <Storage>::char_access my_access (*this );
454
457
util::string_or_char32_char_access<Storage, StringOrChar> divider_access (divider);
455
458
auto it = std::search (my_access.rbegin (), my_access.rend (), divider_access.rbegin (), divider_access.rend ());
459
+ if (it == my_access.rend () && divider_access.size () != 0 )
460
+ return std::nullopt;
456
461
return sys_string_t (my_access.begin () + (my_access.rend () - it), my_access.end ());
457
462
}
458
463
459
464
template <class Storage >
460
465
template <class StringOrChar >
461
- auto sysstr::sys_string_t <Storage>::headBeforeLast (const StringOrChar & divider) const ->
462
- std::enable_if_t <is_string_or_char<StringOrChar>, sys_string_t >
466
+ auto sysstr::sys_string_t <Storage>::prefix_before_last (const StringOrChar & divider) const ->
467
+ std::enable_if_t <is_string_or_char<StringOrChar>, std::optional< sys_string_t > >
463
468
{
464
469
sys_string_t <Storage>::char_access my_access (*this );
465
470
util::string_or_char32_char_access<Storage, StringOrChar> divider_access (divider);
466
471
auto it = std::search (my_access.rbegin (), my_access.rend (), divider_access.rbegin (), divider_access.rend ());
467
- if (it != my_access.rend ())
468
- it += divider_access.size ();
472
+ if (it == my_access.rend () && divider_access.size () != 0 )
473
+ return std::nullopt;
474
+ it += divider_access.size ();
469
475
return sys_string_t (my_access.begin (), my_access.begin () + (my_access.rend () - it));
470
476
}
477
+
478
+ template <class Storage >
479
+ template <class StringOrChar >
480
+ auto sysstr::sys_string_t <Storage>::partition_at_first(const StringOrChar & divider) const ->
481
+ std::enable_if_t <is_string_or_char<StringOrChar>, std::optional<std::pair<sys_string_t , sys_string_t >>>
482
+ {
483
+ sys_string_t <Storage>::char_access my_access (*this );
484
+ util::string_or_char32_char_access<Storage, StringOrChar> divider_access (divider);
485
+ auto it = std::search (my_access.begin (), my_access.end (), divider_access.begin (), divider_access.end ());
486
+ if (it == my_access.end () && divider_access.size () != 0 )
487
+ return std::nullopt;
488
+ return std::pair (sys_string_t (my_access.begin (), it), sys_string_t (it + divider_access.size (), my_access.end ()));
489
+ }
490
+
491
+ template <class Storage >
492
+ template <class StringOrChar >
493
+ auto sysstr::sys_string_t <Storage>::partition_at_last(const StringOrChar & divider) const ->
494
+ std::enable_if_t <is_string_or_char<StringOrChar>, std::optional<std::pair<sys_string_t , sys_string_t >>>
495
+ {
496
+ sys_string_t <Storage>::char_access my_access (*this );
497
+ util::string_or_char32_char_access<Storage, StringOrChar> divider_access (divider);
498
+ auto it = std::search (my_access.rbegin (), my_access.rend (), divider_access.rbegin (), divider_access.rend ());
499
+ if (it == my_access.rend () && divider_access.size () != 0 )
500
+ return std::nullopt;
501
+ return std::pair (sys_string_t (my_access.begin (), my_access.begin () + (my_access.rend () - it - divider_access.size ())),
502
+ sys_string_t (my_access.begin () + (my_access.rend () - it), my_access.end ()));
503
+ }
0 commit comments