alstring.h 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. #ifndef AL_STRING_H
  2. #define AL_STRING_H
  3. #include <algorithm>
  4. #include <cstddef>
  5. #include <limits>
  6. #include <string>
  7. #include <string_view>
  8. namespace al {
  9. template<typename ...Ts>
  10. [[nodiscard]] constexpr
  11. auto sizei(const std::basic_string_view<Ts...> str) noexcept -> int
  12. { return static_cast<int>(std::min<std::size_t>(str.size(), std::numeric_limits<int>::max())); }
  13. template<typename ...Ts>
  14. [[nodiscard]] constexpr
  15. auto sizei(const std::basic_string<Ts...> &str) noexcept -> int
  16. { return static_cast<int>(std::min<std::size_t>(str.size(), std::numeric_limits<int>::max())); }
  17. [[nodiscard]]
  18. constexpr bool contains(const std::string_view str0, const std::string_view str1) noexcept
  19. { return str0.find(str1) != std::string_view::npos; }
  20. [[nodiscard]]
  21. constexpr bool starts_with(const std::string_view str0, const std::string_view str1) noexcept
  22. { return str0.substr(0, std::min(str0.size(), str1.size())) == str1; }
  23. [[nodiscard]]
  24. constexpr bool ends_with(const std::string_view str0, const std::string_view str1) noexcept
  25. { return str0.substr(str0.size() - std::min(str0.size(), str1.size())) == str1; }
  26. [[nodiscard]]
  27. int case_compare(const std::string_view str0, const std::string_view str1) noexcept;
  28. [[nodiscard]]
  29. int case_compare(const std::wstring_view str0, const std::wstring_view str1) noexcept;
  30. /* C++20 changes path::u8string() to return a string using a new/distinct
  31. * char8_t type for UTF-8 strings. However, support for this with standard
  32. * string functions is totally inadequate, and we already hold UTF-8 with plain
  33. * char strings. So this function is used to reinterpret a char8_t string as a
  34. * char string_view.
  35. */
  36. #if defined(__cpp_lib_char8_t) && __cpp_lib_char8_t >= 201907L
  37. inline auto u8_as_char(const std::u8string_view str) -> std::string_view
  38. #else
  39. inline auto u8_as_char(const std::string_view str) -> std::string_view
  40. #endif
  41. {
  42. return std::string_view{reinterpret_cast<const char*>(str.data()), str.size()};
  43. }
  44. } // namespace al
  45. #endif /* AL_STRING_H */