@@ -17,10 +17,12 @@ #include "config.h" #import "OFXMLAttribute.h" #import "OFString.h" #import "OFAutoreleasePool.h" + +#import "macros.h" @implementation OFXMLAttribute + attributeWithName: (OFString*)name namespace: (OFString*)ns stringValue: (OFString*)value @@ -69,6 +71,60 @@ - (OFString*)stringValue { return [[stringValue copy] autorelease]; } + +- (BOOL)isEqual: (id)object +{ + OFXMLAttribute *other; + + if (![object isKindOfClass: [OFXMLAttribute class]]) + return NO; + + other = object; + + if (![other->name isEqual: name]) + return NO; + if (other->ns != ns && ![other->ns isEqual: ns]) + return NO; + if (![other->stringValue isEqual: stringValue]) + return NO; + + return YES; +} + +- (uint32_t)hash +{ + uint32_t hash, tmp; + + OF_HASH_INIT(hash); + + tmp = [name hash]; + OF_HASH_ADD(hash, (tmp >> 24) & 0xFF); + OF_HASH_ADD(hash, (tmp >> 16) & 0xFF); + OF_HASH_ADD(hash, (tmp >> 8) & 0xFF); + OF_HASH_ADD(hash, tmp & 0xFF); + + tmp = [name hash]; + OF_HASH_ADD(hash, (tmp >> 24) & 0xFF); + OF_HASH_ADD(hash, (tmp >> 16) & 0xFF); + OF_HASH_ADD(hash, (tmp >> 8) & 0xFF); + OF_HASH_ADD(hash, tmp & 0xFF); + + tmp = [ns hash]; + OF_HASH_ADD(hash, (tmp >> 24) & 0xFF); + OF_HASH_ADD(hash, (tmp >> 16) & 0xFF); + OF_HASH_ADD(hash, (tmp >> 8) & 0xFF); + OF_HASH_ADD(hash, tmp & 0xFF); + + tmp = [stringValue hash]; + OF_HASH_ADD(hash, (tmp >> 24) & 0xFF); + OF_HASH_ADD(hash, (tmp >> 16) & 0xFF); + OF_HASH_ADD(hash, (tmp >> 8) & 0xFF); + OF_HASH_ADD(hash, tmp & 0xFF); + + OF_HASH_FINALIZE(hash); + + return hash; +} @end