//
//  ACNumber.m
//  ST4
//
//  Created by Alan Condit on 3/19/12.
//  Copyright 2012 Alan Condit. All rights reserved.
//

#import "ACNumber.h"


@implementation ACNumber

+ (ACNumber *)numberWithBool:(BOOL)aBool
{
    return [[ACNumber alloc] initWithBool:aBool];
}

+ (ACNumber *)numberWithChar:(char)aChar
{
    return [[ACNumber alloc] initWithChar:aChar];
}

+ (ACNumber *)numberWithDouble:(double)aDouble
{
    return [[ACNumber alloc] initWithDouble:aDouble];
}

+ (ACNumber *)numberWithInt:(NSInteger)anInt
{
    return [[ACNumber alloc] initWithInteger:anInt];
}

+ (ACNumber *)numberWithInteger:(NSInteger)anInt
{
    return [[ACNumber alloc] initWithInteger:anInt];
}


- (id)init
{
    self = [super init];
    if (self) {
        // Initialization code here.
    }
    
    return self;
}

- (ACNumber *)initWithBool:(BOOL)aBool
{
    self = [super init];
    if ( self != nil ) {
        fBOOL = YES;
        fChar = NO;
        fDouble = NO;
        fNSInt = NO;
        u.b = aBool;
    }
    return self;
}

- (ACNumber *)initWithChar:(char)aChar
{
    self = [super init];
    if ( self != nil ) {
        fBOOL = NO;
        fChar = YES;
        fDouble = NO;
        fNSInt = NO;
        u.c = aChar;
    }
    return self;
}

- (ACNumber *)initWithDouble:(double)aDouble
{
    self = [super init];
    if ( self != nil ) {
        fBOOL = NO;
        fChar = NO;
        fDouble = YES;
        fNSInt = NO;
        u.d = aDouble;
    }
    return self;
}

- (ACNumber *)initWithInteger:(NSInteger)anInt
{
    self = [super init];
    if ( self != nil ) {
        fBOOL = NO;
        fChar = NO;
        fDouble = NO;
        fNSInt = YES;
        u.i = anInt;
    }
    return self;
}

- (void)dealloc
{
    [super dealloc];
}

- (BOOL)boolValue
{
    if (fBOOL)
        return u.b;
    else
        return NO;
}

- (char)charValue
{
    if (fChar)
        return u.c;
    else
        return (char)-1;
}

- (double)doubleValue
{
    if (fDouble)
        return u.d;
    else
        return 0.0;
}

- (NSInteger)intValue
{
    if (fNSInt)
        return u.i;
    else
        return -1;
}

- (NSInteger)integerValue
{
    if (fNSInt)
        return u.i;
    else
        return -1;
}

- (NSInteger)inc
{
    return (u.i+=1);
}

- (NSInteger)add:(NSInteger)anInt
{
    return (u.i+=anInt);
}

- (NSString *)description
{
    if (fBOOL)
        return (u.b == YES) ? @"true" : @"false"; 
    else if (fChar)
        return [NSString stringWithFormat:@"%c", u.c];
    else if (fNSInt)
        return [NSString stringWithFormat:@"%Ld", u.i];
    else if (fDouble)
        return [NSString stringWithFormat:@"%Lf", u.d];
    return @"ACNumber not valid";
}

@end