23 #ifndef GUL14_JOIN_SPLIT_H_
24 #define GUL14_JOIN_SPLIT_H_
29 #include <type_traits>
114 template <
typename StringContainer = std::vector<std::
string>,
115 typename ContainerInsertFct =
void (*)(StringContainer&,
string_view)>
116 inline StringContainer
118 ContainerInsertFct insert_fct = detail::emplace_back<StringContainer>)
120 using StringType =
typename StringContainer::value_type;
121 using SizeType =
typename StringType::size_type;
123 auto result = StringContainer{ };
124 auto search_start = SizeType{ 0 };
125 auto push_start = search_start;
128 const auto hit = text.find(delimiter.data(), search_start, delimiter.size());
129 if (hit == StringType::npos)
131 const auto hit_len = hit - push_start;
132 insert_fct(result, text.substr(push_start, hit_len));
133 search_start += std::max(delimiter.size() + hit_len, SizeType{ 1 });
134 push_start += delimiter.size() + hit_len;
136 insert_fct(result, text.substr(push_start));
164 template <
typename StringContainer = std::vector<std::
string>,
165 typename ContainerInsertFct =
void (*)(StringContainer&,
string_view)>
166 inline StringContainer
168 ContainerInsertFct insert_fct = detail::emplace_back<StringContainer>)
170 auto const end = std::cregex_iterator{ };
171 auto result = StringContainer{ };
173 auto parts = std::cregex_iterator(text.begin(), text.end(), delimiter);
176 insert_fct(result, text);
180 auto previous = std::cregex_iterator{ };
181 for (; parts != end; ++parts) {
182 if (parts == previous and not parts->length())
184 auto const& match = parts->prefix();
185 insert_fct(result,
string_view(match.first, match.length()));
189 auto const& match = previous->suffix();
190 insert_fct(result,
string_view(match.first, match.length()));
218 template <
typename StringContainer = std::vector<
string_view>,
219 typename ContainerInsertFct =
void (*)(StringContainer&,
string_view)>
220 inline StringContainer
222 ContainerInsertFct insert_fct = detail::emplace_back<StringContainer>)
224 return split<StringContainer>(text, delimiter, insert_fct);
255 template <
typename StringContainer>
259 return join(parts.begin(), parts.end(), glue);
285 template <
typename Iterator>
294 std::size_t num_strings = 0;
297 for (
auto it = begin; it != end; ++it)
302 len += (num_strings - 1) * glue.size();
309 for (
auto it = std::next(begin); it != end; ++it)
311 result.append(glue.data(), glue.size());
Definition of macros used internally by GUL.
Namespace gul14 contains all functions and classes of the General Utility Library.
Definition: doxygen.h:26
std::string join(const StringContainer &parts, string_view glue)
Concatenate all strings in a range, placing a delimiter between them.
Definition: join_split.h:257
StringContainer split(string_view text, string_view delimiter, ContainerInsertFct insert_fct=detail::emplace_back< StringContainer >)
Separate a string at all occurrences of a delimiter, returning the strings between the delimiters in ...
Definition: join_split.h:117
basic_string_view< char > string_view
A view to a contiguous sequence of chars.
Definition: string_view.h:623
StringContainer split_sv(string_view text, string_view delimiter, ContainerInsertFct insert_fct=detail::emplace_back< StringContainer >)
Separate a string at all occurrences of a delimiter, returning the strings between the delimiters in ...
Definition: join_split.h:221
Declarations of string utility functions for the General Utility Library.
Provides a gul14::string_view that is fully compatible with C++17's std::string_view.