2003-10-27 Daniel Kornhauser Eisenberg <dkor@alum.mit.edu>

* glib/ListBase.cs : Added Indexer to allow [] based adressing
        * glib/List.cs : Added DllImport for Indexer
        * glib/SList.cs : Added DllImport for Indexer

svn path=/trunk/gtk-sharp/; revision=19420
This commit is contained in:
Daniel Kornhauser Eisenberg 2003-10-27 04:58:42 +00:00
parent 9925ac1e6f
commit 737717e5a5
3 changed files with 49 additions and 14 deletions

View File

@ -76,6 +76,15 @@ namespace GLib {
return g_list_prepend (list, raw);
}
[DllImport("libglib-2.0-0.dll")]
static extern IntPtr g_list_nth_data (IntPtr l, uint n);
internal override IntPtr NthData (uint n)
{
return g_list_nth_data (Handle, n);
}
public List (IntPtr raw) : base (raw)
{
}

View File

@ -25,6 +25,7 @@ namespace GLib {
private bool managed = false;
protected System.Type element_type = null;
abstract internal IntPtr NthData (uint index);
abstract internal IntPtr GetData (IntPtr current);
abstract internal IntPtr Next (IntPtr current);
abstract internal int Length (IntPtr list);
@ -106,6 +107,15 @@ namespace GLib {
}
}
public object this [int index] {
get {
IntPtr data = NthData ((uint) index);
object ret = null;
ret = DataMarshal (data);
return ret;
}
}
// Synchronization could be tricky here. Hmm.
public bool IsSynchronized {
get { return false; }
@ -125,6 +135,26 @@ namespace GLib {
orig.CopyTo (array, index);
}
internal object DataMarshal (IntPtr data)
{
object ret = null;
if (element_type != null) {
if (element_type == typeof (string))
ret = Marshal.PtrToStringAnsi (data);
else if (element_type == typeof (int))
ret = (int) data;
else if (element_type.IsValueType)
ret = Marshal.PtrToStructure (data, element_type);
else
ret = Activator.CreateInstance (element_type, new object[] {data});
} else if (Object.IsObject (data))
ret = GLib.Object.GetObject (data, false);
return ret;
}
private class ListEnumerator : IEnumerator
{
private IntPtr current = IntPtr.Zero;
@ -139,20 +169,7 @@ namespace GLib {
get {
IntPtr data = list.GetData (current);
object ret = null;
if (list.element_type != null)
{
if (list.element_type == typeof (string))
ret = Marshal.PtrToStringAnsi (data);
else if (list.element_type == typeof (int))
ret = (int) data;
else if (list.element_type.IsValueType)
ret = Marshal.PtrToStructure (data, list.element_type);
else
ret = Activator.CreateInstance (list.element_type, new object[] {data});
}
else if (Object.IsObject (data))
ret = GLib.Object.GetObject (data, false);
ret = list.DataMarshal (data);
return ret;
}
}

View File

@ -76,6 +76,15 @@ namespace GLib {
return g_slist_prepend (list, raw);
}
[DllImport("libglib-2.0-0.dll")]
static extern IntPtr g_slist_nth_data (IntPtr l, uint n);
internal override IntPtr NthData (uint n)
{
return g_slist_nth_data (Handle, n);
}
public SList (IntPtr raw) : base (raw)
{
}