path.hpp 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. #pragma once
  2. #include <cstddef>
  3. #include <string>
  4. namespace types {
  5. class string_view {
  6. private:
  7. const char* m_str;
  8. std::size_t m_len;
  9. public:
  10. constexpr string_view() : m_str(nullptr), m_len(0) {}
  11. constexpr string_view(const char* str, std::size_t len)
  12. : m_str(str), m_len(len) {}
  13. constexpr string_view(const std::string& str)
  14. : m_str(str.c_str()), m_len(str.size()) {}
  15. inline string_view(const char* str)
  16. : m_str(str), m_len(std::char_traits<char>::length(str)) {}
  17. constexpr const char* data() const { return m_str; }
  18. constexpr std::size_t size() const { return m_len; }
  19. constexpr bool empty() const { return m_len == 0; }
  20. constexpr const char* begin() const { return m_str; }
  21. constexpr const char* end() const { return m_str + m_len; }
  22. constexpr char operator[](std::size_t pos) const { return m_str[pos]; }
  23. constexpr bool operator==(const string_view& val) const {
  24. if (m_len != val.m_len)
  25. return false;
  26. for (std::size_t i = 0; i < m_len; ++i) {
  27. if (m_str[i] != val.m_str[i])
  28. return false;
  29. }
  30. return true;
  31. }
  32. constexpr bool operator==(const char* str) const {
  33. for (std::size_t i = 0; i < m_len; ++i) {
  34. if (m_str[i] != str[i])
  35. return false;
  36. }
  37. return str[m_len] == '\0';
  38. }
  39. constexpr bool operator==(const std::string& str) const {
  40. if (m_len != str.size())
  41. return false;
  42. return operator==(str.c_str());
  43. }
  44. constexpr bool operator<(const string_view& val) const {
  45. for (std::size_t i = 0; i < m_len && i < val.m_len; ++i) {
  46. if (m_str[i] < val.m_str[i])
  47. return true;
  48. if (m_str[i] > val.m_str[i])
  49. return false;
  50. }
  51. return m_len < val.m_len;
  52. }
  53. };
  54. } // namespace types