serialization {
56 template<
typenameReaderInfo,
typenameWriterInfo>
61 usingHashTable = llvm::OnDiskIterableChainedHashTable<Info>;
66OnDiskTable(
file_typeFile,
unsignedNumBuckets,
unsignedNumEntries,
70Table(NumBuckets, NumEntries, Buckets, Payload,
Base, InfoObj) {}
74std::vector<file_type> Files;
75llvm::DenseMap<internal_key_type, data_type>
Data;
78 usingTable = llvm::PointerUnion<OnDiskTable *, MergedTable *>;
79 usingTableVector = llvm::TinyPtrVector<void *>;
90llvm::TinyPtrVector<file_type> PendingOverrides;
92 structAsOnDiskTable {
93 usingresult_type = OnDiskTable *;
95result_type operator()(
void*
P)
const{
96 returnllvm::cast<OnDiskTable *>(Table::getFromOpaqueValue(
P));
100 usingtable_iterator =
101llvm::mapped_iterator<TableVector::iterator, AsOnDiskTable>;
102 usingtable_range = llvm::iterator_range<table_iterator>;
105table_range tables() {
106 auto Begin= Tables.begin(), End = Tables.end();
107 if(getMergedTable())
109 returnllvm::make_range(llvm::map_iterator(
Begin, AsOnDiskTable()),
110llvm::map_iterator(End, AsOnDiskTable()));
113MergedTable *getMergedTable()
const{
115 returnTables.empty() ? nullptr : Table::getFromOpaqueValue(*Tables.begin())
116.template dyn_cast<MergedTable*>();
121 for(
auto*
T: tables())
123 if(
auto*M = getMergedTable())
128 voidremoveOverriddenTables() {
129llvm::DenseSet<file_type> Files;
130Files.insert(PendingOverrides.begin(), PendingOverrides.end());
132 autoShouldRemove = [&Files](
void*
T) ->
bool{
133 auto*ODT = llvm::cast<OnDiskTable *>(Table::getFromOpaqueValue(
T));
134 boolRemove = Files.count(ODT->File);
139Tables.erase(std::remove_if(tables().begin().getCurrent(), Tables.end(),
142PendingOverrides.clear();
146MergedTable *Merged = getMergedTable();
148Merged =
newMergedTable;
152 for(
auto*ODT : tables()) {
153 auto&HT = ODT->Table;
154Info &InfoObj = HT.getInfoObj();
156 for(
autoI = HT.data_begin(),
E= HT.data_end(); I !=
E; ++I) {
157 auto*LocalPtr = I.getItem();
160 autoL = InfoObj.ReadKeyDataLength(LocalPtr);
163InfoObj.ReadDataInto(Key, LocalPtr + L.first, L.second,
167Merged->Files.push_back(ODT->File);
172Tables.push_back(Table(Merged).getOpaqueValue());
179: Tables(
std::move(O.Tables)),
180PendingOverrides(
std::move(O.PendingOverrides)) {
188Tables = std::move(O.Tables);
190PendingOverrides = std::move(O.PendingOverrides);
198 using namespacellvm::support;
202uint32_t BucketOffset =
203endian::readNext<uint32_t, llvm::endianness::little>(Ptr);
207endian::readNext<uint32_t, llvm::endianness::little>(Ptr);
211OverriddenFiles.reserve(NumFiles);
212 for(
; NumFiles != 0; --NumFiles)
213OverriddenFiles.push_back(InfoObj.ReadFileRef(Ptr));
214PendingOverrides.insert(PendingOverrides.end(), OverriddenFiles.begin(),
215OverriddenFiles.end());
219 autoNumBucketsAndEntries =
220OnDiskTable::HashTable::readNumBucketsAndEntries(Buckets);
223Table NewTable =
newOnDiskTable(
File, NumBucketsAndEntries.first,
224NumBucketsAndEntries.second,
225Buckets, Ptr,
Data, std::move(InfoObj));
226Tables.push_back(NewTable.getOpaqueValue());
233 if(!PendingOverrides.empty())
234removeOverriddenTables();
236 if(Tables.size() >
static_cast<unsigned>(Info::MaxTables))
240 autoKeyHash = Info::ComputeHash(Key);
242 if(MergedTable *M = getMergedTable()) {
243 autoIt = M->Data.find(Key);
244 if(It != M->Data.end())
250 for(
auto*ODT : tables()) {
251 auto&HT = ODT->Table;
252 autoIt = HT.find_hashed(Key, KeyHash);
254HT.getInfoObj().ReadDataInto(Key, It.getDataPtr(), It.getDataLen(),
267 if(!PendingOverrides.empty())
268removeOverriddenTables();
270 if(MergedTable *M = getMergedTable()) {
271 for(
auto&KV : M->Data)
272Info::MergeDataInto(KV.second, ResultBuilder);
275 for(
auto*ODT : tables()) {
276 auto&HT = ODT->Table;
277Info &InfoObj = HT.getInfoObj();
278 for(
autoI = HT.data_begin(),
E= HT.data_end(); I !=
E; ++I) {
279 auto*LocalPtr = I.getItem();
282 autoL = InfoObj.ReadKeyDataLength(LocalPtr);
284InfoObj.ReadDataInto(Key, LocalPtr + L.first, L.second, ResultBuilder);
293template<
typenameReaderInfo,
typenameWriterInfo>
296 usingGenerator = llvm::OnDiskChainedHashTableGenerator<WriterInfo>;
303 void insert(
typenameWriterInfo::key_type_ref Key,
304 typenameWriterInfo::data_type_ref
Data, WriterInfo &Info) {
305Gen.insert(Key,
Data, Info);
310 using namespacellvm::support;
312llvm::raw_svector_ostream OutStream(Out);
316endian::Writer Writer(OutStream, llvm::endianness::little);
319Writer.write<uint32_t>(0);
321 if(
auto*Merged =
Base?
Base->getMergedTable() :
nullptr) {
323Writer.write<uint32_t>(Merged->Files.size());
324 for(
const auto&F : Merged->Files)
325Info.EmitFileRef(OutStream, F);
328 for(
auto&KV : Merged->Data) {
329 if(!Gen.contains(KV.first, Info))
330Gen.insert(KV.first, Info.ImportData(KV.second), Info);
333Writer.write<uint32_t>(0);
338uint32_t BucketOffset = Gen.Emit(OutStream, Info);
341endian::write32le(Out.data(), BucketOffset);
Writer for the on-disk hash table.
MultiOnDiskHashTableGenerator()
void insert(typename WriterInfo::key_type_ref Key, typename WriterInfo::data_type_ref Data, WriterInfo &Info)
void emit(llvm::SmallVectorImpl< char > &Out, WriterInfo &Info, const BaseTable *Base)
A collection of on-disk hash tables, merged when relevant for performance.
data_type find(const external_key_type &EKey)
Find and read the lookup results for EKey.
typename Info::file_type file_type
A handle to a file, used when overriding tables.
MultiOnDiskHashTable(MultiOnDiskHashTable &&O)
MultiOnDiskHashTable()=default
typename Info::external_key_type external_key_type
typename Info::data_type data_type
typename Info::internal_key_type internal_key_type
const unsigned char * storage_type
A pointer to an on-disk representation of the hash table.
MultiOnDiskHashTable & operator=(MultiOnDiskHashTable &&O)
typename Info::data_type_builder data_type_builder
data_type findAll()
Read all the lookup results into a single value.
void add(file_type File, storage_type Data, Info InfoObj=Info())
Add the table Data loaded from file File.
The JSON file list parser is used to communicate input to InstallAPI.
@ Result
The result type of a method or function.
const FunctionProtoType * T
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4