add single instance mode
[uwplayer.git] / ucx / cx / collection.h
1 /*
2  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
3  *
4  * Copyright 2023 Mike Becker, Olaf Wintermann All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions are met:
8  *
9  *   1. Redistributions of source code must retain the above copyright
10  *      notice, this list of conditions and the following disclaimer.
11  *
12  *   2. Redistributions in binary form must reproduce the above copyright
13  *      notice, this list of conditions and the following disclaimer in the
14  *      documentation and/or other materials provided with the distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
20  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26  * POSSIBILITY OF SUCH DAMAGE.
27  */
28 /**
29  * \file collection.h
30  * \brief Common definitions for various collection implementations.
31  * \author Mike Becker
32  * \author Olaf Wintermann
33  * \version 3.0
34  * \copyright 2-Clause BSD License
35  */
36
37 #ifndef UCX_COLLECTION_H
38 #define UCX_COLLECTION_H
39
40 #include "allocator.h"
41 #include "iterator.h"
42
43 #ifdef __cplusplus
44 extern "C" {
45 #endif
46
47 /**
48  * Special constant used for creating collections that are storing pointers.
49  */
50 #define CX_STORE_POINTERS 0
51
52 /**
53  * A comparator function comparing two collection elements.
54  */
55 typedef int(*cx_compare_func)(
56         void const *left,
57         void const *right
58 );
59
60 /**
61  * Use this macro to declare common members for a collection structure.
62  */
63 #define CX_COLLECTION_MEMBERS \
64     /** \
65      * The allocator to use. \
66      */ \
67     CxAllocator const *allocator; \
68     /** \
69      * The comparator function for the elements. \
70      */ \
71     cx_compare_func cmpfunc; \
72     /** \
73      * The size of each element. \
74      */ \
75     size_t item_size; \
76     /** \
77      * The number of currently stored elements. \
78      */ \
79     size_t size; \
80     /** \
81      * An optional simple destructor for the collection's elements. \
82      * \
83      * @attention Read the documentation of the particular collection implementation \
84      * whether this destructor shall only destroy the contents or also free the memory. \
85      */ \
86     cx_destructor_func simple_destructor; \
87     /** \
88      * An optional advanced destructor for the collection's elements. \
89      * \
90      * @attention Read the documentation of the particular collection implementation \
91      * whether this destructor shall only destroy the contents or also free the memory. \
92      */ \
93     cx_destructor_func2 advanced_destructor; \
94     /** \
95      * The pointer to additional data that is passed to the advanced destructor. \
96      */ \
97     void *destructor_data; \
98     /** \
99      * Indicates if this instance of a collection is supposed to store pointers \
100      * instead of copies of the actual objects. \
101      */ \
102     bool store_pointer;
103
104 /**
105  * Invokes the simple destructor function for a specific element.
106  *
107  * Usually only used by collection implementations. There should be no need
108  * to invoke this macro manually.
109  *
110  * @param c the collection
111  * @param e the element
112  */
113 #define cx_invoke_simple_destructor(c, e) \
114     (c)->simple_destructor((c)->store_pointer ? (*((void **) (e))) : (e))
115
116 /**
117  * Invokes the advanced destructor function for a specific element.
118  *
119  * Usually only used by collection implementations. There should be no need
120  * to invoke this macro manually.
121  *
122  * @param c the collection
123  * @param e the element
124  */
125 #define cx_invoke_advanced_destructor(c, e) \
126     (c)->advanced_destructor((c)->destructor_data, \
127     (c)->store_pointer ? (*((void **) (e))) : (e))
128
129
130 /**
131  * Invokes all available destructor functions for a specific element.
132  *
133  * Usually only used by collection implementations. There should be no need
134  * to invoke this macro manually.
135  *
136  * @param c the collection
137  * @param e the element
138  */
139 #define cx_invoke_destructor(c, e) \
140     if ((c)->simple_destructor) cx_invoke_simple_destructor(c,e); \
141     if ((c)->advanced_destructor) cx_invoke_advanced_destructor(c,e)
142
143 #ifdef __cplusplus
144 } // extern "C"
145 #endif
146
147 #endif // UCX_COLLECTION_H