]> git.saurik.com Git - apple/cf.git/blobdiff - CFSet.h
CF-476.10.tar.gz
[apple/cf.git] / CFSet.h
diff --git a/CFSet.h b/CFSet.h
new file mode 100644 (file)
index 0000000..7da0aea
--- /dev/null
+++ b/CFSet.h
@@ -0,0 +1,506 @@
+/*
+ * Copyright (c) 2008 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@
+ */
+/*     CFSet.h
+       Copyright (c) 1998-2007, Apple Inc. All rights reserved.
+*/
+/*!
+        @header CFSet
+        CFSet implements a container which stores unique values.
+*/
+
+#if !defined(__COREFOUNDATION_CFSET__)
+#define __COREFOUNDATION_CFSET__ 1
+
+#include <CoreFoundation/CFBase.h>
+
+CF_EXTERN_C_BEGIN
+
+/*!
+       @typedef CFSetRetainCallBack
+       Type of the callback function used by CFSets for retaining values.
+        @param allocator The allocator of the CFSet.
+       @param value The value to retain.
+        @result The value to store in the set, which is usually the value
+               parameter passed to this callback, but may be a different
+               value if a different value should be stored in the set.
+*/
+typedef const void *   (*CFSetRetainCallBack)(CFAllocatorRef allocator, const void *value);
+
+/*!
+       @typedef CFSetReleaseCallBack
+       Type of the callback function used by CFSets for releasing a retain on values.
+        @param allocator The allocator of the CFSet.
+       @param value The value to release.
+*/
+typedef void           (*CFSetReleaseCallBack)(CFAllocatorRef allocator, const void *value);
+
+/*!
+       @typedef CFSetCopyDescriptionCallBack
+       Type of the callback function used by CFSets for describing values.
+       @param value The value to describe.
+        @result A description of the specified value.
+*/
+typedef CFStringRef    (*CFSetCopyDescriptionCallBack)(const void *value);
+
+/*!
+       @typedef CFSetEqualCallBack
+       Type of the callback function used by CFSets for comparing values.
+       @param value1 The first value to compare.
+       @param value2 The second value to compare.
+        @result True if the values are equal, otherwise false.
+*/
+typedef Boolean                (*CFSetEqualCallBack)(const void *value1, const void *value2);
+
+/*!
+       @typedef CFSetHashCallBack
+       Type of the callback function used by CFSets for hashing values.
+       @param value The value to hash.
+        @result The hash of the value.
+*/
+typedef CFHashCode     (*CFSetHashCallBack)(const void *value);
+
+/*!
+       @typedef CFSetCallBacks
+       Structure containing the callbacks of a CFSet.
+       @field version The version number of the structure type being passed
+               in as a parameter to the CFSet creation functions. This
+               structure is version 0.
+       @field retain The callback used to add a retain for the set on
+               values as they are put into the set. This callback returns
+               the value to store in the set, which is usually the value
+               parameter passed to this callback, but may be a different
+               value if a different value should be stored in the set.
+               The set's allocator is passed as the first argument.
+       @field release The callback used to remove a retain previously added
+               for the set from values as they are removed from the
+               set. The set's allocator is passed as the first
+               argument.
+       @field copyDescription The callback used to create a descriptive
+               string representation of each value in the set. This is
+               used by the CFCopyDescription() function.
+       @field equal The callback used to compare values in the set for
+               equality for some operations.
+       @field hash The callback used to compare values in the set for
+               uniqueness for some operations.
+*/
+typedef struct {
+    CFIndex                            version;
+    CFSetRetainCallBack                        retain;
+    CFSetReleaseCallBack               release;
+    CFSetCopyDescriptionCallBack       copyDescription;
+    CFSetEqualCallBack                 equal;
+    CFSetHashCallBack                  hash;
+} CFSetCallBacks;
+
+/*!
+       @constant kCFTypeSetCallBacks
+       Predefined CFSetCallBacks structure containing a set of callbacks
+       appropriate for use when the values in a CFSet are all CFTypes.
+*/
+CF_EXPORT
+const CFSetCallBacks kCFTypeSetCallBacks;
+
+/*!
+       @constant kCFCopyStringSetCallBacks
+       Predefined CFSetCallBacks structure containing a set of callbacks
+       appropriate for use when the values in a CFSet should be copies
+        of a CFString.
+*/
+CF_EXPORT
+const CFSetCallBacks kCFCopyStringSetCallBacks;
+
+/*!
+       @typedef CFSetApplierFunction
+       Type of the callback function used by the apply functions of
+               CFSets.
+       @param value The current value from the set.
+       @param context The user-defined context parameter given to the apply
+               function.
+*/
+typedef void (*CFSetApplierFunction)(const void *value, void *context);
+
+/*!
+        @typedef CFSetRef
+       This is the type of a reference to immutable CFSets.
+*/
+typedef const struct __CFSet * CFSetRef;
+
+/*!
+        @typedef CFMutableSetRef
+       This is the type of a reference to mutable CFSets.
+*/
+typedef struct __CFSet * CFMutableSetRef;
+
+/*!
+        @function CFSetGetTypeID
+        Returns the type identifier of all CFSet instances.
+*/
+CF_EXPORT
+CFTypeID CFSetGetTypeID(void);
+
+/*!
+        @function CFSetCreate
+        Creates a new immutable set with the given values.
+       @param allocator The CFAllocator which should be used to allocate
+               memory for the set and its storage for values. This
+               parameter may be NULL in which case the current default
+               CFAllocator is used. If this reference is not a valid
+               CFAllocator, the behavior is undefined.
+       @param values A C array of the pointer-sized values to be in the
+               set.  This C array is not changed or freed by this function. 
+                If this parameter is not a valid pointer to a C array of at
+                least numValues pointers, the behavior is undefined.
+       @param numValues The number of values to copy from the values C
+               array into the CFSet. This number will be the count of the
+               set.  If this parameter is zero, negative, or greater than 
+                the number of values actually in the values C array, the 
+                behavior is undefined.
+       @param callBacks A C pointer to a CFSetCallBacks structure
+               initialized with the callbacks for the set to use on each
+               value in the set. A copy of the contents of the
+               callbacks structure is made, so that a pointer to a
+               structure on the stack can be passed in, or can be reused
+               for multiple set creations. If the version field of this
+               callbacks structure is not one of the defined ones for
+               CFSet, the behavior is undefined. The retain field may be
+               NULL, in which case the CFSet will do nothing to add a
+               retain to the contained values for the set. The release
+               field may be NULL, in which case the CFSet will do nothing
+               to remove the set's retain (if any) on the values when the
+               set is destroyed. If the copyDescription field is NULL,
+               the set will create a simple description for the value. If
+               the equal field is NULL, the set will use pointer equality
+               to test for equality of values. The hash field may be NULL,
+                in which case the CFSet will determine uniqueness by pointer
+                equality. This callbacks parameter
+               itself may be NULL, which is treated as if a valid structure
+               of version 0 with all fields NULL had been passed in.
+               Otherwise, if any of the fields are not valid pointers to
+               functions of the correct type, or this parameter is not a
+               valid pointer to a  CFSetCallBacks callbacks structure,
+               the behavior is undefined. If any of the values put into the
+               set is not one understood by one of the callback functions
+               the behavior when that callback function is used is
+               undefined.
+       @result A reference to the new immutable CFSet.
+*/
+CF_EXPORT
+CFSetRef CFSetCreate(CFAllocatorRef allocator, const void **values, CFIndex numValues, const CFSetCallBacks *callBacks);
+
+/*!
+       @function CFSetCreateCopy
+       Creates a new immutable set with the values from the given set.
+       @param allocator The CFAllocator which should be used to allocate
+               memory for the set and its storage for values. This
+               parameter may be NULL in which case the current default
+               CFAllocator is used. If this reference is not a valid
+               CFAllocator, the behavior is undefined.
+       @param theSet The set which is to be copied. The values from the
+               set are copied as pointers into the new set (that is,
+               the values themselves are copied, not that which the values
+               point to, if anything). However, the values are also
+               retained by the new set. The count of the new set will
+               be the same as the copied set. The new set uses the same
+               callbacks as the set to be copied. If this parameter is
+               not a valid CFSet, the behavior is undefined.
+       @result A reference to the new immutable CFSet.
+*/
+CF_EXPORT
+CFSetRef CFSetCreateCopy(CFAllocatorRef allocator, CFSetRef theSet);
+
+/*!
+       @function CFSetCreateMutable
+       Creates a new empty mutable set.
+       @param allocator The CFAllocator which should be used to allocate
+               memory for the set and its storage for values. This
+               parameter may be NULL in which case the current default
+               CFAllocator is used. If this reference is not a valid
+               CFAllocator, the behavior is undefined.
+        @param capacity A hint about the number of values that will be held
+                by the CFSet. Pass 0 for no hint. The implementation may
+                ignore this hint, or may use it to optimize various
+                operations. A set's actual capacity is only limited by 
+                address space and available memory constraints). If this 
+                parameter is negative, the behavior is undefined.
+       @param callBacks A C pointer to a CFSetCallBacks structure
+               initialized with the callbacks for the set to use on each
+               value in the set. A copy of the contents of the
+               callbacks structure is made, so that a pointer to a
+               structure on the stack can be passed in, or can be reused
+               for multiple set creations. If the version field of this
+               callbacks structure is not one of the defined ones for
+               CFSet, the behavior is undefined. The retain field may be
+               NULL, in which case the CFSet will do nothing to add a
+               retain to the contained values for the set. The release
+               field may be NULL, in which case the CFSet will do nothing
+               to remove the set's retain (if any) on the values when the
+               set is destroyed. If the copyDescription field is NULL,
+               the set will create a simple description for the value. If
+               the equal field is NULL, the set will use pointer equality
+               to test for equality of values. The hash field may be NULL,
+                in which case the CFSet will determine uniqueness by pointer
+                equality. This callbacks parameter
+               itself may be NULL, which is treated as if a valid structure
+               of version 0 with all fields NULL had been passed in.
+               Otherwise, if any of the fields are not valid pointers to
+               functions of the correct type, or this parameter is not a
+               valid pointer to a  CFSetCallBacks callbacks structure,
+               the behavior is undefined. If any of the values put into the
+               set is not one understood by one of the callback functions
+               the behavior when that callback function is used is
+               undefined.
+       @result A reference to the new mutable CFSet.
+*/
+CF_EXPORT
+CFMutableSetRef CFSetCreateMutable(CFAllocatorRef allocator, CFIndex capacity, const CFSetCallBacks *callBacks);
+
+/*!
+       @function CFSetCreateMutableCopy
+       Creates a new immutable set with the values from the given set.
+       @param allocator The CFAllocator which should be used to allocate
+               memory for the set and its storage for values. This
+               parameter may be NULL in which case the current default
+               CFAllocator is used. If this reference is not a valid
+               CFAllocator, the behavior is undefined.
+        @param capacity A hint about the number of values that will be held
+                by the CFSet. Pass 0 for no hint. The implementation may
+                ignore this hint, or may use it to optimize various
+                operations. A set's actual capacity is only limited by
+                address space and available memory constraints). 
+                This parameter must be greater than or equal
+                to the count of the set which is to be copied, or the
+                behavior is undefined. If this parameter is negative, the
+                behavior is undefined.
+       @param theSet The set which is to be copied. The values from the
+               set are copied as pointers into the new set (that is,
+               the values themselves are copied, not that which the values
+               point to, if anything). However, the values are also
+               retained by the new set. The count of the new set will
+               be the same as the copied set. The new set uses the same
+               callbacks as the set to be copied. If this parameter is
+               not a valid CFSet, the behavior is undefined.
+       @result A reference to the new mutable CFSet.
+*/
+CF_EXPORT
+CFMutableSetRef CFSetCreateMutableCopy(CFAllocatorRef allocator, CFIndex capacity, CFSetRef theSet);
+
+/*!
+       @function CFSetGetCount
+       Returns the number of values currently in the set.
+       @param theSet The set to be queried. If this parameter is not a valid
+               CFSet, the behavior is undefined.
+       @result The number of values in the set.
+*/
+CF_EXPORT
+CFIndex CFSetGetCount(CFSetRef theSet);
+
+/*!
+       @function CFSetGetCountOfValue
+       Counts the number of times the given value occurs in the set. Since 
+        sets by definition contain only one instance of a value, this function
+        is synomous to SFSetContainsValue.
+       @param theSet The set to be searched. If this parameter is not a
+               valid CFSet, the behavior is undefined.
+       @param value The value for which to find matches in the set. The
+               equal() callback provided when the set was created is
+               used to compare. If the equal() callback was NULL, pointer
+               equality (in C, ==) is used. If value, or any of the values
+               in the set, are not understood by the equal() callback,
+               the behavior is undefined.
+       @result The number of times the given value occurs in the set.
+*/
+CF_EXPORT
+CFIndex CFSetGetCountOfValue(CFSetRef theSet, const void *value);
+
+/*!
+       @function CFSetContainsValue
+       Reports whether or not the value is in the set.
+       @param theSet The set to be searched. If this parameter is not a
+               valid CFSet, the behavior is undefined.
+       @param value The value for which to find matches in the set. The
+               equal() callback provided when the set was created is
+               used to compare. If the equal() callback was NULL, pointer
+               equality (in C, ==) is used. If value, or any of the values
+               in the set, are not understood by the equal() callback,
+               the behavior is undefined.
+       @result true, if the value is in the set, otherwise false.
+*/
+CF_EXPORT
+Boolean CFSetContainsValue(CFSetRef theSet, const void *value);
+
+/*!
+       @function CFSetGetValue
+       Retrieves a value in the set which hashes the same as the specified value.
+       @param theSet The set to be queried. If this parameter is not a
+               valid CFSet, the behavior is undefined.
+       @param value The value to retrieve. The equal() callback provided when
+                the set was created is used to compare. If the equal() callback
+                was NULL, pointer equality (in C, ==) is used. If a value, or
+                any of the values in the set, are not understood by the equal()
+                callback, the behavior is undefined.
+        @result The value in the set with the given hash.
+*/
+CF_EXPORT
+const void *CFSetGetValue(CFSetRef theSet, const void *value);
+
+/*!
+       @function CFSetGetValue
+       Retrieves a value in the set which hashes the same as the specified value,
+        if present.
+       @param theSet The set to be queried. If this parameter is not a
+               valid CFSet, the behavior is undefined.
+       @param candidate This value is hashed and compared with values in the
+                set to determine which value to retrieve. The equal() callback provided when
+                the set was created is used to compare. If the equal() callback
+                was NULL, pointer equality (in C, ==) is used. If a value, or
+                any of the values in the set, are not understood by the equal()
+                callback, the behavior is undefined.
+       @param value A pointer to memory which should be filled with the
+               pointer-sized value if a matching value is found. If no
+               match is found, the contents of the storage pointed to by
+               this parameter are undefined. This parameter may be NULL,
+               in which case the value from the dictionary is not returned
+               (but the return value of this function still indicates
+               whether or not the value was present).
+        @result True if the value was present in the set, otherwise false.
+*/
+CF_EXPORT
+Boolean CFSetGetValueIfPresent(CFSetRef theSet, const void *candidate, const void **value);
+
+/*!
+       @function CFSetGetValues
+       Fills the buffer with values from the set.
+       @param theSet The set to be queried. If this parameter is not a
+               valid CFSet, the behavior is undefined.
+       @param values A C array of pointer-sized values to be filled with
+               values from the set. The values in the C array are ordered
+               in the same order in which they appear in the set. If this
+               parameter is not a valid pointer to a C array of at least
+               CFSetGetCount() pointers, the behavior is undefined.
+*/
+CF_EXPORT
+void CFSetGetValues(CFSetRef theSet, const void **values);
+
+/*!
+       @function CFSetApplyFunction
+       Calls a function once for each value in the set.
+       @param theSet The set to be operated upon. If this parameter is not
+               a valid CFSet, the behavior is undefined.
+       @param applier The callback function to call once for each value in
+               the given set. If this parameter is not a
+               pointer to a function of the correct prototype, the behavior
+               is undefined. If there are values in the set which the
+               applier function does not expect or cannot properly apply
+               to, the behavior is undefined. 
+       @param context A pointer-sized user-defined value, which is passed
+               as the second parameter to the applier function, but is
+               otherwise unused by this function. If the context is not
+               what is expected by the applier function, the behavior is
+               undefined.
+*/
+CF_EXPORT
+void CFSetApplyFunction(CFSetRef theSet, CFSetApplierFunction applier, void *context);
+
+/*!
+       @function CFSetAddValue
+       Adds the value to the set if it is not already present.
+       @param theSet The set to which the value is to be added. If this
+               parameter is not a valid mutable CFSet, the behavior is
+               undefined.
+       @param value The value to add to the set. The value is retained by
+               the set using the retain callback provided when the set
+               was created. If the value is not of the sort expected by the
+               retain callback, the behavior is undefined. The count of the 
+                set is increased by one.
+*/
+CF_EXPORT
+void CFSetAddValue(CFMutableSetRef theSet, const void *value);
+
+/*!
+       @function CFSetReplaceValue
+       Replaces the value in the set if it is present.
+       @param theSet The set to which the value is to be replaced. If this
+               parameter is not a valid mutable CFSet, the behavior is
+               undefined.
+        @param value The value to replace in the set. The equal() callback provided when
+                the set was created is used to compare. If the equal() callback
+                was NULL, pointer equality (in C, ==) is used. If a value, or
+                any of the values in the set, are not understood by the equal()
+                callback, the behavior is undefined. The value is retained by
+               the set using the retain callback provided when the set
+               was created. If the value is not of the sort expected by the
+               retain callback, the behavior is undefined. The count of the 
+                set is increased by one.
+*/
+CF_EXPORT
+void CFSetReplaceValue(CFMutableSetRef theSet, const void *value);
+
+/*!
+       @function CFSetSetValue
+       Replaces the value in the set if it is present, or adds the value to 
+        the set if it is absent.
+       @param theSet The set to which the value is to be replaced. If this
+               parameter is not a valid mutable CFSet, the behavior is
+               undefined.
+        @param value The value to set in the CFSet. The equal() callback provided when
+                the set was created is used to compare. If the equal() callback
+                was NULL, pointer equality (in C, ==) is used. If a value, or
+                any of the values in the set, are not understood by the equal()
+                callback, the behavior is undefined. The value is retained by
+               the set using the retain callback provided when the set
+               was created. If the value is not of the sort expected by the
+               retain callback, the behavior is undefined. The count of the 
+                set is increased by one.
+*/
+CF_EXPORT
+void CFSetSetValue(CFMutableSetRef theSet, const void *value);
+
+/*!
+       @function CFSetRemoveValue
+       Removes the specified value from the set.
+       @param theSet The set from which the value is to be removed.
+                If this parameter is not a valid mutable CFSet,
+               the behavior is undefined.
+        @param value The value to remove. The equal() callback provided when
+                the set was created is used to compare. If the equal() callback
+                was NULL, pointer equality (in C, ==) is used. If a value, or
+                any of the values in the set, are not understood by the equal()
+                callback, the behavior is undefined.
+*/
+CF_EXPORT
+void CFSetRemoveValue(CFMutableSetRef theSet, const void *value);
+
+/*!
+       @function CFSetRemoveAllValues
+       Removes all the values from the set, making it empty.
+       @param theSet The set from which all of the values are to be
+               removed. If this parameter is not a valid mutable CFSet,
+               the behavior is undefined.
+*/
+CF_EXPORT
+void CFSetRemoveAllValues(CFMutableSetRef theSet);
+
+CF_EXTERN_C_END
+
+#endif /* ! __COREFOUNDATION_CFSET__ */
+