view dstep/foundation/NSString.d @ 14:89f3c3ef1fd2

Added the Foundation framework
author Jacob Carlborg <doob@me.com>
date Mon, 03 Aug 2009 15:23:15 +0200
parents
children 19885b43130e
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.NSString;

import dstep.foundation.NSArray;
import dstep.foundation.NSCharacterSet;
import dstep.foundation.NSData;
import dstep.foundation.NSDictionary;
import dstep.foundation.NSError;
import dstep.foundation.NSLocale;
import dstep.foundation.NSObject;
import dstep.foundation.NSRange;
import dstep.foundation.NSURL;
import dstep.limits;
import dstep.objc.bridge.Bridge;
import dstep.objc.objc : id;
import dstep.stdarg;

import bindings = dstep.foundation.NSString_bindings;

alias ushort unichar;
alias NSUInteger NSStringCompareOptions;
alias NSUInteger NSStringEncoding;
alias NSUInteger NSStringEncodingConversionOptions;

const NSString NSParseErrorException;
const NSString NSCharacterConversionException;

enum
{
	NSCaseInsensitiveSearch = 1,
	NSLiteralSearch = 2,
	NSBackwardsSearch = 4,
	NSAnchoredSearch = 8,
	NSNumericSearch = 64,
	NSDiacriticInsensitiveSearch = 128,
	NSWidthInsensitiveSearch = 256,
	NSForcedOrderingSearch = 512
}

enum
{
	NSASCIIStringEncoding = 1,
	NSNEXTSTEPStringEncoding = 2,
	NSJapaneseEUCStringEncoding = 3,
	NSUTF8StringEncoding = 4,
	NSISOLatin1StringEncoding = 5,
	NSSymbolStringEncoding = 6,
	NSNonLossyASCIIStringEncoding = 7,
	NSShiftJISStringEncoding = 8,
	NSISOLatin2StringEncoding = 9,
	NSUnicodeStringEncoding = 10,
	NSWindowsCP1251StringEncoding = 11,
	NSWindowsCP1252StringEncoding = 12,
	NSWindowsCP1253StringEncoding = 13,
	NSWindowsCP1254StringEncoding = 14,
	NSWindowsCP1250StringEncoding = 15,
	NSISO2022JPStringEncoding = 21,
	NSMacOSRomanStringEncoding = 30,
	NSUTF16StringEncoding = NSUnicodeStringEncoding,
	NSUTF16BigEndianStringEncoding = 0x90000100,
	NSUTF16LittleEndianStringEncoding = 0x94000100,
	NSUTF32StringEncoding = 0x8c000100,
	NSUTF32BigEndianStringEncoding = 0x98000100,
	NSUTF32LittleEndianStringEncoding = 0x9c000100
}

enum
{
	NSStringEncodingConversionAllowLossy = 1,
	NSStringEncodingConversionExternalRepresentation = 2
}

static this ()
{
	NSParseErrorException = new NSString(bindings.NSParseErrorException);
	NSCharacterConversionException = new NSString(bindings.NSCharacterConversionException);
}

class NSMutableString : NSString
{
	mixin ObjcWrap;
	mixin TNSMutableStringExtensionMethods;

	void replaceCharactersInRange (NSRange range, NSString aString)
	{
		return invokeObjcSelf!(void, "replaceCharactersInRange:withString:", NSRange, NSString)(range, aString);
	}
}

class NSString : NSObject, INSCopying, INSMutableCopying, INSCoding
{
	mixin ObjcWrap;
	mixin TNSExtendedStringPropertyListParsing;
	mixin TNSStringExtensionMethods;
	mixin TNSStringPathExtensions;
	mixin TNSURLUtilities;
	mixin TNSStringDeprecated;

	NSUInteger length ()
	{
		return invokeObjcSelf!(NSUInteger, "length");
	}

	ushort characterAtIndex (NSUInteger index)
	{
		return invokeObjcSelf!(ushort, "characterAtIndex:", NSUInteger)(index);
	}

	Object copyWithZone (NSZone* zone)
	{
		return invokeObjcSelf!(Object, "copyWithZone:", NSZone*)(zone);
	}

	Object mutableCopyWithZone (NSZone* zone)
	{
		return invokeObjcSelf!(Object, "mutableCopyWithZone:", NSZone*)(zone);
	}

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

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

	this (NSCoder aDecoder)
	{
		objcObject = Bridge.invokeObjcClassMethod!(id, "alloc")(objcClass);
		id result = Bridge.invokeObjcMethod!(id, "initWithCoder:", NSCoder)(objcObject, aDecoder);

		if (result)
			objcObject = ret;

		dObject = this;
	}
}

template TNSExtendedStringPropertyListParsing ()
{
	Object propertyList ()
	{
		return invokeObjcSelf!(Object, "propertyList");
	}

	NSDictionary propertyListFromStringsFileFormat ()
	{
		return invokeObjcSelf!(NSDictionary, "propertyListFromStringsFileFormat");
	}
}

template TNSMutableStringExtensionMethods ()
{
	void insertString (NSString aString, NSUInteger loc)
	{
		return invokeObjcSelf!(void, "insertString:atIndex:", NSString, NSUInteger)(aString, loc);
	}

	void deleteCharactersInRange (NSRange range)
	{
		return invokeObjcSelf!(void, "deleteCharactersInRange:", NSRange)(range);
	}

	void appendString (NSString aString)
	{
		return invokeObjcSelf!(void, "appendString:", NSString)(aString);
	}

	void appendFormat (NSString appendFormat, ...)
	{
		return invokeObjcSelf!(void, "appendFormat:", NSString)(appendFormat);
	}

	void setString (NSString aString)
	{
		return invokeObjcSelf!(void, "setString:", NSString)(aString);
	}

	Object initWithCapacity (NSUInteger capacity)
	{
		return invokeObjcSelf!(Object, "initWithCapacity:", NSUInteger)(capacity);
	}

	this (NSUInteger capacity)
	{
		objcObject = Bridge.invokeObjcClassMethod!(id, "alloc")(objcClass);
		id result = Bridge.invokeObjcMethod!(id, "initWithCapacity:", NSUInteger)(objcObject, capacity);

		if (result)
			objcObject = ret;

		dObject = this;
	}

	static Object stringWithCapacity (NSUInteger capacity)
	{
		return invokeObjcSelfClass!(Object, "stringWithCapacity:", NSUInteger)(capacity);
	}

	NSUInteger replaceOccurrencesOfString (NSString target, NSString replacement, uint options, NSRange searchRange)
	{
		return invokeObjcSelf!(NSUInteger, "replaceOccurrencesOfString:withString:options:range:", NSString, NSString, uint, NSRange)(target, replacement, options, searchRange);
	}
}

template TNSStringExtensionMethods ()
{
	void getCharacters (unichar* buffer)
	{
		return invokeObjcSelf!(void, "getCharacters:", unichar*)(buffer);
	}

	void getCharacters (unichar* buffer, NSRange aRange)
	{
		return invokeObjcSelf!(void, "getCharacters:range:", unichar*, NSRange)(buffer, aRange);
	}

	NSString substringFromIndex (NSUInteger from)
	{
		return invokeObjcSelf!(NSString, "substringFromIndex:", NSUInteger)(from);
	}

	NSString substringToIndex (NSUInteger to)
	{
		return invokeObjcSelf!(NSString, "substringToIndex:", NSUInteger)(to);
	}

	NSString substringWithRange (NSRange range)
	{
		return invokeObjcSelf!(NSString, "substringWithRange:", NSRange)(range);
	}

	int compare (NSString string)
	{
		return invokeObjcSelf!(int, "compare:", NSString)(string);
	}

	int compare (NSString string, uint mask)
	{
		return invokeObjcSelf!(int, "compare:options:", NSString, uint)(string, mask);
	}

	int compare (NSString string, uint mask, NSRange compareRange)
	{
		return invokeObjcSelf!(int, "compare:options:range:", NSString, uint, NSRange)(string, mask, compareRange);
	}

	int compare (NSString string, uint mask, NSRange compareRange, Object locale)
	{
		return invokeObjcSelf!(int, "compare:options:range:locale:", NSString, uint, NSRange, Object)(string, mask, compareRange, locale);
	}

	int caseInsensitiveCompare (NSString string)
	{
		return invokeObjcSelf!(int, "caseInsensitiveCompare:", NSString)(string);
	}

	int localizedCompare (NSString string)
	{
		return invokeObjcSelf!(int, "localizedCompare:", NSString)(string);
	}

	int localizedCaseInsensitiveCompare (NSString string)
	{
		return invokeObjcSelf!(int, "localizedCaseInsensitiveCompare:", NSString)(string);
	}

	bool isEqualToString (NSString aString)
	{
		return invokeObjcSelf!(bool, "isEqualToString:", NSString)(aString);
	}

	bool hasPrefix (NSString aString)
	{
		return invokeObjcSelf!(bool, "hasPrefix:", NSString)(aString);
	}

	bool hasSuffix (NSString aString)
	{
		return invokeObjcSelf!(bool, "hasSuffix:", NSString)(aString);
	}

	NSRange rangeOfString (NSString aString)
	{
		return invokeObjcSelf!(NSRange, "rangeOfString:", NSString)(aString);
	}

	NSRange rangeOfString (NSString aString, uint mask)
	{
		return invokeObjcSelf!(NSRange, "rangeOfString:options:", NSString, uint)(aString, mask);
	}

	NSRange rangeOfString (NSString aString, uint mask, NSRange searchRange)
	{
		return invokeObjcSelf!(NSRange, "rangeOfString:options:range:", NSString, uint, NSRange)(aString, mask, searchRange);
	}

	NSRange rangeOfString (NSString aString, uint mask, NSRange searchRange, NSLocale locale)
	{
		return invokeObjcSelf!(NSRange, "rangeOfString:options:range:locale:", NSString, uint, NSRange, NSLocale)(aString, mask, searchRange, locale);
	}

	NSRange rangeOfCharacterFromSet (NSCharacterSet aSet)
	{
		return invokeObjcSelf!(NSRange, "rangeOfCharacterFromSet:", NSCharacterSet)(aSet);
	}

	NSRange rangeOfCharacterFromSet (NSCharacterSet aSet, uint mask)
	{
		return invokeObjcSelf!(NSRange, "rangeOfCharacterFromSet:options:", NSCharacterSet, uint)(aSet, mask);
	}

	NSRange rangeOfCharacterFromSet (NSCharacterSet aSet, uint mask, NSRange searchRange)
	{
		return invokeObjcSelf!(NSRange, "rangeOfCharacterFromSet:options:range:", NSCharacterSet, uint, NSRange)(aSet, mask, searchRange);
	}

	NSRange rangeOfComposedCharacterSequenceAtIndex (NSUInteger index)
	{
		return invokeObjcSelf!(NSRange, "rangeOfComposedCharacterSequenceAtIndex:", NSUInteger)(index);
	}

	NSRange rangeOfComposedCharacterSequencesForRange (NSRange range)
	{
		return invokeObjcSelf!(NSRange, "rangeOfComposedCharacterSequencesForRange:", NSRange)(range);
	}

	NSString stringByAppendingString (NSString aString)
	{
		return invokeObjcSelf!(NSString, "stringByAppendingString:", NSString)(aString);
	}

	NSString stringByAppendingFormat (NSString stringByAppendingFormat, ...)
	{
		return invokeObjcSelf!(NSString, "stringByAppendingFormat:", NSString)(stringByAppendingFormat);
	}

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

	float floatValue ()
	{
		return invokeObjcSelf!(float, "floatValue");
	}

	int intValue ()
	{
		return invokeObjcSelf!(int, "intValue");
	}

	NSInteger integerValue ()
	{
		return invokeObjcSelf!(NSInteger, "integerValue");
	}

	long longLongValue ()
	{
		return invokeObjcSelf!(long, "longLongValue");
	}

	bool boolValue ()
	{
		return invokeObjcSelf!(bool, "boolValue");
	}

	NSArray componentsSeparatedByString (NSString separator)
	{
		return invokeObjcSelf!(NSArray, "componentsSeparatedByString:", NSString)(separator);
	}

	NSArray componentsSeparatedByCharactersInSet (NSCharacterSet separator)
	{
		return invokeObjcSelf!(NSArray, "componentsSeparatedByCharactersInSet:", NSCharacterSet)(separator);
	}

	NSString commonPrefixWithString (NSString aString, uint mask)
	{
		return invokeObjcSelf!(NSString, "commonPrefixWithString:options:", NSString, uint)(aString, mask);
	}

	NSString uppercaseString ()
	{
		return invokeObjcSelf!(NSString, "uppercaseString");
	}

	NSString lowercaseString ()
	{
		return invokeObjcSelf!(NSString, "lowercaseString");
	}

	NSString capitalizedString ()
	{
		return invokeObjcSelf!(NSString, "capitalizedString");
	}

	NSString stringByTrimmingCharactersInSet (NSCharacterSet set)
	{
		return invokeObjcSelf!(NSString, "stringByTrimmingCharactersInSet:", NSCharacterSet)(set);
	}

	NSString stringByPaddingToLength (NSUInteger newLength, NSString padString, NSUInteger padIndex)
	{
		return invokeObjcSelf!(NSString, "stringByPaddingToLength:withString:startingAtIndex:", NSUInteger, NSString, NSUInteger)(newLength, padString, padIndex);
	}

	void getLineStart (NSUInteger* startPtr, NSUInteger* lineEndPtr, NSUInteger* contentsEndPtr, NSRange range)
	{
		return invokeObjcSelf!(void, "getLineStart:end:contentsEnd:forRange:", NSUInteger*, NSUInteger*, NSUInteger*, NSRange)(startPtr, lineEndPtr, contentsEndPtr, range);
	}

	NSRange lineRangeForRange (NSRange range)
	{
		return invokeObjcSelf!(NSRange, "lineRangeForRange:", NSRange)(range);
	}

	void getParagraphStart (NSUInteger* startPtr, NSUInteger* parEndPtr, NSUInteger* contentsEndPtr, NSRange range)
	{
		return invokeObjcSelf!(void, "getParagraphStart:end:contentsEnd:forRange:", NSUInteger*, NSUInteger*, NSUInteger*, NSRange)(startPtr, parEndPtr, contentsEndPtr, range);
	}

	NSRange paragraphRangeForRange (NSRange range)
	{
		return invokeObjcSelf!(NSRange, "paragraphRangeForRange:", NSRange)(range);
	}

	NSString description ()
	{
		return invokeObjcSelf!(NSString, "description");
	}

	NSUInteger hash ()
	{
		return invokeObjcSelf!(NSUInteger, "hash");
	}

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

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

	NSData dataUsingEncoding (uint encoding, bool lossy)
	{
		return invokeObjcSelf!(NSData, "dataUsingEncoding:allowLossyConversion:", uint, bool)(encoding, lossy);
	}

	NSData dataUsingEncoding (uint encoding)
	{
		return invokeObjcSelf!(NSData, "dataUsingEncoding:", uint)(encoding);
	}

	bool canBeConvertedToEncoding (uint encoding)
	{
		return invokeObjcSelf!(bool, "canBeConvertedToEncoding:", uint)(encoding);
	}

	char* cStringUsingEncoding (uint encoding)
	{
		return invokeObjcSelf!(char*, "cStringUsingEncoding:", uint)(encoding);
	}

	bool getCString (char* buffer, NSUInteger maxBufferCount, uint encoding)
	{
		return invokeObjcSelf!(bool, "getCString:maxLength:encoding:", char*, NSUInteger, uint)(buffer, maxBufferCount, encoding);
	}

	bool getBytes (void* buffer, NSUInteger maxBufferCount, NSUInteger* usedBufferCount, uint encoding, uint options, NSRange range, NSRangePointer leftover)
	{
		return invokeObjcSelf!(bool, "getBytes:maxLength:usedLength:encoding:options:range:remainingRange:", void*, NSUInteger, NSUInteger*, uint, uint, NSRange, NSRangePointer)(buffer, maxBufferCount, usedBufferCount, encoding, options, range, leftover);
	}

	NSUInteger maximumLengthOfBytesUsingEncoding (uint enc)
	{
		return invokeObjcSelf!(NSUInteger, "maximumLengthOfBytesUsingEncoding:", uint)(enc);
	}

	NSUInteger lengthOfBytesUsingEncoding (uint enc)
	{
		return invokeObjcSelf!(NSUInteger, "lengthOfBytesUsingEncoding:", uint)(enc);
	}

	NSString decomposedStringWithCanonicalMapping ()
	{
		return invokeObjcSelf!(NSString, "decomposedStringWithCanonicalMapping");
	}

	NSString precomposedStringWithCanonicalMapping ()
	{
		return invokeObjcSelf!(NSString, "precomposedStringWithCanonicalMapping");
	}

	NSString decomposedStringWithCompatibilityMapping ()
	{
		return invokeObjcSelf!(NSString, "decomposedStringWithCompatibilityMapping");
	}

	NSString precomposedStringWithCompatibilityMapping ()
	{
		return invokeObjcSelf!(NSString, "precomposedStringWithCompatibilityMapping");
	}

	NSString stringByFoldingWithOptions (uint options, NSLocale locale)
	{
		return invokeObjcSelf!(NSString, "stringByFoldingWithOptions:locale:", uint, NSLocale)(options, locale);
	}

	NSString stringByReplacingOccurrencesOfString (NSString target, NSString replacement, uint options, NSRange searchRange)
	{
		return invokeObjcSelf!(NSString, "stringByReplacingOccurrencesOfString:withString:options:range:", NSString, NSString, uint, NSRange)(target, replacement, options, searchRange);
	}

	NSString stringByReplacingOccurrencesOfString (NSString target, NSString replacement)
	{
		return invokeObjcSelf!(NSString, "stringByReplacingOccurrencesOfString:withString:", NSString, NSString)(target, replacement);
	}

	NSString stringByReplacingCharactersInRange (NSRange range, NSString replacement)
	{
		return invokeObjcSelf!(NSString, "stringByReplacingCharactersInRange:withString:", NSRange, NSString)(range, replacement);
	}

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

	static uint defaultCStringEncoding ()
	{
		return invokeObjcSelfClass!(uint, "defaultCStringEncoding");
	}

	static NSStringEncoding* availableStringEncodings ()
	{
		return invokeObjcSelfClass!(NSStringEncoding*, "availableStringEncodings");
	}

	static NSString localizedNameOfStringEncoding (uint encoding)
	{
		return invokeObjcSelfClass!(NSString, "localizedNameOfStringEncoding:", uint)(encoding);
	}

	Object init ()
	{
		return invokeObjcSelf!(Object, "init");
	}

	this ()
	{
		objcObject = Bridge.invokeObjcClassMethod!(id, "alloc")(objcClass);
		id result = Bridge.invokeObjcMethod!(id, "init")(objcObject);

		if (result)
			objcObject = ret;

		dObject = this;
	}

	Object initWithCharactersNoCopy (unichar* characters, NSUInteger length, bool freeBuffer)
	{
		return invokeObjcSelf!(Object, "initWithCharactersNoCopy:length:freeWhenDone:", unichar*, NSUInteger, bool)(characters, length, freeBuffer);
	}

	this (unichar* characters, NSUInteger length, bool freeBuffer)
	{
		objcObject = Bridge.invokeObjcClassMethod!(id, "alloc")(objcClass);
		id result = Bridge.invokeObjcMethod!(id, "initWithCharactersNoCopy:length:freeWhenDone:", unichar*, NSUInteger, bool)(objcObject, characters, length, freeBuffer);

		if (result)
			objcObject = ret;

		dObject = this;
	}

	Object initWithCharacters (unichar* characters, NSUInteger length)
	{
		return invokeObjcSelf!(Object, "initWithCharacters:length:", unichar*, NSUInteger)(characters, length);
	}

	this (unichar* characters, NSUInteger length)
	{
		objcObject = Bridge.invokeObjcClassMethod!(id, "alloc")(objcClass);
		id result = Bridge.invokeObjcMethod!(id, "initWithCharacters:length:", unichar*, NSUInteger)(objcObject, characters, length);

		if (result)
			objcObject = ret;

		dObject = this;
	}

	Object initWithUTF8String (char* nullTerminatedCString)
	{
		return invokeObjcSelf!(Object, "initWithUTF8String:", char*)(nullTerminatedCString);
	}

	this (char* nullTerminatedCString)
	{
		objcObject = Bridge.invokeObjcClassMethod!(id, "alloc")(objcClass);
		id result = Bridge.invokeObjcMethod!(id, "initWithUTF8String:", char*)(objcObject, nullTerminatedCString);

		if (result)
			objcObject = ret;

		dObject = this;
	}

	Object initWithString (NSString aString)
	{
		return invokeObjcSelf!(Object, "initWithString:", NSString)(aString);
	}

	this (NSString aString)
	{
		objcObject = Bridge.invokeObjcClassMethod!(id, "alloc")(objcClass);
		id result = Bridge.invokeObjcMethod!(id, "initWithString:", NSString)(objcObject, aString);

		if (result)
			objcObject = ret;

		dObject = this;
	}

	Object initWithFormat (NSString initWithFormat, ...)
	{
		return invokeObjcSelf!(Object, "initWithFormat:", NSString)(initWithFormat);
	}

	this (NSString initWithFormat, ...)
	{
		objcObject = Bridge.invokeObjcClassMethod!(id, "alloc")(objcClass);
		id result = Bridge.invokeObjcMethod!(id, "initWithFormat:", NSString)(objcObject, initWithFormat);

		if (result)
			objcObject = ret;

		dObject = this;
	}

	Object initWithFormat (NSString format, char* argList)
	{
		return invokeObjcSelf!(Object, "initWithFormat:arguments:", NSString, char*)(format, argList);
	}

	this (NSString format, char* argList)
	{
		objcObject = Bridge.invokeObjcClassMethod!(id, "alloc")(objcClass);
		id result = Bridge.invokeObjcMethod!(id, "initWithFormat:arguments:", NSString, char*)(objcObject, format, argList);

		if (result)
			objcObject = ret;

		dObject = this;
	}

	Object initWithFormat (NSString format, Object locale, ...)
	{
		return invokeObjcSelf!(Object, "initWithFormat:locale:", NSString, Object)(format, locale);
	}

	this (NSString format, Object locale, ...)
	{
		objcObject = Bridge.invokeObjcClassMethod!(id, "alloc")(objcClass);
		id result = Bridge.invokeObjcMethod!(id, "initWithFormat:locale:", NSString, Object)(objcObject, format, locale);

		if (result)
			objcObject = ret;

		dObject = this;
	}

	Object initWithFormat (NSString format, Object locale, char* argList)
	{
		return invokeObjcSelf!(Object, "initWithFormat:locale:arguments:", NSString, Object, char*)(format, locale, argList);
	}

	this (NSString format, Object locale, char* argList)
	{
		objcObject = Bridge.invokeObjcClassMethod!(id, "alloc")(objcClass);
		id result = Bridge.invokeObjcMethod!(id, "initWithFormat:locale:arguments:", NSString, Object, char*)(objcObject, format, locale, argList);

		if (result)
			objcObject = ret;

		dObject = this;
	}

	Object initWithData (NSData data, uint encoding)
	{
		return invokeObjcSelf!(Object, "initWithData:encoding:", NSData, uint)(data, encoding);
	}

	this (NSData data, uint encoding)
	{
		objcObject = Bridge.invokeObjcClassMethod!(id, "alloc")(objcClass);
		id result = Bridge.invokeObjcMethod!(id, "initWithData:encoding:", NSData, uint)(objcObject, data, encoding);

		if (result)
			objcObject = ret;

		dObject = this;
	}

	Object initWithBytes (void* bytes, NSUInteger len, uint encoding)
	{
		return invokeObjcSelf!(Object, "initWithBytes:length:encoding:", void*, NSUInteger, uint)(bytes, len, encoding);
	}

	this (void* bytes, NSUInteger len, uint encoding)
	{
		objcObject = Bridge.invokeObjcClassMethod!(id, "alloc")(objcClass);
		id result = Bridge.invokeObjcMethod!(id, "initWithBytes:length:encoding:", void*, NSUInteger, uint)(objcObject, bytes, len, encoding);

		if (result)
			objcObject = ret;

		dObject = this;
	}

	Object initWithBytesNoCopy (void* bytes, NSUInteger len, uint encoding, bool freeBuffer)
	{
		return invokeObjcSelf!(Object, "initWithBytesNoCopy:length:encoding:freeWhenDone:", void*, NSUInteger, uint, bool)(bytes, len, encoding, freeBuffer);
	}

	this (void* bytes, NSUInteger len, uint encoding, bool freeBuffer)
	{
		objcObject = Bridge.invokeObjcClassMethod!(id, "alloc")(objcClass);
		id result = Bridge.invokeObjcMethod!(id, "initWithBytesNoCopy:length:encoding:freeWhenDone:", void*, NSUInteger, uint, bool)(objcObject, bytes, len, encoding, freeBuffer);

		if (result)
			objcObject = ret;

		dObject = this;
	}

	static Object string ()
	{
		return invokeObjcSelfClass!(Object, "string");
	}

	static Object stringWithString (NSString string)
	{
		return invokeObjcSelfClass!(Object, "stringWithString:", NSString)(string);
	}

	static Object stringWithCharacters (unichar* characters, NSUInteger length)
	{
		return invokeObjcSelfClass!(Object, "stringWithCharacters:length:", unichar*, NSUInteger)(characters, length);
	}

	static Object stringWithUTF8String (char* nullTerminatedCString)
	{
		return invokeObjcSelfClass!(Object, "stringWithUTF8String:", char*)(nullTerminatedCString);
	}

	static Object stringWithFormat (NSString stringWithFormat, ...)
	{
		return invokeObjcSelfClass!(Object, "stringWithFormat:", NSString)(stringWithFormat);
	}

	static Object localizedStringWithFormat (NSString localizedStringWithFormat, ...)
	{
		return invokeObjcSelfClass!(Object, "localizedStringWithFormat:", NSString)(localizedStringWithFormat);
	}

	Object initWithCString (char* nullTerminatedCString, uint encoding)
	{
		return invokeObjcSelf!(Object, "initWithCString:encoding:", char*, uint)(nullTerminatedCString, encoding);
	}

	this (char* nullTerminatedCString, uint encoding)
	{
		objcObject = Bridge.invokeObjcClassMethod!(id, "alloc")(objcClass);
		id result = Bridge.invokeObjcMethod!(id, "initWithCString:encoding:", char*, uint)(objcObject, nullTerminatedCString, encoding);

		if (result)
			objcObject = ret;

		dObject = this;
	}

	static Object stringWithCString (char* cString, uint enc)
	{
		return invokeObjcSelfClass!(Object, "stringWithCString:encoding:", char*, uint)(cString, enc);
	}

	Object initWithContentsOfURL (NSURL url, uint enc, NSError** error)
	{
		return invokeObjcSelf!(Object, "initWithContentsOfURL:encoding:error:", NSURL, uint, NSError**)(url, enc, error);
	}

	this (NSURL url, uint enc, NSError** error)
	{
		objcObject = Bridge.invokeObjcClassMethod!(id, "alloc")(objcClass);
		id result = Bridge.invokeObjcMethod!(id, "initWithContentsOfURL:encoding:error:", NSURL, uint, NSError**)(objcObject, url, enc, error);

		if (result)
			objcObject = ret;

		dObject = this;
	}

	Object initWithContentsOfFile (NSString path, uint enc, NSError** error)
	{
		return invokeObjcSelf!(Object, "initWithContentsOfFile:encoding:error:", NSString, uint, NSError**)(path, enc, error);
	}

	this (NSString path, uint enc, NSError** error)
	{
		objcObject = Bridge.invokeObjcClassMethod!(id, "alloc")(objcClass);
		id result = Bridge.invokeObjcMethod!(id, "initWithContentsOfFile:encoding:error:", NSString, uint, NSError**)(objcObject, path, enc, error);

		if (result)
			objcObject = ret;

		dObject = this;
	}

	static Object stringWithContentsOfURL (NSURL url, uint enc, NSError** error)
	{
		return invokeObjcSelfClass!(Object, "stringWithContentsOfURL:encoding:error:", NSURL, uint, NSError**)(url, enc, error);
	}

	static Object stringWithContentsOfFile (NSString path, uint enc, NSError** error)
	{
		return invokeObjcSelfClass!(Object, "stringWithContentsOfFile:encoding:error:", NSString, uint, NSError**)(path, enc, error);
	}

	Object initWithContentsOfURL (NSURL url, NSStringEncoding* enc, NSError** error)
	{
		return invokeObjcSelf!(Object, "initWithContentsOfURL:usedEncoding:error:", NSURL, NSStringEncoding*, NSError**)(url, enc, error);
	}

	this (NSURL url, NSStringEncoding* enc, NSError** error)
	{
		objcObject = Bridge.invokeObjcClassMethod!(id, "alloc")(objcClass);
		id result = Bridge.invokeObjcMethod!(id, "initWithContentsOfURL:usedEncoding:error:", NSURL, NSStringEncoding*, NSError**)(objcObject, url, enc, error);

		if (result)
			objcObject = ret;

		dObject = this;
	}

	Object initWithContentsOfFile (NSString path, NSStringEncoding* enc, NSError** error)
	{
		return invokeObjcSelf!(Object, "initWithContentsOfFile:usedEncoding:error:", NSString, NSStringEncoding*, NSError**)(path, enc, error);
	}

	this (NSString path, NSStringEncoding* enc, NSError** error)
	{
		objcObject = Bridge.invokeObjcClassMethod!(id, "alloc")(objcClass);
		id result = Bridge.invokeObjcMethod!(id, "initWithContentsOfFile:usedEncoding:error:", NSString, NSStringEncoding*, NSError**)(objcObject, path, enc, error);

		if (result)
			objcObject = ret;

		dObject = this;
	}

	static Object stringWithContentsOfURL (NSURL url, NSStringEncoding* enc, NSError** error)
	{
		return invokeObjcSelfClass!(Object, "stringWithContentsOfURL:usedEncoding:error:", NSURL, NSStringEncoding*, NSError**)(url, enc, error);
	}

	static Object stringWithContentsOfFile (NSString path, NSStringEncoding* enc, NSError** error)
	{
		return invokeObjcSelfClass!(Object, "stringWithContentsOfFile:usedEncoding:error:", NSString, NSStringEncoding*, NSError**)(path, enc, error);
	}

	bool writeToURL (NSURL url, bool useAuxiliaryFile, uint enc, NSError** error)
	{
		return invokeObjcSelf!(bool, "writeToURL:atomically:encoding:error:", NSURL, bool, uint, NSError**)(url, useAuxiliaryFile, enc, error);
	}

	bool writeToFile (NSString path, bool useAuxiliaryFile, uint enc, NSError** error)
	{
		return invokeObjcSelf!(bool, "writeToFile:atomically:encoding:error:", NSString, bool, uint, NSError**)(path, useAuxiliaryFile, enc, error);
	}
}

template TNSStringDeprecated ()
{
	char* cString ()
	{
		return invokeObjcSelf!(char*, "cString");
	}

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

	NSUInteger cStringLength ()
	{
		return invokeObjcSelf!(NSUInteger, "cStringLength");
	}

	void getCString (char* bytes)
	{
		return invokeObjcSelf!(void, "getCString:", char*)(bytes);
	}

	void getCString (char* bytes, NSUInteger maxLength)
	{
		return invokeObjcSelf!(void, "getCString:maxLength:", char*, NSUInteger)(bytes, maxLength);
	}

	void getCString (char* bytes, NSUInteger maxLength, NSRange aRange, NSRangePointer leftoverRange)
	{
		return invokeObjcSelf!(void, "getCString:maxLength:range:remainingRange:", char*, NSUInteger, NSRange, NSRangePointer)(bytes, maxLength, aRange, leftoverRange);
	}

	bool writeToFile (NSString path, bool useAuxiliaryFile)
	{
		return invokeObjcSelf!(bool, "writeToFile:atomically:", NSString, bool)(path, useAuxiliaryFile);
	}

	bool writeToURL (NSURL url, bool atomically)
	{
		return invokeObjcSelf!(bool, "writeToURL:atomically:", NSURL, bool)(url, atomically);
	}

	Object initWithContentsOfFile (NSString path)
	{
		return invokeObjcSelf!(Object, "initWithContentsOfFile:", NSString)(path);
	}

	this (NSString path)
	{
		objcObject = Bridge.invokeObjcClassMethod!(id, "alloc")(objcClass);
		id result = Bridge.invokeObjcMethod!(id, "initWithContentsOfFile:", NSString)(objcObject, path);

		if (result)
			objcObject = ret;

		dObject = this;
	}

	Object initWithContentsOfURL (NSURL url)
	{
		return invokeObjcSelf!(Object, "initWithContentsOfURL:", NSURL)(url);
	}

	this (NSURL url)
	{
		objcObject = Bridge.invokeObjcClassMethod!(id, "alloc")(objcClass);
		id result = Bridge.invokeObjcMethod!(id, "initWithContentsOfURL:", NSURL)(objcObject, url);

		if (result)
			objcObject = ret;

		dObject = this;
	}

	static Object stringWithContentsOfFile (NSString path)
	{
		return invokeObjcSelfClass!(Object, "stringWithContentsOfFile:", NSString)(path);
	}

	static Object stringWithContentsOfURL (NSURL url)
	{
		return invokeObjcSelfClass!(Object, "stringWithContentsOfURL:", NSURL)(url);
	}

	Object initWithCStringNoCopy (char* bytes, NSUInteger length, bool freeBuffer)
	{
		return invokeObjcSelf!(Object, "initWithCStringNoCopy:length:freeWhenDone:", char*, NSUInteger, bool)(bytes, length, freeBuffer);
	}

	this (char* bytes, NSUInteger length, bool freeBuffer)
	{
		objcObject = Bridge.invokeObjcClassMethod!(id, "alloc")(objcClass);
		id result = Bridge.invokeObjcMethod!(id, "initWithCStringNoCopy:length:freeWhenDone:", char*, NSUInteger, bool)(objcObject, bytes, length, freeBuffer);

		if (result)
			objcObject = ret;

		dObject = this;
	}

	Object initWithCString (char* bytes, NSUInteger length)
	{
		return invokeObjcSelf!(Object, "initWithCString:length:", char*, NSUInteger)(bytes, length);
	}

	this (char* bytes, NSUInteger length)
	{
		objcObject = Bridge.invokeObjcClassMethod!(id, "alloc")(objcClass);
		id result = Bridge.invokeObjcMethod!(id, "initWithCString:length:", char*, NSUInteger)(objcObject, bytes, length);

		if (result)
			objcObject = ret;

		dObject = this;
	}

	Object initWithCString (char* bytes)
	{
		return invokeObjcSelf!(Object, "initWithCString:", char*)(bytes);
	}

	this (char* bytes)
	{
		objcObject = Bridge.invokeObjcClassMethod!(id, "alloc")(objcClass);
		id result = Bridge.invokeObjcMethod!(id, "initWithCString:", char*)(objcObject, bytes);

		if (result)
			objcObject = ret;

		dObject = this;
	}

	static Object stringWithCString (char* bytes, NSUInteger length)
	{
		return invokeObjcSelfClass!(Object, "stringWithCString:length:", char*, NSUInteger)(bytes, length);
	}

	static Object stringWithCString (char* bytes)
	{
		return invokeObjcSelfClass!(Object, "stringWithCString:", char*)(bytes);
	}
}