|  | 1 # collection.h | 
|  | 2 | 
|  | 3 Collections in UCX 3 have several common features. | 
|  | 4 If you want to implement an own collection data type that uses the same features, you can use the | 
|  | 5 `CX_COLLECTION_BASE` macro at the beginning of your struct to roll out all members a usual UCX collection has. | 
|  | 6 ```c | 
|  | 7 struct my_fancy_collection_s { | 
|  | 8     CX_COLLECTION_BASE; | 
|  | 9     struct my_collection_data_s *data; | 
|  | 10 }; | 
|  | 11 ``` | 
|  | 12 Based on this structure, this header provides some convenience macros for invoking the destructor functions | 
|  | 13 that are part of the basic collection members. | 
|  | 14 The idea of having destructor functions within a collection is that you can destroy the collection _and_ the | 
|  | 15 contents with one single function call. | 
|  | 16 When you are implementing a collection, you are responsible for invoking the destructors at the right places, e.g. | 
|  | 17 when removing (and deleting) elements in the collection, clearing the collection, or - the most prominent case - | 
|  | 18 destroying the collection. | 
|  | 19 | 
|  | 20 You can always look at the UCX list and map implementations if you need some inspiration. |