xref: /php-src/ext/dom/lexbor/lexbor/dom/collection.h (revision f0934090)
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