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