]> git.saurik.com Git - apple/cf.git/blobdiff - CFBasicHash.h
CF-550.tar.gz
[apple/cf.git] / CFBasicHash.h
diff --git a/CFBasicHash.h b/CFBasicHash.h
new file mode 100644 (file)
index 0000000..e592b69
--- /dev/null
@@ -0,0 +1,165 @@
+/*
+ * Copyright (c) 2009 Apple Inc. All rights reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * This file contains Original Code and/or Modifications of Original Code
+ * as defined in and that are subject to the Apple Public Source License
+ * Version 2.0 (the 'License'). You may not use this file except in
+ * compliance with the License. Please obtain a copy of the License at
+ * http://www.opensource.apple.com/apsl/ and read it before using this
+ * file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
+ * Please see the License for the specific language governing rights and
+ * limitations under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+/*     CFBasicHash.h
+       Copyright (c) 2008-2009, Apple Inc. All rights reserved.
+*/
+
+#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), // bits 13-14
+    kCFBasicHashDoubleHashing = (__kCFBasicHashDoubleHashingValue << 13),
+    kCFBasicHashExponentialHashing = (__kCFBasicHashExponentialHashingValue << 13),
+
+    kCFBasicHashAggressiveGrowth = (1UL << 15),
+};
+
+// Note that for a hash table without keys, the value is treated as the key,
+// and the value should be passed in as the key for operations which take a key.
+
+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;
+
+// Bit 6 in the CF_INFO_BITS of the CFRuntimeBase inside the CFBasicHashRef is the "is immutable" bit
+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,   // Return new value; REQUIRED
+    kCFBasicHashCallbackOpFreeCallbacks = 9,   // Return 0; REQUIRED
+
+    kCFBasicHashCallbackOpRetainValue = 10,    // Return first arg or new value; REQUIRED
+    kCFBasicHashCallbackOpRetainValue2 = 11,   // Return first arg or new value
+    kCFBasicHashCallbackOpRetainKey = 12,      // Return first arg or new key; REQUIRED
+    kCFBasicHashCallbackOpRetainKey2 = 13,     // Return first arg or new key
+    kCFBasicHashCallbackOpReleaseValue = 14,   // Return 0; REQUIRED
+    kCFBasicHashCallbackOpReleaseValue2 = 15,  // Return 0
+    kCFBasicHashCallbackOpReleaseKey = 16,     // Return 0; REQUIRED
+    kCFBasicHashCallbackOpReleaseKey2 = 17,    // Return 0
+    kCFBasicHashCallbackOpValueEqual = 18,     // Return 0 or 1; REQUIRED
+    kCFBasicHashCallbackOpValue2Equal = 19,    // Return 0 or 1
+    kCFBasicHashCallbackOpKeyEqual = 20,       // Return 0 or 1; REQUIRED
+    kCFBasicHashCallbackOpKey2Equal = 21,      // Return 0 or 1
+    kCFBasicHashCallbackOpHashKey = 22,                // Return hash code; REQUIRED
+    kCFBasicHashCallbackOpHashKey2 = 23,       // Return hash code
+    kCFBasicHashCallbackOpDescribeValue = 24,  // Return retained CFStringRef; REQUIRED
+    kCFBasicHashCallbackOpDescribeValue2 = 25, // Return retained CFStringRef
+    kCFBasicHashCallbackOpDescribeKey = 26,    // Return retained CFStringRef; REQUIRED
+    kCFBasicHashCallbackOpDescribeKey2 = 27,   // Return retained CFStringRef
+};
+
+struct __CFBasicHashCallbacks {
+    CFBasicHashCallbackType func; // must not be NULL
+    uintptr_t context[0]; // variable size; any pointers in here must remain valid as long as the CFBasicHash
+};
+
+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);
+
+// creation functions create mutable CFBasicHashRefs
+CFBasicHashRef CFBasicHashCreate(CFAllocatorRef allocator, CFOptionFlags flags, const CFBasicHashCallbacks *cb);
+CFBasicHashRef CFBasicHashCreateCopy(CFAllocatorRef allocator, CFBasicHashRef ht);
+
+
+CF_EXTERN_C_END
+