Ignore:
Timestamp:
Aug 27, 2007, 12:31:38 AM (18 years ago)
Author:
bird
Message:

Made is possible to redefine the AVLNODE members, thus allowing a structure to be used by more than one kAvl instance (i.e. be in more than one tree). Define the callback and enumdata our selves.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/kStuff/include/k/kAvlTmpl/kAvlEnum.h

    r3560 r3562  
    2525 */
    2626
     27/*******************************************************************************
     28*   Structures and Typedefs                                                    *
     29*******************************************************************************/
     30/**
     31 * Enumeration control data.
     32 *
     33 * This is initialized by BeginEnum and used by GetNext to figure out what
     34 * to do next.
     35 */
     36typedef struct KAVL_TYPE(,ENUMDATA)
     37{
     38    KBOOL               fFromLeft;
     39    KI8                 cEntries;
     40    KU8                 achFlags[KAVL_MAX_STACK];
     41    KAVLNODE *          aEntries[KAVL_MAX_STACK];
     42} KAVL_TYPE(,ENUMDATA), *KAVL_TYPE(P,ENUMDATA);
     43
     44
    2745/**
    2846 * Get the next node in the tree enumeration.
    29  * @returns   Pointer to the first node in the tree.
    30  * @param     pEnumData  Pointer to enumeration control data.
    31  * @status    completely implemented.
    32  * @author    knut st. osmundsen
     47 *
     48 * @returns Pointer to the first node in the tree.
     49 * @param   pEnumData   Pointer to enumeration control data.
    3350 */
    34 KAVL_DECL(KAVLNODECORE *) KAVL_FN(GetNextNode)(KAVL_TYPE(,ENUMDATA) *pEnumData)
     51KAVL_DECL(KAVLNODE *) KAVL_FN(GetNext)(KAVL_TYPE(,ENUMDATA) *pEnumData)
    3552{
    3653    if (pEnumData->fFromLeft)
     
    3855        while (pEnumData->cEntries > 0)
    3956        {
    40             KAVLNODECORE *pNode = pEnumData->aEntries[pEnumData->cEntries - 1];
     57            KAVLNODE *pNode = pEnumData->aEntries[pEnumData->cEntries - 1];
    4158
    4259            /* left */
     
    4461            {
    4562                pEnumData->achFlags[pEnumData->cEntries - 1]++;
    46                 if (pNode->pLeft != KAVL_NULL)
     63                if (pNode->mpLeft != KAVL_NULL)
    4764                {
    4865                    pEnumData->achFlags[pEnumData->cEntries] = 0; /* 0 left, 1 center, 2 right */
    49                     pEnumData->aEntries[pEnumData->cEntries++] = KAVL_GET_POINTER(&pNode->pLeft);
     66                    pEnumData->aEntries[pEnumData->cEntries++] = KAVL_GET_POINTER(&pNode->mpLeft);
    5067                    continue;
    5168                }
     
    6178            /* right */
    6279            pEnumData->cEntries--;
    63             if (pNode->pRight != KAVL_NULL)
     80            if (pNode->mpRight != KAVL_NULL)
    6481            {
    6582                pEnumData->achFlags[pEnumData->cEntries] = 0;
    66                 pEnumData->aEntries[pEnumData->cEntries++] = KAVL_GET_POINTER(&pNode->pRight);
     83                pEnumData->aEntries[pEnumData->cEntries++] = KAVL_GET_POINTER(&pNode->mpRight);
    6784            }
    6885        } /* while */
     
    7289        while (pEnumData->cEntries > 0)
    7390        {
    74             KAVLNODECORE *pNode = pEnumData->aEntries[pEnumData->cEntries - 1];
     91            KAVLNODE *pNode = pEnumData->aEntries[pEnumData->cEntries - 1];
    7592
    7693            /* right */
     
    7895            {
    7996                pEnumData->achFlags[pEnumData->cEntries - 1]++;
    80                 if (pNode->pRight != KAVL_NULL)
     97                if (pNode->mpRight != KAVL_NULL)
    8198                {
    8299                    pEnumData->achFlags[pEnumData->cEntries] = 0;  /* 0 right, 1 center, 2 left */
    83                     pEnumData->aEntries[pEnumData->cEntries++] = KAVL_GET_POINTER(&pNode->pRight);
     100                    pEnumData->aEntries[pEnumData->cEntries++] = KAVL_GET_POINTER(&pNode->mpRight);
    84101                    continue;
    85102                }
     
    95112            /* left */
    96113            pEnumData->cEntries--;
    97             if (pNode->pLeft != KAVL_NULL)
     114            if (pNode->mpLeft != KAVL_NULL)
    98115            {
    99116                pEnumData->achFlags[pEnumData->cEntries] = 0;
    100                 pEnumData->aEntries[pEnumData->cEntries++] = KAVL_GET_POINTER(&pNode->pLeft);
     117                pEnumData->aEntries[pEnumData->cEntries++] = KAVL_GET_POINTER(&pNode->mpLeft);
    101118            }
    102119        } /* while */
     
    116133 *                      K_FALSE: Right to left.
    117134 */
    118 KAVL_DECL(KAVLNODECORE *) KAVL_FN(BeginEnumTree)(KAVLTREEPTR *ppTree, KAVL_TYPE(,ENUMDATA) *pEnumData, KBOOL fFromLeft)
     135KAVL_DECL(KAVLNODE *) KAVL_FN(BeginEnum)(KAVLTREEPTR *ppTree, KAVL_TYPE(,ENUMDATA) *pEnumData, KBOOL fFromLeft)
    119136{
    120137    if (*ppTree != KAVL_NULL)
     
    128145        pEnumData->cEntries = 0;
    129146
    130     return KAVL_FN(GetNextNode)(pEnumData);
     147    return KAVL_FN(GetNext)(pEnumData);
    131148}
    132149
Note: See TracChangeset for help on using the changeset viewer.