@@ -1013,10 +1013,47 @@ string_nodiscard std::size_t find_first( std17::basic_string_view<CharT> text, S
10131013
10141014// ends_with_all_of()
10151015
1016+ # define string_MK_ENDS_WITH_ALL_OF (CharT ) \
1017+ string_nodiscard inline bool \
1018+ ends_with_all_of ( std17::basic_string_view<CharT> text, std17::basic_string_view<CharT> set ) \
1019+ { \
1020+ if ( text.empty () ) \
1021+ return false ; \
1022+ \
1023+ std::basic_string<CharT> result; \
1024+ \
1025+ for ( auto it = text.crbegin (); it != text.crend (); ++it ) \
1026+ { \
1027+ auto const chr = *it; \
1028+ if ( !contains ( set, chr ) ) \
1029+ break ; \
1030+ if ( !contains ( result, chr ) ) \
1031+ result.append ( 1 , chr ); \
1032+ } \
1033+ return contains_all_of ( result, set ); \
1034+ }
1035+
10161036// ends_with_any_of()
10171037
1038+ # define string_MK_ENDS_WITH_ANY_OF (CharT ) \
1039+ string_nodiscard inline bool \
1040+ ends_with_any_of ( std17::basic_string_view<CharT> text, std17::basic_string_view<CharT> set ) \
1041+ { \
1042+ if ( text.empty () ) \
1043+ return false ; \
1044+ \
1045+ return contains ( set, *text.crbegin () ); \
1046+ }
1047+
10181048// ends_with_none_of()
10191049
1050+ # define string_MK_ENDS_WITH_NONE_OF (CharT ) \
1051+ string_nodiscard inline bool \
1052+ ends_with_none_of ( std17::basic_string_view<CharT> text, std17::basic_string_view<CharT> set ) \
1053+ { \
1054+ return !ends_with_any_of ( text, set ); \
1055+ }
1056+
10201057//
10211058// Modifiers:
10221059//
@@ -1879,11 +1916,14 @@ string_MK_CONTAINS_ANY_OF ( char )
18791916string_MK_CONTAINS_NONE_OF ( char )
18801917string_MK_STARTS_WITH ( char )
18811918string_MK_STARTS_WITH_CHAR ( char )
1919+ string_MK_STARTS_WITH_ALL_OF ( char )
18821920string_MK_STARTS_WITH_ANY_OF ( char )
18831921string_MK_STARTS_WITH_NONE_OF( char )
1884- string_MK_STARTS_WITH_ALL_OF ( char )
18851922string_MK_ENDS_WITH ( char )
18861923string_MK_ENDS_WITH_CHAR ( char )
1924+ string_MK_ENDS_WITH_ALL_OF ( char )
1925+ string_MK_ENDS_WITH_ANY_OF ( char )
1926+ string_MK_ENDS_WITH_NONE_OF ( char )
18871927string_MK_ERASE ( char )
18881928string_MK_ERASE_ALL ( char )
18891929string_MK_ERASE_FIRST ( char )
@@ -1924,11 +1964,14 @@ string_MK_CONTAINS_ANY_OF ( wchar_t )
19241964string_MK_CONTAINS_NONE_OF ( wchar_t )
19251965string_MK_STARTS_WITH ( wchar_t )
19261966string_MK_STARTS_WITH_CHAR ( wchar_t )
1967+ string_MK_STARTS_WITH_ALL_OF ( wchar_t )
19271968string_MK_STARTS_WITH_ANY_OF ( wchar_t )
19281969string_MK_STARTS_WITH_NONE_OF( wchar_t )
1929- string_MK_STARTS_WITH_ALL_OF ( wchar_t )
19301970string_MK_ENDS_WITH ( wchar_t )
19311971string_MK_ENDS_WITH_CHAR ( wchar_t )
1972+ string_MK_ENDS_WITH_ALL_OF ( wchar_t )
1973+ string_MK_ENDS_WITH_ANY_OF ( wchar_t )
1974+ string_MK_ENDS_WITH_NONE_OF ( wchar_t )
19321975string_MK_FIND_FIRST ( wchar_t )
19331976string_MK_FIND_FIRST_CHAR ( wchar_t )
19341977string_MK_FIND_LAST ( wchar_t )
@@ -1977,11 +2020,14 @@ string_MK_CONTAINS_ANY_OF ( char8_t )
19772020string_MK_CONTAINS_NONE_OF ( char8_t )
19782021string_MK_STARTS_WITH ( char8_t )
19792022string_MK_STARTS_WITH_CHAR ( char8_t )
2023+ string_MK_STARTS_WITH_ALL_OF ( char8_t )
19802024string_MK_STARTS_WITH_ANY_OF ( char8_t )
19812025string_MK_STARTS_WITH_NONE_OF( char8_t )
1982- string_MK_STARTS_WITH_ALL_OF ( char8_t )
19832026string_MK_ENDS_WITH ( char8_t )
19842027string_MK_ENDS_WITH_CHAR ( char8_t )
2028+ string_MK_ENDS_WITH_ALL_OF ( char8_t )
2029+ string_MK_ENDS_WITH_ANY_OF ( char8_t )
2030+ string_MK_ENDS_WITH_NONE_OF ( char8_t )
19852031string_MK_FIND_FIRST ( char8_t )
19862032string_MK_FIND_FIRST_CHAR ( char8_t )
19872033string_MK_FIND_LAST ( char8_t )
@@ -2030,11 +2076,14 @@ string_MK_CONTAINS_ANY_OF ( char16_t )
20302076string_MK_CONTAINS_NONE_OF ( char16_t )
20312077string_MK_STARTS_WITH ( char16_t )
20322078string_MK_STARTS_WITH_CHAR ( char16_t )
2079+ string_MK_STARTS_WITH_ALL_OF ( char16_t )
20332080string_MK_STARTS_WITH_ANY_OF ( char16_t )
20342081string_MK_STARTS_WITH_NONE_OF( char16_t )
2035- string_MK_STARTS_WITH_ALL_OF ( char16_t )
20362082string_MK_ENDS_WITH ( char16_t )
20372083string_MK_ENDS_WITH_CHAR ( char16_t )
2084+ string_MK_ENDS_WITH_ALL_OF ( char16_t )
2085+ string_MK_ENDS_WITH_ANY_OF ( char16_t )
2086+ string_MK_ENDS_WITH_NONE_OF ( char16_t )
20382087string_MK_FIND_FIRST ( char16_t )
20392088string_MK_FIND_FIRST_CHAR ( char16_t )
20402089string_MK_FIND_LAST ( char16_t )
@@ -2083,11 +2132,14 @@ string_MK_CONTAINS_ANY_OF ( char32_t )
20832132string_MK_CONTAINS_NONE_OF ( char32_t )
20842133string_MK_STARTS_WITH ( char32_t )
20852134string_MK_STARTS_WITH_CHAR ( char32_t )
2135+ string_MK_STARTS_WITH_ALL_OF ( char32_t )
20862136string_MK_STARTS_WITH_ANY_OF ( char32_t )
20872137string_MK_STARTS_WITH_NONE_OF( char32_t )
2088- string_MK_STARTS_WITH_ALL_OF ( char32_t )
20892138string_MK_ENDS_WITH ( char32_t )
20902139string_MK_ENDS_WITH_CHAR ( char32_t )
2140+ string_MK_ENDS_WITH_ALL_OF ( char32_t )
2141+ string_MK_ENDS_WITH_ANY_OF ( char32_t )
2142+ string_MK_ENDS_WITH_NONE_OF ( char32_t )
20912143string_MK_FIND_FIRST ( char32_t )
20922144string_MK_FIND_FIRST_CHAR ( char32_t )
20932145string_MK_FIND_LAST ( char32_t )
@@ -2136,11 +2188,14 @@ string_MK_SPLIT_LEFT_STRING ( char32_t )
21362188#undef string_MK_CONTAINS_NONE_OF
21372189#undef string_MK_STARTS_WITH
21382190#undef string_MK_STARTS_WITH_CHAR
2191+ #undef string_MK_STARTS_WITH_ALL_OF
21392192#undef string_MK_STARTS_WITH_ANY_OF
21402193#undef string_MK_STARTS_WITH_NONE_OF
2141- #undef string_MK_STARTS_WITH_ALL_OF
21422194#undef string_MK_ENDS_WITH
21432195#undef string_MK_ENDS_WITH_CHAR
2196+ #undef string_MK_ENDS_WITH_ALL_OF
2197+ #undef string_MK_ENDS_WITH_ANY_OF
2198+ #undef string_MK_ENDS_WITH_NONE_OF
21442199#undef string_MK_FIND_FIRST
21452200#undef string_MK_FIND_FIRST_CHAR
21462201#undef string_MK_FIND_LAST
0 commit comments