MCPcopy Create free account
hub / github.com/OpenSteam001/OpenSteamTool / FixedPatternScanner

Class FixedPatternScanner

src/OSTPlatform/Windows/ByteSearch.cpp:18–57  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

16namespace {
17
18class FixedPatternScanner {
19public:
20 explicit FixedPatternScanner(std::span<const uint8_t> pattern)
21 : pattern_(pattern.begin(), pattern.end()) {
22 const size_t patternSize = pattern_.size();
23 skip_.fill(patternSize == 0 ? 1 : patternSize);
24 if (patternSize <= 1) return;
25
26 for (size_t i = 0; i + 1 < patternSize; ++i) {
27 skip_[pattern_[i]] = patternSize - 1 - i;
28 }
29 }
30
31 std::optional<size_t> Find(std::span<const uint8_t> bytes) const {
32 const size_t patternSize = pattern_.size();
33 if (patternSize == 0 || bytes.size() < patternSize) return std::nullopt;
34
35 size_t offset = 0;
36 while (offset <= bytes.size() - patternSize) {
37 const uint8_t tail = bytes[offset + patternSize - 1];
38 if (tail == pattern_[patternSize - 1]) {
39 size_t i = patternSize - 1;
40 while (i > 0 && bytes[offset + i - 1] == pattern_[i - 1]) {
41 --i;
42 }
43 if (i == 0) return offset;
44 }
45
46 offset += skip_[tail];
47 }
48
49 return std::nullopt;
50 }
51
52 size_t PatternSize() const { return pattern_.size(); }
53
54private:
55 std::vector<uint8_t> pattern_;
56 std::array<size_t, 256> skip_{};
57};
58
59// Open for overlapped (async) sequential reads. FILE_FLAG_SEQUENTIAL_SCAN biases
60// the cache manager toward aggressive readahead and evict-behind; FILE_FLAG_OVERLAPPED

Callers 1

FindFunction · 0.85

Calls

no outgoing calls

Tested by

no test coverage detected