diff options
-rw-r--r-- | icespider/common/pathparts.cpp | 11 | ||||
-rw-r--r-- | icespider/common/pathparts.h | 3 | ||||
-rw-r--r-- | icespider/core/core.cpp | 14 |
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(); } |