1 /*
2  * List functions
3  *
4  * Copyright (C) 2006-2021, Joachim Metz <joachim.metz@gmail.com>
5  *
6  * Refer to AUTHORS for acknowledgements.
7  *
8  * This program is free software: you can redistribute it and/or modify
9  * it under the terms of the GNU Lesser General Public License as published by
10  * the Free Software Foundation, either version 3 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public License
19  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
20  */
21 
22 #if !defined( _LIBCDATA_LIST_H )
23 #define _LIBCDATA_LIST_H
24 
25 #include <common.h>
26 #include <types.h>
27 
28 #include "libcdata_extern.h"
29 #include "libcdata_libcerror.h"
30 #include "libcdata_libcthreads.h"
31 #include "libcdata_types.h"
32 
33 #if defined( __cplusplus )
34 extern "C" {
35 #endif
36 
37 typedef struct libcdata_internal_list libcdata_internal_list_t;
38 
39 struct libcdata_internal_list
40 {
41 	/* The number of elements
42 	 */
43 	int number_of_elements;
44 
45 	/* The first element
46 	 */
47 	libcdata_list_element_t *first_element;
48 
49 	/* The last element
50 	 */
51 	libcdata_list_element_t *last_element;
52 
53 #if defined( HAVE_MULTI_THREAD_SUPPORT ) && !defined( HAVE_LOCAL_LIBCDATA )
54 	/* The read/write lock
55 	 */
56 	libcthreads_read_write_lock_t *read_write_lock;
57 #endif
58 };
59 
60 LIBCDATA_EXTERN \
61 int libcdata_list_initialize(
62      libcdata_list_t **list,
63      libcerror_error_t **error );
64 
65 LIBCDATA_EXTERN \
66 int libcdata_list_free(
67      libcdata_list_t **list,
68      int (*value_free_function)(
69             intptr_t **value,
70             libcerror_error_t **error ),
71      libcerror_error_t **error );
72 
73 LIBCDATA_EXTERN \
74 int libcdata_list_empty(
75      libcdata_list_t *list,
76      int (*value_free_function)(
77             intptr_t **value,
78             libcerror_error_t **error ),
79      libcerror_error_t **error );
80 
81 LIBCDATA_EXTERN \
82 int libcdata_list_clone(
83      libcdata_list_t **destination_list,
84      libcdata_list_t *source_list,
85      int (*value_free_function)(
86             intptr_t **value,
87             libcerror_error_t **error ),
88      int (*value_clone_function)(
89             intptr_t **destination_value,
90             intptr_t *source_value,
91             libcerror_error_t **error ),
92      libcerror_error_t **error );
93 
94 LIBCDATA_EXTERN \
95 int libcdata_list_get_number_of_elements(
96      libcdata_list_t *list,
97      int *number_of_elements,
98      libcerror_error_t **error );
99 
100 LIBCDATA_EXTERN \
101 int libcdata_list_get_first_element(
102      libcdata_list_t *list,
103      libcdata_list_element_t **element,
104      libcerror_error_t **error );
105 
106 int libcdata_internal_list_set_first_element(
107      libcdata_internal_list_t *internal_list,
108      libcdata_list_element_t *element,
109      libcerror_error_t **error );
110 
111 LIBCDATA_EXTERN \
112 int libcdata_list_get_last_element(
113      libcdata_list_t *list,
114      libcdata_list_element_t **element,
115      libcerror_error_t **error );
116 
117 int libcdata_internal_list_set_last_element(
118      libcdata_internal_list_t *internal_list,
119      libcdata_list_element_t *element,
120      libcerror_error_t **error );
121 
122 LIBCDATA_EXTERN \
123 int libcdata_list_get_element_by_index(
124      libcdata_list_t *list,
125      int element_index,
126      libcdata_list_element_t **element,
127      libcerror_error_t **error );
128 
129 LIBCDATA_EXTERN \
130 int libcdata_list_get_value_by_index(
131      libcdata_list_t *list,
132      int element_index,
133      intptr_t **value,
134      libcerror_error_t **error );
135 
136 LIBCDATA_EXTERN \
137 int libcdata_list_prepend_element(
138      libcdata_list_t *list,
139      libcdata_list_element_t *element,
140      libcerror_error_t **error );
141 
142 LIBCDATA_EXTERN \
143 int libcdata_list_prepend_value(
144      libcdata_list_t *list,
145      intptr_t *value,
146      libcerror_error_t **error );
147 
148 LIBCDATA_EXTERN \
149 int libcdata_list_append_element(
150      libcdata_list_t *list,
151      libcdata_list_element_t *element,
152      libcerror_error_t **error );
153 
154 LIBCDATA_EXTERN \
155 int libcdata_list_append_value(
156      libcdata_list_t *list,
157      intptr_t *value,
158      libcerror_error_t **error );
159 
160 int libcdata_internal_list_insert_element_find_element(
161      libcdata_internal_list_t *internal_list,
162      intptr_t *value_to_insert,
163      int (*value_compare_function)(
164             intptr_t *first_value,
165             intptr_t *second_value,
166             libcerror_error_t **error ),
167      uint8_t insert_flags,
168      int *element_index,
169      libcdata_list_element_t **element,
170      libcerror_error_t **error );
171 
172 int libcdata_internal_list_insert_element_before_element(
173      libcdata_internal_list_t *internal_list,
174      libcdata_list_element_t *list_element,
175      libcdata_list_element_t *element_to_insert,
176      libcerror_error_t **error );
177 
178 LIBCDATA_EXTERN \
179 int libcdata_list_insert_element(
180      libcdata_list_t *list,
181      libcdata_list_element_t *element_to_insert,
182      int (*value_compare_function)(
183             intptr_t *first,
184             intptr_t *second,
185             libcerror_error_t **error ),
186      uint8_t insert_flags,
187      libcerror_error_t **error );
188 
189 LIBCDATA_EXTERN \
190 int libcdata_list_insert_value(
191      libcdata_list_t *list,
192      intptr_t *value,
193      int (*value_compare_function)(
194             intptr_t *first,
195             intptr_t *second,
196             libcerror_error_t **error ),
197      uint8_t insert_flags,
198      libcerror_error_t **error );
199 
200 LIBCDATA_EXTERN \
201 int libcdata_list_remove_element(
202      libcdata_list_t *list,
203      libcdata_list_element_t *element_to_remove,
204      libcerror_error_t **error );
205 
206 #if defined( __cplusplus )
207 }
208 #endif
209 
210 #endif /* !defined( _LIBCDATA_LIST_H ) */
211 
212