Changeset 03daabd in mainline for uspace/lib/c/include/adt/array.h
- Timestamp:
- 2019-10-06T19:47:36Z (5 years ago)
- Children:
- 5be6361
- Parents:
- 9559cf8
- git-author:
- Matthieu Riolo <matthieu.riolo@…> (2019-09-17 07:50:03)
- git-committer:
- Matthieu Riolo <matthieu.riolo@…> (2019-10-06 19:47:36)
- File:
-
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/include/adt/array.h
r9559cf8 r03daabd 33 33 */ 34 34 35 #ifndef LIBC_ DYN_ARRAY_H_36 #define LIBC_ DYN_ARRAY_H_35 #ifndef LIBC_ARRAY_H_ 36 #define LIBC_ARRAY_H_ 37 37 38 38 #include <errno.h> … … 50 50 /** No. of items in the array */ 51 51 size_t size; 52 } dyn_array_t;52 } array_t; 53 53 54 54 /** Initialize dynamic array … … 58 58 * @return void 59 59 */ 60 #define dyn_array_initialize(dyn_array, type) \61 _ dyn_array_initialize((dyn_array), sizeof(type))60 #define array_initialize(array, type) \ 61 _array_initialize((array), sizeof(type)) 62 62 63 63 /** Dynamic array accessor … … 65 65 * @return lvalue for the given item 66 66 */ 67 #define dyn_array_at(dyn_array, type, index) \68 (*((type *) ( dyn_array)->_data + index))67 #define array_at(array, type, index) \ 68 (*((type *) (array)->_data + index)) 69 69 70 70 /** Access last element … … 72 72 * @return lvalue for the last item 73 73 */ 74 #define dyn_array_last(dyn_array, type) \75 (*((type *) ( dyn_array)->_data + ((dyn_array)->size - 1)))74 #define array_last(array, type) \ 75 (*((type *) (array)->_data + ((array)->size - 1))) 76 76 77 77 /** Insert item at given position, shift rest of array … … 80 80 * @return ENOMEM on failure 81 81 */ 82 #define dyn_array_insert(dyn_array, type, index, value) \83 ({ 84 size_t _index = (index); 85 dyn_array_t *_da = (dyn_array);\86 errno_t rc = dyn_array_reserve(_da, _da->size + 1);\87 if (!rc) { 88 _ dyn_array_shift(_da, _index, 1);\89 dyn_array_at(_da, type, _index) = (value); \90 } 91 rc; 82 #define array_insert(array, type, index, value) \ 83 ({ \ 84 size_t _index = (index); \ 85 array_t *_da = (array); \ 86 errno_t rc = array_reserve(_da, _da->size + 1); \ 87 if (!rc) { \ 88 _array_shift(_da, _index, 1); \ 89 array_at(_da, type, _index) = (value); \ 90 } \ 91 rc; \ 92 92 }) 93 93 … … 97 97 * @return ENOMEM on failure 98 98 */ 99 #define dyn_array_append(dyn_array, type, value) \100 dyn_array_insert(dyn_array, type, (dyn_array)->size, (value))99 #define array_append(array, type, value) \ 100 array_insert(array, type, (array)->size, (value)) 101 101 102 102 /** Dynamic array iteration 103 103 * 104 * @param[in] dyn_array dyn_array_t (not pointer)105 * @param[in] it 106 * 104 * @param[in] array array_t (not pointer) 105 * @param[in] it name of variable used as iterator, it's pointer 106 * to @p type 107 107 */ 108 #define dyn_array_foreach(dyn_array, type, it) \109 for (type *it = NULL; it == NULL; it = (type *)1) 110 for (type *_it = (type *)( dyn_array)._data; \111 it = _it, _it != ((type *)( dyn_array)._data + (dyn_array).size);\108 #define array_foreach(array, type, it) \ 109 for (type *it = NULL; it == NULL; it = (type *)1) \ 110 for (type *_it = (type *)(array)._data; \ 111 it = _it, _it != ((type *)(array)._data + (array).size); \ 112 112 ++_it) 113 113 114 114 /** Find first occurence of value 115 115 * 116 * @param[in] dyn_array dyn_array_t *116 * @param[in] array array_t * 117 117 * @param[in] value value to search for 118 118 * 119 119 * @return index of found value or size of array when no found 120 120 */ 121 #define dyn_array_find(dyn_array, type, value) \122 ({ 123 size_t _result = ( dyn_array)->size; \124 dyn_array_foreach(*(dyn_array), type, _it) {\121 #define array_find(array, type, value) \ 122 ({ \ 123 size_t _result = (array)->size; \ 124 array_foreach(*(array), type, _it) { \ 125 125 if (*_it == value) { \ 126 _result = _it - (type *)( dyn_array)->_data;\127 break; \126 _result = _it - (type *)(array)->_data; \ 127 break; \ 128 128 } \ 129 } 130 _result; 129 } \ 130 _result; \ 131 131 }) 132 132 133 extern void dyn_array_destroy(dyn_array_t *);134 extern void dyn_array_remove(dyn_array_t *, size_t);135 void dyn_array_clear(dyn_array_t *);136 void dyn_array_clear_range(dyn_array_t *, size_t, size_t);137 extern errno_t dyn_array_concat(dyn_array_t *, dyn_array_t *);138 extern errno_t dyn_array_reserve(dyn_array_t *, size_t);133 extern void array_destroy(array_t *); 134 extern void array_remove(array_t *, size_t); 135 void array_clear(array_t *); 136 void array_clear_range(array_t *, size_t, size_t); 137 extern errno_t array_concat(array_t *, array_t *); 138 extern errno_t array_reserve(array_t *, size_t); 139 139 140 extern void _ dyn_array_initialize(dyn_array_t *, size_t);141 extern void _ dyn_array_shift(dyn_array_t *, size_t, size_t);142 extern void _ dyn_array_unshift(dyn_array_t *, size_t, size_t);140 extern void _array_initialize(array_t *, size_t); 141 extern void _array_shift(array_t *, size_t, size_t); 142 extern void _array_unshift(array_t *, size_t, size_t); 143 143 144 144 #endif
Note:
See TracChangeset
for help on using the changeset viewer.