This is MAConcreteNumber.m in view mode; [Download] [Up]
/* MAConcreteNumber - Concrete subclasses of MANumber
Copyright (C) 1995, Adam Fedor.
*/
# line 6 "MAConcreteNumber.m"
#ifdef NEXT_FOUNDATION
#import <foundation/NSString.h>
#import <foundation/NSException.h>
#import <foundation/NSCoder.h>
#else
#include <Foundation/NSString.h>
#include <Foundation/NSException.h>
#include <Foundation/NSCoder.h>
#endif
#include "MAConcreteNumber.h"
#include "MathArray/array_encoding.h"
/* This file should be run through a preprocessor with the macro MATH_ORDER
defined to a number from 0 to 1 cooresponding to each number type */
#if MATH_ORDER == 0
# define NumberTemplate MAComplexFloatNumber
# define TYPE_METHOD complexFloatValue
# define TYPE_FORMAT @"{%f,%f}"
#elif MATH_ORDER == 1
# define NumberTemplate MAComplexDoubleNumber
# define TYPE_METHOD complexDoubleValue
# define TYPE_FORMAT @"{%g,%g}"
#endif
@implementation NumberTemplate
- initValue:(const void *)value withObjCType:(const char *)type
{
typedef _dt = data;
self = [super init];
data = *(_dt *)value;
return self;
}
- (BOOL)boolValue
{
return data.real;
}
- (char)charValue
{
return data.real;
}
- (double)doubleValue
{
return data.real;
}
- (float)floatValue
{
return data.real;
}
- (int)intValue
{
return data.real;
}
- (long long)longLongValue
{
return data.real;
}
- (long)longValue
{
return data.real;
}
- (short)shortValue
{
return data.real;
}
- (NSString *)stringValue
{
return [NSString stringWithFormat:TYPE_FORMAT, data.real, data.imag];
}
- (unsigned char)unsignedCharValue
{
return data.real;
}
- (unsigned int)unsignedIntValue
{
return data.real;
}
- (unsigned long long)unsignedLongLongValue
{
return data.real;
}
- (unsigned long)unsignedLongValue
{
return data.real;
}
- (unsigned short)unsignedShortValue
{
return data.real;
}
- (complex_float)complexFloatValue
{
#if MATH_ORDER == 0
return data;
#else
complex_float other;
other.real = data.real; other.imag = data.imag;
return other;
#endif
}
- (complex_double)complexDoubleValue
{
#if MATH_ORDER == 0
complex_double other;
other.real = data.real; other.imag = data.imag;
return other;
#else
return data;
#endif
}
- (NSComparisonResult)compare:(NSNumber *)otherNumber
{
typedef _dt = data;
_dt other_data = [otherNumber TYPE_METHOD];
if (data.real == other_data.real && data.imag == other_data.imag)
return NSOrderedSame;
else // FIXME you can't order complex numbers. What should this do?
return NSOrderedAscending;
}
// Override these from NSValue
- (void)getValue:(void *)value
{
if (!value) {
[NSException raise:NSInvalidArgumentException
format:@"Cannot copy value into NULL pointer"];
/* NOT REACHED */
}
memcpy( value, &data, math_sizeof_type([self objCType]) );
}
- (const char *)objCType
{
typedef _dt = data;
return @encode(_dt);
}
// NSCoding
- (void)encodeWithCoder:(NSCoder *)coder
{
[super encodeWithCoder:coder];
[coder encodeValueOfObjCType:[self objCType] at:&data];
}
- (id)initWithCoder:(NSCoder *)coder
{
self = [super initWithCoder:coder];
[coder decodeValueOfObjCType:[self objCType] at:&data];
return self;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.