31#ifndef ETL_STRING_UTILITIES_INCLUDED
32#define ETL_STRING_UTILITIES_INCLUDED
60 ETL_ENUM_TYPE(LEFT,
"left")
61 ETL_ENUM_TYPE(RIGHT,
"right")
68 template <
typename TChar>
74 static ETL_CONSTEXPR
const char* value()
84 static ETL_CONSTEXPR
const char8_t* value()
86 return u8
" \t\n\r\f\v";
94 static ETL_CONSTEXPR
const wchar_t* value()
96 return L
" \t\n\r\f\v";
104 static ETL_CONSTEXPR
const char16_t* value()
106 return u
" \t\n\r\f\v";
113 static ETL_CONSTEXPR
const char32_t* value()
115 return U
" \t\n\r\f\v";
121 template <
typename TChar>
129 template <
typename TIString>
130 void trim_from_left(TIString& s,
typename TIString::const_pointer trim_characters)
132 typename TIString::size_type position = s.find_first_not_of(trim_characters);
133 s.erase(0U, position);
140 template <
typename TIString>
150 template <
typename TStringView>
151 TStringView
trim_from_view_left(
const TStringView& view,
typename TStringView::const_pointer trim_characters)
153 typename TStringView::size_type first = view.find_first_not_of(trim_characters);
155 typename TStringView::const_pointer pbegin = view.data() + view.size();
157 if (first != TStringView::npos)
159 pbegin = view.data() + first;
162 return TStringView(pbegin,
static_cast<size_t>(etl::distance(pbegin, view.data() + view.size())));
169 template <
typename TStringView>
179 template <
typename TIString>
180 void trim_left(TIString& s,
typename TIString::const_pointer delimiters)
182 typename TIString::size_type p = s.find_first_of(delimiters);
184 if (p == TIString::npos)
198 template <
typename TStringView>
199 TStringView
trim_view_left(
const TStringView& view,
typename TStringView::const_pointer delimiters)
201 typename TStringView::size_type first = view.find_first_of(delimiters);
203 typename TStringView::const_pointer pbegin = view.data();
205 if (first != TStringView::npos)
208 return TStringView(pbegin, view.size() - first);
212 return TStringView(pbegin,
typename TStringView::size_type(0U));
220 template <
typename TIString>
223 s.erase(s.find_last_not_of(trim_characters) + 1);
230 template <
typename TIString>
240 template <
typename TStringView>
243 typename TStringView::size_type last = view.find_last_not_of(trim_characters) + 1;
245 typename TStringView::const_pointer pend = view.data();
247 if (last != TStringView::npos)
252 return TStringView(view.data(),
static_cast<size_t>(etl::distance(view.data(), pend)));
259 template <
typename TStringView>
268 template <
typename TIString>
269 void trim_right(TIString& s,
typename TIString::const_pointer delimiters)
271 typename TIString::size_type p = s.find_last_of(delimiters);
273 if (p == TIString::npos)
291 template <
typename TStringView>
292 TStringView
trim_view_right(
const TStringView& view,
typename TStringView::const_pointer delimiters)
294 typename TStringView::size_type last = view.find_last_of(delimiters) + 1;
296 typename TStringView::const_pointer pend = view.data();
298 if (last != TStringView::npos)
301 return TStringView(view.data(),
static_cast<size_t>(etl::distance(view.data(), pend)));
305 return TStringView(view.data(),
typename TStringView::size_type(0U));
313 template <
typename TIString>
314 void trim_from(TIString& s,
typename TIString::const_pointer trim_characters)
324 template <
typename TIString>
334 template <
typename TStringView>
335 TStringView
trim_from_view(
const TStringView& view,
typename TStringView::const_pointer trim_characters)
337 typename TStringView::size_type first = view.find_first_not_of(trim_characters);
338 typename TStringView::size_type last = view.find_last_not_of(trim_characters) + 1;
340 typename TStringView::const_pointer pbegin = view.data();
341 typename TStringView::const_pointer pend = view.data();
343 if (first != TStringView::npos)
348 if (last != TStringView::npos)
353 return TStringView(pbegin,
static_cast<size_t>(etl::distance(pbegin, pend)));
360 template <
typename TStringView>
370 template <
typename TIString>
371 void trim(TIString& s,
typename TIString::const_pointer delimiters)
381 template <
typename TStringView>
382 TStringView
trim_view(
const TStringView& view,
typename TStringView::const_pointer delimiters)
384 typename TStringView::size_type first = view.find_first_of(delimiters);
385 typename TStringView::size_type last = view.find_last_of(delimiters) + 1;
387 typename TStringView::const_pointer pbegin = view.data();
388 typename TStringView::const_pointer pend = view.data();
390 if (first != TStringView::npos)
395 if (last != TStringView::npos)
400 return TStringView(pbegin,
static_cast<size_t>(etl::distance(pbegin, pend)));
406 template <
typename TIString>
407 void left_n(TIString& s,
typename TIString::size_type n)
409 n = (n > s.size()) ? s.size() : n;
411 s.erase(s.begin() +
static_cast<typename TIString::difference_type
>(n), s.end());
417 template <
typename TStringView>
418 TStringView
left_n_view(
const TStringView& view,
typename TStringView::size_type n)
420 n = (n > view.size()) ? view.size() : n;
428 template <
typename TIString>
429 void right_n(TIString& s,
typename TIString::size_type n)
431 n = (n > s.size()) ? s.size() : n;
433 s.erase(s.begin(), s.end() -
static_cast<typename TIString::difference_type
>(n));
439 template <
typename TStringView>
440 TStringView
right_n_view(
const TStringView& view,
typename TStringView::size_type n)
442 n = (n > view.size()) ? view.size() : n;
444 return TStringView(view.data() + view.size() - n, n);
451 template <
typename TIString>
452 void reverse(TIString& s)
454 etl::reverse(s.begin(), s.end());
460 template <
typename TIString,
typename TPair>
463 while (pairsbegin != pairsend)
465 etl::replace(s.begin(), s.end(), pairsbegin->first, pairsbegin->second);
473 template <
typename TIString,
typename TPair>
476 while (pairsbegin != pairsend)
478 const typename TIString::value_type* p_old = pairsbegin->first;
479 const typename TIString::value_type* p_new = pairsbegin->second;
481 typename TIString::size_type position = 0U;
484 position = s.find(p_old, position);
485 if (position != TIString::npos)
487 s.replace(position,
typename TIString::size_type(
etl::strlen(p_old)), p_new,
typename TIString::size_type(
etl::strlen(p_new)));
488 position +=
typename TIString::size_type(
etl::strlen(p_new));
490 }
while (position != TIString::npos);
499 template <
typename TIterator,
typename TPo
inter>
500 TIterator
find_first_of(TIterator first, TIterator last, TPointer delimiters)
502 TIterator itr(first);
506 TPointer pd = delimiters;
527 template <
typename TIString,
typename TPo
inter>
536 template <
typename TIString,
typename TPo
inter>
537 typename TIString::const_iterator
find_first_of(
const TIString& s, TPointer delimiters)
545 template <
typename TIterator,
typename TPo
inter>
548 TIterator itr(first);
552 TPointer pd = delimiters;
581 template <
typename TIString,
typename TPo
inter>
590 template <
typename TIString,
typename TPo
inter>
599 template <
typename TIterator,
typename TPo
inter>
600 TIterator
find_last_of(TIterator first, TIterator last, TPointer delimiters)
608 TIterator
end(first);
613 TPointer pd = delimiters;
624 }
while (itr !=
end);
632 template <
typename TIString,
typename TPo
inter>
633 typename TIString::iterator
find_last_of(TIString& s, TPointer delimiters)
641 template <
typename TIString,
typename TPo
inter>
642 typename TIString::const_iterator
find_last_of(
const TIString& s, TPointer delimiters)
650 template <
typename TIterator,
typename TPo
inter>
659 TIterator
end(first);
664 TPointer pd = delimiters;
683 }
while (itr !=
end);
691 template <
typename TIString,
typename TPo
inter>
700 template <
typename TIString,
typename TPo
inter>
710 template <
typename TInput,
typename TStringView>
712 bool ignore_empty_tokens)
714 typedef typename TInput::const_pointer const_pointer;
716 bool token_found =
false;
717 typename TStringView::size_type position = 0U;
718 TStringView view = last_view.value_or(TStringView());
719 const_pointer begin_ptr = input.data();
721 if (begin_ptr == ETL_NULLPTR)
726 const_pointer end_ptr = begin_ptr + input.size();
731 if (view.data() != ETL_NULLPTR)
733 position =
static_cast<typename TStringView::size_type
>(etl::distance(begin_ptr, view.data() + view.size() + 1U));
736 if (position > input.size())
738 return etl::optional<TStringView>();
743 const_pointer first_ptr = begin_ptr + position;
744 const_pointer last_ptr =
find_first_of(first_ptr, end_ptr, delimiters);
746 view = TStringView(first_ptr,
static_cast<size_t>(etl::distance(first_ptr, last_ptr)));
748 token_found = ((view.size() != 0U) || !ignore_empty_tokens);
751 return etl::optional<TStringView>(view);
777 template <
typename TInput,
typename TOutput>
778 bool get_token_list(
const TInput& input, TOutput& output,
typename TInput::const_pointer delimiters,
bool ignore_empty_tokens,
781 typedef typename TOutput::value_type string_view_t;
786 while ((token = etl::get_token(input, delimiters, token, ignore_empty_tokens)) && (count != output.max_size()) && (count != max_n_tokens))
788 output.push_back(token.value());
792 bool all_tokens_found = (token.has_value() ==
false);
794 return all_tokens_found;
800 template <
typename TIString>
801 void pad_left(TIString& s,
typename TIString::size_type required_size,
typename TIString::value_type pad_char)
803 required_size = etl::min(required_size, s.max_size());
805 if (required_size > s.size())
807 required_size -= s.size();
808 s.insert(
typename TIString::size_type(0U), required_size, pad_char);
815 template <
typename TIString>
816 void pad_right(TIString& s,
typename TIString::size_type required_size,
typename TIString::value_type pad_char)
818 required_size = etl::min(required_size, s.max_size());
820 if (required_size > s.size())
822 required_size -= s.size();
823 s.insert(s.size(), required_size, pad_char);
830 template <
typename TIString>
831 void pad(TIString& s,
typename TIString::size_type required_size,
string_pad_direction pad_direction,
typename TIString::value_type pad_char)
833 switch (
int(pad_direction))
835 case string_pad_direction::LEFT:
837 pad_left(s, required_size, pad_char);
841 case string_pad_direction::RIGHT:
857 template <
typename TString>
860 etl::transform(s.begin(), s.end(), s.begin(), ::toupper);
866 template <
typename TString>
869 etl::transform(s.begin(), s.end(), s.begin(), ::tolower);
875 template <
typename TString>
878 typename TString::iterator itr = s.begin();
880 *itr =
typename TString::value_type(::toupper(*itr));
883 etl::transform(itr, s.end(), itr, ::tolower);
900 template <
typename T>
903 if ((src == ETL_NULLPTR) || (dst == ETL_NULLPTR))
911 while ((count != n) && (*src != 0))
Definition optional.h:1273
#define ETL_DECLARE_ENUM_TYPE(TypeName, ValueType)
Definition enum_type.h:90
Definition integral_limits.h:518
ETL_CONSTEXPR17 etl::enable_if<!etl::is_same< T, etl::nullptr_t >::value, T >::type * addressof(T &t)
Definition addressof.h:52
bitset_ext
Definition absolute.h:40
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:546
void trim_from_left(TIString &s, typename TIString::const_pointer trim_characters)
Definition string_utilities.h:130
TStringView trim_from_view_right(const TStringView &view, typename TStringView::const_pointer trim_characters)
Definition string_utilities.h:241
void trim(TIString &s, typename TIString::const_pointer delimiters)
Definition string_utilities.h:371
TIterator find_first_of(TIterator first, TIterator last, TPointer delimiters)
Find first of any of delimiters within the string.
Definition string_utilities.h:500
void to_lower_case(TString &s)
to_lower_case
Definition string_utilities.h:867
void trim_whitespace_right(TIString &s)
Definition string_utilities.h:231
void pad_right(TIString &s, typename TIString::size_type required_size, typename TIString::value_type pad_char)
pad_right
Definition string_utilities.h:816
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:831
void right_n(TIString &s, typename TIString::size_type n)
Get up to the last n characters.
Definition string_utilities.h:429
void trim_left(TIString &s, typename TIString::const_pointer delimiters)
Definition string_utilities.h:180
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:418
void replace_characters(TIString &s, const TPair *pairsbegin, const TPair *pairsend)
replace_characters
Definition string_utilities.h:461
void to_sentence_case(TString &s)
to_sentence_case
Definition string_utilities.h:876
TIterator find_last_of(TIterator first, TIterator last, TPointer delimiters)
Find last of any of delimiters within the string.
Definition string_utilities.h:600
void trim_from_right(TIString &s, typename TIString::const_pointer trim_characters)
Definition string_utilities.h:221
TStringView trim_view(const TStringView &view, typename TStringView::const_pointer delimiters)
Definition string_utilities.h:382
TStringView trim_view_whitespace(const TStringView &view)
Definition string_utilities.h:361
TStringView trim_view_left(const TStringView &view, typename TStringView::const_pointer delimiters)
Definition string_utilities.h:199
void trim_right(TIString &s, typename TIString::const_pointer delimiters)
trim_right
Definition string_utilities.h:269
TStringView trim_view_whitespace_right(TStringView &view)
Definition string_utilities.h:260
TStringView trim_from_view(const TStringView &view, typename TStringView::const_pointer trim_characters)
Definition string_utilities.h:335
void trim_whitespace_left(TIString &s)
Definition string_utilities.h:141
bool get_token_list(const TInput &input, TOutput &output, typename TInput::const_pointer delimiters, bool ignore_empty_tokens, size_t max_n_tokens=etl::integral_limits< size_t >::max)
Splits a string of tokens to a set of views, according to a set of delimiters. The tokenisation stops...
Definition string_utilities.h:778
void pad_left(TIString &s, typename TIString::size_type required_size, typename TIString::value_type pad_char)
pad_left
Definition string_utilities.h:801
TStringView trim_view_whitespace_left(TStringView &s)
Definition string_utilities.h:170
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:651
void left_n(TIString &s, typename TIString::size_type n)
Get up to the first n characters.
Definition string_utilities.h:407
void to_upper_case(TString &s)
to_upper_case
Definition string_utilities.h:858
void trim_whitespace(TIString &s)
Definition string_utilities.h:325
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:440
void trim_from(TIString &s, typename TIString::const_pointer trim_characters)
Definition string_utilities.h:314
TStringView trim_from_view_left(const TStringView &view, typename TStringView::const_pointer trim_characters)
Definition string_utilities.h:151
void replace_strings(TIString &s, const TPair *pairsbegin, const TPair *pairsend)
replace_strings
Definition string_utilities.h:474
TStringView trim_view_right(const TStringView &view, typename TStringView::const_pointer delimiters)
trim_view_right
Definition string_utilities.h:292
ETL_CONSTEXPR14 size_t strlen(const T *t) ETL_NOEXCEPT
Alternative strlen for all character types.
Definition char_traits.h:293
ETL_CONSTEXPR TContainer::iterator end(TContainer &container)
Definition iterator.h:997
Definition string_utilities.h:894
string_pad_direction
Definition string_utilities.h:52
whitespace
Definition string_utilities.h:69