StringTools.cpp 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. // Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)
  2. // SPDX-FileCopyrightText: 2021 Jorrit Rouwe
  3. // SPDX-License-Identifier: MIT
  4. #include <Jolt/Jolt.h>
  5. #include <Jolt/Core/StringTools.h>
  6. JPH_SUPPRESS_WARNINGS_STD_BEGIN
  7. #include <cstdarg>
  8. JPH_SUPPRESS_WARNINGS_STD_END
  9. JPH_NAMESPACE_BEGIN
  10. String StringFormat(const char *inFMT, ...)
  11. {
  12. char buffer[1024];
  13. // Format the string
  14. va_list list;
  15. va_start(list, inFMT);
  16. vsnprintf(buffer, sizeof(buffer), inFMT, list);
  17. va_end(list);
  18. return String(buffer);
  19. }
  20. void StringReplace(String &ioString, const string_view &inSearch, const string_view &inReplace)
  21. {
  22. size_t index = 0;
  23. for (;;)
  24. {
  25. index = ioString.find(inSearch, index);
  26. if (index == String::npos)
  27. break;
  28. ioString.replace(index, inSearch.size(), inReplace);
  29. index += inReplace.size();
  30. }
  31. }
  32. void StringToVector(const string_view &inString, Array<String> &outVector, const string_view &inDelimiter, bool inClearVector)
  33. {
  34. JPH_ASSERT(inDelimiter.size() > 0);
  35. // Ensure vector empty
  36. if (inClearVector)
  37. outVector.clear();
  38. // No string? no elements
  39. if (inString.empty())
  40. return;
  41. // Start with initial string
  42. String s(inString);
  43. // Add to vector while we have a delimiter
  44. size_t i;
  45. while (!s.empty() && (i = s.find(inDelimiter)) != String::npos)
  46. {
  47. outVector.push_back(s.substr(0, i));
  48. s.erase(0, i + inDelimiter.length());
  49. }
  50. // Add final element
  51. outVector.push_back(s);
  52. }
  53. void VectorToString(const Array<String> &inVector, String &outString, const string_view &inDelimiter)
  54. {
  55. // Ensure string empty
  56. outString.clear();
  57. for (const String &s : inVector)
  58. {
  59. // Add delimiter if not first element
  60. if (!outString.empty())
  61. outString.append(inDelimiter);
  62. // Add element
  63. outString.append(s);
  64. }
  65. }
  66. String ToLower(const string_view &inString)
  67. {
  68. String out;
  69. out.reserve(inString.length());
  70. for (char c : inString)
  71. out.push_back((char)tolower(c));
  72. return out;
  73. }
  74. const char *NibbleToBinary(uint32 inNibble)
  75. {
  76. static const char *nibbles[] = { "0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111" };
  77. return nibbles[inNibble & 0xf];
  78. }
  79. JPH_NAMESPACE_END