Use more StringView in string helper functions
This commit is contained in:
parent
de402c4703
commit
8ee2aa9ba7
|
@ -1,46 +1,44 @@
|
|||
#include "string.hh"
|
||||
|
||||
#include "exception.hh"
|
||||
#include "utils.hh"
|
||||
#include "utf8_iterator.hh"
|
||||
|
||||
namespace Kakoune
|
||||
{
|
||||
|
||||
std::vector<String> split(const String& str, char separator, char escape)
|
||||
std::vector<String> split(StringView str, char separator, char escape)
|
||||
{
|
||||
auto begin = str.begin();
|
||||
auto end = str.begin();
|
||||
|
||||
std::vector<String> res;
|
||||
while (end != str.end())
|
||||
auto it = str.begin();
|
||||
while (it != str.end())
|
||||
{
|
||||
res.emplace_back();
|
||||
String& element = res.back();
|
||||
while (end != str.end())
|
||||
while (it != str.end())
|
||||
{
|
||||
auto c = *end;
|
||||
if (c == escape and end + 1 != end and *(end+1) == separator)
|
||||
auto c = *it;
|
||||
if (c == escape and it + 1 != str.end() and *(it+1) == separator)
|
||||
{
|
||||
element += separator;
|
||||
end += 2;
|
||||
it += 2;
|
||||
}
|
||||
else if (c == separator)
|
||||
{
|
||||
++end;
|
||||
++it;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
element += c;
|
||||
++end;
|
||||
++it;
|
||||
}
|
||||
}
|
||||
begin = end;
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
String escape(const String& str, char character, char escape)
|
||||
String escape(StringView str, char character, char escape)
|
||||
{
|
||||
String res;
|
||||
for (auto& c : str)
|
||||
|
@ -52,10 +50,22 @@ String escape(const String& str, char character, char escape)
|
|||
return res;
|
||||
}
|
||||
|
||||
int str_to_int(const String& str)
|
||||
String escape(StringView str, StringView characters, char escape)
|
||||
{
|
||||
String res;
|
||||
for (auto& c : str)
|
||||
{
|
||||
if (contains(characters, c))
|
||||
res += escape;
|
||||
res += c;
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
int str_to_int(StringView str)
|
||||
{
|
||||
int res = 0;
|
||||
if (sscanf(str.c_str(), "%i", &res) != 1)
|
||||
if (sscanf(str.zstr(), "%i", &res) != 1)
|
||||
throw runtime_error(str + "is not a number");
|
||||
return res;
|
||||
}
|
||||
|
@ -72,7 +82,7 @@ String option_to_string(const Regex& re)
|
|||
return String{re.str()};
|
||||
}
|
||||
|
||||
void option_from_string(const String& str, Regex& re)
|
||||
void option_from_string(StringView str, Regex& re)
|
||||
{
|
||||
try
|
||||
{
|
||||
|
|
|
@ -61,7 +61,7 @@ public:
|
|||
: m_data{data}, m_length{length} {}
|
||||
StringView(const char* data) : m_data{data}, m_length{(int)strlen(data)} {}
|
||||
constexpr StringView(const char* begin, const char* end) : m_data{begin}, m_length{(int)(end - begin)} {}
|
||||
StringView(const String& str) : m_data{str.data()}, m_length{str.length()} {}
|
||||
StringView(const std::string& str) : m_data{str.data()}, m_length{(int)str.length()} {}
|
||||
|
||||
bool operator==(StringView other) const;
|
||||
bool operator!=(StringView other) const;
|
||||
|
@ -259,8 +259,9 @@ inline String operator+(StringView lhs, StringView rhs)
|
|||
return res;
|
||||
}
|
||||
|
||||
std::vector<String> split(const String& str, char separator, char escape = 0);
|
||||
String escape(const String& str, char character, char escape);
|
||||
std::vector<String> split(StringView str, char separator, char escape = 0);
|
||||
String escape(StringView str, char character, char escape);
|
||||
String escape(StringView str, StringView characters, char escape);
|
||||
|
||||
inline String operator"" _str(const char* str, size_t)
|
||||
{
|
||||
|
@ -275,9 +276,9 @@ inline String codepoint_to_str(Codepoint cp)
|
|||
}
|
||||
|
||||
String option_to_string(const Regex& re);
|
||||
void option_from_string(const String& str, Regex& re);
|
||||
void option_from_string(StringView str, Regex& re);
|
||||
|
||||
int str_to_int(const String& str);
|
||||
int str_to_int(StringView str);
|
||||
|
||||
String to_string(int val);
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user