1 /*
2  * List element functions
3  *
4  * Copyright (C) 2006-2020, 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_ELEMENT_H )
23 #define _LIBCDATA_LIST_ELEMENT_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_element libcdata_internal_list_element_t;
38 
39 struct libcdata_internal_list_element
40 {
41 	/* The list the element is part of
42 	 */
43 	intptr_t *parent_list;
44 
45 	/* The previous list element
46 	 */
47 	libcdata_list_element_t *previous_element;
48 
49 	/* The next list element
50 	 */
51 	libcdata_list_element_t *next_element;
52 
53 	/* The value
54 	 */
55 	intptr_t *value;
56 
57 #if defined( HAVE_MULTI_THREAD_SUPPORT ) && !defined( HAVE_LOCAL_LIBCDATA )
58 	/* The read/write lock
59 	 */
60 	libcthreads_read_write_lock_t *read_write_lock;
61 #endif
62 };
63 
64 LIBCDATA_EXTERN \
65 int libcdata_list_element_initialize(
66      libcdata_list_element_t **element,
67      libcerror_error_t **error );
68 
69 LIBCDATA_EXTERN \
70 int libcdata_list_element_free(
71      libcdata_list_element_t **element,
72      int (*value_free_function)(
73             intptr_t **value,
74             libcerror_error_t **error ),
75      libcerror_error_t **error );
76 
77 int libcdata_list_element_get_parent_list(
78      libcdata_list_element_t *element,
79      intptr_t **parent_list,
80      libcerror_error_t **error );
81 
82 int libcdata_list_element_set_parent_list(
83      libcdata_list_element_t *element,
84      intptr_t *parent_list,
85      libcerror_error_t **error );
86 
87 LIBCDATA_EXTERN \
88 int libcdata_list_element_get_previous_element(
89      libcdata_list_element_t *element,
90      libcdata_list_element_t **previous_element,
91      libcerror_error_t **error );
92 
93 LIBCDATA_EXTERN \
94 int libcdata_list_element_set_previous_element(
95      libcdata_list_element_t *element,
96      libcdata_list_element_t *previous_element,
97      libcerror_error_t **error );
98 
99 LIBCDATA_EXTERN \
100 int libcdata_list_element_get_next_element(
101      libcdata_list_element_t *element,
102      libcdata_list_element_t **next_element,
103      libcerror_error_t **error );
104 
105 LIBCDATA_EXTERN \
106 int libcdata_list_element_set_next_element(
107      libcdata_list_element_t *element,
108      libcdata_list_element_t *next_element,
109      libcerror_error_t **error );
110 
111 LIBCDATA_EXTERN \
112 int libcdata_list_element_get_elements(
113      libcdata_list_element_t *element,
114      libcdata_list_element_t **previous_element,
115      libcdata_list_element_t **next_element,
116      libcerror_error_t **error );
117 
118 LIBCDATA_EXTERN \
119 int libcdata_list_element_set_elements(
120      libcdata_list_element_t *element,
121      libcdata_list_element_t *previous_element,
122      libcdata_list_element_t *next_element,
123      libcerror_error_t **error );
124 
125 LIBCDATA_EXTERN \
126 int libcdata_list_element_get_value(
127      libcdata_list_element_t *element,
128      intptr_t **value,
129      libcerror_error_t **error );
130 
131 LIBCDATA_EXTERN \
132 int libcdata_list_element_set_value(
133      libcdata_list_element_t *element,
134      intptr_t *value,
135      libcerror_error_t **error );
136 
137 #if defined( __cplusplus )
138 }
139 #endif
140 
141 #endif /* !defined( _LIBCDATA_LIST_ELEMENT_H ) */
142 
143