From f001c36343843dbe0c09898fbba8006baeee01af Mon Sep 17 00:00:00 2001 From: richard Date: Sat, 12 Jun 1999 09:07:50 +0000 Subject: [PATCH] Implement some hash methods git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@4400 72102866-910b-0410-8b05-ffd578937521 --- ChangeLog | 5 ++++ Source/NSCTemplateValue.m | 48 +++++++++++++++++++++++++++++++++++++++ Source/NSConcreteValue.m | 29 ++++++++++++++++++++++- 3 files changed, 81 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index bad50600d..fbf818ead 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Sat Jun 12 10:25:00 1999 Richard Frith-Macdonald + + * Source/NSConcreteValue.m: Implemented [hash and isEqualToValue + * Source/NSCTemplateValue.m: Implemented hash + Thu Jun 4 13:55:00 1999 Richard Frith-Macdonald * Source/NSCharacterSet.m: prepare for GC diff --git a/Source/NSCTemplateValue.m b/Source/NSCTemplateValue.m index e6be3b366..96511fc24 100644 --- a/Source/NSCTemplateValue.m +++ b/Source/NSCTemplateValue.m @@ -120,6 +120,54 @@ return NO; } +- (unsigned) hash +{ +#if TYPE_ORDER == 0 + return [data hash]; +#elif TYPE_ORDER == 1 + union { + double d; + unsigned char c[sizeof(double)]; + } val; + unsigned hash = 0; + int i; + + val.d = data.x + data.y; + for (i = 0; i < sizeof(double); i++) { + hash += val.c[i]; + } + return hash; +#elif TYPE_ORDER == 2 + return (unsigned)(gsaddr)data; +#elif TYPE_ORDER == 3 + union { + double d; + unsigned char c[sizeof(double)]; + } val; + unsigned hash = 0; + int i; + + val.d = data.origin.x + data.origin.y + data.size.width + data.size.height; + for (i = 0; i < sizeof(double); i++) { + hash += val.c[i]; + } + return hash; +#elif TYPE_ORDER == 4 + union { + double d; + unsigned char c[sizeof(double)]; + } val; + unsigned hash = 0; + int i; + + val.d = data.width + data.height; + for (i = 0; i < sizeof(double); i++) { + hash += val.c[i]; + } + return hash; +#endif +} + - (const char *)objCType { typedef _dt = data; diff --git a/Source/NSConcreteValue.m b/Source/NSConcreteValue.m index 7206c4032..8a427f9cb 100644 --- a/Source/NSConcreteValue.m +++ b/Source/NSConcreteValue.m @@ -113,9 +113,36 @@ memcpy( value, data, objc_sizeof_type([objctype cString]) ); } --(BOOL) isEqualToValue: (NSValue*)aValue +- (unsigned) hash { + const char* type = [objctype cString]; + unsigned size = objc_sizeof_type(type); + unsigned hash = 0; + + while (size-- > 0) + hash += ((unsigned char*)data)[size]; + return hash; +} + +- (BOOL) isEqualToValue: (NSValue*)aValue +{ + const char* type; + + if ([aValue class] != [self class]) return NO; + type = [objctype cString]; + if (strcmp(type, [aValue objCType]) != 0) + return NO; + else + { + unsigned size = objc_sizeof_type(type); + char buf[size]; + + [aValue getValue: buf]; + if (memcmp(buf, data, size) != 0) + return NO; + return YES; + } } - (const char *)objCType