// QString.cs - A Qt to C# binding.
//
// Copyright (C) 2002  Adam Treat (manyoso@yahoo.com)
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2
// of the License, or (at your option) any later version.
//
// This program 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 General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
//
// Static file customized to allow unicode strings and
// other features


namespace Qt {

	using Qt;
	using System;
	using System.Runtime.InteropServices;

	public class QString : QtSupport, IDisposable {

		public enum SectionFlags {
			SectionDefault = 0,
			SectionSkipEmpty = 1,
			SectionIncludeLeadingSep = 2,
			SectionIncludeTrailingSep = 4,
			SectionCaseInsensitiveSeps = 8
		}

		
		[DllImport("libqtc")]
		private static extern IntPtr qt_QString_null ();
		public static readonly QString Null = new QString (qt_QString_null ());
		
		// TODO: Is there a good reason why this C# constructor is public?
		[DllImport("libqtc")]
		private static extern IntPtr qt_new_QString ();
		public QString () : this (QNull.Instance)
		{
			rawObject = qt_new_QString ();
		}

		// TODO: Make sure there is a QChar constructor that
		// handles unicode conversion
		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern IntPtr qt_new_QString1 (IntPtr arg1);
		public QString (QChar arg1) : this (QNull.Instance)
		{
			rawObject = qt_new_QString1 (arg1.RawObject);
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern IntPtr qt_new_QString2 (IntPtr arg1);
		public QString (QString arg1) : this (QNull.Instance)
		{
			rawObject = qt_new_QString2 (arg1.RawObject);
		}

		// TODO: Verify that this works. We have weak support for
		// QByteArray
		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern IntPtr qt_new_QString3 (IntPtr arg1);
		public QString (QByteArray arg1) : this (QNull.Instance)
		{
			rawObject = qt_new_QString3 (arg1.RawObject);
		}

		// TODO: This signature is wrong. The C++ version is
		// takes a pointer to a sequence of QChars, not a single
		// QChar
		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern IntPtr qt_new_QString4 (IntPtr unicode, uint length);
		public QString (QChar unicode, uint length) : this (QNull.Instance)
		{
			rawObject = qt_new_QString4 (unicode.RawObject, length);
			
		}
	
		[DllImport("libqtc")]
		private static extern IntPtr qt_QString_setUnicodeCodes(
			IntPtr raw,
			[MarshalAs(UnmanagedType.LPWStr)] string s,
			uint len);
		
		public QString( string s ): this( QNull.Instance )
		{
			rawObject = qt_new_QString ();
			rawObject = qt_QString_setUnicodeCodes(
				rawObject, s, (uint) s.Length );
		}

		internal QString (IntPtr ptr) : this (QNull.Instance)
		{
			rawObject = ptr;

		}

		internal QString (QNull dummy) : base (QNull.Instance) {}
		
		
		[DllImport("libqtc")]
		private static extern void qt_del_QString (IntPtr str);
		~QString ()
		{
			qt_del_QString (rawObject);
		}

		
		[DllImport("libqtc")]
		private static extern ushort qt_QChar_unicode (IntPtr raw);			
		
		public char this[int index]
		{
			get
			{
				return (char) qt_QChar_unicode(
					qt_QString_at( rawObject, (uint) index ) );
			}
		}
		
		public static implicit operator string ( QString s )
		{
			int length = (int) s.Length();
			char[] t = new char[length];
		
			for (int i = 0; i < length; i++ )
				t[i] = s[i];
		
			return new String(t);
		}
		
		public static implicit operator QString ( string s )
		{
			return new QString(s);
		}		
		
		public override string ToString ()
		{
			return (string) this;	
		}
		
		public static QString operator + ( QString a, QString b )
		{
			QString result = new QString (qt_new_QString2( a.rawObject ));
			result.rawObject = 
				qt_QString_append2( result.rawObject, b.rawObject );
			return result;		
		}		
		
		// TODO: Do we need ==, !=, Equals(), etc?

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern bool qt_QString_isNull (IntPtr raw);
		public bool IsNull ()
		{
			return qt_QString_isNull (rawObject);
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern bool qt_QString_isEmpty (IntPtr raw);
		public bool IsEmpty ()
		{
			return qt_QString_isEmpty (rawObject);
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern uint qt_QString_length (IntPtr raw);
		public uint Length ()
		{
			return qt_QString_length (rawObject);
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern void qt_QString_truncate (IntPtr raw, uint pos);
		public void Truncate (uint pos)
		{
			qt_QString_truncate (rawObject, pos);
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern IntPtr qt_QString_fill (IntPtr raw, IntPtr c, int len);
		public QString Fill (QChar c, int len)
		{
			return new QString (qt_QString_fill (rawObject, c.RawObject, len));
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern IntPtr qt_QString_arg (IntPtr raw, long a, int fieldwidth, int Q_base);
		public QString Arg (long a, int fieldwidth, int Q_base)
		{
			return new QString (qt_QString_arg (rawObject, a, fieldwidth, Q_base));
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern IntPtr qt_QString_arg1 (IntPtr raw, ulong a, int fieldwidth, int Q_base);
		public QString Arg (ulong a, int fieldwidth, int Q_base)
		{
			return new QString (qt_QString_arg1 (rawObject, a, fieldwidth, Q_base));

		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern IntPtr qt_QString_arg2 (IntPtr raw, int a, int fieldwidth, int Q_base);
		public QString Arg (int a, int fieldwidth, int Q_base)
		{
			return new QString (qt_QString_arg2 (rawObject, a, fieldwidth, Q_base));

		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern IntPtr qt_QString_arg3 (IntPtr raw, uint a, int fieldwidth, int Q_base);
		public QString Arg (uint a, int fieldwidth, int Q_base)
		{
			return new QString (qt_QString_arg3 (rawObject, a, fieldwidth, Q_base));

		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern IntPtr qt_QString_arg4 (IntPtr raw, short a, int fieldwidth, int Q_base);
		public QString Arg (short a, int fieldwidth, int Q_base)
		{
			return new QString (qt_QString_arg4 (rawObject, a, fieldwidth, Q_base));

		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern IntPtr qt_QString_arg5 (IntPtr raw, ushort a, int fieldwidth, int Q_base);
		public QString Arg (ushort a, int fieldwidth, int Q_base)
		{
			return new QString (qt_QString_arg5 (rawObject, a, fieldwidth, Q_base));

		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern IntPtr qt_QString_arg6 (IntPtr raw, char a, int fieldwidth);
		public QString Arg (char a, int fieldwidth)
		{
			return new QString (qt_QString_arg6 (rawObject, a, fieldwidth));

		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern IntPtr qt_QString_arg7 (IntPtr raw, IntPtr a, int fieldwidth);
		public QString Arg (QChar a, int fieldwidth)
		{
			return new QString (qt_QString_arg7 (rawObject, a.RawObject, fieldwidth));

		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern IntPtr qt_QString_arg8 (IntPtr raw, IntPtr a, int fieldwidth);
		public QString Arg (QString a, int fieldwidth)
		{
			return new QString (qt_QString_arg8 (rawObject, a.RawObject, fieldwidth));

		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern IntPtr qt_QString_arg9 (IntPtr raw, double a, int fieldwidth, char fmt, int prec);
		public QString Arg (double a, int fieldwidth, char fmt, int prec)
		{
			return new QString (qt_QString_arg9 (rawObject, a, fieldwidth, fmt, prec));
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern int qt_QString_find (IntPtr raw, IntPtr c, int index, bool cs);
		public int Find (QChar c, int index, bool cs)
		{
			return qt_QString_find (rawObject, c.RawObject, index, cs);
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern int qt_QString_find1 (IntPtr raw, char c, int index, bool cs);
		public int Find (char c, int index, bool cs)
		{
			return qt_QString_find1 (rawObject, c, index, cs);
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern int qt_QString_find2 (IntPtr raw, IntPtr str, int index, bool cs);
		public int Find (QString str, int index, bool cs)
		{
			return qt_QString_find2 (rawObject, str.RawObject, index, cs);
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern int qt_QString_find3 (IntPtr raw, IntPtr arg1, int index);
		public int Find (QRegExp arg1, int index)
		{
			return qt_QString_find3 (rawObject, arg1.RawObject, index);
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern int qt_QString_find4 (IntPtr raw, string str, int index);
		public int Find (string str, int index)
		{
			return qt_QString_find4 (rawObject, str, index);
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern int qt_QString_findRev (IntPtr raw, IntPtr c, int index, bool cs);
		public int FindRev (QChar c, int index, bool cs)
		{
			return qt_QString_findRev (rawObject, c.RawObject, index, cs);
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern int qt_QString_findRev1 (IntPtr raw, char c, int index, bool cs);
		public int FindRev (char c, int index, bool cs)
		{
			return qt_QString_findRev1 (rawObject, c, index, cs);
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern int qt_QString_findRev2 (IntPtr raw, IntPtr str, int index, bool cs);
		public int FindRev (QString str, int index, bool cs)
		{
			return qt_QString_findRev2 (rawObject, str.RawObject, index, cs);
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern int qt_QString_findRev3 (IntPtr raw, IntPtr arg1, int index);
		public int FindRev (QRegExp arg1, int index)
		{
			return qt_QString_findRev3 (rawObject, arg1.RawObject, index);
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern int qt_QString_findRev4 (IntPtr raw, string str, int index);
		public int FindRev (string str, int index)
		{
			return qt_QString_findRev4 (rawObject, str, index);
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern int qt_QString_contains (IntPtr raw, IntPtr c, bool cs);
		public int Contains (QChar c, bool cs)
		{
			return qt_QString_contains (rawObject, c.RawObject, cs);
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern int qt_QString_contains1 (IntPtr raw, char c, bool cs);
		public int Contains (char c, bool cs)
		{
			return qt_QString_contains1 (rawObject, c, cs);
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern int qt_QString_contains2 (IntPtr raw, string str, bool cs);
		public int Contains (string str, bool cs)
		{
			return qt_QString_contains2 (rawObject, str, cs);
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern int qt_QString_contains3 (IntPtr raw, IntPtr str, bool cs);
		public int Contains (QString str, bool cs)
		{
			return qt_QString_contains3 (rawObject, str.RawObject, cs);
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern int qt_QString_contains4 (IntPtr raw, IntPtr arg1);
		public int Contains (QRegExp arg1)
		{
			return qt_QString_contains4 (rawObject, arg1.RawObject);
		}

		// TODO: This is wrong. sep should be a QChar* in C++ terms
		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern IntPtr qt_QString_section (IntPtr raw, IntPtr sep, int start, int end, QString.SectionFlags SectionFlags);
		public QString Section (QChar sep, int start, int end, QString.SectionFlags SectionFlags)
		{
			return new QString (qt_QString_section (rawObject, sep.RawObject, start, end, SectionFlags));
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern IntPtr qt_QString_section1 (IntPtr raw, char sep, int start, int end, QString.SectionFlags SectionFlags);
		public QString Section (char sep, int start, int end, QString.SectionFlags SectionFlags)
		{
			return new QString (qt_QString_section1 (rawObject, sep, start, end, SectionFlags));
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern IntPtr qt_QString_section2 (IntPtr raw, string in_sep, int start, int end, QString.SectionFlags SectionFlags);
		public QString Section (string in_sep, int start, int end, QString.SectionFlags SectionFlags)
		{
			return new QString (qt_QString_section2 (rawObject, in_sep, start, end, SectionFlags));
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern IntPtr qt_QString_section3 (IntPtr raw, IntPtr in_sep, int start, int end, QString.SectionFlags SectionFlags);
		public QString Section (QString in_sep, int start, int end, QString.SectionFlags SectionFlags)
		{
			return new QString (qt_QString_section3 (rawObject, in_sep.RawObject, start, end, SectionFlags));
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern IntPtr qt_QString_section4 (IntPtr raw, IntPtr reg, int start, int end, QString.SectionFlags SectionFlags);
		public QString Section (QRegExp reg, int start, int end, QString.SectionFlags SectionFlags)
		{
			return new QString (qt_QString_section4 (rawObject, reg.RawObject, start, end, SectionFlags));
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern IntPtr qt_QString_left (IntPtr raw, uint len);
		public QString Left (uint len)
		{
			return new QString (qt_QString_left (rawObject, len));
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern IntPtr qt_QString_right (IntPtr raw, uint len);
		public QString Right (uint len)
		{
			return new QString (qt_QString_right (rawObject, len));
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern IntPtr qt_QString_mid (IntPtr raw, uint index, uint len);
		public QString Mid (uint index, uint len)
		{
			return new QString (qt_QString_mid (rawObject, index, len));
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern IntPtr qt_QString_leftJustify (IntPtr raw, uint width, IntPtr fill, bool trunc);
		public QString LeftJustify (uint width, QChar fill, bool trunc)
		{
			return new QString (qt_QString_leftJustify (rawObject, width, fill.RawObject, trunc));
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern IntPtr qt_QString_rightJustify (IntPtr raw, uint width, IntPtr fill, bool trunc);
		public QString RightJustify (uint width, QChar fill, bool trunc)
		{
			return new QString (qt_QString_rightJustify (rawObject, width, fill.RawObject, trunc));
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern IntPtr qt_QString_lower (IntPtr raw);
		public QString Lower ()
		{
			return new QString (qt_QString_lower (rawObject));
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern IntPtr qt_QString_upper (IntPtr raw);
		public QString Upper ()
		{
			return new QString (qt_QString_upper (rawObject));
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern IntPtr qt_QString_stripWhiteSpace (IntPtr raw);
		public QString StripWhiteSpace ()
		{
			return new QString (qt_QString_stripWhiteSpace (rawObject));
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern IntPtr qt_QString_simplifyWhiteSpace (IntPtr raw);
		public QString SimplifyWhiteSpace ()
		{
			return new QString (qt_QString_simplifyWhiteSpace (rawObject));
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern IntPtr qt_QString_insert (IntPtr raw, uint index, IntPtr arg1);
		public QString Insert (uint index, QString arg1)
		{
			return new QString (qt_QString_insert (rawObject, index, arg1.RawObject));
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern IntPtr qt_QString_insert1 (IntPtr raw, uint index, IntPtr arg1, uint len);
		public QString Insert (uint index, QChar arg1, uint len)
		{
			return new QString (qt_QString_insert1 (rawObject, index, arg1.RawObject, len));
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern IntPtr qt_QString_insert2 (IntPtr raw, uint index, IntPtr arg1);
		public QString Insert (uint index, QChar arg1)
		{
			return new QString (qt_QString_insert2 (rawObject, index, arg1.RawObject));
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern IntPtr qt_QString_insert3 (IntPtr raw, uint index, char c);
		public QString Insert (uint index, char c)
		{
			return new QString (qt_QString_insert3 (rawObject, index, c));
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern IntPtr qt_QString_append (IntPtr raw, char arg1);
		public QString Append (char arg1)
		{
			return new QString (qt_QString_append (rawObject, arg1));
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern IntPtr qt_QString_append1 (IntPtr raw, IntPtr arg1);
		public QString Append (QChar arg1)
		{
			return new QString (qt_QString_append1 (rawObject, arg1.RawObject));
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern IntPtr qt_QString_append2 (IntPtr raw, IntPtr arg1);
		public QString Append (QString arg1)
		{
			return new QString (qt_QString_append2 (rawObject, arg1.RawObject));
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern IntPtr qt_QString_prepend (IntPtr raw, char arg1);
		public QString Prepend (char arg1)
		{
			return new QString (qt_QString_prepend (rawObject, arg1));
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern IntPtr qt_QString_prepend1 (IntPtr raw, IntPtr arg1);
		public QString Prepend (QChar arg1)
		{
			return new QString (qt_QString_prepend1 (rawObject, arg1.RawObject));
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern IntPtr qt_QString_prepend2 (IntPtr raw, IntPtr arg1);
		public QString Prepend (QString arg1)
		{
			return new QString (qt_QString_prepend2 (rawObject, arg1.RawObject));
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern IntPtr qt_QString_remove (IntPtr raw, uint index, uint len);
		public QString Remove (uint index, uint len)
		{
			return new QString (qt_QString_remove (rawObject, index, len));
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern IntPtr qt_QString_replace (IntPtr raw, uint index, uint len, IntPtr arg1);
		public QString Replace (uint index, uint len, QString arg1)
		{
			return new QString (qt_QString_replace (rawObject, index, len, arg1.RawObject));
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern IntPtr qt_QString_replace1 (IntPtr raw, uint index, uint len, IntPtr arg1, uint clen);
		public QString Replace (uint index, uint len, QChar arg1, uint clen)
		{
			return new QString (qt_QString_replace1 (rawObject, index, len, arg1.RawObject, clen));
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern IntPtr qt_QString_replace2 (IntPtr raw, IntPtr arg1, IntPtr arg2);
		public QString Replace (QRegExp arg1, QString arg2)
		{
			return new QString (qt_QString_replace2 (rawObject, arg1.RawObject, arg2.RawObject));
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern short qt_QString_toShort (IntPtr raw, bool ok, int Q_base);
		public short ToShort (bool ok, int Q_base)
		{
			return qt_QString_toShort (rawObject, ok, Q_base);
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern ushort qt_QString_toUShort (IntPtr raw, bool ok, int Q_base);
		public ushort ToUShort (bool ok, int Q_base)
		{
			return qt_QString_toUShort (rawObject, ok, Q_base);
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern int qt_QString_toInt (IntPtr raw, bool ok, int Q_base);
		public int ToInt (bool ok, int Q_base)
		{
			return qt_QString_toInt (rawObject, ok, Q_base);
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern uint qt_QString_toUInt (IntPtr raw, bool ok, int Q_base);
		public uint ToUInt (bool ok, int Q_base)
		{
			return qt_QString_toUInt (rawObject, ok, Q_base);
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern long qt_QString_toLong (IntPtr raw, bool ok, int Q_base);
		public long ToLong (bool ok, int Q_base)
		{
			return qt_QString_toLong (rawObject, ok, Q_base);
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern ulong qt_QString_toULong (IntPtr raw, bool ok, int Q_base);
		public ulong ToULong (bool ok, int Q_base)
		{
			return qt_QString_toULong (rawObject, ok, Q_base);
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern float qt_QString_toFloat (IntPtr raw, bool ok);
		public float ToFloat (bool ok)
		{
			return qt_QString_toFloat (rawObject, ok);
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern double qt_QString_toDouble (IntPtr raw, bool ok);
		public double ToDouble (bool ok)
		{
			return qt_QString_toDouble (rawObject, ok);
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern IntPtr qt_QString_setNum (IntPtr raw, short arg1, int Q_base);
		public QString SetNum (short arg1, int Q_base)
		{
			return new QString (qt_QString_setNum (rawObject, arg1, Q_base));
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern IntPtr qt_QString_setNum1 (IntPtr raw, ushort arg1, int Q_base);
		public QString SetNum (ushort arg1, int Q_base)
		{
			return new QString (qt_QString_setNum1 (rawObject, arg1, Q_base));
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern IntPtr qt_QString_setNum2 (IntPtr raw, int arg1, int Q_base);
		public QString SetNum (int arg1, int Q_base)
		{
			return new QString (qt_QString_setNum2 (rawObject, arg1, Q_base));
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern IntPtr qt_QString_setNum3 (IntPtr raw, uint arg1, int Q_base);
		public QString SetNum (uint arg1, int Q_base)
		{
			return new QString (qt_QString_setNum3 (rawObject, arg1, Q_base));
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern IntPtr qt_QString_setNum4 (IntPtr raw, long arg1, int Q_base);
		public QString SetNum (long arg1, int Q_base)
		{
			return new QString (qt_QString_setNum4 (rawObject, arg1, Q_base));
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern IntPtr qt_QString_setNum5 (IntPtr raw, ulong arg1, int Q_base);
		public QString SetNum (ulong arg1, int Q_base)
		{
			return new QString (qt_QString_setNum5 (rawObject, arg1, Q_base));
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern IntPtr qt_QString_setNum6 (IntPtr raw, float arg1, char f, int prec);
		public QString SetNum (float arg1, char f, int prec)
		{
			return new QString (qt_QString_setNum6 (rawObject, arg1, f, prec));
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern IntPtr qt_QString_setNum7 (IntPtr raw, double arg1, char f, int prec);
		public QString SetNum (double arg1, char f, int prec)
		{
			return new QString (qt_QString_setNum7 (rawObject, arg1, f, prec));
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern void qt_QString_setExpand (IntPtr raw, uint index, IntPtr c);
		public void SetExpand (uint index, QChar c)
		{
			qt_QString_setExpand (rawObject, index, c.RawObject);
		}

		// TODO: The QChar functions need to get fixed
		
		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern IntPtr qt_QString_at (IntPtr raw, uint i);
		public QChar At (uint i)
		{
			return LookupObject (qt_QString_at (rawObject, i), typeof (QChar)) as QChar;
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern IntPtr qt_QString_constref (IntPtr raw, uint i);
		public QChar Constref (uint i)
		{
			return LookupObject (qt_QString_constref (rawObject, i), typeof (QChar)) as QChar;
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern IntPtr qt_QString_ref (IntPtr raw, uint i);
		public QChar Q_ref (uint i)
		{
			return LookupObject (qt_QString_ref (rawObject, i), typeof (QChar)) as QChar;
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern IntPtr qt_QString_unicode (IntPtr raw);
		public QChar Unicode ()
		{
			return LookupObject (qt_QString_unicode (rawObject), typeof (QChar)) as QChar;
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern string qt_QString_ascii (IntPtr raw);
		public string Ascii ()
		{
			return qt_QString_ascii (rawObject);
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern string qt_QString_latin1 (IntPtr raw);
		public string Latin1 ()
		{
			return qt_QString_latin1 (rawObject);
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern IntPtr qt_QString_utf8 (IntPtr raw);
		public QCString Utf8 ()
		{
			return LookupObject (qt_QString_utf8 (rawObject), typeof (QCString)) as QCString;
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern IntPtr qt_QString_local8Bit (IntPtr raw);
		public QCString Local8Bit ()
		{
			return LookupObject (qt_QString_local8Bit (rawObject), typeof (QCString)) as QCString;
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern IntPtr qt_QString_setUnicode (IntPtr raw, IntPtr unicode, uint len);
		public QString SetUnicode (QChar unicode, uint len)
		{
			return new QString (qt_QString_setUnicode (rawObject, unicode.RawObject, len));
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern IntPtr qt_QString_setLatin1 (IntPtr raw, string arg1, int len);
		public QString SetLatin1 (string arg1, int len)
		{
			return new QString (qt_QString_setLatin1 (rawObject, arg1, len));
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern int qt_QString_compare (IntPtr raw, IntPtr s);
		public int Compare (QString s)
		{
			return qt_QString_compare (rawObject, s.RawObject);
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern int qt_QString_localeAwareCompare (IntPtr raw, IntPtr s);
		public int LocaleAwareCompare (QString s)
		{
			return qt_QString_localeAwareCompare (rawObject, s.RawObject);
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern void qt_QString_compose (IntPtr raw);
		public void Compose ()
		{
			qt_QString_compose (rawObject);
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern string qt_QString_data (IntPtr raw);
		public string Data ()
		{
			return qt_QString_data (rawObject);
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern bool qt_QString_startsWith (IntPtr raw, IntPtr arg1);
		public bool StartsWith (QString arg1)
		{
			return qt_QString_startsWith (rawObject, arg1.RawObject);
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern bool qt_QString_endsWith (IntPtr raw, IntPtr arg1);
		public bool EndsWith (QString arg1)
		{
			return qt_QString_endsWith (rawObject, arg1.RawObject);
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern void qt_QString_setLength (IntPtr raw, uint newLength);
		public void SetLength (uint newLength)
		{
			qt_QString_setLength (rawObject, newLength);
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern bool qt_QString_simpleText (IntPtr raw);
		public bool SimpleText ()
		{
			return qt_QString_simpleText (rawObject);
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern bool qt_QString_isRightToLeft (IntPtr raw);
		public bool IsRightToLeft ()
		{
			return qt_QString_isRightToLeft (rawObject);
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern IntPtr qt_QString_number (long arg1, int Q_base);
		public static QString Number (long arg1, int Q_base)
		{
			return new QString (qt_QString_number (arg1, Q_base));
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern IntPtr qt_QString_number1 (ulong arg1, int Q_base);
		public static QString Number (ulong arg1, int Q_base)
		{
			return new QString (qt_QString_number1 (arg1, Q_base));
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern IntPtr qt_QString_number2 (int arg1, int Q_base);
		public static QString Number (int arg1, int Q_base)
		{
			return new QString (qt_QString_number2 (arg1, Q_base));
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern IntPtr qt_QString_number3 (uint arg1, int Q_base);
		public static QString Number (uint arg1, int Q_base)
		{
			return new QString (qt_QString_number3 (arg1, Q_base));
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern IntPtr qt_QString_number4 (double arg1, char f, int prec);
		public static QString Number (double arg1, char f, int prec)
		{
			return new QString (qt_QString_number4 (arg1, f, prec));
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern IntPtr qt_QString_fromLatin1 (string arg1, int len);
		public static QString FromLatin1 (string arg1, int len)
		{
			return new QString (qt_QString_fromLatin1 (arg1, len));
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern IntPtr qt_QString_fromUtf8 (QString arg1, int len);
		public static QString FromUtf8 (string arg1, int len)
		{
			return new QString (qt_QString_fromUtf8 (arg1, len));
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern IntPtr qt_QString_fromLocal8Bit (QString arg1, int len);
		public static QString FromLocal8Bit (string arg1, int len)
		{
			return new QString (qt_QString_fromLocal8Bit (arg1, len));
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern int qt_QString_compare1 (IntPtr s1, IntPtr s2);
		public static int Compare (QString s1, QString s2)
		{
			return qt_QString_compare1 (s1.RawObject, s2.RawObject);
		}

		[DllImport("libqtc", CharSet=CharSet.Ansi)]
		private static extern int qt_QString_localeAwareCompare1 (IntPtr s1, IntPtr s2);
		public static int LocaleAwareCompare (QString s1, QString s2)
		{
			return qt_QString_localeAwareCompare1 (s1.RawObject, s2.RawObject);
		}

		public QString Fill (QChar c)
		{
			return Fill(c, (int) -1);
		}

		public QString Arg (long a)
		{
			return Arg(a, (int) 0);
		}

		public QString Arg (long a, int fieldwidth)
		{
			return Arg(a, fieldwidth, (int) 10);
		}

		public QString Arg (ulong a)
		{
			return Arg(a, (int) 0);
		}

		public QString Arg (ulong a, int fieldwidth)
		{
			return Arg(a, fieldwidth, (int) 10);
		}

		public QString Arg (int a)
		{
			return Arg(a, (int) 0);
		}

		public QString Arg (int a, int fieldwidth)
		{
			return Arg(a, fieldwidth, (int) 10);
		}

		public QString Arg (uint a)
		{
			return Arg(a, (int) 0);
		}

		public QString Arg (uint a, int fieldwidth)
		{
			return Arg(a, fieldwidth, (int) 10);
		}

		public QString Arg (short a)
		{
			return Arg(a, (int) 0);
		}

		public QString Arg (short a, int fieldwidth)
		{
			return Arg(a, fieldwidth, (int) 10);
		}

		public QString Arg (ushort a)
		{
			return Arg(a, (int) 0);
		}

		public QString Arg (ushort a, int fieldwidth)
		{
			return Arg(a, fieldwidth, (int) 10);
		}

		public QString Arg (char a)
		{
			return Arg(a, (int) 0);
		}

		public QString Arg (QChar a)
		{
			return Arg(a, (int) 0);
		}

		public QString Arg (QString a)
		{
			return Arg(a, (int) 0);
		}

		public QString Arg (double a)
		{
			return Arg(a, (int) 0);
		}

		public QString Arg (double a, int fieldwidth)
		{
			return Arg(a, fieldwidth, (char) 'g');
		}

		public QString Arg (double a, int fieldwidth, char fmt)
		{
			return Arg(a, fieldwidth, fmt, (int) -1);
		}

		public int Find (QChar c)
		{
			return Find(c, (int) 0);
		}

		public int Find (QChar c, int index)
		{
			return Find(c, index, true);
		}

		public int Find (char c)
		{
			return Find(c, (int) 0);
		}

		public int Find (char c, int index)
		{
			return Find(c, index, true);
		}

		public int Find (QString str)
		{
			return Find(str, (int) 0);
		}

		public int Find (QString str, int index)
		{
			return Find(str, index, true);
		}

		public int Find (QRegExp arg1)
		{
			return Find(arg1, (int) 0);
		}

		public int Find (string str)
		{
			return Find(str, (int) 0);
		}

		public int FindRev (QChar c)
		{
			return FindRev(c, (int) -1);
		}

		public int FindRev (QChar c, int index)
		{
			return FindRev(c, index, true);
		}

		public int FindRev (char c)
		{
			return FindRev(c, (int) -1);
		}

		public int FindRev (char c, int index)
		{
			return FindRev(c, index, true);
		}

		public int FindRev (QString str)
		{
			return FindRev(str, (int) -1);
		}

		public int FindRev (QString str, int index)
		{
			return FindRev(str, index, true);
		}

		public int FindRev (QRegExp arg1)
		{
			return FindRev(arg1, (int) -1);
		}

		public int FindRev (string str)
		{
			return FindRev(str, (int) -1);
		}

		public int Contains (QChar c)
		{
			return Contains(c, true);
		}

		public int Contains (char c)
		{
			return Contains(c, true);
		}

		public int Contains (QString str)
		{
			return Contains(str, true);
		}

		public int Contains (string str)
		{
			return Contains(str, true);
		}

		public QString Section (QChar sep, int start)
		{
			return Section(sep, start, (int) 1);
		}

		public QString Section (QChar sep, int start, int end)
		{
			return Section(sep, start, end, QString.SectionFlags.SectionDefault);
		}

		public QString Section (char sep, int start)
		{
			return Section(sep, start, (int) 1);
		}

		public QString Section (char sep, int start, int end)
		{
			return Section(sep, start, end, QString.SectionFlags.SectionDefault);
		}

		public QString Section (QString in_sep, int start)
		{
			return Section(in_sep, start, (int) 1);
		}

		public QString Section (QString in_sep, int start, int end)
		{
			return Section(in_sep, start, end, QString.SectionFlags.SectionDefault);
		}

		public QString Section (string in_sep, int start)
		{
			return Section(in_sep, start, (int) 1);
		}

		public QString Section (string in_sep, int start, int end)
		{
			return Section(in_sep, start, end, QString.SectionFlags.SectionDefault);
		}

		public QString Section (QRegExp reg, int start)
		{
			return Section(reg, start, (int) 1);
		}

		public QString Section (QRegExp reg, int start, int end)
		{
			return Section(reg, start, end, QString.SectionFlags.SectionDefault);
		}

		public QString Mid (uint index)
		{
			return Mid(index, (uint) 1);
		}

		public QString LeftJustify (uint width)
		{
			return LeftJustify(width, new QChar ());
		}

		public QString LeftJustify (uint width, QChar fill)
		{
			return LeftJustify(width, fill, false);
		}

		public QString RightJustify (uint width)
		{
			return RightJustify(width, new QChar ());
		}

		public QString RightJustify (uint width, QChar fill)
		{
			return RightJustify(width, fill, false);
		}

		public short ToShort ()
		{
			return ToShort(false);
		}

		public short ToShort (bool ok)
		{
			return ToShort(ok, (int) 10);
		}

		public ushort ToUShort ()
		{
			return ToUShort(false);
		}

		public ushort ToUShort (bool ok)
		{
			return ToUShort(ok, (int) 10);
		}

		public int ToInt ()
		{
			return ToInt(false);
		}

		public int ToInt (bool ok)
		{
			return ToInt(ok, (int) 10);
		}

		public uint ToUInt ()
		{
			return ToUInt(false);
		}

		public uint ToUInt (bool ok)
		{
			return ToUInt(ok, (int) 10);
		}

		public long ToLong ()
		{
			return ToLong(false);
		}

		public long ToLong (bool ok)
		{
			return ToLong(ok, (int) 10);
		}

		public ulong ToULong ()
		{
			return ToULong(false);
		}

		public ulong ToULong (bool ok)
		{
			return ToULong(ok, (int) 10);
		}

		public float ToFloat ()
		{
			return ToFloat(false);
		}

		public double ToDouble ()
		{
			return ToDouble(false);
		}

		public QString SetNum (short arg1)
		{
			return SetNum(arg1, (int) 10);
		}

		public QString SetNum (ushort arg1)
		{
			return SetNum(arg1, (int) 10);
		}

		public QString SetNum (int arg1)
		{
			return SetNum(arg1, (int) 10);
		}

		public QString SetNum (uint arg1)
		{
			return SetNum(arg1, (int) 10);
		}

		public QString SetNum (long arg1)
		{
			return SetNum(arg1, (int) 10);
		}

		public QString SetNum (ulong arg1)
		{
			return SetNum(arg1, (int) 10);
		}

		public QString SetNum (float arg1)
		{
			return SetNum(arg1, (char) 'g');
		}

		public QString SetNum (float arg1, char f)
		{
			return SetNum(arg1, f, (int) 6);
		}

		public QString SetNum (double arg1)
		{
			return SetNum(arg1, (char) 'g');
		}

		public QString SetNum (double arg1, char f)
		{
			return SetNum(arg1, f, (int) 6);
		}

		public QString SetLatin1 (QString arg1)
		{
			return SetLatin1(arg1, (int) -1);
		}

		public static QString Number (long arg1)
		{
			return Number(arg1, (int) 10);
		}

		public static QString Number (ulong arg1)
		{
			return Number(arg1, (int) 10);
		}

		public static QString Number (int arg1)
		{
			return Number(arg1, (int) 10);
		}

		public static QString Number (uint arg1)
		{
			return Number(arg1, (int) 10);
		}

		public static QString Number (double arg1)
		{
			return Number(arg1, (char) 'g');
		}

		public static QString Number (double arg1, char f)
		{
			return Number(arg1, f, (int) 6);
		}

		public static QString FromLatin1 (QString arg1)
		{
			return FromLatin1(arg1, (int) -1);
		}

		public static QString FromUtf8 (QString arg1)
		{
			return FromUtf8(arg1, (int) -1);
		}

		public static QString FromLocal8Bit (QString arg1)
		{
			return FromLocal8Bit(arg1, (int) -1);
		}
	}
}
