]> git.saurik.com Git - apple/cf.git/blob - CFDictionary.h
CF-744.tar.gz
[apple/cf.git] / CFDictionary.h
1 /*
2 * Copyright (c) 2012 Apple Inc. All rights reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. Please obtain a copy of the License at
10 * http://www.opensource.apple.com/apsl/ and read it before using this
11 * file.
12 *
13 * The Original Code and all software distributed under the License are
14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
18 * Please see the License for the specific language governing rights and
19 * limitations under the License.
20 *
21 * @APPLE_LICENSE_HEADER_END@
22 */
23
24 /* CFDictionary.h
25 Copyright (c) 1998-2012, Apple Inc. All rights reserved.
26 */
27
28 /*!
29 @header CFDictionary
30 CFDictionary implements a container which pairs pointer-sized keys
31 with pointer-sized values. Values are accessed via arbitrary
32 user-defined keys. A CFDictionary differs from a CFArray in that
33 the key used to access a particular value in the dictionary remains
34 the same as values are added to or removed from the dictionary,
35 unless a value associated with its particular key is replaced or
36 removed. In a CFArray, the key (or index) used to retrieve a
37 particular value can change over time as values are added to or
38 deleted from the array. Also unlike an array, there is no ordering
39 among values in a dictionary. To enable later retrieval of a value,
40 the key of the key-value pair should be constant (or treated as
41 constant); if the key changes after being used to put a value in
42 the dictionary, the value may not be retrievable. The keys of a
43 dictionary form a set; that is, no two keys which are equal to
44 one another are present in the dictionary at any time.
45
46 Dictionaries come in two flavors, immutable, which cannot have
47 values added to them or removed from them after the dictionary is
48 created, and mutable, to which you can add values or from which
49 remove values. Mutable dictionaries can have an unlimited number
50 of values (or rather, limited only by constraints external to
51 CFDictionary, like the amount of available memory).
52
53 As with all CoreFoundation collection types, dictionaries maintain
54 hard references on the values you put in them, but the retaining and
55 releasing functions are user-defined callbacks that can actually do
56 whatever the user wants (for example, nothing).
57
58 Although a particular implementation of CFDictionary may not use
59 hashing and a hash table for storage of the values, the keys have
60 a hash-code generating function defined for them, and a function
61 to test for equality of two keys. These two functions together
62 must maintain the invariant that if equal(X, Y), then hash(X) ==
63 hash(Y). Note that the converse will not generally be true (but
64 the contrapositive, if hash(X) != hash(Y), then !equal(X, Y),
65 will be as required by Boolean logic). If the hash() and equal()
66 key callbacks are NULL, the key is used as a pointer-sized integer,
67 and pointer equality is used. Care should be taken to provide a
68 hash() callback which will compute sufficiently dispersed hash
69 codes for the key set for best performance.
70
71 Computational Complexity
72 The access time for a value in the dictionary is guaranteed to be at
73 worst O(N) for any implementation, current and future, but will
74 often be O(1) (constant time). Insertion or deletion operations
75 will typically be constant time as well, but are O(N*N) in the
76 worst case in some implementations. Access of values through a key
77 is faster than accessing values directly (if there are any such
78 operations). Dictionaries will tend to use significantly more memory
79 than a array with the same number of values.
80 */
81
82 #if !defined(__COREFOUNDATION_CFDICTIONARY__)
83 #define __COREFOUNDATION_CFDICTIONARY__ 1
84
85 #include <CoreFoundation/CFBase.h>
86
87 CF_IMPLICIT_BRIDGING_ENABLED
88 CF_EXTERN_C_BEGIN
89
90 /*!
91 @typedef CFDictionaryKeyCallBacks
92 Structure containing the callbacks for keys of a CFDictionary.
93 @field version The version number of the structure type being passed
94 in as a parameter to the CFDictionary creation functions.
95 This structure is version 0.
96 @field retain The callback used to add a retain for the dictionary
97 on keys as they are used to put values into the dictionary.
98 This callback returns the value to use as the key in the
99 dictionary, which is usually the value parameter passed to
100 this callback, but may be a different value if a different
101 value should be used as the key. The dictionary's allocator
102 is passed as the first argument.
103 @field release The callback used to remove a retain previously added
104 for the dictionary from keys as their values are removed from
105 the dictionary. The dictionary's allocator is passed as the
106 first argument.
107 @field copyDescription The callback used to create a descriptive
108 string representation of each key in the dictionary. This
109 is used by the CFCopyDescription() function.
110 @field equal The callback used to compare keys in the dictionary for
111 equality.
112 @field hash The callback used to compute a hash code for keys as they
113 are used to access, add, or remove values in the dictionary.
114 */
115 typedef const void * (*CFDictionaryRetainCallBack)(CFAllocatorRef allocator, const void *value);
116 typedef void (*CFDictionaryReleaseCallBack)(CFAllocatorRef allocator, const void *value);
117 typedef CFStringRef (*CFDictionaryCopyDescriptionCallBack)(const void *value);
118 typedef Boolean (*CFDictionaryEqualCallBack)(const void *value1, const void *value2);
119 typedef CFHashCode (*CFDictionaryHashCallBack)(const void *value);
120 typedef struct {
121 CFIndex version;
122 CFDictionaryRetainCallBack retain;
123 CFDictionaryReleaseCallBack release;
124 CFDictionaryCopyDescriptionCallBack copyDescription;
125 CFDictionaryEqualCallBack equal;
126 CFDictionaryHashCallBack hash;
127 } CFDictionaryKeyCallBacks;
128
129 /*!
130 @constant kCFTypeDictionaryKeyCallBacks
131 Predefined CFDictionaryKeyCallBacks structure containing a
132 set of callbacks appropriate for use when the keys of a
133 CFDictionary are all CFTypes.
134 */
135 CF_EXPORT
136 const CFDictionaryKeyCallBacks kCFTypeDictionaryKeyCallBacks;
137
138 /*!
139 @constant kCFCopyStringDictionaryKeyCallBacks
140 Predefined CFDictionaryKeyCallBacks structure containing a
141 set of callbacks appropriate for use when the keys of a
142 CFDictionary are all CFStrings, which may be mutable and
143 need to be copied in order to serve as constant keys for
144 the values in the dictionary.
145 */
146 CF_EXPORT
147 const CFDictionaryKeyCallBacks kCFCopyStringDictionaryKeyCallBacks;
148
149 /*!
150 @typedef CFDictionaryValueCallBacks
151 Structure containing the callbacks for values of a CFDictionary.
152 @field version The version number of the structure type being passed
153 in as a parameter to the CFDictionary creation functions.
154 This structure is version 0.
155 @field retain The callback used to add a retain for the dictionary
156 on values as they are put into the dictionary.
157 This callback returns the value to use as the value in the
158 dictionary, which is usually the value parameter passed to
159 this callback, but may be a different value if a different
160 value should be added to the dictionary. The dictionary's
161 allocator is passed as the first argument.
162 @field release The callback used to remove a retain previously added
163 for the dictionary from values as they are removed from
164 the dictionary. The dictionary's allocator is passed as the
165 first argument.
166 @field copyDescription The callback used to create a descriptive
167 string representation of each value in the dictionary. This
168 is used by the CFCopyDescription() function.
169 @field equal The callback used to compare values in the dictionary for
170 equality in some operations.
171 */
172 typedef struct {
173 CFIndex version;
174 CFDictionaryRetainCallBack retain;
175 CFDictionaryReleaseCallBack release;
176 CFDictionaryCopyDescriptionCallBack copyDescription;
177 CFDictionaryEqualCallBack equal;
178 } CFDictionaryValueCallBacks;
179
180 /*!
181 @constant kCFTypeDictionaryValueCallBacks
182 Predefined CFDictionaryValueCallBacks structure containing a set
183 of callbacks appropriate for use when the values in a CFDictionary
184 are all CFTypes.
185 */
186 CF_EXPORT
187 const CFDictionaryValueCallBacks kCFTypeDictionaryValueCallBacks;
188
189 /*!
190 @typedef CFDictionaryApplierFunction
191 Type of the callback function used by the apply functions of
192 CFDictionarys.
193 @param key The current key for the value.
194 @param value The current value from the dictionary.
195 @param context The user-defined context parameter given to the apply
196 function.
197 */
198 typedef void (*CFDictionaryApplierFunction)(const void *key, const void *value, void *context);
199
200 /*!
201 @typedef CFDictionaryRef
202 This is the type of a reference to immutable CFDictionarys.
203 */
204 typedef const struct __CFDictionary * CFDictionaryRef;
205
206 /*!
207 @typedef CFMutableDictionaryRef
208 This is the type of a reference to mutable CFDictionarys.
209 */
210 typedef struct __CFDictionary * CFMutableDictionaryRef;
211
212 /*!
213 @function CFDictionaryGetTypeID
214 Returns the type identifier of all CFDictionary instances.
215 */
216 CF_EXPORT
217 CFTypeID CFDictionaryGetTypeID(void);
218
219 /*!
220 @function CFDictionaryCreate
221 Creates a new immutable dictionary with the given values.
222 @param allocator The CFAllocator which should be used to allocate
223 memory for the dictionary and its storage for values. This
224 parameter may be NULL in which case the current default
225 CFAllocator is used. If this reference is not a valid
226 CFAllocator, the behavior is undefined.
227 @param keys A C array of the pointer-sized keys to be used for
228 the parallel C array of values to be put into the dictionary.
229 This parameter may be NULL if the numValues parameter is 0.
230 This C array is not changed or freed by this function. If
231 this parameter is not a valid pointer to a C array of at
232 least numValues pointers, the behavior is undefined.
233 @param values A C array of the pointer-sized values to be in the
234 dictionary. This parameter may be NULL if the numValues
235 parameter is 0. This C array is not changed or freed by
236 this function. If this parameter is not a valid pointer to
237 a C array of at least numValues pointers, the behavior is
238 undefined.
239 @param numValues The number of values to copy from the keys and
240 values C arrays into the CFDictionary. This number will be
241 the count of the dictionary. If this parameter is
242 negative, or greater than the number of values actually
243 in the keys or values C arrays, the behavior is undefined.
244 @param keyCallBacks A pointer to a CFDictionaryKeyCallBacks structure
245 initialized with the callbacks for the dictionary to use on
246 each key in the dictionary. The retain callback will be used
247 within this function, for example, to retain all of the new
248 keys from the keys C array. A copy of the contents of the
249 callbacks structure is made, so that a pointer to a structure
250 on the stack can be passed in, or can be reused for multiple
251 dictionary creations. If the version field of this
252 callbacks structure is not one of the defined ones for
253 CFDictionary, the behavior is undefined. The retain field may
254 be NULL, in which case the CFDictionary will do nothing to add
255 a retain to the keys of the contained values. The release field
256 may be NULL, in which case the CFDictionary will do nothing
257 to remove the dictionary's retain (if any) on the keys when the
258 dictionary is destroyed or a key-value pair is removed. If the
259 copyDescription field is NULL, the dictionary will create a
260 simple description for a key. If the equal field is NULL, the
261 dictionary will use pointer equality to test for equality of
262 keys. If the hash field is NULL, a key will be converted from
263 a pointer to an integer to compute the hash code. This callbacks
264 parameter itself may be NULL, which is treated as if a valid
265 structure of version 0 with all fields NULL had been passed in.
266 Otherwise, if any of the fields are not valid pointers to
267 functions of the correct type, or this parameter is not a
268 valid pointer to a CFDictionaryKeyCallBacks callbacks structure,
269 the behavior is undefined. If any of the keys put into the
270 dictionary is not one understood by one of the callback functions
271 the behavior when that callback function is used is undefined.
272 @param valueCallBacks A pointer to a CFDictionaryValueCallBacks structure
273 initialized with the callbacks for the dictionary to use on
274 each value in the dictionary. The retain callback will be used
275 within this function, for example, to retain all of the new
276 values from the values C array. A copy of the contents of the
277 callbacks structure is made, so that a pointer to a structure
278 on the stack can be passed in, or can be reused for multiple
279 dictionary creations. If the version field of this callbacks
280 structure is not one of the defined ones for CFDictionary, the
281 behavior is undefined. The retain field may be NULL, in which
282 case the CFDictionary will do nothing to add a retain to values
283 as they are put into the dictionary. The release field may be
284 NULL, in which case the CFDictionary will do nothing to remove
285 the dictionary's retain (if any) on the values when the
286 dictionary is destroyed or a key-value pair is removed. If the
287 copyDescription field is NULL, the dictionary will create a
288 simple description for a value. If the equal field is NULL, the
289 dictionary will use pointer equality to test for equality of
290 values. This callbacks parameter itself may be NULL, which is
291 treated as if a valid structure of version 0 with all fields
292 NULL had been passed in. Otherwise,
293 if any of the fields are not valid pointers to functions
294 of the correct type, or this parameter is not a valid
295 pointer to a CFDictionaryValueCallBacks callbacks structure,
296 the behavior is undefined. If any of the values put into the
297 dictionary is not one understood by one of the callback functions
298 the behavior when that callback function is used is undefined.
299 @result A reference to the new immutable CFDictionary.
300 */
301 CF_EXPORT
302 CFDictionaryRef CFDictionaryCreate(CFAllocatorRef allocator, const void **keys, const void **values, CFIndex numValues, const CFDictionaryKeyCallBacks *keyCallBacks, const CFDictionaryValueCallBacks *valueCallBacks);
303
304 /*!
305 @function CFDictionaryCreateCopy
306 Creates a new immutable dictionary with the key-value pairs from
307 the given dictionary.
308 @param allocator The CFAllocator which should be used to allocate
309 memory for the dictionary and its storage for values. This
310 parameter may be NULL in which case the current default
311 CFAllocator is used. If this reference is not a valid
312 CFAllocator, the behavior is undefined.
313 @param theDict The dictionary which is to be copied. The keys and values
314 from the dictionary are copied as pointers into the new
315 dictionary (that is, the values themselves are copied, not
316 that which the values point to, if anything). However, the
317 keys and values are also retained by the new dictionary using
318 the retain function of the original dictionary.
319 The count of the new dictionary will be the same as the
320 given dictionary. The new dictionary uses the same callbacks
321 as the dictionary to be copied. If this parameter is
322 not a valid CFDictionary, the behavior is undefined.
323 @result A reference to the new immutable CFDictionary.
324 */
325 CF_EXPORT
326 CFDictionaryRef CFDictionaryCreateCopy(CFAllocatorRef allocator, CFDictionaryRef theDict);
327
328 /*!
329 @function CFDictionaryCreateMutable
330 Creates a new mutable dictionary.
331 @param allocator The CFAllocator which should be used to allocate
332 memory for the dictionary and its storage for values. This
333 parameter may be NULL in which case the current default
334 CFAllocator is used. If this reference is not a valid
335 CFAllocator, the behavior is undefined.
336 @param capacity A hint about the number of values that will be held
337 by the CFDictionary. Pass 0 for no hint. The implementation may
338 ignore this hint, or may use it to optimize various
339 operations. A dictionary's actual capacity is only limited by
340 address space and available memory constraints). If this
341 parameter is negative, the behavior is undefined.
342 @param keyCallBacks A pointer to a CFDictionaryKeyCallBacks structure
343 initialized with the callbacks for the dictionary to use on
344 each key in the dictionary. A copy of the contents of the
345 callbacks structure is made, so that a pointer to a structure
346 on the stack can be passed in, or can be reused for multiple
347 dictionary creations. If the version field of this
348 callbacks structure is not one of the defined ones for
349 CFDictionary, the behavior is undefined. The retain field may
350 be NULL, in which case the CFDictionary will do nothing to add
351 a retain to the keys of the contained values. The release field
352 may be NULL, in which case the CFDictionary will do nothing
353 to remove the dictionary's retain (if any) on the keys when the
354 dictionary is destroyed or a key-value pair is removed. If the
355 copyDescription field is NULL, the dictionary will create a
356 simple description for a key. If the equal field is NULL, the
357 dictionary will use pointer equality to test for equality of
358 keys. If the hash field is NULL, a key will be converted from
359 a pointer to an integer to compute the hash code. This callbacks
360 parameter itself may be NULL, which is treated as if a valid
361 structure of version 0 with all fields NULL had been passed in.
362 Otherwise, if any of the fields are not valid pointers to
363 functions of the correct type, or this parameter is not a
364 valid pointer to a CFDictionaryKeyCallBacks callbacks structure,
365 the behavior is undefined. If any of the keys put into the
366 dictionary is not one understood by one of the callback functions
367 the behavior when that callback function is used is undefined.
368 @param valueCallBacks A pointer to a CFDictionaryValueCallBacks structure
369 initialized with the callbacks for the dictionary to use on
370 each value in the dictionary. The retain callback will be used
371 within this function, for example, to retain all of the new
372 values from the values C array. A copy of the contents of the
373 callbacks structure is made, so that a pointer to a structure
374 on the stack can be passed in, or can be reused for multiple
375 dictionary creations. If the version field of this callbacks
376 structure is not one of the defined ones for CFDictionary, the
377 behavior is undefined. The retain field may be NULL, in which
378 case the CFDictionary will do nothing to add a retain to values
379 as they are put into the dictionary. The release field may be
380 NULL, in which case the CFDictionary will do nothing to remove
381 the dictionary's retain (if any) on the values when the
382 dictionary is destroyed or a key-value pair is removed. If the
383 copyDescription field is NULL, the dictionary will create a
384 simple description for a value. If the equal field is NULL, the
385 dictionary will use pointer equality to test for equality of
386 values. This callbacks parameter itself may be NULL, which is
387 treated as if a valid structure of version 0 with all fields
388 NULL had been passed in. Otherwise,
389 if any of the fields are not valid pointers to functions
390 of the correct type, or this parameter is not a valid
391 pointer to a CFDictionaryValueCallBacks callbacks structure,
392 the behavior is undefined. If any of the values put into the
393 dictionary is not one understood by one of the callback functions
394 the behavior when that callback function is used is undefined.
395 @result A reference to the new mutable CFDictionary.
396 */
397 CF_EXPORT
398 CFMutableDictionaryRef CFDictionaryCreateMutable(CFAllocatorRef allocator, CFIndex capacity, const CFDictionaryKeyCallBacks *keyCallBacks, const CFDictionaryValueCallBacks *valueCallBacks);
399
400 /*!
401 @function CFDictionaryCreateMutableCopy
402 Creates a new mutable dictionary with the key-value pairs from
403 the given dictionary.
404 @param allocator The CFAllocator which should be used to allocate
405 memory for the dictionary and its storage for values. This
406 parameter may be NULL in which case the current default
407 CFAllocator is used. If this reference is not a valid
408 CFAllocator, the behavior is undefined.
409 @param capacity A hint about the number of values that will be held
410 by the CFDictionary. Pass 0 for no hint. The implementation may
411 ignore this hint, or may use it to optimize various
412 operations. A dictionary's actual capacity is only limited by
413 address space and available memory constraints).
414 This parameter must be greater than or equal
415 to the count of the dictionary which is to be copied, or the
416 behavior is undefined. If this parameter is negative, the
417 behavior is undefined.
418 @param theDict The dictionary which is to be copied. The keys and values
419 from the dictionary are copied as pointers into the new
420 dictionary (that is, the values themselves are copied, not
421 that which the values point to, if anything). However, the
422 keys and values are also retained by the new dictionary using
423 the retain function of the original dictionary.
424 The count of the new dictionary will be the same as the
425 given dictionary. The new dictionary uses the same callbacks
426 as the dictionary to be copied. If this parameter is
427 not a valid CFDictionary, the behavior is undefined.
428 @result A reference to the new mutable CFDictionary.
429 */
430 CF_EXPORT
431 CFMutableDictionaryRef CFDictionaryCreateMutableCopy(CFAllocatorRef allocator, CFIndex capacity, CFDictionaryRef theDict);
432
433 /*!
434 @function CFDictionaryGetCount
435 Returns the number of values currently in the dictionary.
436 @param theDict The dictionary to be queried. If this parameter is
437 not a valid CFDictionary, the behavior is undefined.
438 @result The number of values in the dictionary.
439 */
440 CF_EXPORT
441 CFIndex CFDictionaryGetCount(CFDictionaryRef theDict);
442
443 /*!
444 @function CFDictionaryGetCountOfKey
445 Counts the number of times the given key occurs in the dictionary.
446 @param theDict The dictionary to be searched. If this parameter is
447 not a valid CFDictionary, the behavior is undefined.
448 @param key The key for which to find matches in the dictionary. The
449 hash() and equal() key callbacks provided when the dictionary
450 was created are used to compare. If the hash() key callback
451 was NULL, the key is treated as a pointer and converted to
452 an integer. If the equal() key callback was NULL, pointer
453 equality (in C, ==) is used. If key, or any of the keys in
454 the dictionary, are not understood by the equal() callback,
455 the behavior is undefined.
456 @result Returns 1 if a matching key is used by the dictionary,
457 0 otherwise.
458 */
459 CF_EXPORT
460 CFIndex CFDictionaryGetCountOfKey(CFDictionaryRef theDict, const void *key);
461
462 /*!
463 @function CFDictionaryGetCountOfValue
464 Counts the number of times the given value occurs in the dictionary.
465 @param theDict The dictionary to be searched. If this parameter is
466 not a valid CFDictionary, the behavior is undefined.
467 @param value The value for which to find matches in the dictionary. The
468 equal() callback provided when the dictionary was created is
469 used to compare. If the equal() value callback was NULL, pointer
470 equality (in C, ==) is used. If value, or any of the values in
471 the dictionary, are not understood by the equal() callback,
472 the behavior is undefined.
473 @result The number of times the given value occurs in the dictionary.
474 */
475 CF_EXPORT
476 CFIndex CFDictionaryGetCountOfValue(CFDictionaryRef theDict, const void *value);
477
478 /*!
479 @function CFDictionaryContainsKey
480 Reports whether or not the key is in the dictionary.
481 @param theDict The dictionary to be searched. If this parameter is
482 not a valid CFDictionary, the behavior is undefined.
483 @param key The key for which to find matches in the dictionary. The
484 hash() and equal() key callbacks provided when the dictionary
485 was created are used to compare. If the hash() key callback
486 was NULL, the key is treated as a pointer and converted to
487 an integer. If the equal() key callback was NULL, pointer
488 equality (in C, ==) is used. If key, or any of the keys in
489 the dictionary, are not understood by the equal() callback,
490 the behavior is undefined.
491 @result true, if the key is in the dictionary, otherwise false.
492 */
493 CF_EXPORT
494 Boolean CFDictionaryContainsKey(CFDictionaryRef theDict, const void *key);
495
496 /*!
497 @function CFDictionaryContainsValue
498 Reports whether or not the value is in the dictionary.
499 @param theDict The dictionary to be searched. If this parameter is
500 not a valid CFDictionary, the behavior is undefined.
501 @param value The value for which to find matches in the dictionary. The
502 equal() callback provided when the dictionary was created is
503 used to compare. If the equal() callback was NULL, pointer
504 equality (in C, ==) is used. If value, or any of the values
505 in the dictionary, are not understood by the equal() callback,
506 the behavior is undefined.
507 @result true, if the value is in the dictionary, otherwise false.
508 */
509 CF_EXPORT
510 Boolean CFDictionaryContainsValue(CFDictionaryRef theDict, const void *value);
511
512 /*!
513 @function CFDictionaryGetValue
514 Retrieves the value associated with the given key.
515 @param theDict The dictionary to be queried. If this parameter is
516 not a valid CFDictionary, the behavior is undefined.
517 @param key The key for which to find a match in the dictionary. The
518 hash() and equal() key callbacks provided when the dictionary
519 was created are used to compare. If the hash() key callback
520 was NULL, the key is treated as a pointer and converted to
521 an integer. If the equal() key callback was NULL, pointer
522 equality (in C, ==) is used. If key, or any of the keys in
523 the dictionary, are not understood by the equal() callback,
524 the behavior is undefined.
525 @result The value with the given key in the dictionary, or NULL if
526 no key-value pair with a matching key exists. Since NULL
527 can be a valid value in some dictionaries, the function
528 CFDictionaryGetValueIfPresent() must be used to distinguish
529 NULL-no-found from NULL-is-the-value.
530 */
531 CF_EXPORT
532 const void *CFDictionaryGetValue(CFDictionaryRef theDict, const void *key);
533
534 /*!
535 @function CFDictionaryGetValueIfPresent
536 Retrieves the value associated with the given key.
537 @param theDict The dictionary to be queried. If this parameter is
538 not a valid CFDictionary, the behavior is undefined.
539 @param key The key for which to find a match in the dictionary. The
540 hash() and equal() key callbacks provided when the dictionary
541 was created are used to compare. If the hash() key callback
542 was NULL, the key is treated as a pointer and converted to
543 an integer. If the equal() key callback was NULL, pointer
544 equality (in C, ==) is used. If key, or any of the keys in
545 the dictionary, are not understood by the equal() callback,
546 the behavior is undefined.
547 @param value A pointer to memory which should be filled with the
548 pointer-sized value if a matching key is found. If no key
549 match is found, the contents of the storage pointed to by
550 this parameter are undefined. This parameter may be NULL,
551 in which case the value from the dictionary is not returned
552 (but the return value of this function still indicates
553 whether or not the key-value pair was present).
554 @result true, if a matching key was found, false otherwise.
555 */
556 CF_EXPORT
557 Boolean CFDictionaryGetValueIfPresent(CFDictionaryRef theDict, const void *key, const void **value);
558
559 /*!
560 @function CFDictionaryGetKeysAndValues
561 Fills the two buffers with the keys and values from the dictionary.
562 @param theDict The dictionary to be queried. If this parameter is
563 not a valid CFDictionary, the behavior is undefined.
564 @param keys A C array of pointer-sized values to be filled with keys
565 from the dictionary. The keys and values C arrays are parallel
566 to each other (that is, the items at the same indices form a
567 key-value pair from the dictionary). This parameter may be NULL
568 if the keys are not desired. If this parameter is not a valid
569 pointer to a C array of at least CFDictionaryGetCount() pointers,
570 or NULL, the behavior is undefined.
571 @param values A C array of pointer-sized values to be filled with values
572 from the dictionary. The keys and values C arrays are parallel
573 to each other (that is, the items at the same indices form a
574 key-value pair from the dictionary). This parameter may be NULL
575 if the values are not desired. If this parameter is not a valid
576 pointer to a C array of at least CFDictionaryGetCount() pointers,
577 or NULL, the behavior is undefined.
578 */
579 CF_EXPORT
580 void CFDictionaryGetKeysAndValues(CFDictionaryRef theDict, const void **keys, const void **values);
581
582 /*!
583 @function CFDictionaryApplyFunction
584 Calls a function once for each value in the dictionary.
585 @param theDict The dictionary to be queried. If this parameter is
586 not a valid CFDictionary, the behavior is undefined.
587 @param applier The callback function to call once for each value in
588 the dictionary. If this parameter is not a
589 pointer to a function of the correct prototype, the behavior
590 is undefined. If there are keys or values which the
591 applier function does not expect or cannot properly apply
592 to, the behavior is undefined.
593 @param context A pointer-sized user-defined value, which is passed
594 as the third parameter to the applier function, but is
595 otherwise unused by this function. If the context is not
596 what is expected by the applier function, the behavior is
597 undefined.
598 */
599 CF_EXPORT
600 void CFDictionaryApplyFunction(CFDictionaryRef theDict, CFDictionaryApplierFunction applier, void *context);
601
602 /*!
603 @function CFDictionaryAddValue
604 Adds the key-value pair to the dictionary if no such key already exists.
605 @param theDict The dictionary to which the value is to be added. If this
606 parameter is not a valid mutable CFDictionary, the behavior is
607 undefined.
608 @param key The key of the value to add to the dictionary. The key is
609 retained by the dictionary using the retain callback provided
610 when the dictionary was created. If the key is not of the sort
611 expected by the retain callback, the behavior is undefined. If
612 a key which matches this key is already present in the dictionary,
613 this function does nothing ("add if absent").
614 @param value The value to add to the dictionary. The value is retained
615 by the dictionary using the retain callback provided when the
616 dictionary was created. If the value is not of the sort expected
617 by the retain callback, the behavior is undefined.
618 */
619 CF_EXPORT
620 void CFDictionaryAddValue(CFMutableDictionaryRef theDict, const void *key, const void *value);
621
622 /*!
623 @function CFDictionarySetValue
624 Sets the value of the key in the dictionary.
625 @param theDict The dictionary to which the value is to be set. If this
626 parameter is not a valid mutable CFDictionary, the behavior is
627 undefined.
628 @param key The key of the value to set into the dictionary. If a key
629 which matches this key is already present in the dictionary, only
630 the value is changed ("add if absent, replace if present"). If
631 no key matches the given key, the key-value pair is added to the
632 dictionary. If added, the key is retained by the dictionary,
633 using the retain callback provided
634 when the dictionary was created. If the key is not of the sort
635 expected by the key retain callback, the behavior is undefined.
636 @param value The value to add to or replace into the dictionary. The value
637 is retained by the dictionary using the retain callback provided
638 when the dictionary was created, and the previous value if any is
639 released. If the value is not of the sort expected by the
640 retain or release callbacks, the behavior is undefined.
641 */
642 CF_EXPORT
643 void CFDictionarySetValue(CFMutableDictionaryRef theDict, const void *key, const void *value);
644
645 /*!
646 @function CFDictionaryReplaceValue
647 Replaces the value of the key in the dictionary.
648 @param theDict The dictionary to which the value is to be replaced. If this
649 parameter is not a valid mutable CFDictionary, the behavior is
650 undefined.
651 @param key The key of the value to replace in the dictionary. If a key
652 which matches this key is present in the dictionary, the value
653 is changed to the given value, otherwise this function does
654 nothing ("replace if present").
655 @param value The value to replace into the dictionary. The value
656 is retained by the dictionary using the retain callback provided
657 when the dictionary was created, and the previous value is
658 released. If the value is not of the sort expected by the
659 retain or release callbacks, the behavior is undefined.
660 */
661 CF_EXPORT
662 void CFDictionaryReplaceValue(CFMutableDictionaryRef theDict, const void *key, const void *value);
663
664 /*!
665 @function CFDictionaryRemoveValue
666 Removes the value of the key from the dictionary.
667 @param theDict The dictionary from which the value is to be removed. If this
668 parameter is not a valid mutable CFDictionary, the behavior is
669 undefined.
670 @param key The key of the value to remove from the dictionary. If a key
671 which matches this key is present in the dictionary, the key-value
672 pair is removed from the dictionary, otherwise this function does
673 nothing ("remove if present").
674 */
675 CF_EXPORT
676 void CFDictionaryRemoveValue(CFMutableDictionaryRef theDict, const void *key);
677
678 /*!
679 @function CFDictionaryRemoveAllValues
680 Removes all the values from the dictionary, making it empty.
681 @param theDict The dictionary from which all of the values are to be
682 removed. If this parameter is not a valid mutable
683 CFDictionary, the behavior is undefined.
684 */
685 CF_EXPORT
686 void CFDictionaryRemoveAllValues(CFMutableDictionaryRef theDict);
687
688 CF_EXTERN_C_END
689 CF_IMPLICIT_BRIDGING_DISABLED
690
691 #endif /* ! __COREFOUNDATION_CFDICTIONARY__ */
692