2 Copyright (C) 2000-2005 SKYRIX Software AG
4 This file is part of SOPE.
6 SOPE is free software; you can redistribute it and/or modify it under
7 the terms of the GNU Lesser General Public License as published by the
8 Free Software Foundation; either version 2, or (at your option) any
11 SOPE is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
14 License for more details.
16 You should have received a copy of the GNU Lesser General Public
17 License along with SOPE; see the file COPYING. If not, write to the
18 Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
22 #include "EOQualifier.h"
26 static EONull *null = nil;
30 @interface NSObject(CompareIFace)
31 - (NSComparisonResult)compare:(id)_object;
34 @implementation NSObject(ImplementedQualifierComparisons)
36 - (BOOL)isEqualTo:(id)_object {
37 return [self isEqual:_object];
39 - (BOOL)isNotEqualTo:(id)_object {
40 return ![self isEqualTo:_object];
43 - (BOOL)isLessThan:(id)_object {
44 return [self compare:_object] < 0 ? YES : NO;
46 - (BOOL)isGreaterThan:(id)_object {
47 return [self compare:_object] > 0 ? YES : NO;
49 - (BOOL)isLessThanOrEqualTo:(id)_object {
50 return [self compare:_object] <= 0 ? YES : NO;
52 - (BOOL)isGreaterThanOrEqualTo:(id)_object {
53 return [self compare:_object] >= 0 ? YES : NO;
56 - (BOOL)doesContain:(id)_object {
60 - (BOOL)isLike:(NSString *)_object {
63 - (BOOL)isCaseInsensitiveLike:(NSString *)_object {
67 @end /* NSObject(ImplementedQualifierComparisons) */
69 @implementation NSArray(ImplementedQualifierComparisons)
71 - (BOOL)doesContain:(id)_object {
72 return [self containsObject:_object];
75 @end /* NSArray(ImplementedQualifierComparisons) */
77 @implementation NSString(ImplementedQualifierComparisons)
79 - (BOOL)isLike:(NSString *)_pattern {
83 NSString *first, *last;
86 if (null == nil) null = [[EONull null] retain];
88 if ((id)_pattern == (id)null)
91 if ([_pattern isEqual:@"*"])
95 cs = [_pattern componentsSeparatedByString:@"*"];
99 return [self isEqual:_pattern];
102 return [self isEqual:_pattern];
105 if ([_pattern hasPrefix:@"*"])
106 return [self hasSuffix:[cs objectAtIndex:1]];
107 if ([_pattern hasSuffix:@"*"])
108 return [self hasPrefix:[cs objectAtIndex:0]];
111 if ([_pattern hasPrefix:@"*"] && [_pattern hasSuffix:@"*"])
112 return [self rangeOfString:[cs objectAtIndex:1]].length == 0
117 NSEnumerator *enumerator;
124 enumerator = [cs objectEnumerator];
126 while ((str = [enumerator nextObject]) && idx < len) {
129 if ([str length] == 0)
132 r = NSMakeRange(idx, ([self length] - idx));
133 r = [self rangeOfString:str options:0 range:r];
139 return [enumerator nextObject] ? NO : YES;
142 first = [cs objectAtIndex:0];
143 last = [cs lastObject];
145 if (![self hasPrefix:first])
147 if (![self hasSuffix:last])
150 /* to be completed (match interior stuff, match '?') */
157 - (BOOL)isCaseInsensitiveLike:(NSString *)_pattern {
158 return [[self lowercaseString] isLike:[_pattern lowercaseString]];
161 @end /* NSString(ImplementedQualifierComparisons) */
163 @implementation NSNumber(ImplementedQualifierComparisons)
165 - (BOOL)isEqualTo:(id)_object {
166 if (_object == nil) return NO;
167 if (_object == self) return YES;
168 return [self isEqual:_object];
170 - (BOOL)isNotEqualTo:(id)_object {
171 if (_object == nil) return YES;
172 return ![self isEqualTo:_object];
175 - (BOOL)isLessThan:(id)_object {
176 if (_object == nil) return YES;
177 if (_object == self) return NO;
178 return [self compare:_object] < 0 ? YES : NO;
180 - (BOOL)isGreaterThan:(id)_object {
181 if (_object == nil) return NO;
182 if (_object == self) return NO;
183 return [self compare:_object] > 0 ? YES : NO;
185 - (BOOL)isLessThanOrEqualTo:(id)_object {
186 if (_object == nil) return YES;
187 if (_object == self) return YES;
188 return [self compare:_object] <= 0 ? YES : NO;
190 - (BOOL)isGreaterThanOrEqualTo:(id)_object {
191 if (_object == nil) return NO;
192 if (_object == self) return YES;
193 return [self compare:_object] >= 0 ? YES : NO;
196 @end /* NSNumber(ImplementedQualifierComparisons) */
198 @implementation NSDate(ImplementedQualifierComparisons)
200 #define CHECK_NULL(__VAL__, __RES__) \
201 {if (null == nil) null = [[EONull null] retain];} \
202 if (__VAL__ == nil || __VAL__ == null) return __RES__
204 - (BOOL)isLessThan:(id)_object {
205 CHECK_NULL(_object, NO);
206 return [self compare:_object] < 0 ? YES : NO;
208 - (BOOL)isGreaterThan:(id)_object {
209 CHECK_NULL(_object, YES);
210 return [self compare:_object] > 0 ? YES : NO;
213 - (BOOL)isLessThanOrEqualTo:(id)_object {
214 CHECK_NULL(_object, NO);
215 return [self compare:_object] <= 0 ? YES : NO;
217 - (BOOL)isGreaterThanOrEqualTo:(id)_object {
218 CHECK_NULL(_object, YES);
219 return [self compare:_object] >= 0 ? YES : NO;
222 @end /* NSDate(ImplementedQualifierComparisons) */