@@ -27,11 +27,11 @@ #import "OFCollection.h" #import "OFSerialization.h" /*! @file */ -@class OFArray; +@class OFArray OF_GENERIC(ObjectType); #ifdef OF_HAVE_BLOCKS /*! * @brief A block for enumerating an OFSet. * @@ -56,12 +56,19 @@ * @brief An abstract class for an unordered set of unique objects. * * @warning Do not mutate objects that are in a set! Changing the hash of * objects in a set breaks the internal representation of the set! */ -@interface OFSet: OFObject +#ifdef OF_HAVE_GENERICS +@interface OFSet : +#else +# ifndef DOXYGEN +# define ObjectType id +# endif +@interface OFSet: +#endif + OFObject /*! * @brief Creates a new set. * * @return A new, autoreleased set */ @@ -71,70 +78,70 @@ * @brief Creates a new set with the specified set. * * @param set The set to initialize the set with * @return A new, autoreleased set with the specified set */ -+ (instancetype)setWithSet: (OFSet*)set; ++ (instancetype)setWithSet: (OFSet OF_GENERIC(ObjectType)*)set; /*! * @brief Creates a new set with the specified array. * * @param array The array to initialize the set with * @return A new, autoreleased set with the specified array */ -+ (instancetype)setWithArray: (OFArray*)array; ++ (instancetype)setWithArray: (OFArray OF_GENERIC(ObjectType)*)array; /*! * @brief Creates a new set with the specified objects. * * @param firstObject The first object for the set * @return A new, autoreleased set with the specified objects */ -+ (instancetype)setWithObjects: (id)firstObject, ...; ++ (instancetype)setWithObjects: (ObjectType)firstObject, ...; /*! * @brief Creates a new set with the specified objects. * * @param objects An array of objects for the set * @param count The number of objects in the specified array * @return A new, autoreleased set with the specified objects */ -+ (instancetype)setWithObjects: (id const*)objects ++ (instancetype)setWithObjects: (ObjectType const*)objects count: (size_t)count; /*! * @brief Initializes an already allocated set with the specified set. * * @param set The set to initialize the set with * @return An initialized set with the specified set */ -- initWithSet: (OFSet*)set; +- initWithSet: (OFSet OF_GENERIC(ObjectType)*)set; /*! * @brief Initializes an already allocated set with the specified array. * * @param array The array to initialize the set with * @return An initialized set with the specified array */ -- initWithArray: (OFArray*)array; +- initWithArray: (OFArray OF_GENERIC(ObjectType)*)array; /*! * @brief Initializes an already allocated set with the specified objects. * * @param firstObject The first object for the set * @return An initialized set with the specified objects */ -- initWithObjects: (id)firstObject, ...; +- initWithObjects: (ObjectType)firstObject, ...; /*! * @brief Initializes an already allocated set with the specified objects. * * @param objects An array of objects for the set * @param count The number of objects in the specified array * @return An initialized set with the specified objects */ -- initWithObjects: (id const*)objects +- initWithObjects: (ObjectType const*)objects count: (size_t)count; /*! * @brief Initializes an already allocated set with the specified object and * va_list. @@ -141,66 +148,85 @@ * * @param firstObject The first object for the set * @param arguments A va_list with the other objects * @return An initialized set with the specified object and va_list */ -- initWithObject: (id)firstObject +- initWithObject: (ObjectType)firstObject arguments: (va_list)arguments; /*! * @brief Returns whether the receiver is a subset of the specified set. * * @return Whether the receiver is a subset of the specified set */ -- (bool)isSubsetOfSet: (OFSet*)set; +- (bool)isSubsetOfSet: (OFSet OF_GENERIC(ObjectType)*)set; /*! * @brief Returns whether the receiver and the specified set have at least one * object in common. * * @return Whether the receiver and the specified set have at least one object * in common */ -- (bool)intersectsSet: (OFSet*)set; +- (bool)intersectsSet: (OFSet OF_GENERIC(ObjectType)*)set; /*! * @brief Creates a new set which contains the objects which are in the * receiver, but not in the specified set. * * @param set The set whose objects will not be in the new set */ -- (OFSet*)setBySubtractingSet: (OFSet*)set; +- (OFSet OF_GENERIC(ObjectType)*)setBySubtractingSet: + (OFSet OF_GENERIC(ObjectType)*)set; /*! * @brief Creates a new set by creating the intersection of the receiver and * the specified set. * * @param set The set to intersect with */ -- (OFSet*)setByIntersectingWithSet: (OFSet*)set; +- (OFSet OF_GENERIC(ObjectType)*)setByIntersectingWithSet: + (OFSet OF_GENERIC(ObjectType)*)set; /*! * @brief Creates a new set by creating the union of the receiver and the * specified set. * * @param set The set to create the union with */ -- (OFSet*)setByAddingSet: (OFSet*)set; +- (OFSet OF_GENERIC(ObjectType)*)setByAddingSet: + (OFSet OF_GENERIC(ObjectType)*)set; /*! * @brief Returns an array of all objects in the set. * * @return An array of all objects in the set */ -- (OFArray*)allObjects; +- (OFArray OF_GENERIC(ObjectType)*)allObjects; /*! * @brief Returns an arbitrary object in the set. * * @return An arbitrary object in the set */ -- (id)anyObject; +- (ObjectType)anyObject; + +/*! + * @brief Checks whether the set contains an object equal to the specified + * object. + * + * @param object The object which is checked for being in the set + * @return A boolean whether the set contains the specified object + */ +- (bool)containsObject: (ObjectType)object; + +/*! + * @brief Returns an OFEnumerator to enumerate through all objects of the set. + * + * @returns An OFEnumerator to enumerate through all objects of the set + */ +- (OFEnumerator OF_GENERIC(ObjectType)*)objectEnumerator; #ifdef OF_HAVE_BLOCKS /*! * @brief Executes a block for each object in the set. * @@ -213,10 +239,14 @@ * returns true. * * @param block A block which determines if the object should be in the new set * @return A new, autoreleased OFSet */ -- (OFSet*)filteredSetUsingBlock: (of_set_filter_block_t)block; +- (OFSet OF_GENERIC(ObjectType)*)filteredSetUsingBlock: + (of_set_filter_block_t)block; #endif @end +#if !defined(OF_HAVE_GENERICS) && !defined(DOXYGEN) +# undef ObjectType +#endif #import "OFMutableSet.h"