| //===-- LVStringPool.h ------------------------------------------*- 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 |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // This file defines the LVStringPool class, which is used to implement a |
| // basic string pool table. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef LLVM_DEBUGINFO_LOGICALVIEW_CORE_LVSTRINGPOOL_H |
| #define LLVM_DEBUGINFO_LOGICALVIEW_CORE_LVSTRINGPOOL_H |
| |
| #include "llvm/ADT/StringMap.h" |
| #include "llvm/Support/Allocator.h" |
| #include "llvm/Support/Debug.h" |
| #include "llvm/Support/Format.h" |
| #include "llvm/Support/raw_ostream.h" |
| #include <iomanip> |
| #include <vector> |
| |
| namespace llvm { |
| namespace logicalview { |
| |
| class LVStringPool { |
| static constexpr size_t BadIndex = std::numeric_limits<size_t>::max(); |
| using TableType = StringMap<size_t, BumpPtrAllocator>; |
| using ValueType = TableType::value_type; |
| BumpPtrAllocator Allocator; |
| TableType StringTable; |
| std::vector<ValueType *> Entries; |
| |
| public: |
| LVStringPool() { getIndex(""); } |
| LVStringPool(LVStringPool const &other) = delete; |
| LVStringPool(LVStringPool &&other) = delete; |
| ~LVStringPool() = default; |
| |
| bool isValidIndex(size_t Index) const { return Index != BadIndex; } |
| |
| // Return number of strings in the pool. The empty string is allocated |
| // at the slot zero. We substract 1 to indicate the number of non empty |
| // strings. |
| size_t getSize() const { return Entries.size() - 1; } |
| |
| // Return the index for the specified key, otherwise 'BadIndex'. |
| size_t findIndex(StringRef Key) const { |
| TableType::const_iterator Iter = StringTable.find(Key); |
| if (Iter != StringTable.end()) |
| return Iter->second; |
| return BadIndex; |
| } |
| |
| // Return an index for the specified key. |
| size_t getIndex(StringRef Key) { |
| size_t Index = findIndex(Key); |
| if (isValidIndex(Index)) |
| return Index; |
| size_t Value = Entries.size(); |
| ValueType *Entry = ValueType::create(Key, Allocator, std::move(Value)); |
| StringTable.insert(Entry); |
| Entries.push_back(Entry); |
| return Value; |
| } |
| |
| // Given the index, return its corresponding string. |
| StringRef getString(size_t Index) const { |
| return (Index >= Entries.size()) ? StringRef() : Entries[Index]->getKey(); |
| } |
| |
| static LVStringPool &getInstance() { |
| static LVStringPool Instance; |
| return Instance; |
| } |
| |
| void print(raw_ostream &OS) const { |
| if (!Entries.empty()) { |
| OS << "\nString Pool:\n"; |
| for (const ValueType *Entry : Entries) |
| OS << "Index: " << Entry->getValue() << ", " |
| << "Key: '" << Entry->getKey() << "'\n"; |
| } |
| } |
| |
| #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) |
| void dump() const { print(dbgs()); } |
| #endif |
| }; |
| |
| inline LVStringPool &getStringPool() { return LVStringPool::getInstance(); } |
| |
| } // namespace logicalview |
| } // end namespace llvm |
| |
| #endif // LLVM_DEBUGINFO_LOGICALVIEW_CORE_LVSTRINGPOOL_H |