xref: /aosp_15_r20/external/libwebsockets/READMEs/README.lws_map.md (revision 1c60b9aca93fdbc9b5f19b2d2194c91294b22281)
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