From 7bfc38d9789a6a67870079c3f932fae6ee8837c4 Mon Sep 17 00:00:00 2001 From: Myles Busig Date: Thu, 7 Mar 2024 14:25:39 -0700 Subject: [PATCH] Change strings to use string_view instead of const char* Because the length of a string_view is computed at compile time, it is faster for simple copies. --- include/mtl/string.hpp | 77 ++++++++++++++++++++---------------------- src/string.cpp | 18 +++++----- 2 files changed, 46 insertions(+), 49 deletions(-) diff --git a/include/mtl/string.hpp b/include/mtl/string.hpp index 5d92b7b..5195e34 100644 --- a/include/mtl/string.hpp +++ b/include/mtl/string.hpp @@ -5,6 +5,7 @@ #include #include "utility.hpp" +#include "string_view.hpp" namespace mtl { @@ -37,8 +38,8 @@ public: // If the new string does not fit, it will be truncated to the capacity istring& assign(const istring& str); istring& assign(const istring& str, size_t pos, size_t count = npos); - istring& assign(const char* str, size_t count); - istring& assign(const char* str); + istring& assign(const string_view& str); + istring& assign(const string_view& str, size_t pos, size_t count = npos); istring& assign(size_t count, char ch); template istring& assign(T first, T last) { @@ -54,7 +55,7 @@ public: } istring& operator=(const istring& rhs); - istring& operator=(const char* rhs); + istring& operator=(const string_view& rhs); istring& operator=(char rhs); // Element access functions @@ -109,8 +110,8 @@ public: // Insert from self only works if index is after input range istring& insert(size_t index, const istring& str); istring& insert(size_t index, const istring& str, size_t s_index, size_t count = npos); - istring& insert(size_t index, const char* str); - istring& insert(size_t index, const char* str, size_t count); + istring& insert(size_t index, const string_view& str); + istring& insert(size_t index, const string_view& str, size_t str_index, size_t count = npos); istring& insert(size_t index, size_t count, char ch); iterator insert(const_iterator pos, char ch); iterator insert(const_iterator pos, size_t count, char ch); @@ -127,24 +128,24 @@ public: istring& append(const istring& str); istring& append(const istring& str, size_t s_index, size_t count = npos); - istring& append(const char* str); - istring& append(const char* str, size_t count); + istring& append(const string_view& str); + istring& append(const string_view& str, size_t str_index, size_t count = npos); istring& append(size_t count, char ch); template istring& append(T first, T last) { } istring& operator+=(char ch); - istring& operator+=(const char* str); + istring& operator+=(const string_view& str); istring& operator+=(const istring& str); istring& replace(size_t pos, size_t count, const istring& str); istring& replace(const_iterator first, const_iterator last, const istring& str); istring& replace(size_t pos, size_t count, const istring& str, size_t pos2, size_t count2 = npos); - istring& replace(size_t pos, size_t count, const char* str, size_t count2); - istring& replace(const_iterator first, const_iterator last, const char* str, size_t count2); - istring& replace(size_t pos, size_t count, const char* str); - istring& replace(const_iterator first, const_iterator last, const char* str); + istring& replace(size_t pos, size_t count, const string_view& str, size_t pos2, size_t count2 = npos); + istring& replace(const_iterator first, const_iterator last, const string_view& str, size_t pos2, size_t count2 = npos); + istring& replace(size_t pos, size_t count, const string_view& str); + istring& replace(const_iterator first, const_iterator last, const string_view& str); istring& replace(size_t pos, size_t count, size_t count2, char ch); istring& replace(const_iterator first, const_iterator last, size_t count2, char ch); template @@ -158,33 +159,27 @@ public: // Search size_t find(const istring& str, size_t pos = 0) const; - size_t find(const char* str, size_t pos, size_t count) const; - size_t find(const char* str, size_t pos = 0) const; + size_t find(const string_view& str, size_t pos = 0) const; size_t find(char ch, size_t pos = 0) const; size_t rfind(const istring& str, size_t pos = npos) const; - size_t rfind(const char* str, size_t pos, size_t count) const; - size_t rfind(const char* str, size_t pos = npos) const; + size_t rfind(const string_view& str, size_t pos = npos) const; size_t rfind(char ch, size_t pos = npos) const; size_t find_first_of(const istring& str, size_t pos = 0) const; - size_t find_first_of(const char* str, size_t pos, size_t count) const; - size_t find_first_of(const char* str, size_t pos = 0) const; + size_t find_first_of(const string_view& str, size_t pos = 0) const; size_t find_first_of(char ch, size_t pos = 0) const; size_t find_first_not_of(const istring& str, size_t pos = 0) const; - size_t find_first_not_of(const char* str, size_t pos, size_t count) const; - size_t find_first_not_of(const char* str, size_t pos = 0) const; + size_t find_first_not_of(const string_view& str, size_t pos = 0) const; size_t find_first_not_of(char ch, size_t pos = 0) const; size_t find_last_of(const istring& str, size_t pos = npos) const; - size_t find_last_of(const char* str, size_t pos, size_t count) const; - size_t find_last_of(const char* str, size_t pos = npos) const; + size_t find_last_of(const string_view& str, size_t pos = npos) const; size_t find_last_of(char ch, size_t pos = npos) const; size_t find_last_not_of(const istring& str, size_t pos = npos) const; - size_t find_last_not_of(const char* str, size_t pos, size_t count) const; - size_t find_last_not_of(const char* str, size_t pos = npos) const; + size_t find_last_not_of(const string_view& str, size_t pos = npos) const; size_t find_last_not_of(char ch, size_t pos = npos) const; // Comparison @@ -192,9 +187,9 @@ public: int32_t compare(const istring& str) const; int32_t compare(size_t pos, size_t count, const istring& str) const; int32_t compare(size_t pos1, size_t count1, istring& str, size_t pos2, size_t count2 = npos) const; - int32_t compare(const char* str) const; - int32_t compare(size_t pos, size_t count, const char* str) const; - int32_t compare(size_t pos1, size_t count1, const char* str, size_t count2) const; + int32_t compare(const string_view& str) const; + int32_t compare(size_t pos, size_t count, const string_view& str) const; + int32_t compare(size_t pos1, size_t count1, const string_view& str, size_t pos2, size_t count2 = npos) const; friend bool operator==(const istring& lhs, const istring& rhs); friend bool operator!=(const istring& lhs, const istring& rhs); @@ -203,18 +198,18 @@ public: friend bool operator>(const istring& lhs, const istring& rhs); friend bool operator>=(const istring& lhs, const istring& rhs); - friend bool operator==(const istring& lhs, const char* rhs); - friend bool operator==(const char* lhs, const istring& rhs); - friend bool operator!=(const istring& lhs, const char* rhs); - friend bool operator!=(const char* lhs, const istring& rhs); - friend bool operator<(const istring& lhs, const char* rhs); - friend bool operator<(const char* lhs, const istring& rhs); - friend bool operator<=(const istring& lhs, const char* rhs); - friend bool operator<=(const char* lhs, const istring& rhs); - friend bool operator>(const istring& lhs, const char* rhs); - friend bool operator>(const char* lhs, const istring& rhs); - friend bool operator>=(const istring& lhs, const char* rhs); - friend bool operator>=(const char* lhs, const istring& rhs); + friend bool operator==(const istring& lhs, const string_view& rhs); + friend bool operator==(const string_view& lhs, const istring& rhs); + friend bool operator!=(const istring& lhs, const string_view& rhs); + friend bool operator!=(const string_view& lhs, const istring& rhs); + friend bool operator<(const istring& lhs, const string_view& rhs); + friend bool operator<(const string_view& lhs, const istring& rhs); + friend bool operator<=(const istring& lhs, const string_view& rhs); + friend bool operator<=(const string_view& lhs, const istring& rhs); + friend bool operator>(const istring& lhs, const string_view& rhs); + friend bool operator>(const string_view& lhs, const istring& rhs); + friend bool operator>=(const istring& lhs, const string_view& rhs); + friend bool operator>=(const string_view& lhs, const istring& rhs); }; template @@ -224,8 +219,8 @@ private: public: string() : istring(m_buf, C, 0) {} - string(const char* str) : istring(m_buf, C, 0) { - m_size = std::strlen(str); + string(const string_view& str) : istring(m_buf, C, 0) { + m_size = str.length(); if (m_size > C) { m_size = m_capacity; } mtl::memcpy(m_buf, str, m_size); diff --git a/src/string.cpp b/src/string.cpp index 4974627..3e6fa5d 100644 --- a/src/string.cpp +++ b/src/string.cpp @@ -4,6 +4,7 @@ #include #include "mtl/utility.hpp" +#include "mtl/string_view.hpp" namespace mtl { istring::istring(char* _str, size_t _capacity, size_t _size) @@ -36,22 +37,24 @@ istring& istring::assign(const istring& str, size_t pos, size_t count) { return *this; } -istring& istring::assign(const char* str, size_t count) { - m_size = count; +istring& istring::assign(const string_view& str) { + m_size = str.length(); if (m_size > m_capacity) { m_size = m_capacity; } // str may overlap - std::memmove(m_str, str, m_size); + mtl::memcpy(m_str, str.c_str(), m_size); m_str[m_size] = '\0'; return *this; } -istring& istring::assign(const char* str) { - m_size = std::strlen(str); +istring& istring::assign(const string_view& str, size_t pos, size_t count) { + if (pos + count > str.length()) { m_size = str.length() - pos; } + else { m_size = count; } + if (m_size > m_capacity) { m_size = m_capacity; } // str may overlap - mtl::memcpy(m_str, str, m_size); + mtl::memcpy(m_str, str.c_str() + pos, m_size); m_str[m_size] = '\0'; return *this; @@ -72,7 +75,7 @@ istring& istring::assign(size_t count, char ch) { istring& istring::operator=(const istring& rhs) { return assign(rhs); } -istring& istring::operator=(const char* rhs) { +istring& istring::operator=(const string_view& rhs) { return assign(rhs); } istring& istring::operator=(char rhs) { @@ -210,7 +213,6 @@ istring& istring::insert(size_t index, const istring& str) { return *this; } - string_ext::string_ext(char* buf, size_t buf_size) : istring(buf, buf_size - 1, 0) {}