#include "utils.h" #include #include namespace lmcache { namespace utils { ParallelPatternMatcher::ParallelPatternMatcher(const std::vector& pattern) : pattern_(pattern) { if (pattern_.empty()) { throw std::invalid_argument("Pattern cannot be empty"); } } std::vector ParallelPatternMatcher::match(const std::vector& data) { // Handle edge cases if (data.size() < pattern_.size()) { return std::vector(); } std::vector matches; // Search for pattern in the data size_t search_end = data.size() - pattern_.size() + 1; for (size_t i = 0; i < search_end; ++i) { bool match = true; for (size_t j = 0; j < pattern_.size(); ++j) { if (data[i + j] != pattern_[j]) { match = false; break; } } if (match) { matches.push_back(static_cast(i)); } } return matches; } RangePatternMatcher::RangePatternMatcher(const std::vector& start_pattern, const std::vector& end_pattern) : start_pattern_(start_pattern), end_pattern_(end_pattern) { if (start_pattern_.empty()) { throw std::invalid_argument("Start pattern cannot be empty"); } if (end_pattern_.empty()) { throw std::invalid_argument("End pattern cannot be empty"); } } bool RangePatternMatcher::matchesAt(const std::vector& data, size_t pos, const std::vector& pattern) const { if (pos + pattern.size() > data.size()) { return false; } for (size_t i = 0; i < pattern.size(); ++i) { if (data[pos + i] != pattern[i]) { return false; } } return true; } std::vector> RangePatternMatcher::match( const std::vector& data) { std::vector> ranges; // Handle edge cases if (data.size() < start_pattern_.size() + end_pattern_.size()) { return ranges; } size_t i = 0; while (i <= data.size() - start_pattern_.size()) { // Check if start pattern matches at position i if (matchesAt(data, i, start_pattern_)) { int start_pos = static_cast(i); // Look for the first end pattern after the start pattern size_t search_start = i + start_pattern_.size(); bool found_end = false; for (size_t j = search_start; j <= data.size() - end_pattern_.size(); ++j) { if (matchesAt(data, j, end_pattern_)) { int end_pos = static_cast(j + end_pattern_.size()); ranges.push_back({start_pos, end_pos}); // Move to the position after this range to continue searching i = j + end_pattern_.size(); found_end = true; break; } } // If no end pattern was found, move past the start pattern if (!found_end) { i += start_pattern_.size(); } } else { ++i; } } return ranges; } } // namespace utils } // namespace lmcache