1*1c60b9acSAndroid Build Coastguard Worker# lws_map generic map abstraction 2*1c60b9acSAndroid Build Coastguard Worker 3*1c60b9acSAndroid Build Coastguard Worker||| 4*1c60b9acSAndroid Build Coastguard Worker|---|---|---| 5*1c60b9acSAndroid Build Coastguard Worker|cmake|core feature| 6*1c60b9acSAndroid Build Coastguard Worker|Header| ./include/libwebsockets/lws-map.h| 7*1c60b9acSAndroid Build Coastguard Worker|api-test| ./minimal-examples/api-tests/api-test-lws_map/| 8*1c60b9acSAndroid Build Coastguard Worker 9*1c60b9acSAndroid Build Coastguard Workerlws_map provides a robust abstraction for containing a collection of items that 10*1c60b9acSAndroid Build Coastguard Workermap key objects to value objects, where both the key and value objects may 11*1c60b9acSAndroid Build Coastguard Workerdiffer in size each time and have any type. 12*1c60b9acSAndroid Build Coastguard Worker 13*1c60b9acSAndroid Build Coastguard WorkerIts one-level linked-list hashtables are useful up to hundreds or low thousands 14*1c60b9acSAndroid Build Coastguard Workerof items in the map on may platforms. 15*1c60b9acSAndroid Build Coastguard Worker 16*1c60b9acSAndroid Build Coastguard WorkerThe map itself and the items inside it are opaque. 17*1c60b9acSAndroid Build Coastguard Worker 18*1c60b9acSAndroid Build Coastguard Worker## Creating and destroying the map 19*1c60b9acSAndroid Build Coastguard Worker 20*1c60b9acSAndroid Build Coastguard WorkerThe user should prepare a `lws_map_info_t` object, it's legal for it to be 21*1c60b9acSAndroid Build Coastguard Workerall zeros to select defaults, an 8-way hashtable with item allocation from heap, 22*1c60b9acSAndroid Build Coastguard Workersimple bytewise key comparison, and xor / shift key hashing. These are often 23*1c60b9acSAndroid Build Coastguard Workerwhat you want simplifying construction. 24*1c60b9acSAndroid Build Coastguard Worker 25*1c60b9acSAndroid Build Coastguard WorkerThe info object allows user override of item allocator, freeing, key comparison 26*1c60b9acSAndroid Build Coastguard Workerand object hashing, allowing custom objects to be keys if desired. 27*1c60b9acSAndroid Build Coastguard Worker 28*1c60b9acSAndroid Build Coastguard WorkerCustom allocator / free implementations for using lwsac for item allocation are 29*1c60b9acSAndroid Build Coastguard Workerprovided to simplify that case. 30*1c60b9acSAndroid Build Coastguard Worker 31*1c60b9acSAndroid Build Coastguard WorkerJust call `lws_map_create()` with the info struct to create the map, later it 32*1c60b9acSAndroid Build Coastguard Workerand all its contents can be destroyed with `lws_map_destroy()`. The info struct 33*1c60b9acSAndroid Build Coastguard Workercan go out of scope immediately after the create call. 34*1c60b9acSAndroid Build Coastguard Worker 35*1c60b9acSAndroid Build Coastguard Worker``` 36*1c60b9acSAndroid Build Coastguard Workerlws_map_t * 37*1c60b9acSAndroid Build Coastguard Workerlws_map_create(const lws_map_info_t *info); 38*1c60b9acSAndroid Build Coastguard Workervoid 39*1c60b9acSAndroid Build Coastguard Workerlws_map_destroy(lws_map_t **pmap); 40*1c60b9acSAndroid Build Coastguard Worker``` 41*1c60b9acSAndroid Build Coastguard Worker 42*1c60b9acSAndroid Build Coastguard Worker## Keys in lws_map 43*1c60b9acSAndroid Build Coastguard Worker 44*1c60b9acSAndroid Build Coastguard WorkerItems are managed in the map by a key, this may be, eg, a string, but it also 45*1c60b9acSAndroid Build Coastguard Workercan be an arbitrary object itself. If comparing keys takes more than a simple 46*1c60b9acSAndroid Build Coastguard Workerbytewise comparison, the map creation info struct ._compare() operation should 47*1c60b9acSAndroid Build Coastguard Workerbe overridden with a user-supplied one that knows how to use the user's 48*1c60b9acSAndroid Build Coastguard Workercustom key objects. 49*1c60b9acSAndroid Build Coastguard Worker 50*1c60b9acSAndroid Build Coastguard WorkerKeys are not required to be the same length, so objects with variable size 51*1c60b9acSAndroid Build Coastguard Workeroverallocation can be used as keys. 52*1c60b9acSAndroid Build Coastguard Worker 53*1c60b9acSAndroid Build Coastguard WorkerKeys and values are copied into allocations inside the map, the original objects 54*1c60b9acSAndroid Build Coastguard Workerthey are copied from may go out of scope after item creation assuming there are 55*1c60b9acSAndroid Build Coastguard Workerno pointers to them copied in the objects themselves. 56*1c60b9acSAndroid Build Coastguard Worker 57*1c60b9acSAndroid Build Coastguard Worker## Adding items to a map 58*1c60b9acSAndroid Build Coastguard Worker 59*1c60b9acSAndroid Build Coastguard WorkerThe map's info._alloc allocator is used for creating items. By default that 60*1c60b9acSAndroid Build Coastguard Workerjust creates into the heap. 61*1c60b9acSAndroid Build Coastguard Worker 62*1c60b9acSAndroid Build Coastguard WorkerIf you create a new item with the same key as an existing one, the existing one 63*1c60b9acSAndroid Build Coastguard Workeris destroyed before the new one is created. So there is only one item allowed 64*1c60b9acSAndroid Build Coastguard Workerat a given key at a time. 65*1c60b9acSAndroid Build Coastguard Worker 66*1c60b9acSAndroid Build Coastguard WorkerTo allocate and create a new item containing the key and value, use 67*1c60b9acSAndroid Build Coastguard Worker`lws_map_item_create()` 68*1c60b9acSAndroid Build Coastguard Worker 69*1c60b9acSAndroid Build Coastguard Worker``` 70*1c60b9acSAndroid Build Coastguard Workerlws_map_item_t * 71*1c60b9acSAndroid Build Coastguard Workerlws_map_item_create(lws_map_t *map, 72*1c60b9acSAndroid Build Coastguard Worker const lws_map_key_t key, size_t keylen, 73*1c60b9acSAndroid Build Coastguard Worker const lws_map_value_t value, size_t valuelen); 74*1c60b9acSAndroid Build Coastguard Worker``` 75*1c60b9acSAndroid Build Coastguard Worker 76*1c60b9acSAndroid Build Coastguard WorkerEg, 77*1c60b9acSAndroid Build Coastguard Worker 78*1c60b9acSAndroid Build Coastguard Worker``` 79*1c60b9acSAndroid Build Coastguard Worker if (!lws_map_item_create(map, (lws_map_key_t)&my_key, 80*1c60b9acSAndroid Build Coastguard Worker sizeof(my_key), 81*1c60b9acSAndroid Build Coastguard Worker (lws_map_value_t)"4567", 4)) 82*1c60b9acSAndroid Build Coastguard Worker /* fail */ 83*1c60b9acSAndroid Build Coastguard Worker``` 84*1c60b9acSAndroid Build Coastguard Worker 85*1c60b9acSAndroid Build Coastguard Worker 86*1c60b9acSAndroid Build Coastguard WorkerIn the case the key is a string, there is a ..._ks wrapper to simplify usage 87*1c60b9acSAndroid Build Coastguard Worker 88*1c60b9acSAndroid Build Coastguard Worker``` 89*1c60b9acSAndroid Build Coastguard Worker if (!lws_map_item_create_ks(map, "123", (lws_map_value_t)"4567", 4)) 90*1c60b9acSAndroid Build Coastguard Worker /* fail */ 91*1c60b9acSAndroid Build Coastguard Worker``` 92*1c60b9acSAndroid Build Coastguard Worker 93*1c60b9acSAndroid Build Coastguard Worker## Lookups in the map 94*1c60b9acSAndroid Build Coastguard Worker 95*1c60b9acSAndroid Build Coastguard WorkerYou can retreive a pointer to an item in the map with a give key using 96*1c60b9acSAndroid Build Coastguard Worker 97*1c60b9acSAndroid Build Coastguard Worker``` 98*1c60b9acSAndroid Build Coastguard Workerlws_map_item_t * 99*1c60b9acSAndroid Build Coastguard Workerlws_map_item_lookup(lws_map_t *map, const lws_map_key_t key, size_t keylen); 100*1c60b9acSAndroid Build Coastguard Worker``` 101*1c60b9acSAndroid Build Coastguard Worker 102*1c60b9acSAndroid Build Coastguard WorkerThe item is opaque, but there are accessors 103*1c60b9acSAndroid Build Coastguard Worker 104*1c60b9acSAndroid Build Coastguard Worker|Accessor|Function| 105*1c60b9acSAndroid Build Coastguard Worker|---|---| 106*1c60b9acSAndroid Build Coastguard Worker|`lws_map_item_key(lws_map_item_t *_item)`|get a pointer to the item key| 107*1c60b9acSAndroid Build Coastguard Worker|`lws_map_item_value(lws_map_item_t *_item)`|get a pointer to the item value| 108*1c60b9acSAndroid Build Coastguard Worker|`lws_map_item_key_len(lws_map_item_t *_item)`|get the key length| 109*1c60b9acSAndroid Build Coastguard Worker|`lws_map_item_value_len(lws_map_item_t *_item)`|get the value length| 110*1c60b9acSAndroid Build Coastguard Worker 111*1c60b9acSAndroid Build Coastguard WorkerAgain there is a ..._ks() helper to simplify C strings as keys 112*1c60b9acSAndroid Build Coastguard Worker 113*1c60b9acSAndroid Build Coastguard Worker``` 114*1c60b9acSAndroid Build Coastguard Worker item = lws_map_item_lookup_ks(map, "abc"); 115*1c60b9acSAndroid Build Coastguard Worker if (!item) 116*1c60b9acSAndroid Build Coastguard Worker /* fail */ 117*1c60b9acSAndroid Build Coastguard Worker``` 118