This is MissingMethods.m in view mode; [Download] [Up]
/*
Copyright (C) 1996
Ovidiu Predescu <ovidiu@bx.logicnet.ro>
Mircea Oancea <mircea@jupiter.elcom.pub.ro>
Author: Ovidiu Predescu <ovidiu@bx.logicnet.ro>
This file is part of the FoundationExtensions library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with this library; see the file COPYING.LIB.
If not, write to the Free Software Foundation,
59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "MissingMethods.h"
#include <extensions/common.h>
#include <extensions/objc-runtime.h>
#include <extensions/exceptions/GeneralExceptions.h>
void __MissingMethods_dummy_function_for_stupid_linkers()
{
}
#if NeXT_foundation_LIBRARY
@implementation NSArray (MissingMethods)
- (NSArray*)arrayByAddingObject:(id)anObject
{
int i, count = [self count];
id *objects = Malloc(sizeof(id)*(count+1));
id array;
for (i = 0; i < count; i++)
objects[i] = [self objectAtIndex:i];
objects[i] = anObject;
array = [[[isa allocWithZone:NULL]
initWithObjects:objects count:count+1]
autorelease];
Free(objects);
return array;
}
- (NSArray *)arrayByAddingObjectsFromArray:(NSArray *)anotherArray
{
unsigned int i, count = [self count], another = [anotherArray count];
id array;
id *objects = Malloc(sizeof(id)*(count+another));
for (i=0; i<count; i++)
objects[i] = [self objectAtIndex:i];
for (i=0; i<another; i++)
objects[i+count] = [anotherArray objectAtIndex:i];
array = [[[NSArray allocWithZone:NULL]
initWithObjects:objects count:count+another]
autorelease];
Free(objects);
return array;
}
- (NSString *)componentsJoinedByString:(NSString *)separator
{
unsigned int index, count = [self count];
if(count) {
id string = [[[self objectAtIndex:0] description] mutableCopy];
for (index = 1; index < count; index++) {
[string appendString:separator];
[string appendString:[[self objectAtIndex:index] description]];
}
return [string autorelease];
}
return nil;
}
@end /* NSArray (MissingMethods) */
@implementation NSMutableArray (MissingMethods)
- (void)setArray:(NSArray *)otherArray
{
[self removeAllObjects];
[self addObjectsFromArray:otherArray];
}
@end /* NSMutableArray (MissingMethods) */
#endif /* NeXT_foundation_LIBRARY */
@implementation NSDictionary (MissingMethods)
- (id)initWithObjectsAndKeys:(id)firstObject arguments:(va_list)argList
{
id object;
id *ka, *oa;
va_list va = argList;
int count = 0;
for (object = firstObject; object; object = va_arg(va,id)) {
if (!va_arg(va,id))
THROW([[InvalidArgumentException alloc]
initWithReason:@"Nil key to be added in dictionary"]);
count++;
}
ka = Malloc(sizeof(id)*count);
oa = Malloc(sizeof(id)*count);
for (count=0, object=firstObject; object; object=va_arg(argList,id)) {
ka[count] = va_arg(argList,id);
oa[count] = object;
count++;
}
[self initWithObjects:oa forKeys:ka count:count];
Free(ka);
Free(oa);
return self;
}
#ifndef GNUSTEP_BASE_LIBRARY
+ (id)dictionaryWithObjectsAndKeys:(id)firstObject, ...
{
id dict = [self alloc];
va_list va;
va_start(va, firstObject);
[dict initWithObjectsAndKeys:firstObject arguments:va];
va_end(va);
return [dict autorelease];
}
#endif
#if NeXT_foundation_LIBRARY
- (id)initWithObjects:(NSArray*)objects forKeys:(NSArray*)keys
{
unsigned int i, count = [objects count];
id *mkeys;
id *mobjs;
if (count != [keys count])
THROW([[InvalidArgumentException alloc] initWithReason:
@"NSDictionary initWithObjects:forKeys must \
have both arguments of the same size"]);
mkeys = Malloc(sizeof(id)*count);
mobjs = Malloc(sizeof(id)*count);
for (i=0; i<count; i++) {
mkeys[i] = [keys objectAtIndex:i];
mobjs[i] = [objects objectAtIndex:i];
}
[self initWithObjects:mobjs forKeys:mkeys count:count];
Free(mkeys);
Free(mobjs);
return self;
}
#endif
@end /* NSDictionary (MissingMethods) */
@implementation NSMutableDictionary (MissingMethods)
- (void)setDictionary:(NSDictionary*)otherDictionary
{
[self removeAllObjects];
[self addEntriesFromDictionary:otherDictionary];
}
@end /* NSMutableDictionary (MissingMethods) */
#if NeXT_foundation_LIBRARY || Sun_Foundation_LIBRARY
@implementation NSObject (MissingMethods)
/* Not really missing, but these methods are useful at least in the earliear
stages of development :-) */
- subclassResponsibility:(SEL)aSel
{
id exception = [[ObjcRuntimeException alloc]
initWithFormat:@"subclass should override %s",
sel_get_name(aSel)];
THROW(exception);
return self;
}
- notImplemented:(SEL)aSel
{
id reason = [NSString stringWithFormat:@"%s does not implement %s",
object_get_class_name(self), sel_get_name(aSel)];
id exception = [[ObjcRuntimeException alloc]
initWithName:@"ObjcRuntimeException"
reason:reason userInfo:nil];
THROW(exception);
return self;
}
@end /* NSObject (MissingMethods) */
#endif /* NeXT_foundation_LIBRARY || Sun_Foundation_LIBRARY */
#if NeXT_foundation_LIBRARY || GNUSTEP_BASE_LIBRARY
@implementation NSString (MissingMethods)
- (NSString *)substringWithRange:(NSRange)range
{
return [self substringFromRange:range];
}
@end
#endif /* NeXT_foundation_LIBRARY */
#if NeXT_foundation_LIBRARY
@implementation NSNumber(MissingMethods)
+ (NSNumber*)numberWithBool:(BOOL)value
{
return [[[NSBoolNumber alloc]
initValue:&value withObjCType:NULL]
autorelease];
}
+ (NSNumber*)numberWithChar:(char)value
{
return [[[NSCharNumber alloc]
initValue:&value withObjCType:NULL]
autorelease];
}
+ (NSNumber*)numberWithUnsignedChar:(unsigned char)value
{
return [[[NSUCharNumber alloc]
initValue:&value withObjCType:NULL]
autorelease];
}
+ (NSNumber*)numberWithShort:(short)value
{
return [[[NSShortNumber alloc]
initValue:&value withObjCType:NULL]
autorelease];
}
+ (NSNumber*)numberWithUnsignedShort:(unsigned short)value
{
return [[[NSUShortNumber alloc]
initValue:&value withObjCType:NULL]
autorelease];
}
+ (NSNumber*)numberWithInt:(int)value
{
return [[[NSIntNumber alloc]
initValue:&value withObjCType:NULL]
autorelease];
}
+ (NSNumber*)numberWithUnsignedInt:(unsigned int)value
{
return [[[NSUIntNumber alloc]
initValue:&value withObjCType:NULL]
autorelease];
}
+ (NSNumber*)numberWithLong:(long)value
{
return [[[NSLongNumber alloc]
initValue:&value withObjCType:NULL]
autorelease];
}
+ (NSNumber*)numberWithUnsignedLong:(unsigned long)value
{
return [[[NSULongNumber alloc]
initValue:&value withObjCType:NULL]
autorelease];
}
+ (NSNumber*)numberWithLongLong:(long long)value
{
return [[[NSLongLongNumber alloc]
initValue:&value withObjCType:NULL]
autorelease];
}
+ (NSNumber*)numberWithUnsignedLongLong:(unsigned long long)value
{
return [[[NSULongLongNumber alloc]
initValue:&value withObjCType:NULL]
autorelease];
}
+ (NSNumber*)numberWithFloat:(float)value
{
return [[[NSFloatNumber alloc]
initValue:&value withObjCType:NULL]
autorelease];
}
+ (NSNumber*)numberWithDouble:(double)value
{
return [[[NSDoubleNumber alloc]
initValue:&value withObjCType:NULL]
autorelease];
}
/* These methods are not written in concrete subclassses */
- (unsigned)hash
{
return [self unsignedIntValue];
}
- (BOOL)isEqual:(id)anObject
{
if (self == anObject)
return YES;
else
return ([anObject isKindOfClass:[NSNumber class]]
&& [self compare:anObject] == NSOrderedSame);
}
- (NSComparisonResult)compare:(NSNumber*)otherNumber
{
[self subclassResponsibility:_cmd];
return 0;
}
- (int)generality
{
[self subclassResponsibility:_cmd];
return 0;
}
- initValue:(const void*)value withObjCType:(const char*)type
{
[self subclassResponsibility:_cmd];
return self;
}
- (NSString*)description
{
return [self stringValue];
}
@end
#endif /* NeXT_foundation_LIBRARY */
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.