On Wed, 11 Jun 2003, Juan Rivera wrote:

> I don't understand well how the ring data structure works.

Have you read apr_ring.h?  I tried to heavily document that file.  If you
have and it's still unclear, I'd like to know how to make it more clear.

> How would the code look like? I tried unsplicing from the first bucket to
> the bucket previous to e and then splicing it at the tail of b. But
> didn't work.

A splice basically takes one chain of ring elements (buckets in this case)
that are already tied together [you pass in pointers to the first and last
elements in this chain] and inserts it either before or after some other
element (APR_RING_SPLICE_BEFORE() and APR_RING_SPLICE_AFTER()).

--Cliff



>From apr_ring.h:

/**
 * Splice the sequence ep1..epN into the ring before element lep
 *   (..lep.. becomes ..ep1..epN..lep..)
 * @warning This doesn't work for splicing before the first element or on
 *   empty rings... see APR_RING_SPLICE_HEAD for one that does
 * @param lep  Element in the ring to splice before
 * @param ep1  First element in the sequence to splice in
 * @param epN  Last element in the sequence to splice in
 * @param link The name of the APR_RING_ENTRY in the element struct
 */
#define APR_RING_SPLICE_BEFORE(lep, ep1, epN, link) do {                \
        APR_RING_NEXT((epN), link) = (lep);                             \
        APR_RING_PREV((ep1), link) = APR_RING_PREV((lep), link);        \
        APR_RING_NEXT(APR_RING_PREV((lep), link), link) = (ep1);        \
        APR_RING_PREV((lep), link) = (epN);                             \
    } while (0)

/**
 * Splice the sequence ep1..epN into the ring after element lep
 *   (..lep.. becomes ..lep..ep1..epN..)
 * @warning This doesn't work for splicing after the last element or on
 *   empty rings... see APR_RING_SPLICE_TAIL for one that does
 * @param lep  Element in the ring to splice after
 * @param ep1  First element in the sequence to splice in
 * @param epN  Last element in the sequence to splice in
 * @param link The name of the APR_RING_ENTRY in the element struct
 */
#define APR_RING_SPLICE_AFTER(lep, ep1, epN, link) do {                 \
        APR_RING_PREV((ep1), link) = (lep);                             \
        APR_RING_NEXT((epN), link) = APR_RING_NEXT((lep), link);        \
        APR_RING_PREV(APR_RING_NEXT((lep), link), link) = (epN);        \
        APR_RING_NEXT((lep), link) = (ep1);                             \
    } while (0)


Reply via email to