2 * mono-mlist.c: Managed object list implementation
5 * Paolo Molaro (lupus@ximian.com)
7 * Copyright 2006-2009 Novell, Inc (http://www.novell.com)
10 #include "mono/metadata/mono-mlist.h"
11 #include "mono/metadata/appdomain.h"
12 #include "mono/metadata/class-internals.h"
14 /* matches the System.MonoListItem object*/
22 * note: we only allocate in the root domain: this lists are
23 * not exposed to managed code
25 static MonoVTable
*monolist_item_vtable
= NULL
;
29 * @data: object to use as data
31 * Allocates a new managed list node with @data as the contents.
32 * A managed list node also represents a singly-linked list.
33 * Managed lists are garbage collected, so there is no free routine
34 * and the user is required to keep references to the managed list
35 * to prevent it from being garbage collected.
38 mono_mlist_alloc (MonoObject
*data
)
41 if (!monolist_item_vtable
) {
42 MonoClass
*klass
= mono_class_from_name (mono_defaults
.corlib
, "System", "MonoListItem");
43 monolist_item_vtable
= mono_class_vtable (mono_get_root_domain (), klass
);
44 g_assert (monolist_item_vtable
);
46 res
= (MonoMList
*)mono_object_new_fast (monolist_item_vtable
);
47 MONO_OBJECT_SETREF (res
, data
, data
);
52 * mono_mlist_get_data:
53 * @list: the managed list node
55 * Get the object stored in the list node @list.
58 mono_mlist_get_data (MonoMList
* list
)
64 * mono_mlist_set_data:
65 * @list: the managed list node
67 * Set the object content in the list node @list.
70 mono_mlist_set_data (MonoMList
* list
, MonoObject
*data
)
72 MONO_OBJECT_SETREF (list
, data
, data
);
76 * mono_mlist_set_next:
77 * @list: a managed list node
78 * @next: list node that will be next for the @list node.
80 * Set next node for @list to @next.
83 mono_mlist_set_next (MonoMList
* list
, MonoMList
*next
)
88 MONO_OBJECT_SETREF (list
, next
, next
);
94 * @list: the managed list
96 * Get the number of items in the list @list.
97 * Since managed lists are singly-linked, this operation takes O(n) time.
100 mono_mlist_length (MonoMList
* list
)
112 * @list: the managed list node
114 * Returns the next managed list node starting from @list.
117 mono_mlist_next (MonoMList
* list
)
124 * @list: the managed list node
126 * Returns the last managed list node in list @list.
127 * Since managed lists are singly-linked, this operation takes O(n) time.
130 mono_mlist_last (MonoMList
* list
)
141 * mono_mlist_prepend:
142 * @list: the managed list
143 * @data: the object to add to the list
145 * Allocate a new list node with @data as content and prepend it
146 * to the list @list. @list can be NULL.
149 mono_mlist_prepend (MonoMList
* list
, MonoObject
*data
)
151 MonoMList
* res
= mono_mlist_alloc (data
);
153 MONO_OBJECT_SETREF (res
, next
, list
);
159 * @list: the managed list
160 * @data: the object to add to the list
162 * Allocate a new list node with @data as content and append it
163 * to the list @list. @list can be NULL.
164 * Since managed lists are singly-linked, this operation takes O(n) time.
167 mono_mlist_append (MonoMList
* list
, MonoObject
*data
)
169 MonoMList
* res
= mono_mlist_alloc (data
);
171 MonoMList
* last
= mono_mlist_last (list
);
172 MONO_OBJECT_SETREF (last
, next
, res
);
180 find_prev (MonoMList
* list
, MonoMList
*item
)
182 MonoMList
* prev
= NULL
;
193 * mono_mlist_remove_item:
194 * @list: the managed list
195 * @data: the object to remove from the list
197 * Remove the list node @item from the managed list @list.
198 * Since managed lists are singly-linked, this operation can take O(n) time.
201 mono_mlist_remove_item (MonoMList
* list
, MonoMList
*item
)
209 prev
= find_prev (list
, item
);
211 MONO_OBJECT_SETREF (prev
, next
, item
->next
);