//===--- OnDiskHashTable.h - On-Disk Hash Table Implementation --*- 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 // //===----------------------------------------------------------------------===// /// /// \file /// Defines facilities for reading and writing on-disk hash tables. /// //===----------------------------------------------------------------------===// #ifndef LLVM_SUPPORT_ONDISKHASHTABLE_H #define LLVM_SUPPORT_ONDISKHASHTABLE_H #include "llvm/Support/Alignment.h" #include "llvm/Support/Allocator.h" #include "llvm/Support/DataTypes.h" #include "llvm/Support/EndianStream.h" #include "llvm/Support/MathExtras.h" #include "llvm/Support/raw_ostream.h" #include <cassert> #include <cstdlib> namespace llvm { /// Generates an on disk hash table. /// /// This needs an \c Info that handles storing values into the hash table's /// payload and computes the hash for a given key. This should provide the /// following interface: /// /// \code /// class ExampleInfo { /// public: /// typedef ExampleKey key_type; // Must be copy constructible /// typedef ExampleKey &key_type_ref; /// typedef ExampleData data_type; // Must be copy constructible /// typedef ExampleData &data_type_ref; /// typedef uint32_t hash_value_type; // The type the hash function returns. /// typedef uint32_t offset_type; // The type for offsets into the table. /// /// /// Calculate the hash for Key /// static hash_value_type ComputeHash(key_type_ref Key); /// /// Return the lengths, in bytes, of the given Key/Data pair. /// static std::pair<offset_type, offset_type> /// EmitKeyDataLength(raw_ostream &Out, key_type_ref Key, data_type_ref Data); /// /// Write Key to Out. KeyLen is the length from EmitKeyDataLength. /// static void EmitKey(raw_ostream &Out, key_type_ref Key, /// offset_type KeyLen); /// /// Write Data to Out. DataLen is the length from EmitKeyDataLength. /// static void EmitData(raw_ostream &Out, key_type_ref Key, /// data_type_ref Data, offset_type DataLen); /// /// Determine if two keys are equal. Optional, only needed by contains. /// static bool EqualKey(key_type_ref Key1, key_type_ref Key2); /// }; /// \endcode template <typename Info> class OnDiskChainedHashTableGenerator { … }; /// Provides lookup on an on disk hash table. /// /// This needs an \c Info that handles reading values from the hash table's /// payload and computes the hash for a given key. This should provide the /// following interface: /// /// \code /// class ExampleLookupInfo { /// public: /// typedef ExampleData data_type; /// typedef ExampleInternalKey internal_key_type; // The stored key type. /// typedef ExampleKey external_key_type; // The type to pass to find(). /// typedef uint32_t hash_value_type; // The type the hash function returns. /// typedef uint32_t offset_type; // The type for offsets into the table. /// /// /// Compare two keys for equality. /// static bool EqualKey(internal_key_type &Key1, internal_key_type &Key2); /// /// Calculate the hash for the given key. /// static hash_value_type ComputeHash(internal_key_type &IKey); /// /// Translate from the semantic type of a key in the hash table to the /// /// type that is actually stored and used for hashing and comparisons. /// /// The internal and external types are often the same, in which case this /// /// can simply return the passed in value. /// static const internal_key_type &GetInternalKey(external_key_type &EKey); /// /// Read the key and data length from Buffer, leaving it pointing at the /// /// following byte. /// static std::pair<offset_type, offset_type> /// ReadKeyDataLength(const unsigned char *&Buffer); /// /// Read the key from Buffer, given the KeyLen as reported from /// /// ReadKeyDataLength. /// const internal_key_type &ReadKey(const unsigned char *Buffer, /// offset_type KeyLen); /// /// Read the data for Key from Buffer, given the DataLen as reported from /// /// ReadKeyDataLength. /// data_type ReadData(StringRef Key, const unsigned char *Buffer, /// offset_type DataLen); /// }; /// \endcode template <typename Info> class OnDiskChainedHashTable { … }; /// Provides lookup and iteration over an on disk hash table. /// /// \copydetails llvm::OnDiskChainedHashTable template <typename Info> class OnDiskIterableChainedHashTable : public OnDiskChainedHashTable<Info> { … }; } // end namespace llvm #endif