9 #ifndef LLVM_CLANG_TOOLS_EXTRA_CLANGD_INDEX_MEMINDEX_H
10 #define LLVM_CLANG_TOOLS_EXTRA_CLANGD_INDEX_MEMINDEX_H
13 #include "llvm/ADT/StringSet.h"
24 template <
typename SymbolRange,
typename RefRange,
typename RelationRange>
25 MemIndex(SymbolRange &&Symbols, RefRange &&Refs, RelationRange &&Relations) {
26 for (
const Symbol &S : Symbols)
28 for (
const std::pair<
SymbolID, llvm::ArrayRef<Ref>> &R : Refs)
29 this->Refs.try_emplace(R.first, R.second.begin(), R.second.end());
31 this->Relations[std::make_pair(R.Subject,
32 static_cast<uint8_t
>(R.Predicate))]
36 template <
typename SymbolRange,
typename RefRange,
typename RelationRange,
38 MemIndex(SymbolRange &&Symbols, RefRange &&Refs, RelationRange &&Relations,
39 Payload &&BackingData,
size_t BackingDataSize)
40 :
MemIndex(std::forward<SymbolRange>(Symbols),
41 std::forward<RefRange>(Refs),
42 std::forward<RelationRange>(Relations)) {
43 KeepAlive = std::shared_ptr<void>(
44 std::make_shared<Payload>(std::move(BackingData)),
nullptr);
45 this->BackingDataSize = BackingDataSize;
48 template <
typename SymbolRange,
typename RefRange,
typename RelationRange,
49 typename FileRange,
typename Payload>
50 MemIndex(SymbolRange &&Symbols, RefRange &&Refs, RelationRange &&Relations,
52 size_t BackingDataSize)
53 :
MemIndex(std::forward<SymbolRange>(Symbols),
54 std::forward<RefRange>(Refs),
55 std::forward<RelationRange>(Relations),
56 std::forward<
Payload>(BackingData), BackingDataSize) {
57 this->Files = std::forward<FileRange>(Files);
58 this->IdxContents = IdxContents;
73 llvm::function_ref<
void(
const Ref &)>
Callback)
const override;
86 llvm::DenseMap<SymbolID, const Symbol *> Index;
88 llvm::DenseMap<SymbolID, llvm::ArrayRef<Ref>> Refs;
91 "RelationKind should be of same size as a uint8_t");
92 llvm::DenseMap<std::pair<SymbolID, uint8_t>, std::vector<SymbolID>> Relations;
94 llvm::StringSet<> Files;
97 std::shared_ptr<void> KeepAlive;
99 size_t BackingDataSize = 0;
105 #endif // LLVM_CLANG_TOOLS_EXTRA_CLANGD_INDEX_MEMINDEX_H