xref: /xnu-11215.1.10/libkern/libkern/c++/OSSet.h (revision 8d741a5de7ff4191bf97d57b9f54c2f6d4a15585)
1 /*
2  * Copyright (c) 2019 Apple Inc. All rights reserved.
3  *
4  * @APPLE_OSREFERENCE_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. The rights granted to you under the License
10  * may not be used to create, or enable the creation or redistribution of,
11  * unlawful or unlicensed copies of an Apple operating system, or to
12  * circumvent, violate, or enable the circumvention or violation of, any
13  * terms of an Apple operating system software license agreement.
14  *
15  * Please obtain a copy of the License at
16  * http://www.opensource.apple.com/apsl/ and read it before using this file.
17  *
18  * The Original Code and all software distributed under the License are
19  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23  * Please see the License for the specific language governing rights and
24  * limitations under the License.
25  *
26  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27  */
28 /* IOSet.h created by rsulack on Thu 11-Jun-1998 */
29 /* IOSet.h converted to C++ by gvdl on Fri 1998-10-30 */
30 
31 #ifndef _OS_OSSET_H
32 #define _OS_OSSET_H
33 
34 #include <libkern/c++/OSCollection.h>
35 #include <libkern/c++/OSPtr.h>
36 
37 class OSArray;
38 class OSSet;
39 
40 typedef OSSet* OSSetPtr;
41 typedef OSArray* OSArrayPtr;
42 
43 /*!
44  * @header
45  *
46  * @abstract
47  * This header declares the OSSet collection class.
48  */
49 
50 
51 /*!
52  * @class OSSet
53  *
54  * @abstract
55  * OSSet provides an unordered set store of objects.
56  *
57  * @discussion
58  * OSSet is a container for Libkern C++ objects
59  * (those derived from
60  * @link //apple_ref/doc/class/OSMetaClassBase OSMetaClassBase@/link,
61  * in particular @link //apple_ref/doc/class/OSObject OSObject@/link).
62  * Storage and access follow basic set logic: you can add or remove an object,
63  * and test whether the set contains a particular object.
64  * A given object is only stored in the set once,
65  * and there is no ordering of objects in the set.
66  * A subclass @link //apple_ref/doc/class/OSOrderedSet OSOrderedSet@/link,
67  * provides for ordered set logic.
68  *
69  * As with all Libkern collection classes,
70  * OSSet retains objects added to it,
71  * and releases objects removed from it.
72  * An OSSet also grows as necessary to accommodate new objects,
73  * <i>unlike</i> Core Foundation collections (it does not, however, shrink).
74  *
75  * <b>Use Restrictions</b>
76  *
77  * With very few exceptions in the I/O Kit, all Libkern-based C++
78  * classes, functions, and macros are <b>unsafe</b>
79  * to use in a primary interrupt context.
80  * Consult the I/O Kit documentation related to primary interrupts
81  * for more information.
82  *
83  * OSSet provides no concurrency protection;
84  * it's up to the usage context to provide any protection necessary.
85  * Some portions of the I/O Kit, such as
86  * @link //apple_ref/doc/class/IORegistryEntry IORegistryEntry@/link,
87  * handle synchronization via defined member functions for setting
88  * properties.
89  */
90 class OSSet : public OSCollection
91 {
92 	friend class OSSerialize;
93 
94 	OSDeclareDefaultStructors(OSSet);
95 
96 #if APPLE_KEXT_ALIGN_CONTAINERS
97 
98 private:
99 	OSPtr<OSArray> members;
100 
101 #else /* APPLE_KEXT_ALIGN_CONTAINERS */
102 
103 private:
104 	OSPtr<OSArray> members;
105 
106 protected:
107 	struct ExpansionData { };
108 
109 /* Reserved for future use.  (Internal use only)  */
110 	ExpansionData * reserved;
111 
112 #endif /* APPLE_KEXT_ALIGN_CONTAINERS */
113 
114 /*
115  * OSCollectionIterator interfaces.
116  */
117 	virtual unsigned int iteratorSize() const APPLE_KEXT_OVERRIDE;
118 	virtual bool initIterator(void * iterator) const APPLE_KEXT_OVERRIDE;
119 	virtual bool getNextObjectForIterator(void * iterator, OSObject ** ret) const APPLE_KEXT_OVERRIDE;
120 
121 public:
122 
123 
124 /*!
125  * @function withCapacity
126  *
127  * @abstract
128  * Creates and initializes an empty OSSet.
129  *
130  * @param   capacity The initial storage capacity of the new set object.
131  *
132  * @result
133  * An empty instance of OSSet
134  *         with a retain count of 1;
135  * <code>NULL</code> on failure.
136  *
137  * @discussion
138  * <code>capacity</code> must be nonzero.
139  * The new OSSet will grow as needed to accommodate more key/object pairs
140  * (<i>unlike</i> @link //apple_ref/doc/uid/20001503 CFMutableSet@/link,
141  * for which the initial capacity is a hard limit).
142  */
143 	static OSPtr<OSSet> withCapacity(unsigned int capacity);
144 
145 
146 /*!
147  * @function withObjects
148  *
149  * @abstract
150  * Creates and initializes an OSSet
151  * populated with objects provided.
152  *
153  * @param objects   A C array of OSMetaClassBase-derived objects.
154  * @param count     The number of objects to be placed into the set.
155  * @param capacity  The initial storage capacity of the new set object.
156  *                  If 0, <code>count</code> is used; otherwise this value
157  *                  must be greater than or equal to <code>count</code>.
158  *
159  * @result
160  * An instance of OSSet
161  * containing the objects provided,
162  * with a retain count of 1;
163  * <code>NULL</code> on failure.
164  *
165  * @discussion
166  * <code>objects</code> must be non-<code>NULL</code>,
167  * and <code>count</code> must be nonzero.
168  * If <code>capacity</code> is nonzero,
169  * it must be greater than or equal to <code>count</code>.
170  * The new OSSet will grow as needed to accommodate more objects
171  * (<i>unlike</i> @link //apple_ref/doc/uid/20001503 CFMutableSet@/link,
172  * for which the initial capacity is a hard limit).
173  *
174  * The objects in <code>objects</code> are retained for storage in the new set,
175  * not copied.
176  */
177 	static OSPtr<OSSet> withObjects(
178 		const OSObject * objects[],
179 		unsigned int     count,
180 		unsigned int     capacity = 0);
181 
182 
183 /*!
184  * @function withArray
185  *
186  * @abstract
187  * Creates and initializes an OSSet
188  * populated with the contents of an OSArray.
189  *
190  * @param array     An array whose objects will be stored in the new OSSet.
191  * @param capacity  The initial storage capacity of the new set object.
192  *                  If 0, the capacity is set to the number of objects
193  *                  in <code>array</code>;
194  *                  otherwise <code>capacity</code> must be greater than or equal to
195  *                  the number of objects in <code>array</code>.
196  * @result
197  * An instance of OSSet containing
198  * the objects of <code>array</code>,
199  * with a retain count of 1;
200  * <code>NULL</code> on failure.
201  *
202  * @discussion
203  * Each distinct object in <code>array</code> is added to the new set.
204  *
205  * <code>array</code> must be non-<code>NULL</code>.
206  * If <code>capacity</code> is nonzero,
207  * it must be greater than or equal to <code>count</code>.
208  * The new OSSet will grow as needed to accommodate more key-object pairs
209  * (<i>unlike</i> @link //apple_ref/doc/uid/20001503 CFMutableSet@/link,
210  * for which the initial capacity is a hard limit).
211  *
212  * The objects in <code>array</code> are retained for storage in the new set,
213  * not copied.
214  */
215 	static OSPtr<OSSet> withArray(
216 		const OSArray * array,
217 		unsigned int    capacity = 0);
218 
219 
220 /*!
221  * @function withSet
222  *
223  * @abstract
224  * Creates and initializes an OSSet
225  * populated with the contents of another OSSet.
226  *
227  * @param set       An OSSet whose contents will be stored
228  *                  in the new instance.
229  * @param capacity  The initial storage capacity of the set object.
230  *                  If 0, the capacity is set to the number of objects
231  *                  in <code>set</code>;
232  *                  otherwise <code>capacity</code> must be greater than or equal to
233  *                  the number of objects in <code>array</code>.
234  * @result
235  * An instance of OSArray
236  * containing the objects of <code>set</code>,
237  * with a retain count of 1;
238  * <code>NULL</code> on failure.
239  *
240  * @discussion
241  * <code>set</code> must be non-<code>NULL</code>.
242  * If <code>capacity</code> is nonzero,
243  * it must be greater than or equal to <code>count</code>.
244  * The array will grow as needed to accommodate more key-object pairs
245  * (<i>unlike</i> @link //apple_ref/doc/uid/20001503 CFMutableSet@/link,
246  * for which the initial capacity is a hard limit).
247  *
248  * The objects in <code>set</code> are retained for storage in the new set,
249  * not copied.
250  */
251 	static OSPtr<OSSet> withSet(const OSSet * set,
252 	    unsigned int capacity = 0);
253 
254 
255 /*!
256  * @function initWithCapacity
257  *
258  * @abstract
259  * Initializes a new instance of OSSet.
260  *
261  * @param capacity  The initial storage capacity of the new set object.
262  *
263  * @result
264  * <code>true</code> on success, <code>false</code> on failure.
265  *
266  * @discussion
267  * Not for general use. Use the static instance creation method
268  * <code>@link
269  * //apple_ref/cpp/clm/OSSet/withCapacity/staticOSSet*\/(unsignedint)
270  * withCapacity@/link</code>
271  * instead.
272  *
273  * <code>capacity</code> must be nonzero.
274  * The new set will grow as needed to accommodate more key/object pairs
275  * (<i>unlike</i> @link //apple_ref/doc/uid/20001503 CFMutableSet@/link,
276  * for which the initial capacity is a hard limit).
277  */
278 	virtual bool initWithCapacity(unsigned int capacity);
279 
280 
281 /*!
282  * @function initWithObjects
283  *
284  * @abstract
285  * Initializes a new OSSet populated with objects provided.
286  *
287  * @param objects   A C array of OSObject-derived objects.
288  * @param count     The number of objects to be placed into the set.
289  * @param capacity  The initial storage capacity of the new set object.
290  *                  If 0, <code>count</code> is used; otherwise this value
291  *                  must be greater than or equal to <code>count</code>.
292  *
293  * @result
294  * <code>true</code> on success, <code>false</code> on failure.
295  *
296  * @discussion
297  * Not for general use. Use the static instance creation method
298  * <code>@link
299  * //apple_ref/cpp/clm/OSSet/withObjects/staticOSSet*\/(constOSObject*,unsignedint,unsignedint)
300  * withObjects@/link</code>
301  * instead.
302  *
303  * <code>objects</code> must be non-<code>NULL</code>,
304  * and <code>count</code> must be nonzero.
305  * If <code>capacity</code> is nonzero, it must be greater than or equal to <code>count</code>.
306  * The new array will grow as needed to accommodate more key-object pairs
307  * (<i>unlike</i> @link //apple_ref/doc/uid/20001503 CFMutableSet@/link,
308  * for which the initial capacity is a hard limit).
309  *
310  * The objects in <code>objects</code> are retained for storage in the new set,
311  * not copied.
312  */
313 	virtual bool initWithObjects(
314 		const OSObject * objects[],
315 		unsigned int     count,
316 		unsigned int     capacity = 0);
317 
318 
319 /*!
320  * @function initWithArray
321  *
322  * @abstract Initializes a new OSSet
323  *           populated with the contents of an OSArray.
324  *
325  * @param array     An OSAray whose contents will be placed
326  *                  in the new instance.
327  * @param capacity  The initial storage capacity of the new set object.
328  *                  If 0, the capacity is set
329  *                  to the number of objects in <code>array</code>;
330  *                  otherwise <code>capacity</code> must be greater than or equal to
331  *                  the number of objects in <code>array</code>.
332  *
333  * @result
334  * <code>true</code> on success, <code>false</code> on failure.
335  *
336  * @discussion
337  * Not for general use. Use the static instance creation method
338  * <code>@link
339  * //apple_ref/cpp/clm/OSSet/withArray/staticOSSet*\/(constOSArray*,unsignedint)
340  * withArray@/link</code>
341  * instead.
342  *
343  * <code>array</code> must be non-<code>NULL</code>.
344  * If <code>capacity</code> is nonzero,
345  * it must be greater than or equal to <code>count</code>.
346  * The new array will grow as needed to accommodate more key-object pairs
347  * (<i>unlike</i> @link //apple_ref/doc/uid/20001503 CFMutableSet@/link,
348  * for which the initial capacity is a hard limit).
349  *
350  * The objects in <code>array</code> are retained for storage in the new set,
351  * not copied.
352  */
353 	virtual bool initWithArray(
354 		const OSArray * array,
355 		unsigned int capacity = 0);
356 
357 
358 /*!
359  * @function initWithSet
360  *
361  * @abstract
362  * Initializes a new OSSet
363  * populated with the contents of another OSSet.
364  *
365  * @param set       A set whose contents will be placed in the new instance.
366  * @param capacity  The initial storage capacity of the new set object.
367  *                  If 0, the capacity is set
368  *                  to the number of objects in <code>set</code>;
369  *                  otherwise <code>capacity</code> must be greater than or equal to
370  *                  the number of objects in <code>set</code>.
371  *
372  * @result
373  * <code>true</code> on success, <code>false</code> on failure.
374  *
375  * @discussion
376  * Not for general use. Use the static instance creation method
377  * <code>@link withSet withSet@/link</code> instead.
378  *
379  * <code>set</code> must be non-<code>NULL</code>.
380  * If <code>capacity</code> is nonzero,
381  * it must be greater than or equal to <code>count</code>.
382  * The new set will grow as needed to accommodate more key-object pairs
383  * (<i>unlike</i> @link //apple_ref/doc/uid/20001503 CFMutableSet@/link,
384  * for which the initial capacity is a hard limit).
385  *
386  * The objects in <code>set</code> are retained for storage in the new set,
387  * not copied.
388  */
389 	virtual bool initWithSet(const OSSet *set,
390 	    unsigned int capacity = 0);
391 
392 
393 /*!
394  * @function free
395  *
396  * @abstract
397  * Deallocates or releases any resources
398  * used by the OSSet instance.
399  *
400  * @discussion
401  * This function should not be called directly;
402  * use
403  * <code>@link
404  * //apple_ref/cpp/instm/OSObject/release/virtualvoid/()
405  * release@/link</code>
406  * instead.
407  */
408 	virtual void free() APPLE_KEXT_OVERRIDE;
409 
410 
411 /*!
412  * @function getCount
413  *
414  * @abstract
415  * Returns the current number of objects within the set.
416  *
417  * @result
418  * The current number of objects within the set.
419  */
420 	virtual unsigned int getCount() const APPLE_KEXT_OVERRIDE;
421 
422 
423 /*!
424  * @function getCapacity
425  *
426  * @abstract
427  * Returns the number of objects the set
428  * can store without reallocating.
429  *
430  * @result
431  * The number objects the set
432  * can store without reallocating.
433  *
434  * @discussion
435  * OSSet objects grow when full to accommodate additional objects.
436  * See
437  * <code>@link
438  * //apple_ref/cpp/instm/OSSet/getCapacityIncrement/virtualunsignedint/()
439  * getCapacityIncrement@/link</code>
440  * and
441  * <code>@link
442  * //apple_ref/cpp/instm/OSSet/ensureCapacity/virtualunsignedint/(unsignedint)
443  * ensureCapacity@/link</code>.
444  */
445 	virtual unsigned int getCapacity() const APPLE_KEXT_OVERRIDE;
446 
447 
448 /*!
449  * @function getCapacityIncrement
450  *
451  * @abstract
452  * Returns the storage increment of the set.
453  *
454  * @result
455  * The storage increment of the set.
456  *
457  * @discussion
458  * An OSSet allocates storage for objects in multiples
459  * of the capacity increment.
460  */
461 	virtual unsigned int getCapacityIncrement() const APPLE_KEXT_OVERRIDE;
462 
463 
464 /*!
465  * @function setCapacityIncrement
466  *
467  * @abstract
468  * Sets the storage increment of the set.
469  *
470  * @result
471  * The new storage increment of the set,
472  * which may be different from the number requested.
473  *
474  * @discussion
475  * An OSSet allocates storage for objects in multiples
476  * of the capacity increment.
477  * Calling this function does not immediately reallocate storage.
478  */
479 	virtual unsigned int setCapacityIncrement(unsigned increment) APPLE_KEXT_OVERRIDE;
480 
481 
482 /*!
483  * @function ensureCapacity
484  *
485  * @abstract
486  * Ensures the set has enough space
487  * to store the requested number of distinct objects.
488  *
489  * @param newCapacity  The total number of distinct objects the set
490  *                     should be able to store.
491  * @result
492  * The new capacity of the set,
493  * which may be different from the number requested
494  * (if smaller, reallocation of storage failed).
495  *
496  * @discussion
497  * This function immediately resizes the set, if necessary,
498  * to accommodate at least <code>newCapacity</code> distinct objects.
499  * If <code>newCapacity</code> is not greater than the current capacity,
500  * or if an allocation error occurs, the original capacity is returned.
501  *
502  * There is no way to reduce the capacity of an OSSet.
503  */
504 	virtual unsigned int ensureCapacity(unsigned int newCapacity) APPLE_KEXT_OVERRIDE;
505 
506 
507 /*!
508  * @function flushCollection
509  *
510  * @abstract
511  * Removes and releases all objects within the set.
512  *
513  * @discussion
514  * The set's capacity (and therefore direct memory consumption)
515  * is not reduced by this function.
516  */
517 	virtual void flushCollection() APPLE_KEXT_OVERRIDE;
518 
519 
520 /*!
521  * @function setObject
522  *
523  * @abstract
524  * Adds an object to the OSSet if it is not already present.
525  *
526  * @param anObject  The OSMetaClassBase-derived object to be added to the set.
527  *
528  * @result
529  * <code>true</code> if <code>anObject</code> was successfully
530  * added to the set, <code>false</code> otherwise
531  * (including if it was already in the set).
532  *
533  * @discussion
534  * The set adds storage to accomodate the new object, if necessary.
535  * If successfully added, the object is retained.
536  *
537  * A <code>false</code> return value can mean either
538  * that <code>anObject</code> is already present in the set,
539  * or that a memory allocation failure occurred.
540  * If you need to know whether the object
541  * is already present, use
542  * <code>@link containsObject containsObject@/link</code>.
543  */
544 	virtual bool setObject(const OSMetaClassBase * anObject);
545 
546 	bool setObject(OSSharedPtr<const OSMetaClassBase> const& anObject);
547 
548 
549 /*!
550  * @function merge
551  *
552  * @abstract
553  * Adds the contents of an OSArray to the set.
554  *
555  * @param array  The OSArray object containing the objects to be added.
556  *
557  * @result
558  * <code>true</code> if all objects from <code>array</code>
559  * are successfully added the receiver (or were already present),
560  * <code>false</code> otherwise.
561  *
562  * @discussion
563  * This functions adds to the receiving set
564  * all objects from <code>array</code>
565  * that are not already in the receiving set.
566  * Objects added to the receiver are retained.
567  *
568  * In  releases prior to 10.7, this function would return <code>false</code>
569  * if an object from <code>array</code> was already present in the set,
570  * or if <code>array</code> was empty.
571  * This is no longer the case, so this function correctly returns <code>true</code>
572  * when the semantic of merging is met.
573  */
574 	virtual bool merge(const OSArray * array);
575 
576 
577 /*!
578  * @function merge
579  *
580  * @abstract
581  * Adds the contents of an OSet to the set.
582  *
583  * @param set    The OSSet object containing the objects to be added.
584  *
585  * @result
586  * <code>true</code> if any object from <code>set</code>
587  * are successfully added the receiver (or were already present),
588  * <code>false</code> otherwise.
589  *
590  * @discussion
591  * This functions adds to the receiving set
592  * all objects from <code>set</code>
593  * that are not already in the receiving set.
594  * Objects  added to the receiver are retained.
595  *
596  * In  releases prior to 10.7, this function would return <code>false</code>
597  * if an object from <code>set</code> was already present in the set,
598  * or if <code>set</code> was empty.
599  * This is no longer the case, so this function correctly returns <code>true</code>
600  * when the semantic of merging is met.
601  */
602 	virtual bool merge(const OSSet * set);
603 
604 
605 /*!
606  * @function removeObject
607  *
608  * @abstract
609  * Removes an object from the set.
610  *
611  * @param anObject  The OSMetaClassBase-derived object
612  *                  to be removed from the set.
613  *
614  * @discussion
615  * The object removed from the set is released.
616  */
617 	virtual void removeObject(const OSMetaClassBase * anObject);
618 
619 	void removeObject(OSSharedPtr<const OSMetaClassBase> const& anObject);
620 
621 
622 /*!
623  * @function containsObject
624  *
625  * @abstract
626  * Checks the set for the presence of an object.
627  *
628  * @param anObject  The OSMetaClassBase-derived object
629  *                  to check for in the set.
630  *
631  * @result
632  * <code>true</code> if <code>anObject</code> is present within the set,
633  * <code>false</code> otherwise.
634  *
635  * @discussion
636  * Pointer equality is used.
637  * This function returns <code>false</code> if passed <code>NULL</code>.
638  */
639 	virtual bool containsObject(const OSMetaClassBase * anObject) const;
640 
641 
642 /*!
643  * @function member
644  *
645  * @abstract
646  * Checks the set for the presence of an object.
647  *
648  * @param anObject  The OSMetaClassBase-derived object
649  *                  to check for in the set.
650  *
651  * @result
652  * <code>true</code> if <code>anObject</code> is present
653  * within the set, <code>false</code> otherwise.
654  *
655  * @discussion
656  * Pointer equality is used. This function returns <code>false</code>
657  * if passed <code>NULL</code>.
658  *
659  * <code>@link containsObject containsObject@/link</code>
660  * checks for <code>NULL</code> first,
661  * and is therefore more efficient than this function.
662  */
663 	virtual bool member(const OSMetaClassBase * anObject) const;
664 
665 
666 /*!
667  * @function getAnyObject
668  *
669  * @abstract
670  * Returns an arbitrary (not random) object from the set.
671  *
672  * @result
673  * An arbitrary (not random) object
674  * if one exists within the set.
675  *
676  * @discussion
677  * The returned object will be released if removed from the set;
678  * if you plan to store the reference, you should call
679  * <code>@link
680  * //apple_ref/cpp/instm/OSObject/retain/virtualvoid/()
681  * retain@/link</code>
682  * on that object.
683  */
684 	virtual OSObject * getAnyObject() const;
685 
686 
687 /*!
688  * @function isEqualTo
689  *
690  * @abstract
691  * Tests the equality of two OSSet objects.
692  *
693  * @param aSet  The set object being compared against the receiver.
694  * @result
695  * <code>true</code> if the two sets are equivalent,
696  * <code>false</code> otherwise.
697  *
698  * @discussion
699  * Two OSSet objects are considered equal if they have same count
700  * and the same object pointer values.
701  */
702 	virtual bool isEqualTo(const OSSet * aSet) const;
703 
704 
705 /*!
706  * @function isEqualTo
707  *
708  * @abstract
709  * Tests the equality of an OSSet against an arbitrary object.
710  *
711  * @param anObject  The object being compared against the receiver.
712  * @result
713  * <code>true</code> if the two objects are equivalent,
714  * <code>false</code> otherwise.
715  *
716  * @discussion
717  * An OSSet object is considered equal to another object if the other object
718  * is derived from OSSet and compares equal as a set.
719  */
720 	virtual bool isEqualTo(const OSMetaClassBase * anObject) const APPLE_KEXT_OVERRIDE;
721 
722 
723 /*!
724  * @function serialize
725  *
726  * @abstract
727  * Archives the receiver into the provided
728  * @link //apple_ref/doc/class/OSSerialize OSSerialize@/link object.
729  *
730  * @param serializer The OSSerialize object.
731  *
732  * @result
733  * <code>true</code> if serialization succeeds, <code>false</code> if not.
734  */
735 	virtual bool serialize(OSSerialize * serializer) const APPLE_KEXT_OVERRIDE;
736 
737 
738 /*!
739  * @function setOptions
740  *
741  * @abstract
742  * Recursively sets option bits in the set
743  * and all child collections.
744  *
745  * @param options  A bitfield whose values turn the options on (1) or off (0).
746  * @param mask     A mask indicating which bits
747  *                 in <code>options</code> to change.
748  *                 Pass 0 to get the whole current options bitfield
749  *                 without changing any settings.
750  * @param context  Unused.
751  *
752  * @result
753  * The options bitfield as it was before the set operation.
754  *
755  * @discussion
756  * Kernel extensions should not call this function.
757  *
758  * Child collections' options are changed only if the receiving set's
759  * options actually change.
760  */
761 	virtual unsigned setOptions(unsigned options, unsigned mask, void * context = NULL) APPLE_KEXT_OVERRIDE;
762 
763 
764 /*!
765  * @function copyCollection
766  *
767  * @abstract
768  * Creates a deep copy of this set and its child collections.
769  *
770  * @param cycleDict  A dictionary of all of the collections
771  *                   that have been copied so far,
772  *                   which is used to track circular references.
773  *                   To start the copy at the top level,
774  *                   pass <code>NULL</code>.
775  *
776  * @result
777  * The newly copied set, with a retain count of 1,
778  * or <code>NULL</code> if there is insufficient memory to do the copy.
779  *
780  * @discussion
781  * The receiving set, and any collections it contains,
782  * recursively, are copied.
783  * Objects that are not derived from OSCollection are retained
784  * rather than copied.
785  */
786 	OSPtr<OSCollection>  copyCollection(OSDictionary *cycleDict = NULL) APPLE_KEXT_OVERRIDE;
787 
788 	OSMetaClassDeclareReservedUnused(OSSet, 0);
789 	OSMetaClassDeclareReservedUnused(OSSet, 1);
790 	OSMetaClassDeclareReservedUnused(OSSet, 2);
791 	OSMetaClassDeclareReservedUnused(OSSet, 3);
792 	OSMetaClassDeclareReservedUnused(OSSet, 4);
793 	OSMetaClassDeclareReservedUnused(OSSet, 5);
794 	OSMetaClassDeclareReservedUnused(OSSet, 6);
795 	OSMetaClassDeclareReservedUnused(OSSet, 7);
796 };
797 
798 #endif /* !_OS_OSSET_H */
799