]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/include/llvm/DebugInfo/PDB/Native/HashTable.h
Merge llvm, clang, lld, lldb, compiler-rt and libc++ r304460, and update
[FreeBSD/FreeBSD.git] / contrib / llvm / include / llvm / DebugInfo / PDB / Native / HashTable.h
1 //===- HashTable.h - PDB Hash Table -----------------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9
10 #ifndef LLVM_DEBUGINFO_PDB_RAW_HASHTABLE_H
11 #define LLVM_DEBUGINFO_PDB_RAW_HASHTABLE_H
12
13 #include "llvm/ADT/ArrayRef.h"
14 #include "llvm/ADT/SparseBitVector.h"
15 #include "llvm/ADT/StringRef.h"
16 #include "llvm/ADT/iterator.h"
17 #include "llvm/Support/BinaryStreamArray.h"
18 #include "llvm/Support/BinaryStreamReader.h"
19 #include "llvm/Support/BinaryStreamWriter.h"
20 #include "llvm/Support/Endian.h"
21 #include "llvm/Support/Error.h"
22 #include "llvm/Support/MathExtras.h"
23
24 #include <cstdint>
25 #include <utility>
26
27 namespace llvm {
28 namespace pdb {
29
30 class HashTableIterator;
31
32 class HashTable {
33   friend class HashTableIterator;
34   struct Header {
35     support::ulittle32_t Size;
36     support::ulittle32_t Capacity;
37   };
38
39   typedef std::vector<std::pair<uint32_t, uint32_t>> BucketList;
40
41 public:
42   HashTable();
43   explicit HashTable(uint32_t Capacity);
44
45   Error load(BinaryStreamReader &Stream);
46
47   uint32_t calculateSerializedLength() const;
48   Error commit(BinaryStreamWriter &Writer) const;
49
50   void clear();
51
52   uint32_t capacity() const;
53   uint32_t size() const;
54
55   HashTableIterator begin() const;
56   HashTableIterator end() const;
57   HashTableIterator find(uint32_t K);
58
59   void set(uint32_t K, uint32_t V);
60   void remove(uint32_t K);
61   uint32_t get(uint32_t K);
62
63 protected:
64   bool isPresent(uint32_t K) const { return Present.test(K); }
65   bool isDeleted(uint32_t K) const { return Deleted.test(K); }
66   BucketList Buckets;
67   mutable SparseBitVector<> Present;
68   mutable SparseBitVector<> Deleted;
69
70 private:
71   static uint32_t maxLoad(uint32_t capacity);
72   void grow();
73
74   static Error readSparseBitVector(BinaryStreamReader &Stream,
75                                    SparseBitVector<> &V);
76   static Error writeSparseBitVector(BinaryStreamWriter &Writer,
77                                     SparseBitVector<> &Vec);
78 };
79
80 class HashTableIterator
81     : public iterator_facade_base<HashTableIterator, std::forward_iterator_tag,
82                                   std::pair<uint32_t, uint32_t>> {
83   friend class HashTable;
84   HashTableIterator(const HashTable &Map, uint32_t Index, bool IsEnd);
85
86 public:
87   HashTableIterator(const HashTable &Map);
88
89   HashTableIterator &operator=(const HashTableIterator &R);
90   bool operator==(const HashTableIterator &R) const;
91   const std::pair<uint32_t, uint32_t> &operator*() const;
92   HashTableIterator &operator++();
93
94 private:
95   bool isEnd() const { return IsEnd; }
96   uint32_t index() const { return Index; }
97
98   const HashTable *Map;
99   uint32_t Index;
100   bool IsEnd;
101 };
102
103 } // end namespace pdb
104 } // end namespace llvm
105
106 #endif // LLVM_DEBUGINFO_PDB_RAW_HASHTABLE_H