#include <CoreFoundation/CFBase.h>
#include <CoreFoundation/CFString.h>
#include "CFInternal.h"
CF_EXTERN_C_BEGIN
struct __objcFastEnumerationStateEquivalent2 {
unsigned long state;
unsigned long *itemsPtr;
unsigned long *mutationsPtr;
unsigned long extra[5];
};
enum {
__kCFBasicHashLinearHashingValue = 1,
__kCFBasicHashDoubleHashingValue = 2,
__kCFBasicHashExponentialHashingValue = 3,
};
enum {
kCFBasicHashHasValues2 = (1UL << 2),
kCFBasicHashHasKeys = (1UL << 3),
kCFBasicHashHasKeys2 = (1UL << 4),
kCFBasicHashHasCounts = (1UL << 5),
kCFBasicHashHasOrder = (1UL << 6),
kCFBasicHashHasHashCache = (1UL << 7),
kCFBasicHashStrongValues = (1UL << 9),
kCFBasicHashStrongValues2 = (1UL << 10),
kCFBasicHashStrongKeys = (1UL << 11),
kCFBasicHashStrongKeys2 = (1UL << 12),
kCFBasicHashLinearHashing = (__kCFBasicHashLinearHashingValue << 13), kCFBasicHashDoubleHashing = (__kCFBasicHashDoubleHashingValue << 13),
kCFBasicHashExponentialHashing = (__kCFBasicHashExponentialHashingValue << 13),
kCFBasicHashAggressiveGrowth = (1UL << 15),
};
typedef struct {
CFIndex idx;
uintptr_t weak_key;
uintptr_t weak_key2;
uintptr_t weak_value;
uintptr_t weak_value2;
uintptr_t count;
uintptr_t order;
} CFBasicHashBucket;
typedef struct __CFBasicHash *CFBasicHashRef;
CF_INLINE Boolean CFBasicHashIsMutable(CFBasicHashRef ht) {
return __CFBitfieldGetValue(((CFRuntimeBase *)ht)->_cfinfo[CF_INFO_BITS], 6, 6) ? false : true;
}
CF_INLINE void CFBasicHashMakeImmutable(CFBasicHashRef ht) {
__CFBitfieldSetValue(((CFRuntimeBase *)ht)->_cfinfo[CF_INFO_BITS], 6, 6, 1);
}
typedef struct __CFBasicHashCallbacks CFBasicHashCallbacks;
typedef uintptr_t (*CFBasicHashCallbackType)(CFBasicHashRef ht, uint8_t op, uintptr_t a1, uintptr_t a2, const CFBasicHashCallbacks *cb);
enum {
kCFBasicHashCallbackOpCopyCallbacks = 8, kCFBasicHashCallbackOpFreeCallbacks = 9,
kCFBasicHashCallbackOpRetainValue = 10, kCFBasicHashCallbackOpRetainValue2 = 11, kCFBasicHashCallbackOpRetainKey = 12, kCFBasicHashCallbackOpRetainKey2 = 13, kCFBasicHashCallbackOpReleaseValue = 14, kCFBasicHashCallbackOpReleaseValue2 = 15, kCFBasicHashCallbackOpReleaseKey = 16, kCFBasicHashCallbackOpReleaseKey2 = 17, kCFBasicHashCallbackOpValueEqual = 18, kCFBasicHashCallbackOpValue2Equal = 19, kCFBasicHashCallbackOpKeyEqual = 20, kCFBasicHashCallbackOpKey2Equal = 21, kCFBasicHashCallbackOpHashKey = 22, kCFBasicHashCallbackOpHashKey2 = 23, kCFBasicHashCallbackOpDescribeValue = 24, kCFBasicHashCallbackOpDescribeValue2 = 25, kCFBasicHashCallbackOpDescribeKey = 26, kCFBasicHashCallbackOpDescribeKey2 = 27, };
struct __CFBasicHashCallbacks {
CFBasicHashCallbackType func; uintptr_t context[0]; };
extern const CFBasicHashCallbacks CFBasicHashNullCallbacks;
extern const CFBasicHashCallbacks CFBasicHashStandardCallbacks;
CFOptionFlags CFBasicHashGetFlags(CFBasicHashRef ht);
CFIndex CFBasicHashGetNumBuckets(CFBasicHashRef ht);
CFIndex CFBasicHashGetCapacity(CFBasicHashRef ht);
void CFBasicHashSetCapacity(CFBasicHashRef ht, CFIndex capacity);
CFIndex CFBasicHashGetCount(CFBasicHashRef ht);
CFBasicHashBucket CFBasicHashGetBucket(CFBasicHashRef ht, CFIndex idx);
CFBasicHashBucket CFBasicHashFindBucket(CFBasicHashRef ht, uintptr_t stack_key);
CFIndex CFBasicHashGetCountOfKey(CFBasicHashRef ht, uintptr_t stack_key);
CFIndex CFBasicHashGetCountOfValue(CFBasicHashRef ht, uintptr_t stack_value);
Boolean CFBasicHashesAreEqual(CFBasicHashRef ht1, CFBasicHashRef ht2);
void CFBasicHashApply(CFBasicHashRef ht, Boolean (^block)(CFBasicHashBucket));
void CFBasicHashGetElements(CFBasicHashRef ht, CFIndex bufferslen, uintptr_t *weak_values, uintptr_t *weak_values2, uintptr_t *weak_keys, uintptr_t *weak_keys2);
void CFBasicHashAddValue(CFBasicHashRef ht, uintptr_t stack_key, uintptr_t stack_value);
void CFBasicHashReplaceValue(CFBasicHashRef ht, uintptr_t stack_key, uintptr_t stack_value);
void CFBasicHashSetValue(CFBasicHashRef ht, uintptr_t stack_key, uintptr_t stack_value);
CFIndex CFBasicHashRemoveValue(CFBasicHashRef ht, uintptr_t stack_key);
void CFBasicHashRemoveAllValues(CFBasicHashRef ht);
size_t CFBasicHashGetSize(CFBasicHashRef ht, Boolean total);
CFStringRef CFBasicHashCopyDescription(CFBasicHashRef ht, Boolean detailed, CFStringRef linePrefix, CFStringRef entryLinePrefix, Boolean describeElements);
CFTypeID CFBasicHashGetTypeID(void);
extern Boolean __CFBasicHashEqual(CFTypeRef cf1, CFTypeRef cf2);
extern CFHashCode __CFBasicHashHash(CFTypeRef cf);
extern CFStringRef __CFBasicHashCopyDescription(CFTypeRef cf);
extern void __CFBasicHashDeallocate(CFTypeRef cf);
extern unsigned long __CFBasicHashFastEnumeration(CFBasicHashRef ht, struct __objcFastEnumerationStateEquivalent2 *state, void *stackbuffer, unsigned long count);
CFBasicHashRef CFBasicHashCreate(CFAllocatorRef allocator, CFOptionFlags flags, const CFBasicHashCallbacks *cb);
CFBasicHashRef CFBasicHashCreateCopy(CFAllocatorRef allocator, CFBasicHashRef ht);
CF_EXTERN_C_END