Skip to content

Commit 680401e

Browse files
authored
feat: Do not use regex for simple pattern-replacements to improve performance (#252)
1 parent 99509ea commit 680401e

File tree

1 file changed

+14
-7
lines changed

1 file changed

+14
-7
lines changed

casbin/util/built_in_functions.cpp

+14-7
Original file line numberDiff line numberDiff line change
@@ -38,17 +38,24 @@ namespace {
3838
static const std::regex capturingColonNonSlashRegex("(.*?):[^/]+(.*?)");
3939
static const std::regex enclosedPlaceHolderRegex("(.*?)\\{[^/]+?\\}(.*?)");
4040

41+
std::string ReplacePattern(std::string const& in, std::string const& pattern, std::string const& replacement) {
42+
std::string result = in;
43+
std::size_t pos = 0;
44+
// Replace all occurrences of pattern with replacement
45+
while ((pos = result.find(pattern, pos)) != std::string::npos) {
46+
result.replace(pos, pattern.length(), replacement);
47+
pos += replacement.length(); // Move over change
48+
}
49+
return result;
50+
}
51+
4152
std::string PrepareWildCardMatching(const std::string& value) {
42-
static const std::regex pattern("/\\*");
43-
return std::regex_replace(value, pattern, "/.*");
53+
return ReplacePattern(value, "/*", "/.*");
4454
}
4555

4656
std::string EscapeCurlyBraces(const std::string& value) {
47-
static const std::regex curlyBraceOpenPattern("\\{");
48-
static const std::regex curlyBraceClosePattern("\\}");
49-
50-
std::string intermediate = std::regex_replace(value, curlyBraceOpenPattern, "\\{");
51-
return std::regex_replace(intermediate, curlyBraceClosePattern, "\\}");
57+
std::string intermediate = ReplacePattern(value, "{", "\\{");
58+
return ReplacePattern(intermediate, "}", "\\}");
5259
}
5360
}
5461

0 commit comments

Comments
 (0)