Skip to content

Commit aad9214

Browse files
committed
Add erase_first(), erase_last()
1 parent 95777d7 commit aad9214

File tree

3 files changed

+71
-0
lines changed

3 files changed

+71
-0
lines changed

README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,8 @@ The following table presents types, values and simplified, short prototypes of t
133133
|   | string **substring**(string_view sv, size_t pos \[, size_t count\]); | substring starting at given position of given length, default up to end |
134134
|   | string **erase**(string_view sv, size_t pos \[, size_t count\]) | string with substring at given position of given length removed, default up to end |
135135
|   | string **erase_all**(string_view sv, string_view what) | string with all occurrences of 'what' removed |
136+
|   | string **erase_first**(string_view sv, string_view what) | string with first occurrence of 'what' removed |
137+
|   | string **erase_last**(string_view sv, string_view what) | string with last occurrence of 'what' removed |
136138
|   | string **insert**(string_view sv, size_t pos, string_view what) | string with substring 'what' inserted at given position |
137139
|   | string **replace**(string_view sv, size_t pos, size_t length, string_view with) | string with substring pos to pos+length replaced with 'with' |
138140
|   | string **replace_all**(string_view sv, string_view what, string_view with) | string with all occurrences of 'what' replaced with 'with' |
@@ -235,6 +237,8 @@ append: string with second string concatenated to first string
235237
substring: substring starting at given position of given length, default up to end
236238
erase: string with substring at given position of given length removed - default up to end
237239
erase_all: string with all occurrences of substring removed
240+
erase_first: string with first occurrence of substring removed
241+
erase_last: string with last occurrence of substring removed
238242
insert: string with substring inserted at given position
239243
replace: string with substring given by position and length replaced
240244
replace_all: string with all occurrences of substring replaced

include/nonstd/string.hpp

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1084,8 +1084,39 @@ erase_all( std17::basic_string_view<CharT> text, std17::basic_string_view<CharT>
10841084
}
10851085

10861086
// erase_first()
1087+
1088+
#define string_MK_ERASE_FIRST(CharT) \
1089+
string_nodiscard inline std::basic_string<CharT> \
1090+
erase_first( \
1091+
std17::basic_string_view<CharT> text \
1092+
, std17::basic_string_view<CharT> what ) \
1093+
{ \
1094+
std::basic_string<CharT> result( text ); \
1095+
\
1096+
const auto pos = find_first( result, what ); \
1097+
\
1098+
return pos != std::basic_string<CharT>::npos \
1099+
? result.erase( pos, what.length() ) \
1100+
: result; \
1101+
}
1102+
10871103
// erase_last()
10881104

1105+
#define string_MK_ERASE_LAST(CharT) \
1106+
string_nodiscard inline std::basic_string<CharT> \
1107+
erase_last( \
1108+
std17::basic_string_view<CharT> text \
1109+
, std17::basic_string_view<CharT> what ) \
1110+
{ \
1111+
std::basic_string<CharT> result( text ); \
1112+
\
1113+
const auto pos = find_last( result, what ); \
1114+
\
1115+
return pos != std::basic_string<CharT>::npos \
1116+
? result.erase( pos, what.length() ) \
1117+
: result; \
1118+
}
1119+
10891120
// insert()
10901121

10911122
#define string_MK_INSERT(CharT) \
@@ -1762,6 +1793,8 @@ string_MK_ENDS_WITH ( char )
17621793
string_MK_ENDS_WITH_CHAR ( char )
17631794
string_MK_ERASE ( char )
17641795
string_MK_ERASE_ALL ( char )
1796+
string_MK_ERASE_FIRST ( char )
1797+
string_MK_ERASE_LAST ( char )
17651798
string_MK_INSERT ( char )
17661799
string_MK_REPLACE ( char )
17671800
string_MK_REPLACE_ALL ( char )
@@ -1807,6 +1840,8 @@ string_MK_FIND_FIRST_NOT_OF( wchar_t )
18071840
string_MK_FIND_LAST_NOT_OF ( wchar_t )
18081841
string_MK_ERASE ( wchar_t )
18091842
string_MK_ERASE_ALL ( wchar_t )
1843+
string_MK_ERASE_FIRST ( wchar_t )
1844+
string_MK_ERASE_LAST ( wchar_t )
18101845
string_MK_INSERT ( wchar_t )
18111846
string_MK_REPLACE ( wchar_t )
18121847
string_MK_REPLACE_ALL ( wchar_t )
@@ -1852,6 +1887,8 @@ string_MK_FIND_FIRST_NOT_OF( char8_t )
18521887
string_MK_FIND_LAST_NOT_OF ( char8_t )
18531888
string_MK_ERASE ( char8_t )
18541889
string_MK_ERASE_ALL ( char8_t )
1890+
string_MK_ERASE_FIRST ( char8_t )
1891+
string_MK_ERASE_LAST ( char8_t )
18551892
string_MK_INSERT ( char8_t )
18561893
string_MK_REPLACE ( char8_t )
18571894
string_MK_REPLACE_ALL ( char8_t )
@@ -1897,6 +1934,8 @@ string_MK_FIND_FIRST_NOT_OF( char16_t )
18971934
string_MK_FIND_LAST_NOT_OF ( char16_t )
18981935
string_MK_ERASE ( char16_t )
18991936
string_MK_ERASE_ALL ( char16_t )
1937+
string_MK_ERASE_FIRST ( char16_t )
1938+
string_MK_ERASE_LAST ( char16_t )
19001939
string_MK_INSERT ( char16_t )
19011940
string_MK_REPLACE ( char16_t )
19021941
string_MK_REPLACE_ALL ( char16_t )
@@ -1942,6 +1981,8 @@ string_MK_FIND_FIRST_NOT_OF( char32_t )
19421981
string_MK_FIND_LAST_NOT_OF ( char32_t )
19431982
string_MK_ERASE ( char32_t )
19441983
string_MK_ERASE_ALL ( char32_t )
1984+
string_MK_ERASE_FIRST ( char32_t )
1985+
string_MK_ERASE_LAST ( char32_t )
19451986
string_MK_INSERT ( char32_t )
19461987
string_MK_REPLACE ( char32_t )
19471988
string_MK_REPLACE_ALL ( char32_t )
@@ -1987,6 +2028,8 @@ string_MK_SPLIT_LEFT_STRING( char32_t )
19872028
#undef string_MK_FIND_LAST_NOT_OF
19882029
#undef string_MK_ERASE
19892030
#undef string_MK_ERASE_ALL
2031+
#undef string_MK_ERASE_FIRST
2032+
#undef string_MK_ERASE_LAST
19902033
#undef string_MK_INSERT
19912034
#undef string_MK_REPLACE
19922035
#undef string_MK_REPLACE_ALL

test/string.t.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -381,6 +381,30 @@ CASE( "erase_all: string with all occurrences of substring removed" )
381381
EXPECT( erase_all("abcxyzabcxyzabc", "xyz") == "abcabcabc" );
382382
EXPECT( erase_all(std::string("abcxyzabcxyzabc"), std::string("xyz")) == "abcabcabc" );
383383
EXPECT( erase_all(std17::string_view("abcxyzabcxyzabc"), std17::string_view("xyz")) == "abcabcabc" );
384+
385+
EXPECT( erase_all("abcxyzabcxyzabc", "123") == "abcxyzabcxyzabc" );
386+
}
387+
388+
// erase_first():
389+
390+
CASE( "erase_first: string with first occurrence of substring removed" )
391+
{
392+
EXPECT( erase_first("abcxyzabcxyzabc", "xyz") == "abcabcxyzabc" );
393+
EXPECT( erase_first(std::string("abcxyzabcxyzabc"), std::string("xyz")) == "abcabcxyzabc" );
394+
EXPECT( erase_first(std17::string_view("abcxyzabcxyzabc"), std17::string_view("xyz")) == "abcabcxyzabc" );
395+
396+
EXPECT( erase_first("abcxyzabcxyzabc", "123") == "abcxyzabcxyzabc" );
397+
}
398+
399+
// erase_last():
400+
401+
CASE( "erase_last: string with last occurrence of substring removed" )
402+
{
403+
EXPECT( erase_last("abcxyzabcxyzabc", "xyz") == "abcxyzabcabc" );
404+
EXPECT( erase_last(std::string("abcxyzabcxyzabc"), std::string("xyz")) == "abcxyzabcabc" );
405+
EXPECT( erase_last(std17::string_view("abcxyzabcxyzabc"), std17::string_view("xyz")) == "abcxyzabcabc" );
406+
407+
EXPECT( erase_last("abcxyzabcxyzabc", "123") == "abcxyzabcxyzabc" );
384408
}
385409

386410
// insert():

0 commit comments

Comments
 (0)