15ffd83dbSDimitry Andric //===-- CFBasicHash.h -------------------------------------------*- C++ -*-===//
25ffd83dbSDimitry Andric //
35ffd83dbSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
45ffd83dbSDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
55ffd83dbSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65ffd83dbSDimitry Andric //
75ffd83dbSDimitry Andric //===----------------------------------------------------------------------===//
85ffd83dbSDimitry Andric 
95ffd83dbSDimitry Andric #ifndef LLDB_SOURCE_PLUGINS_LANGUAGE_OBJC_CFBASICHASH_H
105ffd83dbSDimitry Andric #define LLDB_SOURCE_PLUGINS_LANGUAGE_OBJC_CFBASICHASH_H
115ffd83dbSDimitry Andric 
125ffd83dbSDimitry Andric #include "lldb/Target/Process.h"
135ffd83dbSDimitry Andric #include "lldb/Target/Target.h"
145ffd83dbSDimitry Andric 
155ffd83dbSDimitry Andric namespace lldb_private {
165ffd83dbSDimitry Andric 
175ffd83dbSDimitry Andric class CFBasicHash {
185ffd83dbSDimitry Andric public:
195ffd83dbSDimitry Andric   enum class HashType { set = 0, dict };
205ffd83dbSDimitry Andric 
215ffd83dbSDimitry Andric   CFBasicHash() = default;
225ffd83dbSDimitry Andric   ~CFBasicHash() = default;
235ffd83dbSDimitry Andric 
245ffd83dbSDimitry Andric   bool Update(lldb::addr_t addr, ExecutionContextRef exe_ctx_rf);
255ffd83dbSDimitry Andric 
265ffd83dbSDimitry Andric   bool IsValid() const;
275ffd83dbSDimitry Andric 
IsMutable()285ffd83dbSDimitry Andric   bool IsMutable() const { return m_mutable; };
IsMultiVariant()295ffd83dbSDimitry Andric   bool IsMultiVariant() const { return m_multi; }
GetType()305ffd83dbSDimitry Andric   HashType GetType() const { return m_type; }
315ffd83dbSDimitry Andric 
325ffd83dbSDimitry Andric   size_t GetCount() const;
335ffd83dbSDimitry Andric   lldb::addr_t GetKeyPointer() const;
345ffd83dbSDimitry Andric   lldb::addr_t GetValuePointer() const;
355ffd83dbSDimitry Andric 
365ffd83dbSDimitry Andric private:
375ffd83dbSDimitry Andric   template <typename T> struct __CFBasicHash {
385ffd83dbSDimitry Andric     struct RuntimeBase {
395ffd83dbSDimitry Andric       T cfisa;
405ffd83dbSDimitry Andric       T cfinfoa;
415ffd83dbSDimitry Andric     } base;
425ffd83dbSDimitry Andric 
435ffd83dbSDimitry Andric     struct Bits {
445ffd83dbSDimitry Andric       uint16_t __reserved0;
455ffd83dbSDimitry Andric       uint16_t __reserved1 : 2;
465ffd83dbSDimitry Andric       uint16_t keys_offset : 1;
475ffd83dbSDimitry Andric       uint16_t counts_offset : 2;
485ffd83dbSDimitry Andric       uint16_t counts_width : 2;
495ffd83dbSDimitry Andric       uint16_t __reserved2 : 9;
505ffd83dbSDimitry Andric       uint32_t used_buckets;        // number of used buckets
515ffd83dbSDimitry Andric       uint64_t deleted : 16;        // number of elements deleted
525ffd83dbSDimitry Andric       uint64_t num_buckets_idx : 8; // index to number of buckets
535ffd83dbSDimitry Andric       uint64_t __reserved3 : 40;
545ffd83dbSDimitry Andric       uint64_t __reserved4;
555ffd83dbSDimitry Andric     } bits;
565ffd83dbSDimitry Andric 
575ffd83dbSDimitry Andric     T pointers[3];
585ffd83dbSDimitry Andric   };
595ffd83dbSDimitry Andric   template <typename T> bool UpdateFor(std::unique_ptr<__CFBasicHash<T>> &m_ht);
605ffd83dbSDimitry Andric 
615ffd83dbSDimitry Andric   size_t GetPointerCount() const;
625ffd83dbSDimitry Andric 
635ffd83dbSDimitry Andric   uint32_t m_ptr_size = UINT32_MAX;
645ffd83dbSDimitry Andric   lldb::ByteOrder m_byte_order = lldb::eByteOrderInvalid;
655ffd83dbSDimitry Andric   Address m_address = LLDB_INVALID_ADDRESS;
665ffd83dbSDimitry Andric   std::unique_ptr<__CFBasicHash<uint32_t>> m_ht_32 = nullptr;
675ffd83dbSDimitry Andric   std::unique_ptr<__CFBasicHash<uint64_t>> m_ht_64 = nullptr;
685ffd83dbSDimitry Andric   ExecutionContextRef m_exe_ctx_ref;
695ffd83dbSDimitry Andric   bool m_mutable = true;
705ffd83dbSDimitry Andric   bool m_multi = false;
71*fcaf7f86SDimitry Andric   HashType m_type = HashType::set;
725ffd83dbSDimitry Andric };
735ffd83dbSDimitry Andric 
745ffd83dbSDimitry Andric } // namespace lldb_private
755ffd83dbSDimitry Andric 
765ffd83dbSDimitry Andric #endif // LLDB_SOURCE_PLUGINS_LANGUAGE_OBJC_CFBASICHASH_H
77