31 #ifndef ETL_STRING_UTILITIES_INCLUDED
32 #define ETL_STRING_UTILITIES_INCLUDED
57 ETL_ENUM_TYPE(LEFT,
"left")
58 ETL_ENUM_TYPE(RIGHT,
"right")
65 template <
typename TChar>
71 static ETL_CONSTEXPR
const char* value()
80 static ETL_CONSTEXPR
const wchar_t* value()
82 return L
" \t\n\r\f\v";
89 static ETL_CONSTEXPR
const char16_t* value()
91 return u
" \t\n\r\f\v";
98 static ETL_CONSTEXPR
const char32_t* value()
100 return U
" \t\n\r\f\v";
104 #if ETL_CPP17_SUPPORTED
105 template <
typename TChar>
113 template <
typename TIString>
114 void trim_from_left(TIString& s,
typename TIString::const_pointer trim_characters)
116 typename TIString::size_type position = s.find_first_not_of(trim_characters);
117 s.erase(0U, position);
124 template <
typename TIString>
134 template <
typename TStringView>
135 TStringView
trim_from_view_left(
const TStringView& view,
typename TStringView::const_pointer trim_characters)
137 typename TStringView::size_type first = view.find_first_not_of(trim_characters);
139 typename TStringView::const_pointer pbegin = view.data() + view.size();
141 if (first != TStringView::npos)
143 pbegin = view.data() + first;
146 return TStringView(pbegin, etl::distance(pbegin, view.data() + view.size()));
153 template <
typename TStringView>
163 template <
typename TIString>
164 void trim_left(TIString& s,
typename TIString::const_pointer delimiters)
166 typename TIString::size_type p = s.find_first_of(delimiters);
168 if (p == TIString::npos)
182 template <
typename TStringView>
183 TStringView
trim_view_left(
const TStringView& view,
typename TStringView::const_pointer delimiters)
185 typename TStringView::size_type first = view.find_first_of(delimiters);
187 typename TStringView::const_pointer pbegin = view.data();
189 if (first != TStringView::npos)
192 return TStringView(pbegin, view.size() - first);
196 return TStringView(pbegin,
typename TStringView::size_type(0U));
204 template <
typename TIString>
207 s.erase(s.find_last_not_of(trim_characters) + 1);
214 template <
typename TIString>
224 template <
typename TStringView>
227 typename TStringView::size_type last = view.find_last_not_of(trim_characters) + 1;
229 typename TStringView::const_pointer pend = view.data();
231 if (last != TStringView::npos)
236 return TStringView(view.data(), etl::distance(view.data(), pend));
243 template <
typename TStringView>
252 template <
typename TIString>
253 void trim_right(TIString& s,
typename TIString::const_pointer delimiters)
255 typename TIString::size_type p = s.find_last_of(delimiters);
257 if (p == TIString::npos)
275 template <
typename TStringView>
276 TStringView
trim_view_right(
const TStringView& view,
typename TStringView::const_pointer delimiters)
278 typename TStringView::size_type last = view.find_last_of(delimiters) + 1;
280 typename TStringView::const_pointer pend = view.data();
282 if (last != TStringView::npos)
285 return TStringView(view.data(), etl::distance(view.data(), pend));
289 return TStringView(view.data(),
typename TStringView::size_type(0U));
297 template <
typename TIString>
298 void trim_from(TIString& s,
typename TIString::const_pointer trim_characters)
308 template <
typename TIString>
318 template <
typename TStringView>
319 TStringView
trim_from_view(
const TStringView& view,
typename TStringView::const_pointer trim_characters)
321 typename TStringView::size_type first = view.find_first_not_of(trim_characters);
322 typename TStringView::size_type last = view.find_last_not_of(trim_characters) + 1;
324 typename TStringView::const_pointer pbegin = view.data();
325 typename TStringView::const_pointer pend = view.data();
327 if (first != TStringView::npos)
332 if (last != TStringView::npos)
337 return TStringView(pbegin, etl::distance(pbegin, pend));
344 template <
typename TStringView>
354 template <
typename TIString>
355 void trim(TIString& s,
typename TIString::const_pointer delimiters)
365 template <
typename TStringView>
366 TStringView
trim_view(
const TStringView& view,
typename TStringView::const_pointer delimiters)
368 typename TStringView::size_type first = view.find_first_of(delimiters);
369 typename TStringView::size_type last = view.find_last_of(delimiters) + 1;
371 typename TStringView::const_pointer pbegin = view.data();
372 typename TStringView::const_pointer pend = view.data();
374 if (first != TStringView::npos)
379 if (last != TStringView::npos)
384 return TStringView(pbegin, etl::distance(pbegin, pend));
390 template <
typename TIString>
391 void left_n(TIString& s,
typename TIString::size_type n)
393 n = (n > s.size()) ? s.size() : n;
395 s.erase(s.begin() + n, s.end());
401 template <
typename TStringView>
402 TStringView
left_n_view(
const TStringView& view,
typename TStringView::size_type n)
404 n = (n > view.size()) ? view.size() : n;
412 template <
typename TIString>
413 void right_n(TIString& s,
typename TIString::size_type n)
415 n = (n > s.size()) ? s.size() : n;
417 s.erase(s.begin(), s.end() - n);
423 template <
typename TStringView>
424 TStringView
right_n_view(
const TStringView& view,
typename TStringView::size_type n)
426 n = (n > view.size()) ? view.size() : n;
428 return TStringView(view.data() + view.size() - n, n);
435 template <
typename TIString>
436 void reverse(TIString& s)
438 etl::reverse(s.begin(), s.end());
444 template <
typename TIString,
typename TPair>
446 const TPair* pairsbegin,
447 const TPair* pairsend)
449 while (pairsbegin != pairsend)
451 etl::replace(s.begin(), s.end(), pairsbegin->first, pairsbegin->second);
459 template <
typename TIString,
typename TPair>
461 const TPair* pairsbegin,
462 const TPair* pairsend)
464 while (pairsbegin != pairsend)
466 const typename TIString::value_type* p_old = pairsbegin->first;
467 const typename TIString::value_type* p_new = pairsbegin->second;
469 typename TIString::size_type position = 0U;
473 position = s.find(p_old, position);
474 if (position != TIString::npos)
476 s.replace(position,
typename TIString::size_type(
etl::strlen(p_old)), p_new,
typename TIString::size_type(
etl::strlen(p_new)));
477 position +=
typename TIString::size_type(
etl::strlen(p_new));
479 }
while (position != TIString::npos);
488 template <
typename TIterator,
typename TPo
inter>
489 TIterator
find_first_of(TIterator first, TIterator last, TPointer delimiters)
491 TIterator itr(first);
495 TPointer pd = delimiters;
516 template <
typename TIString,
typename TPo
inter>
525 template <
typename TIString,
typename TPo
inter>
526 typename TIString::const_iterator
find_first_of(
const TIString& s, TPointer delimiters)
534 template <
typename TIterator,
typename TPo
inter>
537 TIterator itr(first);
541 TPointer pd = delimiters;
570 template <
typename TIString,
typename TPo
inter>
579 template <
typename TIString,
typename TPo
inter>
588 template <
typename TIterator,
typename TPo
inter>
589 TIterator
find_last_of(TIterator first, TIterator last, TPointer delimiters)
597 TIterator
end(first);
603 TPointer pd = delimiters;
614 }
while (itr !=
end);
622 template <
typename TIString,
typename TPo
inter>
623 typename TIString::iterator
find_last_of(TIString& s, TPointer delimiters)
631 template <
typename TIString,
typename TPo
inter>
632 typename TIString::const_iterator
find_last_of(
const TIString& s, TPointer delimiters)
640 template <
typename TIterator,
typename TPo
inter>
649 TIterator
end(first);
655 TPointer pd = delimiters;
674 }
while (itr !=
end);
682 template <
typename TIString,
typename TPo
inter>
691 template <
typename TIString,
typename TPo
inter>
700 template <
typename TInput,
typename TStringView>
703 typedef typename TInput::const_pointer const_pointer;
705 bool token_found =
false;
706 typename TStringView::size_type position = 0U;
707 TStringView view = last_view.
value_or(TStringView());
708 const_pointer begin_ptr = input.data();
710 if (begin_ptr == ETL_NULLPTR)
715 const_pointer end_ptr = begin_ptr + input.size();
720 if (view.data() != ETL_NULLPTR)
722 position = etl::distance(begin_ptr, view.data() + view.size() + 1U);
725 if (position > input.size())
732 const_pointer first_ptr = begin_ptr + position;
733 const_pointer last_ptr =
find_first_of(first_ptr, end_ptr, delimiters);
735 view = TStringView(first_ptr, etl::distance(first_ptr, last_ptr));
737 token_found = ((view.size() != 0U) || !ignore_empty_tokens);
746 template <
typename TIString>
747 void pad_left(TIString& s,
typename TIString::size_type required_size,
typename TIString::value_type pad_char)
749 required_size = etl::min(required_size, s.max_size());
751 if (required_size > s.size())
753 required_size -= s.size();
754 s.insert(
typename TIString::size_type(0U), required_size, pad_char);
761 template <
typename TIString>
762 void pad_right(TIString& s,
typename TIString::size_type required_size,
typename TIString::value_type pad_char)
764 required_size = etl::min(required_size, s.max_size());
766 if (required_size > s.size())
768 required_size -= s.size();
769 s.insert(s.size(), required_size, pad_char);
776 template <
typename TIString>
777 void pad(TIString& s,
typename TIString::size_type required_size,
string_pad_direction pad_direction,
typename TIString::value_type pad_char)
779 switch (
int(pad_direction))
781 case string_pad_direction::LEFT:
783 pad_left(s, required_size, pad_char);
787 case string_pad_direction::RIGHT:
803 template <
typename TString>
806 etl::transform(s.begin(), s.end(), s.begin(), ::toupper);
812 template <
typename TString>
815 etl::transform(s.begin(), s.end(), s.begin(), ::tolower);
821 template <
typename TString>
824 typename TString::iterator itr = s.begin();
826 *itr =
typename TString::value_type(::toupper(*itr));
829 etl::transform(itr, s.end(), itr, ::tolower);
Definition: optional.h:108
T value_or(T default_value) const
Gets the value or a default if no valid.
Definition: optional.h:388
ETL_CONSTEXPR TContainer::iterator end(TContainer &container)
Definition: container.h:99
T * addressof(T &t)
Definition: memory.h:61
Definition: absolute.h:37
TIterator find_first_not_of(TIterator first, TIterator last, TPointer delimiters)
Find first not of any of delimiters within the string.
Definition: string_utilities.h:535
void trim_from_left(TIString &s, typename TIString::const_pointer trim_characters)
Definition: string_utilities.h:114
TStringView trim_from_view_right(const TStringView &view, typename TStringView::const_pointer trim_characters)
Definition: string_utilities.h:225
void trim(TIString &s, typename TIString::const_pointer delimiters)
Definition: string_utilities.h:355
TIterator find_first_of(TIterator first, TIterator last, TPointer delimiters)
Find first of any of delimiters within the string.
Definition: string_utilities.h:489
void to_lower_case(TString &s)
to_lower_case
Definition: string_utilities.h:813
void trim_whitespace_right(TIString &s)
Definition: string_utilities.h:215
void pad_right(TIString &s, typename TIString::size_type required_size, typename TIString::value_type pad_char)
pad_right
Definition: string_utilities.h:762
void pad(TIString &s, typename TIString::size_type required_size, string_pad_direction pad_direction, typename TIString::value_type pad_char)
pad
Definition: string_utilities.h:777
void right_n(TIString &s, typename TIString::size_type n)
Get up to the last n characters.
Definition: string_utilities.h:413
void trim_left(TIString &s, typename TIString::const_pointer delimiters)
Definition: string_utilities.h:164
TStringView left_n_view(const TStringView &view, typename TStringView::size_type n)
Get a view of up to the first n characters.
Definition: string_utilities.h:402
void replace_characters(TIString &s, const TPair *pairsbegin, const TPair *pairsend)
replace_characters
Definition: string_utilities.h:445
void to_sentence_case(TString &s)
to_sentence_case
Definition: string_utilities.h:822
TIterator find_last_of(TIterator first, TIterator last, TPointer delimiters)
Find last of any of delimiters within the string.
Definition: string_utilities.h:589
size_t strlen(const T *t)
Alternative strlen for all character types.
Definition: char_traits.h:247
void trim_from_right(TIString &s, typename TIString::const_pointer trim_characters)
Definition: string_utilities.h:205
TStringView trim_view(const TStringView &view, typename TStringView::const_pointer delimiters)
Definition: string_utilities.h:366
TStringView trim_view_whitespace(const TStringView &view)
Definition: string_utilities.h:345
TStringView trim_view_left(const TStringView &view, typename TStringView::const_pointer delimiters)
Definition: string_utilities.h:183
void trim_right(TIString &s, typename TIString::const_pointer delimiters)
trim_right
Definition: string_utilities.h:253
TStringView trim_view_whitespace_right(TStringView &view)
Definition: string_utilities.h:244
TStringView trim_from_view(const TStringView &view, typename TStringView::const_pointer trim_characters)
Definition: string_utilities.h:319
void trim_whitespace_left(TIString &s)
Definition: string_utilities.h:125
void pad_left(TIString &s, typename TIString::size_type required_size, typename TIString::value_type pad_char)
pad_left
Definition: string_utilities.h:747
TStringView trim_view_whitespace_left(TStringView &s)
Definition: string_utilities.h:154
TIterator find_last_not_of(TIterator first, TIterator last, TPointer delimiters)
Find last not of any of delimiters within the string.
Definition: string_utilities.h:641
void left_n(TIString &s, typename TIString::size_type n)
Get up to the first n characters.
Definition: string_utilities.h:391
void to_upper_case(TString &s)
to_upper_case
Definition: string_utilities.h:804
void trim_whitespace(TIString &s)
Definition: string_utilities.h:309
TStringView right_n_view(const TStringView &view, typename TStringView::size_type n)
Get a view of up to the last n characters.
Definition: string_utilities.h:424
void trim_from(TIString &s, typename TIString::const_pointer trim_characters)
Definition: string_utilities.h:298
etl::optional< TStringView > get_token(const TInput &input, typename TInput::const_pointer delimiters, const etl::optional< TStringView > &last_view, bool ignore_empty_tokens)
get_token
Definition: string_utilities.h:701
TStringView trim_from_view_left(const TStringView &view, typename TStringView::const_pointer trim_characters)
Definition: string_utilities.h:135
void replace_strings(TIString &s, const TPair *pairsbegin, const TPair *pairsend)
replace_strings
Definition: string_utilities.h:460
TStringView trim_view_right(const TStringView &view, typename TStringView::const_pointer delimiters)
trim_view_right
Definition: string_utilities.h:276
string_pad_direction
Definition: string_utilities.h:49
whitespace
Definition: string_utilities.h:66