1 /*
2 * Copyright (C) 2018 Alexander Borisov
3 *
4 * Author: Alexander Borisov <borisov@lexbor.com>
5 */
6
7 #ifndef LEXBOR_DOM_COLLECTION_H
8 #define LEXBOR_DOM_COLLECTION_H
9
10 #ifdef __cplusplus
11 extern "C" {
12 #endif
13
14 #include "lexbor/core/base.h"
15 #include "lexbor/core/array.h"
16
17 #include "lexbor/dom/interface.h"
18
19
20 typedef struct {
21 lexbor_array_t array;
22 lxb_dom_document_t *document;
23 }
24 lxb_dom_collection_t;
25
26
27 LXB_API lxb_dom_collection_t *
28 lxb_dom_collection_create(lxb_dom_document_t *document);
29
30 LXB_API lxb_status_t
31 lxb_dom_collection_init(lxb_dom_collection_t *col, size_t start_list_size);
32
33 LXB_API lxb_dom_collection_t *
34 lxb_dom_collection_destroy(lxb_dom_collection_t *col, bool self_destroy);
35
36
37 /*
38 * Inline functions
39 */
40 lxb_inline lxb_dom_collection_t *
lxb_dom_collection_make(lxb_dom_document_t * document,size_t start_list_size)41 lxb_dom_collection_make(lxb_dom_document_t *document, size_t start_list_size)
42 {
43 lxb_status_t status;
44 lxb_dom_collection_t *col;
45
46 col = lxb_dom_collection_create(document);
47 status = lxb_dom_collection_init(col, start_list_size);
48
49 if(status != LXB_STATUS_OK) {
50 return lxb_dom_collection_destroy(col, true);
51 }
52
53 return col;
54 }
55
56 lxb_inline void
lxb_dom_collection_clean(lxb_dom_collection_t * col)57 lxb_dom_collection_clean(lxb_dom_collection_t *col)
58 {
59 lexbor_array_clean(&col->array);
60 }
61
62 lxb_inline lxb_status_t
lxb_dom_collection_append(lxb_dom_collection_t * col,void * value)63 lxb_dom_collection_append(lxb_dom_collection_t *col, void *value)
64 {
65 return lexbor_array_push(&col->array, value);
66 }
67
68 lxb_inline lxb_dom_element_t *
lxb_dom_collection_element(lxb_dom_collection_t * col,size_t idx)69 lxb_dom_collection_element(lxb_dom_collection_t *col, size_t idx)
70 {
71 return (lxb_dom_element_t *) lexbor_array_get(&col->array, idx);
72 }
73
74 lxb_inline lxb_dom_node_t *
lxb_dom_collection_node(lxb_dom_collection_t * col,size_t idx)75 lxb_dom_collection_node(lxb_dom_collection_t *col, size_t idx)
76 {
77 return (lxb_dom_node_t *) lexbor_array_get(&col->array, idx);
78 }
79
80 lxb_inline size_t
lxb_dom_collection_length(lxb_dom_collection_t * col)81 lxb_dom_collection_length(lxb_dom_collection_t *col)
82 {
83 return lexbor_array_length(&col->array);
84 }
85
86 /*
87 * No inline functions for ABI.
88 */
89 LXB_API lxb_dom_collection_t *
90 lxb_dom_collection_make_noi(lxb_dom_document_t *document, size_t start_list_size);
91
92 LXB_API void
93 lxb_dom_collection_clean_noi(lxb_dom_collection_t *col);
94
95 LXB_API lxb_status_t
96 lxb_dom_collection_append_noi(lxb_dom_collection_t *col, void *value);
97
98 LXB_API lxb_dom_element_t *
99 lxb_dom_collection_element_noi(lxb_dom_collection_t *col, size_t idx);
100
101 LXB_API lxb_dom_node_t *
102 lxb_dom_collection_node_noi(lxb_dom_collection_t *col, size_t idx);
103
104 LXB_API size_t
105 lxb_dom_collection_length_noi(lxb_dom_collection_t *col);
106
107
108 #ifdef __cplusplus
109 } /* extern "C" */
110 #endif
111
112 #endif /* LEXBOR_DOM_COLLECTION_H */
113