|  | 1 # Map Interface | 
|  | 2 | 
|  | 3 <warning> | 
|  | 4 Outdated - Rewrite! | 
|  | 5 </warning> | 
|  | 6 | 
|  | 7 Similar to the list interface, the map interface provides a common API for implementing maps. | 
|  | 8 There are some minor subtle differences, though. | 
|  | 9 | 
|  | 10 First, the `remove` method is not always a destructive removal. | 
|  | 11 Instead, the last argument is a Boolean that indicates whether the element shall be destroyed or returned. | 
|  | 12 ```c | 
|  | 13 void *(*remove)(CxMap *map, CxHashKey key, bool destroy); | 
|  | 14 ``` | 
|  | 15 When you implement this method, you are either supposed to invoke the destructors and return `NULL`, | 
|  | 16 or just remove the element from the map and return it. | 
|  | 17 | 
|  | 18 Secondly, the iterator method is a bit more complete. The signature is as follows: | 
|  | 19 ```c | 
|  | 20 CxIterator (*iterator)(const CxMap *map, enum cx_map_iterator_type type); | 
|  | 21 ``` | 
|  | 22 There are three map iterator types: for values, for keys, for pairs. | 
|  | 23 Depending on the iterator type requested, you need to create an iterator with the correct methods that | 
|  | 24 return the requested thing. | 
|  | 25 There are no automatic checks to enforce this - it's completely up to you. | 
|  | 26 If you need inspiration on how to do that, check the hash map implementation that comes with UCX. | 
|  | 27 | 
|  | 28 ## Undocumented Symbols (TODO) | 
|  | 29 ### cx_empty_map | 
|  | 30 ### cxEmptyMap | 
|  | 31 ### cxMapFree | 
|  | 32 ### cxMapMutIterator | 
|  | 33 ### cxMapMutIteratorKeys | 
|  | 34 ### cxMapMutIteratorValues |