From ff23b783db9073369b770ed1497499eff517c005 Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Wed, 26 Jul 2023 15:35:10 +0100 Subject: Move operator/= for pathparts matching as a Path member, reimplement with std::mismatch --- icespider/common/pathparts.cpp | 11 +++++++++++ icespider/common/pathparts.h | 3 +++ 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 namespace IceSpider { + using PathElements = std::vector; + 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(); } -- cgit v1.2.3