mirror of
https://github.com/json-c/json-c.git
synced 2026-03-13 18:19:06 +08:00
The behavior of the json_object_array_put_idx() is that, if a user wants to insert an element inside a JSON array, the element will be replaced. For some cases, a user would want to insert an element into the JSON array and shift the elements to the right. For indexes that are outside the length of the current array this behaves like json_object_array_put_idx(). If a user wants to enforce that the JSON array is not expanded, then the json_object_array_length() function can be used to guard against that. The main driver for this change is JSON patch, where the 'add' operation in an array means inserting a value at a certain index and shifting everything by one. Signed-off-by: Alexandru Ardelean <ardeleanalex@gmail.com>
91 lines
2.5 KiB
C
91 lines
2.5 KiB
C
/*
|
|
* $Id: arraylist.h,v 1.4 2006/01/26 02:16:28 mclark Exp $
|
|
*
|
|
* Copyright (c) 2004, 2005 Metaparadigm Pte. Ltd.
|
|
* Michael Clark <michael@metaparadigm.com>
|
|
*
|
|
* This library is free software; you can redistribute it and/or modify
|
|
* it under the terms of the MIT license. See COPYING for details.
|
|
*
|
|
*/
|
|
|
|
/**
|
|
* @file
|
|
* @brief Internal methods for working with json_type_array objects.
|
|
* Although this is exposed by the json_object_get_array() method,
|
|
* it is not recommended for direct use.
|
|
*/
|
|
#ifndef _json_c_arraylist_h_
|
|
#define _json_c_arraylist_h_
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#include <stddef.h>
|
|
|
|
#define ARRAY_LIST_DEFAULT_SIZE 32
|
|
|
|
typedef void(array_list_free_fn)(void *data);
|
|
|
|
struct array_list
|
|
{
|
|
void **array;
|
|
size_t length;
|
|
size_t size;
|
|
array_list_free_fn *free_fn;
|
|
};
|
|
typedef struct array_list array_list;
|
|
|
|
/**
|
|
* Allocate an array_list of the default size (32).
|
|
* @deprecated Use array_list_new2() instead.
|
|
*/
|
|
extern struct array_list *array_list_new(array_list_free_fn *free_fn);
|
|
|
|
/**
|
|
* Allocate an array_list of the desired size.
|
|
*
|
|
* If possible, the size should be chosen to closely match
|
|
* the actual number of elements expected to be used.
|
|
* If the exact size is unknown, there are tradeoffs to be made:
|
|
* - too small - the array_list code will need to call realloc() more
|
|
* often (which might incur an additional memory copy).
|
|
* - too large - will waste memory, but that can be mitigated
|
|
* by calling array_list_shrink() once the final size is known.
|
|
*
|
|
* @see array_list_shrink
|
|
*/
|
|
extern struct array_list *array_list_new2(array_list_free_fn *free_fn, int initial_size);
|
|
|
|
extern void array_list_free(struct array_list *al);
|
|
|
|
extern void *array_list_get_idx(struct array_list *al, size_t i);
|
|
|
|
extern int array_list_insert_idx(struct array_list *al, size_t i, void *data);
|
|
|
|
extern int array_list_put_idx(struct array_list *al, size_t i, void *data);
|
|
|
|
extern int array_list_add(struct array_list *al, void *data);
|
|
|
|
extern size_t array_list_length(struct array_list *al);
|
|
|
|
extern void array_list_sort(struct array_list *arr, int (*compar)(const void *, const void *));
|
|
|
|
extern void *array_list_bsearch(const void **key, struct array_list *arr,
|
|
int (*compar)(const void *, const void *));
|
|
|
|
extern int array_list_del_idx(struct array_list *arr, size_t idx, size_t count);
|
|
|
|
/**
|
|
* Shrink the array list to just enough to fit the number of elements in it,
|
|
* plus empty_slots.
|
|
*/
|
|
extern int array_list_shrink(struct array_list *arr, size_t empty_slots);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif
|