Skip to content

Commit 1c89ee4

Browse files
committed
Switched to std::views::split for splitting
1 parent f91c13c commit 1c89ee4

File tree

1 file changed

+14
-28
lines changed

1 file changed

+14
-28
lines changed

include/pgvector/pqxx.hpp

Lines changed: 14 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
#include <cstddef>
1010
#include <limits>
11+
#include <ranges>
1112
#include <string_view>
1213
#include <vector>
1314

@@ -35,14 +36,10 @@ template<> struct string_traits<pgvector::Vector> {
3536
std::vector<float> values;
3637
if (text.size() > 2) {
3738
std::string_view inner = text.substr(1, text.size() - 2);
38-
size_t start = 0;
39-
for (size_t i = 0; i < inner.size(); i++) {
40-
if (inner[i] == ',') {
41-
values.push_back(pqxx::from_string<float>(inner.substr(start, i - start), c));
42-
start = i + 1;
43-
}
39+
for (const auto& v : std::views::split(inner, ',')) {
40+
std::string_view sv{v.begin(), v.end()};
41+
values.push_back(pqxx::from_string<float>(sv, c));
4442
}
45-
values.push_back(pqxx::from_string<float>(inner.substr(start), c));
4643
}
4744
return pgvector::Vector{std::move(values)};
4845
}
@@ -108,14 +105,10 @@ template<> struct string_traits<pgvector::HalfVector> {
108105
std::vector<pgvector::Half> values;
109106
if (text.size() > 2) {
110107
std::string_view inner = text.substr(1, text.size() - 2);
111-
size_t start = 0;
112-
for (size_t i = 0; i < inner.size(); i++) {
113-
if (inner[i] == ',') {
114-
values.push_back(static_cast<pgvector::Half>(pqxx::from_string<float>(inner.substr(start, i - start), c)));
115-
start = i + 1;
116-
}
108+
for (const auto& v : std::views::split(inner, ',')) {
109+
std::string_view sv{v.begin(), v.end()};
110+
values.push_back(static_cast<pgvector::Half>(pqxx::from_string<float>(sv, c)));
117111
}
118-
values.push_back(static_cast<pgvector::Half>(pqxx::from_string<float>(inner.substr(start), c)));
119112
}
120113
return pgvector::HalfVector{std::move(values)};
121114
}
@@ -187,32 +180,25 @@ template<> struct string_traits<pgvector::SparseVector> {
187180
int dimensions = pqxx::from_string<int>(text.substr(n + 2), c);
188181

189182
if (n > 1) {
190-
auto add_element = [&](std::string_view substr) {
191-
size_t ne = substr.find(":");
183+
std::string_view inner = text.substr(1, n - 1);
184+
for (const auto& v : std::views::split(inner, ',')) {
185+
std::string_view sv{v.begin(), v.end()};
186+
187+
size_t ne = sv.find(":");
192188
if (ne == std::string::npos) {
193189
throw conversion_error{"Malformed sparsevec literal"};
194190
}
195191

196-
int index = pqxx::from_string<int>(substr.substr(0, ne), c);
197-
float value = pqxx::from_string<float>(substr.substr(ne + 1), c);
192+
int index = pqxx::from_string<int>(sv.substr(0, ne), c);
193+
float value = pqxx::from_string<float>(sv.substr(ne + 1), c);
198194

199195
// check to avoid undefined behavior
200196
if (index > std::numeric_limits<int>::min()) {
201197
index -= 1;
202198
}
203199

204200
map.insert({index, value});
205-
};
206-
207-
std::string_view inner = text.substr(1, n - 1);
208-
size_t start = 0;
209-
for (size_t i = 0; i < inner.size(); i++) {
210-
if (inner[i] == ',') {
211-
add_element(inner.substr(start, i - start));
212-
start = i + 1;
213-
}
214201
}
215-
add_element(inner.substr(start));
216202
}
217203

218204
try {

0 commit comments

Comments
 (0)