ftp.nice.ch/Attic/openStep/implementation/gnustep/sources/gstep-base-0.2.7.tgz#/gstep-base-0.2.7/src/NSNumber.m

This is NSNumber.m in view mode; [Download] [Up]

/* NSNumber - Object encapsulation of numbers
    
   Copyright (C) 1993, 1994, 1996 Free Software Foundation, Inc.

   Written by:  Adam Fedor <fedor@boulder.colorado.edu>
   Created: Mar 1995

   This file is part of the GNUstep Base 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; if not, write to the Free
   Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/

#include <gnustep/base/preface.h>
#include <Foundation/NSException.h>
#include <Foundation/NSString.h>
#include <Foundation/NSConcreteNumber.h>
#include <Foundation/NSCoder.h>

@implementation NSNumber

/* Returns the concrete class associated with the type encoding. Note 
   that we don't allow NSNumber to instantiate any class but its own
   concrete subclasses (see check at end of method) */
+ (Class)valueClassWithObjCType:(const char *)type
{
    Class theClass = Nil;

    switch (*type) {
    case _C_CHR:
	theClass = [NSCharNumber class];
	break;
    case _C_UCHR:
	theClass = [NSUCharNumber class];
	break;
    case _C_SHT:
	theClass = [NSShortNumber class];
	break;
    case _C_USHT:
	theClass = [NSUShortNumber class];
	break;
    case _C_INT:
	theClass = [NSIntNumber class];
	break;
    case _C_UINT:
	theClass = [NSUIntNumber class];
	break;
    case _C_LNG:
	theClass = [NSLongNumber class];
	break;
    case _C_ULNG:
	theClass = [NSULongNumber class];
	break;
    case 'q':
	theClass = [NSLongLongNumber class];
	break;
    case 'Q':
	theClass = [NSULongLongNumber class];
	break;
    case _C_FLT:
	theClass = [NSFloatNumber class];
	break;
    case _C_DBL:
	theClass = [NSDoubleNumber class];
	break;
    default:
	break;
    }

    if (theClass == Nil && self == [NSNumber class]) {
	[NSException raise:NSInvalidArgumentException
		format:@"Invalid number type"];
	/* NOT REACHED */
    } else if (theClass == Nil)
    	theClass = [super valueClassWithObjCType:type];

    return theClass;
}

+ (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 *)numberWithDouble:(double)value
{
    return [[[NSDoubleNumber alloc] initValue:&value withObjCType:NULL] 
	autorelease];
}

+ (NSNumber *)numberWithFloat:(float)value
{
    return [[[NSFloatNumber alloc] initValue:&value withObjCType:NULL] 
	autorelease];
}

+ (NSNumber *)numberWithInt:(int)value
{
    return [[[NSIntNumber alloc] initValue:&value withObjCType:NULL] 
	autorelease];
}

+ (NSNumber *)numberWithLong:(long)value
{
    return [[[NSNumber alloc] initValue:&value withObjCType:NULL] autorelease];
}

+ (NSNumber *)numberWithLongLong:(long long)value
{
    return [[[NSLongLongNumber alloc] initValue:&value withObjCType:NULL] 
	autorelease];
}

+ (NSNumber *)numberWithShort:(short)value
{
    return [[[NSShortNumber alloc] initValue:&value withObjCType:NULL] 
	autorelease];
}

+ (NSNumber *)numberWithUnsignedChar:(unsigned char)value
{
    return [[[NSUCharNumber alloc] initValue:&value withObjCType:NULL] 
	autorelease];
}

+ (NSNumber *)numberWithUnsignedInt:(unsigned int)value
{
    return [[[NSUIntNumber alloc] initValue:&value withObjCType:NULL] 
	autorelease];
}

+ (NSNumber *)numberWithUnsignedLong:(unsigned long)value
{
    return [[[NSULongNumber alloc] initValue:&value withObjCType:NULL] 
	autorelease];
}

+ (NSNumber *)numberWithUnsignedLongLong:(unsigned long long)value
{
    return [[[NSULongLongNumber alloc] initValue:&value withObjCType:NULL] 
	autorelease];
}

+ (NSNumber *)numberWithUnsignedShort:(unsigned short)value
{
    return [[[NSUShortNumber alloc] initValue:&value withObjCType:NULL] 
	autorelease];
}

/* All the rest of these methods must be implemented by a subclass */
- (BOOL)boolValue
{
    [self subclassResponsibility:_cmd];
    return 0;
}

- (char)charValue
{
    [self subclassResponsibility:_cmd];
    return 0;
}

- (double)doubleValue
{
    [self subclassResponsibility:_cmd];
    return 0;
}

- (float)floatValue
{
    [self subclassResponsibility:_cmd];
    return 0;
}

- (int)intValue
{
    [self subclassResponsibility:_cmd];
    return 0;
}

- (long long)longLongValue
{
    [self subclassResponsibility:_cmd];
    return 0;
}

- (long)longValue
{
    [self subclassResponsibility:_cmd];
    return 0;
}

- (short)shortValue
{
    [self subclassResponsibility:_cmd];
    return 0;
}

- (NSString *)stringValue
{
    [self subclassResponsibility:_cmd];
    return 0;
}

- (unsigned char)unsignedCharValue
{
    [self subclassResponsibility:_cmd];
    return 0;
}

- (unsigned int)unsignedIntValue
{
    [self subclassResponsibility:_cmd];
    return 0;
}

- (unsigned long long)unsignedLongLongValue
{
    [self subclassResponsibility:_cmd];
    return 0;
}

- (unsigned long)unsignedLongValue
{
    [self subclassResponsibility:_cmd];
    return 0;
}

- (unsigned short)unsignedShortValue
{
    [self subclassResponsibility:_cmd];
    return 0;
}

- (NSComparisonResult)compare:(NSNumber *)otherNumber
{
    [self subclassResponsibility:_cmd];
    return 0;
}

// NSCoding (done by subclasses)
- (void)encodeWithCoder:(NSCoder *)coder
{
    [super encodeWithCoder:coder];
}

- (id)initWithCoder:(NSCoder *)coder
{
    [NSException raise:NSInconsistentArchiveException
	format:@"Cannot unarchive from NSNumber class - Need NSValueDecoder."];
    return self;
}

- description
{
  /* xxx This could be better integrated into concrete subclasses. */
  return [NSString stringWithFormat: @"%d", [self intValue]];
}

@end

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.