summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--icespider/common/pathparts.cpp11
-rw-r--r--icespider/common/pathparts.h3
-rw-r--r--icespider/core/core.cpp14
3 files changed, 15 insertions, 13 deletions
diff --git a/icespider/common/pathparts.cpp b/icespider/common/pathparts.cpp
index 6c11dec..d7faeb5 100644
--- a/icespider/common/pathparts.cpp
+++ b/icespider/common/pathparts.cpp
@@ -32,6 +32,17 @@ namespace IceSpider {
return parts.size();
}
+ bool
+ Path::matches(const PathElements & pathparts) const
+ {
+ return std::mismatch(pathparts.begin(), pathparts.end(), parts.begin(),
+ [](const auto & pathpart, const auto & routepart) {
+ return routepart->matches(pathpart);
+ })
+ .first
+ == pathparts.end();
+ }
+
PathLiteral::PathLiteral(const std::string_view & p) : value(p) { }
bool
diff --git a/icespider/common/pathparts.h b/icespider/common/pathparts.h
index cb727d6..c24360c 100644
--- a/icespider/common/pathparts.h
+++ b/icespider/common/pathparts.h
@@ -8,6 +8,8 @@
#include <visibility.h>
namespace IceSpider {
+ using PathElements = std::vector<std::string>;
+
class DLL_PUBLIC PathPart {
public:
PathPart() = default;
@@ -46,6 +48,7 @@ namespace IceSpider {
std::string_view path;
[[nodiscard]] std::size_t pathElementCount() const;
+ [[nodiscard]] bool matches(const PathElements &) const;
PathParts parts;
};
diff --git a/icespider/core/core.cpp b/icespider/core/core.cpp
index 11c4f42..4b4d087 100644
--- a/icespider/core/core.cpp
+++ b/icespider/core/core.cpp
@@ -146,18 +146,6 @@ namespace IceSpider {
return communicator->propertyToProxy(std::string {type});
}
- static bool
- operator/=(const PathElements & pathparts, const IRouteHandler * r)
- {
- auto rpi = r->parts.begin();
- for (auto ppi = pathparts.begin(); ppi != pathparts.end(); ++ppi, ++rpi) {
- if (!(*rpi)->matches(*ppi)) {
- return false;
- }
- }
- return true;
- }
-
CoreWithDefaultRouter::CoreWithDefaultRouter(const Ice::StringSeq & opts) : Core(opts)
{
for (const auto & r : allRoutes) {
@@ -180,7 +168,7 @@ namespace IceSpider {
const auto & routeSet = routes[pathparts.size()];
bool match = false;
for (const auto & r : routeSet) {
- if (pathparts /= r.get()) {
+ if (r->matches(pathparts)) {
if (r->method == method) {
return r.get();
}