/* Part of the API MODULE Copyright (C) 2021 by Maxim Prokhorov */ #pragma once #include #include // ----------------------------------------------------------------------------- struct PathPart { enum class Type { Unknown, Value, SingleWildcard, MultiWildcard }; Type type; size_t offset; size_t length; }; struct PathParts { using Parts = std::vector; PathParts() = delete; PathParts(const PathParts&) = default; PathParts(PathParts&&) noexcept = default; explicit PathParts(const String& path); explicit operator bool() const { return _ok; } void clear() { _parts.clear(); } void reserve(size_t size) { _parts.reserve(size); } String operator[](size_t index) const { auto& part = _parts[index]; return _path.substring(part.offset, part.offset + part.length); } const String& path() const { return _path; } const Parts& parts() const { return _parts; } size_t size() const { return _parts.size(); } Parts::const_iterator begin() const { return _parts.begin(); } Parts::const_iterator end() const { return _parts.end(); } bool match(const PathParts& path) const; bool match(const String& path) const { return match(PathParts(path)); } private: PathPart& emplace_back(PathPart::Type type, size_t offset, size_t length) { PathPart part { type, offset, length }; _parts.push_back(std::move(part)); return _parts.back(); } const String& _path; Parts _parts; bool _ok { false }; };