@@ -33,14 +33,15 @@ template <> struct string_traits<pgvector::Vector> {
3333
3434 std::vector<float > result;
3535 if (text.size () > 2 ) {
36- size_t start = 1 ;
37- for (size_t i = start; i < text.size () - 2 ; i++) {
38- if (text[i] == ' ,' ) {
39- result.push_back (string_traits<float >::from_string (text.substr (start, i - start), c));
36+ std::string_view inner = text.substr (1 , text.size () - 2 );
37+ size_t start = 0 ;
38+ for (size_t i = 0 ; i < inner.size (); i++) {
39+ if (inner[i] == ' ,' ) {
40+ result.push_back (string_traits<float >::from_string (inner.substr (start, i - start), c));
4041 start = i + 1 ;
4142 }
4243 }
43- result.push_back (string_traits<float >::from_string (text .substr (start, text. size () - start - 1 ), c));
44+ result.push_back (string_traits<float >::from_string (inner .substr (start), c));
4445 }
4546 return pgvector::Vector (std::move (result));
4647 }
@@ -71,14 +72,15 @@ template <> struct string_traits<pgvector::HalfVector> {
7172
7273 std::vector<float > result;
7374 if (text.size () > 2 ) {
74- size_t start = 1 ;
75- for (size_t i = start; i < text.size () - 2 ; i++) {
76- if (text[i] == ' ,' ) {
77- result.push_back (string_traits<float >::from_string (text.substr (start, i - start), c));
75+ std::string_view inner = text.substr (1 , text.size () - 2 );
76+ size_t start = 0 ;
77+ for (size_t i = 0 ; i < inner.size (); i++) {
78+ if (inner[i] == ' ,' ) {
79+ result.push_back (string_traits<float >::from_string (inner.substr (start, i - start), c));
7880 start = i + 1 ;
7981 }
8082 }
81- result.push_back (string_traits<float >::from_string (text .substr (start, text. size () - start - 1 ), c));
83+ result.push_back (string_traits<float >::from_string (inner .substr (start), c));
8284 }
8385 return pgvector::HalfVector (std::move (result));
8486 }
@@ -138,14 +140,15 @@ template <> struct string_traits<pgvector::SparseVector> {
138140 values.push_back (value);
139141 };
140142
141- size_t start = 1 ;
142- for (size_t i = start; i < n - 1 ; i++) {
143- if (text[i] == ' ,' ) {
144- cb (text.substr (start, i - start));
143+ std::string_view inner = text.substr (1 , n - 1 );
144+ size_t start = 0 ;
145+ for (size_t i = 0 ; i < inner.size (); i++) {
146+ if (inner[i] == ' ,' ) {
147+ cb (inner.substr (start, i - start));
145148 start = i + 1 ;
146149 }
147150 }
148- cb (text .substr (start, n - start));
151+ cb (inner .substr (start));
149152 }
150153
151154 return pgvector::SparseVector (dimensions, indices, values);
0 commit comments