33#ifndef DVD_CORE_STRING_HELPER_INL_
34#define DVD_CORE_STRING_HELPER_INL_
37#define FMT_EXCEPTIONS 0
46 template<
typename T_vec,
typename T_str>
requires is_vector<T_vec, T_str> && is_string<T_str>
47 void Split(
const char* input,
const char delimiter, T_vec& elems )
49 assert( input !=
nullptr );
51 const T_str original( input );
52 if ( !original.empty() )
56 const char* o = input;
57 for ( i = 0u; input[i]; (input[i] == delimiter) ? i++ : *(input++) )
61 elems.resize( i + 1 );
66 typename T_str::const_iterator start = eastl::begin( original );
67 typename T_str::const_iterator end = eastl::end( original );
68 typename T_str::const_iterator next = eastl::find( start, end, delimiter );
71 elems[idx++] = { start, next };
73 next = eastl::find( start, end, delimiter );
75 elems[idx] = { start, next };
84 T_vec
Split(
const char* input,
const char delimiter )
87 Split<T_vec, T_str>( input, delimiter, elems );
97 template<
typename T_str>
requires valid_replace_string<T_str>
100 permutationContainer.clear();
101 T_str tempCpy( subject );
102 std::sort( std::begin( tempCpy ), std::end( tempCpy ) );
105 permutationContainer.push_back( tempCpy );
107 while ( std::next_permutation( std::begin( tempCpy ), std::end( tempCpy ) ) );
110 template<
typename T_str>
requires valid_replace_string<T_str>
111 bool ReplaceStringInPlace( T_str& subject,
const std::span<const std::string_view> search, std::string_view replace,
bool recursive )
118 for (
const std::string_view s : search )
121 ret = changed || ret;
129 template<
typename T_str>
requires valid_replace_string<T_str>
130 T_str
ReplaceString( std::string_view subject,
const std::span<const std::string_view> search, std::string_view replace,
bool recursive )
132 T_str ret{ subject };
137 for (
const std::string_view s : search )
146 template<
typename T_str>
requires valid_replace_string<T_str>
148 const std::string_view search,
149 const std::string_view replace,
150 const bool recursive )
159 while ( (pos = subject.find( search.data(), pos )) != T_str::npos )
161 subject.replace( pos, search.length(), replace.data() );
162 pos += replace.length();
178 const std::string_view search,
179 const std::string_view replace,
180 const bool recursive )
182 string temp = subject.
string();
188 template<
typename T_str>
requires valid_replace_string<T_str>
190 std::string_view search,
191 std::string_view replace,
194 T_str ret{ subject };
201 constexpr std::string_view InvalidXMLStrings[10] =
203 " ",
"[",
"]",
"...",
"..",
".",
"/",
"'\'",
"<",
">"
214 inline bool BeginsWith(
const std::string_view input,
const std::string_view compare,
bool ignoreWhitespace )
216 if ( ignoreWhitespace ) [[likely]]
218 const auto itBegin = input.find_first_not_of(
" \t\n\r\f\v" );
219 if ( itBegin != std::string_view::npos )
221 return input.substr( itBegin ).starts_with( compare );
225 return input.starts_with( compare );
232 const size_t inputLength = input.length();
233 count = std::min( inputLength, count );
235 return input.substr( inputLength - count, inputLength ).data();
241 const size_t inputLength = input.length();
242 count = std::min( inputLength, count );
244 return input.substr( 0, inputLength - count );
249 if (a ==
nullptr || b ==
nullptr)
259 if (a.size() != b.size())
264 for (
size_t i = 0; i < a.size(); ++i )
266 if ( tolower( a[i] ) != tolower( b[i] ) )
278 return to_U32( std::count( std::cbegin( str ), std::cend( str ),
'\n' ) ) + 1;
286 return Ltrim( temp );
292 s.erase( s.begin(), std::find_if( s.begin(), s.end(), [](
const T_str::value_type c )
noexcept
294 return !std::isspace( c );
303 return Rtrim( temp );
309 s.erase( std::find_if( s.rbegin(), s.rend(), [](
const T_str::value_type c )
noexcept
311 return !std::isspace( c );
312 } ).base(), s.end() );
332 if (std::getline(input, line, delimiter))
334 std::erase(line,
'\r');
335 std::erase(line,
'\n');
351 fmt::vformat_to( std::back_inserter( buf ), format_str, args );
368 output.assign(buffer.data(), buffer.size());
mi_stl_allocator< T > dvd_allocator
fmt::basic_memory_buffer< char, fmt::inline_buffer_size, dvd_allocator< char > > custom_memory_buffer
dvd_allocator< char > s_allocator
FORCE_INLINE custom_memory_buffer vformat(fmt::string_view format_str, fmt::format_args args)
bool GetLine(istringstream &input, T_str &line, char delimiter='\n')
Str StringFormat(const char *fmt, Args &&...args)
string to_string(GET_PASS_TYPE< T > value)
void GetPermutations(std::string_view subject, vector< T_str > &permutationContainer)
bool CompareIgnoreCase(const char *a, const char *b) noexcept
bool BeginsWith(std::string_view input, std::string_view compare, bool ignoreWhitespace)
T_vec Split(const char *input, char delimiter)
http://stackoverflow.com/questions/236129/split-a-string-in-c
T_str & Ltrim(T_str &s)
http://stackoverflow.com/questions/216823/whats-the-best-way-to-trim-stdstring
T_str ReplaceString(std::string_view subject, std::span< const std::string_view > search, std::string_view replace, bool recursive=false)
string MakeXMLSafe(std::string_view subject)
bool IsNumber(const T_str &s)
U32 LineCount(const T_str &str)
T_str GetStartingCharacters(const T_str &input, size_t count)
bool ReplaceStringInPlace(T_str &subject, std::span< const std::string_view > search, std::string_view replace, bool recursive=false)
T_str GetTrailingCharacters(const T_str &input, size_t count)
Handle console commands that start with a forward slash.
constexpr U32 to_U32(const T value)
eastl::vector< Type > vector
std::basic_istringstream< char, std::char_traits< char >, dvd_allocator< char > > istringstream
StringReturnType< N > string() const noexcept