garray.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  1. /* GLIB - Library of useful routines for C programming
  2. * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
  3. *
  4. * This library is free software; you can redistribute it and/or
  5. * modify it under the terms of the GNU Lesser General Public
  6. * License as published by the Free Software Foundation; either
  7. * version 2.1 of the License, or (at your option) any later version.
  8. *
  9. * This library is distributed in the hope that it will be useful,
  10. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  12. * Lesser General Public License for more details.
  13. *
  14. * You should have received a copy of the GNU Lesser General Public
  15. * License along with this library; if not, see <http://www.gnu.org/licenses/>.
  16. */
  17. /*
  18. * Modified by the GLib Team and others 1997-2000. See the AUTHORS
  19. * file for a list of people on the GLib Team. See the ChangeLog
  20. * files for a list of changes. These files are distributed with
  21. * GLib at ftp://ftp.gtk.org/pub/gtk/.
  22. */
  23. #ifndef __G_ARRAY_H__
  24. #define __G_ARRAY_H__
  25. #if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
  26. #error "Only <glib.h> can be included directly."
  27. #endif
  28. #include <glib/gtypes.h>
  29. G_BEGIN_DECLS
  30. typedef struct _GBytes GBytes;
  31. typedef struct _GArray GArray;
  32. typedef struct _GByteArray GByteArray;
  33. typedef struct _GPtrArray GPtrArray;
  34. struct _GArray
  35. {
  36. gchar *data;
  37. guint len;
  38. };
  39. struct _GByteArray
  40. {
  41. guint8 *data;
  42. guint len;
  43. };
  44. struct _GPtrArray
  45. {
  46. gpointer *pdata;
  47. guint len;
  48. };
  49. /* Resizable arrays. remove fills any cleared spot and shortens the
  50. * array, while preserving the order. remove_fast will distort the
  51. * order by moving the last element to the position of the removed.
  52. */
  53. #define g_array_append_val(a,v) g_array_append_vals (a, &(v), 1)
  54. #define g_array_prepend_val(a,v) g_array_prepend_vals (a, &(v), 1)
  55. #define g_array_insert_val(a,i,v) g_array_insert_vals (a, i, &(v), 1)
  56. #define g_array_index(a,t,i) (((t*) (void *) (a)->data) [(i)])
  57. GLIB_AVAILABLE_IN_ALL
  58. GArray* g_array_new (gboolean zero_terminated,
  59. gboolean clear_,
  60. guint element_size);
  61. GLIB_AVAILABLE_IN_ALL
  62. GArray* g_array_sized_new (gboolean zero_terminated,
  63. gboolean clear_,
  64. guint element_size,
  65. guint reserved_size);
  66. GLIB_AVAILABLE_IN_2_62
  67. GArray* g_array_copy (GArray *array);
  68. GLIB_AVAILABLE_IN_ALL
  69. gchar* g_array_free (GArray *array,
  70. gboolean free_segment);
  71. GLIB_AVAILABLE_IN_ALL
  72. GArray *g_array_ref (GArray *array);
  73. GLIB_AVAILABLE_IN_ALL
  74. void g_array_unref (GArray *array);
  75. GLIB_AVAILABLE_IN_ALL
  76. guint g_array_get_element_size (GArray *array);
  77. GLIB_AVAILABLE_IN_ALL
  78. GArray* g_array_append_vals (GArray *array,
  79. gconstpointer data,
  80. guint len);
  81. GLIB_AVAILABLE_IN_ALL
  82. GArray* g_array_prepend_vals (GArray *array,
  83. gconstpointer data,
  84. guint len);
  85. GLIB_AVAILABLE_IN_ALL
  86. GArray* g_array_insert_vals (GArray *array,
  87. guint index_,
  88. gconstpointer data,
  89. guint len);
  90. GLIB_AVAILABLE_IN_ALL
  91. GArray* g_array_set_size (GArray *array,
  92. guint length);
  93. GLIB_AVAILABLE_IN_ALL
  94. GArray* g_array_remove_index (GArray *array,
  95. guint index_);
  96. GLIB_AVAILABLE_IN_ALL
  97. GArray* g_array_remove_index_fast (GArray *array,
  98. guint index_);
  99. GLIB_AVAILABLE_IN_ALL
  100. GArray* g_array_remove_range (GArray *array,
  101. guint index_,
  102. guint length);
  103. GLIB_AVAILABLE_IN_ALL
  104. void g_array_sort (GArray *array,
  105. GCompareFunc compare_func);
  106. GLIB_AVAILABLE_IN_ALL
  107. void g_array_sort_with_data (GArray *array,
  108. GCompareDataFunc compare_func,
  109. gpointer user_data);
  110. GLIB_AVAILABLE_IN_2_62
  111. gboolean g_array_binary_search (GArray *array,
  112. gconstpointer target,
  113. GCompareFunc compare_func,
  114. guint *out_match_index);
  115. GLIB_AVAILABLE_IN_ALL
  116. void g_array_set_clear_func (GArray *array,
  117. GDestroyNotify clear_func);
  118. /* Resizable pointer array. This interface is much less complicated
  119. * than the above. Add appends a pointer. Remove fills any cleared
  120. * spot and shortens the array. remove_fast will again distort order.
  121. */
  122. #define g_ptr_array_index(array,index_) ((array)->pdata)[index_]
  123. GLIB_AVAILABLE_IN_ALL
  124. GPtrArray* g_ptr_array_new (void);
  125. GLIB_AVAILABLE_IN_ALL
  126. GPtrArray* g_ptr_array_new_with_free_func (GDestroyNotify element_free_func);
  127. GLIB_AVAILABLE_IN_2_62
  128. GPtrArray *g_ptr_array_copy (GPtrArray *array,
  129. GCopyFunc func,
  130. gpointer user_data);
  131. GLIB_AVAILABLE_IN_ALL
  132. GPtrArray* g_ptr_array_sized_new (guint reserved_size);
  133. GLIB_AVAILABLE_IN_ALL
  134. GPtrArray* g_ptr_array_new_full (guint reserved_size,
  135. GDestroyNotify element_free_func);
  136. GLIB_AVAILABLE_IN_ALL
  137. gpointer* g_ptr_array_free (GPtrArray *array,
  138. gboolean free_seg);
  139. GLIB_AVAILABLE_IN_ALL
  140. GPtrArray* g_ptr_array_ref (GPtrArray *array);
  141. GLIB_AVAILABLE_IN_ALL
  142. void g_ptr_array_unref (GPtrArray *array);
  143. GLIB_AVAILABLE_IN_ALL
  144. void g_ptr_array_set_free_func (GPtrArray *array,
  145. GDestroyNotify element_free_func);
  146. GLIB_AVAILABLE_IN_ALL
  147. void g_ptr_array_set_size (GPtrArray *array,
  148. gint length);
  149. GLIB_AVAILABLE_IN_ALL
  150. gpointer g_ptr_array_remove_index (GPtrArray *array,
  151. guint index_);
  152. GLIB_AVAILABLE_IN_ALL
  153. gpointer g_ptr_array_remove_index_fast (GPtrArray *array,
  154. guint index_);
  155. GLIB_AVAILABLE_IN_2_58
  156. gpointer g_ptr_array_steal_index (GPtrArray *array,
  157. guint index_);
  158. GLIB_AVAILABLE_IN_2_58
  159. gpointer g_ptr_array_steal_index_fast (GPtrArray *array,
  160. guint index_);
  161. GLIB_AVAILABLE_IN_ALL
  162. gboolean g_ptr_array_remove (GPtrArray *array,
  163. gpointer data);
  164. GLIB_AVAILABLE_IN_ALL
  165. gboolean g_ptr_array_remove_fast (GPtrArray *array,
  166. gpointer data);
  167. GLIB_AVAILABLE_IN_ALL
  168. GPtrArray *g_ptr_array_remove_range (GPtrArray *array,
  169. guint index_,
  170. guint length);
  171. GLIB_AVAILABLE_IN_ALL
  172. void g_ptr_array_add (GPtrArray *array,
  173. gpointer data);
  174. GLIB_AVAILABLE_IN_2_62
  175. void g_ptr_array_extend (GPtrArray *array_to_extend,
  176. GPtrArray *array,
  177. GCopyFunc func,
  178. gpointer user_data);
  179. GLIB_AVAILABLE_IN_2_62
  180. void g_ptr_array_extend_and_steal (GPtrArray *array_to_extend,
  181. GPtrArray *array);
  182. GLIB_AVAILABLE_IN_2_40
  183. void g_ptr_array_insert (GPtrArray *array,
  184. gint index_,
  185. gpointer data);
  186. GLIB_AVAILABLE_IN_ALL
  187. void g_ptr_array_sort (GPtrArray *array,
  188. GCompareFunc compare_func);
  189. GLIB_AVAILABLE_IN_ALL
  190. void g_ptr_array_sort_with_data (GPtrArray *array,
  191. GCompareDataFunc compare_func,
  192. gpointer user_data);
  193. GLIB_AVAILABLE_IN_ALL
  194. void g_ptr_array_foreach (GPtrArray *array,
  195. GFunc func,
  196. gpointer user_data);
  197. GLIB_AVAILABLE_IN_2_54
  198. gboolean g_ptr_array_find (GPtrArray *haystack,
  199. gconstpointer needle,
  200. guint *index_);
  201. GLIB_AVAILABLE_IN_2_54
  202. gboolean g_ptr_array_find_with_equal_func (GPtrArray *haystack,
  203. gconstpointer needle,
  204. GEqualFunc equal_func,
  205. guint *index_);
  206. /* Byte arrays, an array of guint8. Implemented as a GArray,
  207. * but type-safe.
  208. */
  209. GLIB_AVAILABLE_IN_ALL
  210. GByteArray* g_byte_array_new (void);
  211. GLIB_AVAILABLE_IN_ALL
  212. GByteArray* g_byte_array_new_take (guint8 *data,
  213. gsize len);
  214. GLIB_AVAILABLE_IN_ALL
  215. GByteArray* g_byte_array_sized_new (guint reserved_size);
  216. GLIB_AVAILABLE_IN_ALL
  217. guint8* g_byte_array_free (GByteArray *array,
  218. gboolean free_segment);
  219. GLIB_AVAILABLE_IN_ALL
  220. GBytes* g_byte_array_free_to_bytes (GByteArray *array);
  221. GLIB_AVAILABLE_IN_ALL
  222. GByteArray *g_byte_array_ref (GByteArray *array);
  223. GLIB_AVAILABLE_IN_ALL
  224. void g_byte_array_unref (GByteArray *array);
  225. GLIB_AVAILABLE_IN_ALL
  226. GByteArray* g_byte_array_append (GByteArray *array,
  227. const guint8 *data,
  228. guint len);
  229. GLIB_AVAILABLE_IN_ALL
  230. GByteArray* g_byte_array_prepend (GByteArray *array,
  231. const guint8 *data,
  232. guint len);
  233. GLIB_AVAILABLE_IN_ALL
  234. GByteArray* g_byte_array_set_size (GByteArray *array,
  235. guint length);
  236. GLIB_AVAILABLE_IN_ALL
  237. GByteArray* g_byte_array_remove_index (GByteArray *array,
  238. guint index_);
  239. GLIB_AVAILABLE_IN_ALL
  240. GByteArray* g_byte_array_remove_index_fast (GByteArray *array,
  241. guint index_);
  242. GLIB_AVAILABLE_IN_ALL
  243. GByteArray* g_byte_array_remove_range (GByteArray *array,
  244. guint index_,
  245. guint length);
  246. GLIB_AVAILABLE_IN_ALL
  247. void g_byte_array_sort (GByteArray *array,
  248. GCompareFunc compare_func);
  249. GLIB_AVAILABLE_IN_ALL
  250. void g_byte_array_sort_with_data (GByteArray *array,
  251. GCompareDataFunc compare_func,
  252. gpointer user_data);
  253. G_END_DECLS
  254. #endif /* __G_ARRAY_H__ */