/*
 * PROJECT:         ReactOS Runtime Library
 * LICENSE:         BSD - See COPYING.ARM in the top level directory
 * FILE:            lib/rtl/rtlavl.h
 * PURPOSE:         RTL AVL Glue
 * PROGRAMMERS:     ReactOS Portable Systems Group
 */

/* INCLUDES ******************************************************************/

/*
 * This is the glue code for the AVL package in the RTL meant for external callers.
 * It's not very exciting, it just uses the RTL-defined fields without any magic,
 * unlike the Mm version which has special handling for balances and parents, and
 * does not implement custom comparison callbacks.
 */
#define MI_ASSERT(x)
#define RtlLeftChildAvl(x)          (PRTL_BALANCED_LINKS)(RtlLeftChild(x))
#define RtlRightChildAvl(x)         (PRTL_BALANCED_LINKS)(RtlRightChild(x))
#define RtlParentAvl(x)             (PRTL_BALANCED_LINKS)(RtlParent(x))
#define RtlRealPredecessorAvl(x)    (PRTL_BALANCED_LINKS)(RtlRealPredecessor((PRTL_SPLAY_LINKS)(x)))
#define RtlRealSuccessorAvl(x)      (PRTL_BALANCED_LINKS)(RtlRealSuccessor((PRTL_SPLAY_LINKS)(x)))
#define RtlInsertAsRightChildAvl    RtlInsertAsRightChild
#define RtlInsertAsLeftChildAvl     RtlInsertAsLeftChild
#define RtlIsLeftChildAvl           RtlIsLeftChild

FORCEINLINE
VOID
RtlpCopyAvlNodeData(IN PRTL_BALANCED_LINKS Node1,
                    IN PRTL_BALANCED_LINKS Node2)
{
    *Node1 = *Node2;
}
 
FORCEINLINE
RTL_GENERIC_COMPARE_RESULTS
RtlpAvlCompareRoutine(IN PRTL_AVL_TABLE Table,
                      IN PVOID Buffer,
                      IN PVOID UserData)
{
    /* Do the compare */
    return Table->CompareRoutine(Table,
                                 Buffer,
                                 UserData);
}

FORCEINLINE
VOID
RtlSetParent(IN PRTL_BALANCED_LINKS Node,
             IN PRTL_BALANCED_LINKS Parent)
{
    Node->Parent = Parent;
}

FORCEINLINE
VOID
RtlSetBalance(IN PRTL_BALANCED_LINKS Node,
              IN CHAR Balance)
{
    Node->Balance = Balance;
}

FORCEINLINE
CHAR
RtlBalance(IN PRTL_BALANCED_LINKS Node)
{
    return Node->Balance;
}

/* EOF */