| //===- MutagenDictionary.h - Internal header for the mutagen ----*- C++ -* ===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| // mutagen::Dictionary |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef LLVM_FUZZER_MUTAGEN_DICTIONARY_H |
| #define LLVM_FUZZER_MUTAGEN_DICTIONARY_H |
| |
| #include "FuzzerDefs.h" |
| #include <algorithm> |
| #include <cassert> |
| #include <cstddef> |
| #include <cstdint> |
| #include <limits> |
| |
| namespace mutagen { |
| namespace { |
| |
| using fuzzer::Word; |
| |
| } // namespace |
| |
| class DictionaryEntry { |
| public: |
| DictionaryEntry() {} |
| DictionaryEntry(Word W) : W(W) {} |
| DictionaryEntry(Word W, size_t PositionHint) |
| : W(W), PositionHint(PositionHint) {} |
| const Word &GetW() const { return W; } |
| |
| bool HasPositionHint() const { |
| return PositionHint != std::numeric_limits<size_t>::max(); |
| } |
| size_t GetPositionHint() const { |
| assert(HasPositionHint()); |
| return PositionHint; |
| } |
| void IncUseCount() { UseCount++; } |
| void IncSuccessCount() { SuccessCount++; } |
| size_t GetUseCount() const { return UseCount; } |
| size_t GetSuccessCount() const { return SuccessCount; } |
| |
| private: |
| Word W; |
| size_t PositionHint = std::numeric_limits<size_t>::max(); |
| size_t UseCount = 0; |
| size_t SuccessCount = 0; |
| }; |
| |
| class Dictionary { |
| public: |
| static const size_t kMaxDictSize = 1 << 14; |
| |
| bool ContainsWord(const Word &W) const { |
| return std::any_of(begin(), end(), [&](const DictionaryEntry &DE) { |
| return DE.GetW() == W; |
| }); |
| } |
| const DictionaryEntry *begin() const { return &DE[0]; } |
| const DictionaryEntry *end() const { return begin() + Size; } |
| DictionaryEntry &operator[](size_t Idx) { |
| assert(Idx < Size); |
| return DE[Idx]; |
| } |
| void push_back(DictionaryEntry DE) { |
| if (Size < kMaxDictSize) |
| this->DE[Size++] = DE; |
| } |
| void clear() { Size = 0; } |
| bool empty() const { return Size == 0; } |
| size_t size() const { return Size; } |
| |
| private: |
| DictionaryEntry DE[kMaxDictSize]; |
| size_t Size = 0; |
| }; |
| |
| } // namespace mutagen |
| |
| #endif // LLVM_FUZZER_MUTAGEN_DICTIONARY_H |