view dstep/foundation/NSDecimalNumber.d @ 16:19885b43130e

Huge update, the bridge actually works now
author Jacob Carlborg <doob@me.com>
date Sun, 03 Jan 2010 22:06:11 +0100
parents 7ff919f595d5
children b9de51448c6b
line wrap: on
line source

/**
 * Copyright: Copyright (c) 2009 Jacob Carlborg.
 * Authors: Jacob Carlborg
 * Version: Initial created: Aug 3, 2009 
 * License: $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost Software License 1.0)
 */
module dstep.foundation.NSDecimalNumber;

import dstep.foundation.NSCoder;
import dstep.foundation.NSDecimal;
import dstep.foundation.NSDictionary;
import dstep.foundation.NSObjCRuntime;
import dstep.foundation.NSObject;
import dstep.foundation.NSScanner;
import dstep.foundation.NSString;
import dstep.foundation.NSValue;
import dstep.objc.bridge.Bridge;
import dstep.objc.objc;

import bindings = dstep.foundation.NSDecimalNumber_bindings;

private
{
	NSString NSDecimalNumberExactnessException_;
	NSString NSDecimalNumberOverflowException_;
	NSString NSDecimalNumberUnderflowException_;
	NSString NSDecimalNumberDivideByZeroException_;
}

NSString NSDecimalNumberExactnessException ()
{
	if (NSDecimalNumberExactnessException_)
		return NSDecimalNumberExactnessException_;
		
	return NSDecimalNumberExactnessException_ = new NSString(bindings.NSDecimalNumberExactnessException);
}

NSString NSDecimalNumberOverflowException ()
{
	if (NSDecimalNumberOverflowException_)
		return NSDecimalNumberOverflowException_;
		
	return NSDecimalNumberOverflowException_ = new NSString(bindings.NSDecimalNumberOverflowException);
}

NSString NSDecimalNumberUnderflowException ()
{
	if (NSDecimalNumberUnderflowException_)
		return NSDecimalNumberUnderflowException_;
		
	return NSDecimalNumberUnderflowException_ = new NSString(bindings.NSDecimalNumberUnderflowException);
}

NSString NSDecimalNumberDivideByZeroException ()
{
	if (NSDecimalNumberDivideByZeroException_)
		return NSDecimalNumberDivideByZeroException_;
		
	return NSDecimalNumberDivideByZeroException_ = new NSString(bindings.NSDecimalNumberDivideByZeroException);
}

const TNSDecimalNumberExtensions = `

	NSDecimal decimalValue ()
	{
		return invokeObjcSelf!(NSDecimal, "decimalValue");
	}
`;

const TNSDecimalNumberScanning = `

	bool scanDecimal (NSDecimal* dcm)
	{
		return invokeObjcSelf!(bool, "scanDecimal:", NSDecimal*)(dcm);
	}
`;

class NSDecimalNumber : NSNumber
{
	mixin (ObjcWrap);
	
	this ()
	{
		super(typeof(this).alloc.init.objcObject);
	}
	
	typeof(this) init ()
	{
		return invokeObjcSelf!(typeof(this), "init");
	}

	NSDecimalNumber initWithMantissa (ulong mantissa, short exponent, bool flag)
	{
		return invokeObjcSelf!(NSDecimalNumber, "initWithMantissa:exponent:isNegative:", ulong, short, bool)(mantissa, exponent, flag);
	}

	this (ulong mantissa, short exponent, bool flag)
	{
		super(typeof(this).alloc.initWithMantissa(mantissa, exponent, flag).objcObject);
	}

	NSDecimalNumber initWithDecimal (NSDecimal dcm)
	{
		return invokeObjcSelf!(NSDecimalNumber, "initWithDecimal:", NSDecimal)(dcm);
	}

	this (NSDecimal dcm)
	{
		super(typeof(this).alloc.initWithDecimal(dcm).objcObject);
	}

	NSDecimalNumber initWithString (NSString numberValue)
	{
		return invokeObjcSelf!(NSDecimalNumber, "initWithString:", NSString)(numberValue);
	}

	this (NSString numberValue)
	{
		super(typeof(this).alloc.initWithString(numberValue).objcObject);
	}

	NSDecimalNumber initWithString (NSString numberValue, Object locale)
	{
		return invokeObjcSelf!(NSDecimalNumber, "initWithString:locale:", NSString, Object)(numberValue, locale);
	}

	this (NSString numberValue, Object locale)
	{
		super(typeof(this).alloc.initWithString(numberValue, locale).objcObject);
	}

	NSString descriptionWithLocale (Object locale)
	{
		return invokeObjcSelf!(NSString, "descriptionWithLocale:", Object)(locale);
	}

	NSDecimal decimalValue ()
	{
		return invokeObjcSelf!(NSDecimal, "decimalValue");
	}

	static NSDecimalNumber decimalNumberWithMantissa (ulong mantissa, short exponent, bool flag)
	{
		return invokeObjcSuperClass!(NSDecimalNumber, "decimalNumberWithMantissa:exponent:isNegative:", ulong, short, bool)(mantissa, exponent, flag);
	}

	static NSDecimalNumber decimalNumberWithDecimal (NSDecimal dcm)
	{
		return invokeObjcSuperClass!(NSDecimalNumber, "decimalNumberWithDecimal:", NSDecimal)(dcm);
	}

	static NSDecimalNumber decimalNumberWithString (NSString numberValue)
	{
		return invokeObjcSuperClass!(NSDecimalNumber, "decimalNumberWithString:", NSString)(numberValue);
	}

	static NSDecimalNumber decimalNumberWithString (NSString numberValue, Object locale)
	{
		return invokeObjcSuperClass!(NSDecimalNumber, "decimalNumberWithString:locale:", NSString, Object)(numberValue, locale);
	}

	static NSDecimalNumber zero ()
	{
		return invokeObjcSuperClass!(NSDecimalNumber, "zero");
	}

	static NSDecimalNumber one ()
	{
		return invokeObjcSuperClass!(NSDecimalNumber, "one");
	}

	static NSDecimalNumber minimumDecimalNumber ()
	{
		return invokeObjcSuperClass!(NSDecimalNumber, "minimumDecimalNumber");
	}

	static NSDecimalNumber maximumDecimalNumber ()
	{
		return invokeObjcSuperClass!(NSDecimalNumber, "maximumDecimalNumber");
	}

	static NSDecimalNumber notANumber ()
	{
		return invokeObjcSuperClass!(NSDecimalNumber, "notANumber");
	}

	NSDecimalNumber decimalNumberByAdding (NSDecimalNumber decimalNumber)
	{
		id result = invokeObjcSelf!(id, "decimalNumberByAdding:", NSDecimalNumber)(decimalNumber);
		return result is this.objcObject ? this : (result !is null ? new NSDecimalNumber(result) : null);
	}

	NSDecimalNumber decimalNumberByAdding (NSDecimalNumber decimalNumber, INSDecimalNumberBehaviors behavior)
	{
		id result = invokeObjcSelf!(id, "decimalNumberByAdding:withBehavior:", NSDecimalNumber, INSDecimalNumberBehaviors)(decimalNumber, behavior);
		return result is this.objcObject ? this : (result !is null ? new NSDecimalNumber(result) : null);
	}

	NSDecimalNumber decimalNumberBySubtracting (NSDecimalNumber decimalNumber)
	{
		id result = invokeObjcSelf!(id, "decimalNumberBySubtracting:", NSDecimalNumber)(decimalNumber);
		return result is this.objcObject ? this : (result !is null ? new NSDecimalNumber(result) : null);
	}

	NSDecimalNumber decimalNumberBySubtracting (NSDecimalNumber decimalNumber, INSDecimalNumberBehaviors behavior)
	{
		id result = invokeObjcSelf!(id, "decimalNumberBySubtracting:withBehavior:", NSDecimalNumber, INSDecimalNumberBehaviors)(decimalNumber, behavior);
		return result is this.objcObject ? this : (result !is null ? new NSDecimalNumber(result) : null);
	}

	NSDecimalNumber decimalNumberByMultiplyingBy (NSDecimalNumber decimalNumber)
	{
		id result = invokeObjcSelf!(id, "decimalNumberByMultiplyingBy:", NSDecimalNumber)(decimalNumber);
		return result is this.objcObject ? this : (result !is null ? new NSDecimalNumber(result) : null);
	}

	NSDecimalNumber decimalNumberByMultiplyingBy (NSDecimalNumber decimalNumber, INSDecimalNumberBehaviors behavior)
	{
		id result = invokeObjcSelf!(id, "decimalNumberByMultiplyingBy:withBehavior:", NSDecimalNumber, INSDecimalNumberBehaviors)(decimalNumber, behavior);
		return result is this.objcObject ? this : (result !is null ? new NSDecimalNumber(result) : null);
	}

	NSDecimalNumber decimalNumberByDividingBy (NSDecimalNumber decimalNumber)
	{
		id result = invokeObjcSelf!(id, "decimalNumberByDividingBy:", NSDecimalNumber)(decimalNumber);
		return result is this.objcObject ? this : (result !is null ? new NSDecimalNumber(result) : null);
	}

	NSDecimalNumber decimalNumberByDividingBy (NSDecimalNumber decimalNumber, INSDecimalNumberBehaviors behavior)
	{
		id result = invokeObjcSelf!(id, "decimalNumberByDividingBy:withBehavior:", NSDecimalNumber, INSDecimalNumberBehaviors)(decimalNumber, behavior);
		return result is this.objcObject ? this : (result !is null ? new NSDecimalNumber(result) : null);
	}

	NSDecimalNumber decimalNumberByRaisingToPower (NSUInteger power)
	{
		id result = invokeObjcSelf!(id, "decimalNumberByRaisingToPower:", NSUInteger)(power);
		return result is this.objcObject ? this : (result !is null ? new NSDecimalNumber(result) : null);
	}

	NSDecimalNumber decimalNumberByRaisingToPower (NSUInteger power, INSDecimalNumberBehaviors behavior)
	{
		id result = invokeObjcSelf!(id, "decimalNumberByRaisingToPower:withBehavior:", NSUInteger, INSDecimalNumberBehaviors)(power, behavior);
		return result is this.objcObject ? this : (result !is null ? new NSDecimalNumber(result) : null);
	}

	NSDecimalNumber decimalNumberByMultiplyingByPowerOf10 (short power)
	{
		id result = invokeObjcSelf!(id, "decimalNumberByMultiplyingByPowerOf10:", short)(power);
		return result is this.objcObject ? this : (result !is null ? new NSDecimalNumber(result) : null);
	}

	NSDecimalNumber decimalNumberByMultiplyingByPowerOf10 (short power, INSDecimalNumberBehaviors behavior)
	{
		id result = invokeObjcSelf!(id, "decimalNumberByMultiplyingByPowerOf10:withBehavior:", short, INSDecimalNumberBehaviors)(power, behavior);
		return result is this.objcObject ? this : (result !is null ? new NSDecimalNumber(result) : null);
	}

	NSDecimalNumber decimalNumberByRoundingAccordingToBehavior (INSDecimalNumberBehaviors behavior)
	{
		id result = invokeObjcSelf!(id, "decimalNumberByRoundingAccordingToBehavior:", INSDecimalNumberBehaviors)(behavior);
		return result is this.objcObject ? this : (result !is null ? new NSDecimalNumber(result) : null);
	}

	int compare (NSNumber decimalNumber)
	{
		return invokeObjcSelf!(int, "compare:", NSNumber)(decimalNumber);
	}

	static void setDefaultBehavior (INSDecimalNumberBehaviors behavior)
	{
		return invokeObjcSuperClass!(void, "setDefaultBehavior:", INSDecimalNumberBehaviors)(behavior);
	}

	static INSDecimalNumberBehaviors defaultBehavior ()
	{
		return invokeObjcSuperClass!(INSDecimalNumberBehaviors, "defaultBehavior");
	}

	char* objCType ()
	{
		return invokeObjcSelf!(char*, "objCType");
	}

	double doubleValue ()
	{
		return invokeObjcSelf!(double, "doubleValue");
	}
}

class NSDecimalNumberHandler : NSObject, INSDecimalNumberBehaviors, INSCoding
{
	mixin (ObjcWrap);
	
	this ()
	{
		super(typeof(this).alloc.init.objcObject);
	}
	
	typeof(this) init ()
	{
		return invokeObjcSelf!(typeof(this), "init");
	}

	static Object defaultDecimalNumberHandler ()
	{
		return invokeObjcSuperClass!(Object, "defaultDecimalNumberHandler");
	}

	Object initWithRoundingMode (uint roundingMode, short scale, bool exact, bool overflow, bool underflow, bool divideByZero)
	{
		return invokeObjcSelf!(Object, "initWithRoundingMode:scale:raiseOnExactness:raiseOnOverflow:raiseOnUnderflow:raiseOnDivideByZero:", uint, short, bool, bool, bool, bool)(roundingMode, scale, exact, overflow, underflow, divideByZero);
	}

	this (uint roundingMode, short scale, bool exact, bool overflow, bool underflow, bool divideByZero)
	{
		typeof(this).alloc.initWithRoundingMode(roundingMode, scale, exact, overflow, underflow, divideByZero);
	}

	static Object decimalNumberHandlerWithRoundingMode (uint roundingMode, short scale, bool exact, bool overflow, bool underflow, bool divideByZero)
	{
		return invokeObjcSuperClass!(Object, "decimalNumberHandlerWithRoundingMode:scale:raiseOnExactness:raiseOnOverflow:raiseOnUnderflow:raiseOnDivideByZero:", uint, short, bool, bool, bool, bool)(roundingMode, scale, exact, overflow, underflow, divideByZero);
	}

	uint roundingMode ()
	{
		return invokeObjcSelf!(uint, "roundingMode");
	}

	short scale ()
	{
		return invokeObjcSelf!(short, "scale");
	}

	NSDecimalNumber exceptionDuringOperation (SEL operation, uint error, NSDecimalNumber leftOperand, NSDecimalNumber rightOperand)
	{
		return invokeObjcSelf!(NSDecimalNumber, "exceptionDuringOperation:error:leftOperand:rightOperand:", SEL, uint, NSDecimalNumber, NSDecimalNumber)(operation, error, leftOperand, rightOperand);
	}

	void encodeWithCoder (NSCoder aCoder)
	{
		return invokeObjcSelf!(void, "encodeWithCoder:", NSCoder)(aCoder);
	}

	Object initWithCoder (NSCoder aDecoder)
	{
		return invokeObjcSelf!(Object, "initWithCoder:", NSCoder)(aDecoder);
	}

	this (NSCoder aDecoder)
	{
		typeof(this).alloc.initWithCoder(aDecoder);
	}
}

interface INSDecimalNumberBehaviors
{
	uint roundingMode ();
	short scale ();
	NSDecimalNumber exceptionDuringOperation (SEL operation, uint error, NSDecimalNumber leftOperand, NSDecimalNumber rightOperand);
}