X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=vppinfra%2Fvppinfra%2Fhash.h;h=4db5a57602e789b15c2a7259975b657904ac1483;hb=5cdaf6358266eb883a2e48239a83e9f56c3c5bad;hp=f796f2dca09aa903709e8b95a665325a4c82eb0e;hpb=54ccf2261cb1f4afd966b7b1e92689183cb17836;p=vpp.git diff --git a/vppinfra/vppinfra/hash.h b/vppinfra/vppinfra/hash.h index f796f2dca09..4db5a57602e 100644 --- a/vppinfra/vppinfra/hash.h +++ b/vppinfra/vppinfra/hash.h @@ -329,21 +329,32 @@ hash_forward (hash_t * h, void *v, uword n) return (u8 *) v + ((n * sizeof (hash_pair_t)) << h->log2_pair_size); } -/* Iterate over hash pairs - @param p the current (key,value) pair - @param v the hash table to iterate - @param body the operation to perform on each (key,value) pair. - executes body with each active hash pair +/** Iterate over hash pairs. + + @param p The current (key,value) pair. This should be of type + (hash_pair_t *). + @param v The hash table to iterate. + @param body The operation to perform on each (key,value) pair. + + Executes the expression or code block @c body with each active hash pair. */ +/* A previous version of this macro made use of the hash_pair_union_t + * structure; this version does not since that approach mightily upset + * the static analysis tool. In the rare chance someone is reading this + * code, pretend that _p below is of type hash_pair_union_t and that when + * used as an rvalue it's really using one of the union members as the + * rvalue. If you were confused before you might be marginally less + * confused after. + */ #define hash_foreach_pair(p,v,body) \ do { \ __label__ _hash_foreach_done; \ hash_t * _h = hash_header (v); \ - hash_pair_union_t * _p; \ + void * _p; \ hash_pair_t * _q, * _q_end; \ uword _i, _i1, _id, _pair_increment; \ \ - _p = (hash_pair_union_t *) (v); \ + _p = (v); \ _i = 0; \ _pair_increment = 1; \ if ((v)) \ @@ -356,12 +367,12 @@ do { \ do { \ if (_id & 1) \ { \ - _q = &_p->direct; \ + _q = _p; \ _q_end = _q + _pair_increment; \ } \ else \ { \ - hash_pair_indirect_t * _pi = &_p->indirect; \ + hash_pair_indirect_t * _pi = _p; \ _q = _pi->pairs; \ if (_h->log2_pair_size > 0) \ _q_end = hash_forward (_h, _q, indirect_pair_get_len (_pi)); \ @@ -384,7 +395,7 @@ do { \ _q += _pair_increment; \ } \ \ - _p = (hash_pair_union_t *) (&_p->direct + _pair_increment); \ + _p = (hash_pair_t *)_p + _pair_increment; \ _id = _id / 2; \ _i++; \ } while (_i < _i1); \