garray.h 14 KB

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