@@ -44,18 +44,30 @@ namespace {
44
44
* @return A set of unique tensor names.
45
45
*/
46
46
std::unordered_set<std::string> deserialize_tensor_names (const std::string_view& tensor_names) {
47
- // tensor names are separated by comma, but ignore escaped comma
48
- static const auto splitter = std::regex (R"( (?:[^\\,\n]|\\.)+)" );
47
+ static const auto escaped_delim = std::regex (R"( \\,)" );
48
+ constexpr auto delim = " ," ;
49
+ constexpr auto esc_char = ' \\ ' ;
49
50
50
51
auto output_names = std::unordered_set<std::string>();
51
- std::transform (std::cregex_token_iterator{tensor_names.data (), tensor_names.data () + tensor_names.size (), splitter},
52
- std::cregex_token_iterator{},
53
- std::inserter (output_names, output_names.end ()),
54
- [](const auto & token) {
55
- // If tensor name contains escaped comma, replace it with comma
56
- static const auto escaped_delim = std::regex (R"( \\,)" );
57
- return std::regex_replace (token.str (), escaped_delim, " ," );
58
- });
52
+ auto name_inserter = std::inserter (output_names, output_names.end ());
53
+ for (size_t pos = tensor_names.find (delim), start = 0 ; start != std::string::npos;
54
+ pos = tensor_names.find (delim, pos)) {
55
+ if (pos == std::string::npos) {
56
+ if (auto name_view = tensor_names.substr (start); name_view.size () > 0 ) {
57
+ *name_inserter = std::regex_replace (std::string (name_view), escaped_delim, delim);
58
+ }
59
+ start = pos;
60
+ } else if (auto delim_pos = pos - 1 ; delim_pos != std::string::npos && tensor_names[delim_pos] == esc_char) {
61
+ ++pos;
62
+ } else {
63
+ if (auto length = pos - start; length > 0 ) {
64
+ *name_inserter =
65
+ std::regex_replace (std::string (tensor_names.substr (start, length)), escaped_delim, delim);
66
+ }
67
+ start = ++pos;
68
+ }
69
+ }
70
+
59
71
return output_names;
60
72
}
61
73
} // namespace
0 commit comments