-
Notifications
You must be signed in to change notification settings - Fork 80
Open
Labels
Description
In NGINX we have several "generic" collections (in the most C style of generic, with void * or pointer aliasing):
ngx_array_t, an array of known-sizevoid *pointersngx_list_t, a sequence of arrays ofvoid *ngx_queue_t, an intrusive doubly linked list.ngx_rbtree_t, a red-black tree. This structure is used both as intrusive (ngx_event_t.timerof typengx_rbtree_node_t) and viangx_rbtree_node_t.dataof typevoid *.ngx_hash_t, a hash table.
All of those should be representable as strictly typed objects, e.g. Array<NgxStr>, List<TableElement>, Hash<HttpHeader> and have the necessary iteration, random access and modification methods. This way we could limit unsafety to the initialization of a collection wrapper.
There's a crate that is useful for implementing such wrappers, foreign-types. It's not necessary, as for Array<T> we can directly cast ngx_array_t.elts.add(i) to *mut T with almost the same level of (un)safety, but it makes certain steps easier and reduces boilerplate code.