]> err.no Git - sope/blob - sope-core/EOControl/NSObject+EOQualifierOps.m
Drop apache 1 build-dependency
[sope] / sope-core / EOControl / NSObject+EOQualifierOps.m
1 /*
2   Copyright (C) 2000-2005 SKYRIX Software AG
3
4   This file is part of SOPE.
5
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
9   later version.
10
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.
15
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
19   02111-1307, USA.
20 */
21
22 #include "EOQualifier.h"
23 #include "EONull.h"
24 #include "common.h"
25
26 static EONull *null = nil;
27
28 /* values */
29
30 @interface NSObject(CompareIFace)
31 - (NSComparisonResult)compare:(id)_object;
32 @end
33
34 @implementation NSObject(ImplementedQualifierComparisons)
35
36 - (BOOL)isEqualTo:(id)_object {
37   return [self isEqual:_object];
38 }
39 - (BOOL)isNotEqualTo:(id)_object {
40   return ![self isEqualTo:_object];
41 }
42
43 - (BOOL)isLessThan:(id)_object {
44   return [self compare:_object] < 0 ? YES : NO;
45 }
46 - (BOOL)isGreaterThan:(id)_object {
47   return [self compare:_object] > 0 ? YES : NO;
48 }
49 - (BOOL)isLessThanOrEqualTo:(id)_object {
50   return [self compare:_object] <= 0 ? YES : NO;
51 }
52 - (BOOL)isGreaterThanOrEqualTo:(id)_object {
53   return [self compare:_object] >= 0 ? YES : NO;
54 }
55
56 - (BOOL)doesContain:(id)_object {
57   return NO;
58 }
59
60 - (BOOL)isLike:(NSString *)_object {
61   return NO;
62 }
63 - (BOOL)isCaseInsensitiveLike:(NSString *)_object {
64   return NO;
65 }
66
67 @end /* NSObject(ImplementedQualifierComparisons) */
68
69 @implementation NSArray(ImplementedQualifierComparisons)
70
71 - (BOOL)doesContain:(id)_object {
72   return [self containsObject:_object];
73 }
74
75 @end /* NSArray(ImplementedQualifierComparisons) */
76
77 @implementation NSString(ImplementedQualifierComparisons)
78
79 - (BOOL)isLike:(NSString *)_pattern {
80   NSArray  *cs;
81   unsigned count;
82 #if 0  
83   NSString *first, *last;
84 #endif  
85   
86   if (null == nil) null = [[EONull null] retain];
87
88   if ((id)_pattern == (id)null)
89     return NO;
90   
91   if ([_pattern isEqual:@"*"])
92     /* all match */
93     return YES;
94   
95   cs    = [_pattern componentsSeparatedByString:@"*"];
96   count = [cs count];
97
98   if (count == 0)
99     return [self isEqual:_pattern];
100   
101   if (count == 1)
102     return [self isEqual:_pattern];
103   
104   if (count == 2) {
105     if ([_pattern hasPrefix:@"*"])
106       return [self hasSuffix:[cs objectAtIndex:1]];
107     if ([_pattern hasSuffix:@"*"])
108       return [self hasPrefix:[cs objectAtIndex:0]];
109   }
110   if (count == 3) {
111     if ([_pattern hasPrefix:@"*"] && [_pattern hasSuffix:@"*"])
112       return [self rangeOfString:[cs objectAtIndex:1]].length == 0
113         ? NO : YES;
114   }
115 #if 1
116   {
117     NSEnumerator *enumerator;
118     int          idx;
119     int          len;
120     NSString     *str;
121
122     idx        = 0;
123     len        = [self length];
124     enumerator = [cs objectEnumerator];
125     
126     while ((str = [enumerator nextObject]) && idx < len) {
127       NSRange r;
128       
129       if ([str length] == 0)
130         continue;
131       
132       r = NSMakeRange(idx, ([self length] - idx));
133       r = [self rangeOfString:str options:0 range:r];
134       if (r.length == 0)
135         return NO;
136       
137       idx += r.length;
138     }
139     return [enumerator nextObject] ? NO : YES;
140   }
141 #else
142   first = [cs objectAtIndex:0];
143   last  = [cs lastObject];
144
145   if (![self hasPrefix:first])
146     return NO;
147   if (![self hasSuffix:last])
148     return NO;
149
150   /* to be completed (match interior stuff, match '?') */
151   
152   return YES;
153 #endif
154   return NO;
155 }
156
157 - (BOOL)isCaseInsensitiveLike:(NSString *)_pattern {
158   return [[self lowercaseString] isLike:[_pattern lowercaseString]];
159 }
160
161 @end /* NSString(ImplementedQualifierComparisons) */
162
163 @implementation NSNumber(ImplementedQualifierComparisons)
164
165 - (BOOL)isEqualTo:(id)_object {
166   if (_object == nil) return NO;
167   if (_object == self) return YES;
168   return [self isEqual:_object];
169 }
170 - (BOOL)isNotEqualTo:(id)_object {
171   if (_object == nil) return YES;
172   return ![self isEqualTo:_object];
173 }
174
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;
179 }
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;
184 }
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;
189 }
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;
194 }
195
196 @end /* NSNumber(ImplementedQualifierComparisons) */
197
198 @implementation NSDate(ImplementedQualifierComparisons)
199
200 #define CHECK_NULL(__VAL__, __RES__) \
201   {if (null == nil) null = [[EONull null] retain];} \
202   if (__VAL__ == nil || __VAL__ == null) return __RES__
203
204 - (BOOL)isLessThan:(id)_object {
205   CHECK_NULL(_object, NO);
206   return [self compare:_object] < 0 ? YES : NO;
207 }
208 - (BOOL)isGreaterThan:(id)_object {
209   CHECK_NULL(_object, YES);
210   return [self compare:_object] > 0 ? YES : NO;
211 }
212
213 - (BOOL)isLessThanOrEqualTo:(id)_object {
214   CHECK_NULL(_object, NO);
215   return [self compare:_object] <= 0 ? YES : NO;
216 }
217 - (BOOL)isGreaterThanOrEqualTo:(id)_object {
218   CHECK_NULL(_object, YES);
219   return [self compare:_object] >= 0 ? YES : NO;
220 }
221
222 @end /* NSDate(ImplementedQualifierComparisons) */