Index: src/OFXMLAttribute.m ================================================================== --- src/OFXMLAttribute.m +++ src/OFXMLAttribute.m @@ -21,10 +21,12 @@ #import "OFDictionary.h" #import "OFXMLElement.h" #import "OFAutoreleasePool.h" #import "OFInvalidArgumentException.h" + +#import "macros.h" @implementation OFXMLAttribute + attributeWithName: (OFString*)name namespace: (OFString*)ns stringValue: (OFString*)value @@ -125,10 +127,25 @@ if (![otherAttribute->stringValue isEqual: stringValue]) return NO; return YES; } + +- (uint32_t)hash +{ + uint32_t hash; + + OF_HASH_INIT(hash); + + OF_HASH_ADD_INT32(hash, [name hash]); + OF_HASH_ADD_INT32(hash, [ns hash]); + OF_HASH_ADD_INT32(hash, [stringValue hash]); + + OF_HASH_FINALIZE(hash); + + return hash; +} - (OFXMLElement*)XMLElementBySerializing { OFAutoreleasePool *pool; OFXMLElement *element; Index: src/OFXMLElement.m ================================================================== --- src/OFXMLElement.m +++ src/OFXMLElement.m @@ -30,10 +30,12 @@ #import "OFInvalidArgumentException.h" #import "OFMalformedXMLException.h" #import "OFNotImplementedException.h" #import "OFUnboundNamespaceException.h" + +#import "macros.h" @interface OFXMLElement_OFXMLElementBuilderDelegate: OFObject { @public OFXMLElement *element; @@ -974,10 +976,31 @@ ![otherElement->comment isEqual: comment]) return NO; return YES; } + +- (uint32_t)hash +{ + uint32_t hash; + + OF_HASH_INIT(hash); + + OF_HASH_ADD_INT32(hash, [name hash]); + OF_HASH_ADD_INT32(hash, [ns hash]); + OF_HASH_ADD_INT32(hash, [defaultNamespace hash]); + OF_HASH_ADD_INT32(hash, [attributes hash]); + OF_HASH_ADD_INT32(hash, [namespaces hash]); + OF_HASH_ADD_INT32(hash, [children hash]); + OF_HASH_ADD_INT32(hash, [characters hash]); + OF_HASH_ADD_INT32(hash, [CDATA hash]); + OF_HASH_ADD_INT32(hash, [comment hash]); + + OF_HASH_FINALIZE(hash); + + return hash; +} - (void)dealloc { [name release]; [ns release];