34
34
xmmsv_coll_type_t type;
36
36
xmmsv_t *attributes;
38
/* List of ids, 0-terminated. */
41
size_t idlist_allocated;
39
int32_t *legacy_idlist;
46
43
static void xmmsv_coll_free (xmmsv_coll_t *coll);
48
static int xmmsv_coll_idlist_resize (xmmsv_coll_t *coll, size_t newsize);
52
47
* @defgroup CollectionStructure CollectionStructure
95
if (!(coll->idlist = x_new0 (uint32_t, 1))) {
100
coll->idlist_size = 1;
101
coll->idlist_allocated = 1;
104
91
coll->type = type;
93
coll->idlist = xmmsv_new_list ();
94
xmmsv_list_restrict_type (coll->idlist, XMMSV_TYPE_INT32);
106
96
coll->operands = xmmsv_new_list ();
107
97
xmmsv_list_restrict_type (coll->operands, XMMSV_TYPE_COLL);
109
99
coll->attributes = xmmsv_new_dict ();
101
coll->legacy_idlist = NULL;
111
103
/* user must give this back */
112
104
xmmsv_coll_ref (coll);
129
121
/* Unref all the operands and attributes */
130
122
xmmsv_unref (coll->operands);
132
123
xmmsv_unref (coll->attributes);
124
xmmsv_unref (coll->idlist);
125
if (coll->legacy_idlist) {
126
free (coll->legacy_idlist);
165
158
* @param ids the 0-terminated list of ids to store in the collection.
168
xmmsv_coll_set_idlist (xmmsv_coll_t *coll, unsigned int ids[])
161
xmmsv_coll_set_idlist (xmmsv_coll_t *coll, int ids[])
171
unsigned int size = 0;
173
x_return_if_fail (coll);
175
while (ids[size] != 0) {
181
if (!(coll->idlist = x_new0 (uint32_t, size))) {
186
for (i = 0; i < size; ++i) {
187
coll->idlist[i] = ids[i];
190
coll->idlist_size = size;
191
coll->idlist_allocated = size;
165
xmmsv_list_clear (coll->idlist);
166
for (i = 0; ids[i]; i++) {
167
xmmsv_list_append_int (coll->idlist, ids[i]);
272
249
* @return TRUE on success, false otherwise.
275
xmmsv_coll_idlist_append (xmmsv_coll_t *coll, unsigned int id)
252
xmmsv_coll_idlist_append (xmmsv_coll_t *coll, int id)
277
254
x_return_val_if_fail (coll, 0);
279
return xmmsv_coll_idlist_insert (coll, coll->idlist_size - 1, id);
256
return xmmsv_list_append_int (coll->idlist, id);
287
264
* @return TRUE on success, false otherwise.
290
xmmsv_coll_idlist_insert (xmmsv_coll_t *coll, unsigned int index, unsigned int id)
267
xmmsv_coll_idlist_insert (xmmsv_coll_t *coll, int index, int id)
293
269
x_return_val_if_fail (coll, 0);
295
if (index >= coll->idlist_size) {
299
/* We need more memory, reallocate */
300
if (coll->idlist_size == coll->idlist_allocated) {
302
size_t double_size = coll->idlist_allocated * 2;
303
success = xmmsv_coll_idlist_resize (coll, double_size);
304
x_return_val_if_fail (success, 0);
307
for (i = coll->idlist_size; i > index; i--) {
308
coll->idlist[i] = coll->idlist[i - 1];
311
coll->idlist[index] = id;
271
return xmmsv_list_insert_int (coll->idlist, index, id);
322
279
* @return TRUE on success, false otherwise.
325
xmmsv_coll_idlist_move (xmmsv_coll_t *coll, unsigned int index, unsigned int newindex)
282
xmmsv_coll_idlist_move (xmmsv_coll_t *coll, int index, int newindex)
330
284
x_return_val_if_fail (coll, 0);
332
if ((index >= coll->idlist_size - 1) || (newindex >= coll->idlist_size - 1)) {
336
tmp = coll->idlist[index];
337
if (index < newindex) {
338
for (i = index; i < newindex; i++) {
339
coll->idlist[i] = coll->idlist[i + 1];
342
else if (index > newindex) {
343
for (i = index; i > newindex; i--) {
344
coll->idlist[i] = coll->idlist[i - 1];
347
coll->idlist[newindex] = tmp;
286
return xmmsv_list_move (coll->idlist, index, newindex);
356
293
* @return TRUE on success, false otherwise.
359
xmmsv_coll_idlist_remove (xmmsv_coll_t *coll, unsigned int index)
296
xmmsv_coll_idlist_remove (xmmsv_coll_t *coll, int index)
364
298
x_return_val_if_fail (coll, 0);
366
if (index >= coll->idlist_size - 1) {
371
for (i = index; i < coll->idlist_size; i++) {
372
coll->idlist[i] = coll->idlist[i + 1];
375
/* Reduce memory usage by two if possible */
376
half_size = coll->idlist_allocated / 2;
377
if (coll->idlist_size <= half_size) {
378
xmmsv_coll_idlist_resize (coll, half_size);
300
return xmmsv_list_remove (coll->idlist, index);
390
309
xmmsv_coll_idlist_clear (xmmsv_coll_t *coll)
392
unsigned int empty[] = { 0 };
394
311
x_return_val_if_fail (coll, 0);
396
xmmsv_coll_set_idlist (coll, empty);
313
return xmmsv_list_clear (coll->idlist);
406
321
* @return TRUE on success, false otherwise.
409
xmmsv_coll_idlist_get_index (xmmsv_coll_t *coll, unsigned int index, uint32_t *val)
324
xmmsv_coll_idlist_get_index (xmmsv_coll_t *coll, int index, int32_t *val)
411
326
x_return_val_if_fail (coll, 0);
413
if (index >= (coll->idlist_size - 1)) {
417
*val = coll->idlist[index];
328
return xmmsv_list_get_int (coll->idlist, index, val);
427
336
* @return TRUE on success, false otherwise.
430
xmmsv_coll_idlist_set_index (xmmsv_coll_t *coll, unsigned int index, uint32_t val)
339
xmmsv_coll_idlist_set_index (xmmsv_coll_t *coll, int index, int32_t val)
432
341
x_return_val_if_fail (coll, 0);
434
if (index >= (coll->idlist_size - 1)) {
438
coll->idlist[index] = val;
343
return xmmsv_list_set_int (coll->idlist, index, val);
474
377
* Note that this must not be confused with the content of the
475
378
* collection, which must be queried using xmmsc_coll_query_ids!
380
* Also note that this function is deprecated (use xmmsv_coll_idlist_get
381
* instead) and that changes to the returned array will be ignored. The array
382
* is also not updated when the idlist is changed using the supplied functions.
383
* Additionally every call to this function allocates a new array, so calling
384
* it repetitively will be a performance penalty.
477
386
* @param coll The collection to consider.
478
387
* @return The 0-terminated list of ids.
481
390
xmmsv_coll_get_idlist (xmmsv_coll_t *coll)
392
xmmsv_list_iter_t *it;
396
x_return_null_if_fail (coll);
398
/* free and allocate a new legacy list */
399
if (coll->legacy_idlist) {
400
free (coll->legacy_idlist);
402
coll->legacy_idlist = calloc (xmmsv_coll_idlist_get_size (coll) + 1,
405
/* copy contents to legacy list */
406
for (xmmsv_get_list_iter (coll->idlist, &it), i = 0;
407
xmmsv_list_iter_valid (it);
408
xmmsv_list_iter_next (it), i++) {
409
xmmsv_list_iter_entry_int (it, &entry);
410
coll->legacy_idlist[i] = entry;
412
coll->legacy_idlist[i] = 0;
414
return coll->legacy_idlist;
418
* Return the list of ids stored in the collection.
419
* This function does not increase the refcount of the list, the reference is
420
* still owned by the collection.
422
* Note that this must not be confused with the content of the collection,
423
* which must be queried using xmmsc_coll_query_ids!
425
* @param coll The collection to consider.
426
* @return The 0-terminated list of ids.
429
xmmsv_coll_idlist_get (xmmsv_coll_t *coll)
483
431
x_return_null_if_fail (coll);
485
433
return coll->idlist;