#ifndef __PRIORITYQUEUE_CPP #define __PRIORITYQUEUE_CPP template BOOL operator< ( const WmiPriorityQueue :: WmiKeyElementPair &a_Arg1 , const WmiPriorityQueue :: WmiKeyElementPair &a_Arg2 ) { if ( a_Arg1.m_Key < a_Arg2.m_Key ) { return TRUE ; } return FALSE ; } template BOOL operator== ( const WmiPriorityQueue :: WmiKeyElementPair &a_Arg1 , const WmiPriorityQueue :: WmiKeyElementPair &a_Arg2 ) { if ( a_Arg1.m_Key == a_Arg2.m_Key ) { return TRUE ; } return FALSE ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ template WmiPriorityQueue :: WmiPriorityQueue ( WmiAllocator &a_Allocator ) : m_Allocator ( a_Allocator ) , m_Size ( 0 ) , m_Array ( a_Allocator ) { } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ template WmiPriorityQueue :: ~WmiPriorityQueue () { WmiStatusCode t_StatusCode = UnInitialize () ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ template WmiStatusCode WmiPriorityQueue :: Initialize () { WmiStatusCode t_StatusCode = e_StatusCode_Success ; t_StatusCode = m_Array.Initialize ( 1 << ElementSize ) ; return t_StatusCode ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ template WmiStatusCode WmiPriorityQueue :: UnInitialize () { WmiStatusCode t_StatusCode = e_StatusCode_Success ; t_StatusCode = m_Array.UnInitialize () ; return t_StatusCode ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ template WmiStatusCode WmiPriorityQueue :: ShuffleDown ( ULONG a_Index ) { WmiStatusCode t_StatusCode = e_StatusCode_Success ; if ( m_Size > 1 ) { WmiKeyElementPair t_KeyElementPair ; t_StatusCode = m_Array.Get ( t_KeyElementPair , a_Index ) ; if ( t_StatusCode == e_StatusCode_Success ) { ULONG t_LargestIndex = a_Index ; ULONG t_LeftIndex = LEFT ( a_Index ) ; ULONG t_RightIndex = RIGHT ( a_Index ) ; if ( t_LeftIndex < m_Size - 1 ) { WmiKeyElementPair t_Compare ; t_StatusCode = m_Array.Get ( t_Compare , t_LeftIndex ) ; if ( CompareElement ( t_Compare.m_Key , t_KeyElementPair.m_Key ) > 0 ) { t_LargestIndex = t_LeftIndex ; } else { t_LargestIndex = a_Index ; } } if ( t_RightIndex < m_Size - 1 ) { WmiKeyElementPair t_CompareKeyElementPair ; WmiKeyElementPair t_LargestKeyElementPair ; t_StatusCode = m_Array.Get ( t_CompareKeyElementPair , t_RightIndex ) ; t_StatusCode = m_Array.Get ( t_LargestKeyElementPair , t_LargestIndex ) ; if ( CompareElement ( t_CompareKeyElementPair.m_Key , t_LargestKeyElementPair.m_Key ) > 0 ) { t_LargestIndex = t_RightIndex ; } } if ( t_LargestIndex != a_Index ) { WmiKeyElementPair t_KeyElementPair ; WmiKeyElementPair t_LargestKeyElementPair ; t_StatusCode = m_Array.Get ( t_KeyElementPair , a_Index ) ; t_StatusCode = m_Array.Get ( t_LargestKeyElementPair , t_LargestIndex ) ; t_StatusCode = m_Array.Set ( t_KeyElementPair , t_LargestIndex ) ; t_StatusCode = m_Array.Set ( t_LargestKeyElementPair , a_Index ) ; t_StatusCode = ShuffleDown ( t_LargestIndex ) ; } } } return t_StatusCode ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ template WmiStatusCode WmiPriorityQueue :: ShuffleUp ( const WmiKeyElementPair &a_KeyElementPair , ULONG a_Index ) { WmiStatusCode t_StatusCode = e_StatusCode_Success ; ULONG t_Index = a_Index ; do { if ( t_Index > 0 ) { WmiKeyElementPair t_Compare ; t_StatusCode = m_Array.Get ( t_Compare , PARENT ( t_Index ) ) ; if ( t_StatusCode == e_StatusCode_Success ) { if ( CompareElement ( t_Compare.m_Key , a_KeyElementPair.m_Key ) < 0 ) { t_StatusCode = m_Array.Set ( t_Compare , t_Index ) ; if ( t_StatusCode == e_StatusCode_Success ) { t_Index = PARENT ( t_Index ) ; } else { break ; } } else { break ; } } else { break ; } } else { break ; } } while ( TRUE ) ; if ( t_StatusCode == e_StatusCode_Success ) { t_StatusCode = m_Array.Set ( a_KeyElementPair , t_Index ) ; } return t_StatusCode ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ template WmiStatusCode WmiPriorityQueue :: EnQueue ( const WmiKey &a_Key , const WmiElement &a_Element ) { WmiStatusCode t_StatusCode = e_StatusCode_Success ; if ( m_Size >= m_Array.Size () ) { t_StatusCode = m_Array.Grow ( m_Size + ( 1 << ElementSize ) ) ; } if ( t_StatusCode == e_StatusCode_Success ) { m_Size ++ ; WmiKeyElementPair t_KeyElementPair ; try { t_KeyElementPair.m_Key = a_Key , t_KeyElementPair.m_Element = a_Element , } catch ( Wmi_Heap_Exception &a_Exception ) { m_Size -- ; return e_StatusCode_OutOfMemory ; } catch ( ... ) { m_Size -- ; return e_StatusCode_Unknown ; } t_StatusCode = ShuffleUp ( t_KeyElementPair , m_Size - 1 ) ; } return t_StatusCode ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ template WmiStatusCode WmiPriorityQueue :: Top ( Iterator &a_Iterator ) { WmiStatusCode t_StatusCode = e_StatusCode_Success ; if ( m_Size ) { a_Iterator = Iterator ( this , 0 ) ; } else { t_StatusCode = e_StatusCode_NotInitialized ; } return t_StatusCode ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ template WmiStatusCode WmiPriorityQueue :: Top ( WmiKey &a_Key , WmiElement &a_Element ) { WmiStatusCode t_StatusCode = e_StatusCode_Success ; if ( m_Size ) { WmiArray :: Iterator t_Iterator ; t_StatusCode = m_Array.Get ( t_Iterator , 0 ) ; if ( t_StatusCode == e_StatusCode_Success ) { WmiKeyElementPair &t_KeyElementPair = t_Iterator.GetElement () ; try { a_Key = t_KeyElementPair.m_Key ; a_Element = t_KeyElementPair.m_Element ; } catch ( Wmi_Heap_Exception &a_Exception ) { return e_StatusCode_OutOfMemory ; } catch ( ... ) { return e_StatusCode_Unknown ; } } } else { t_StatusCode = e_StatusCode_NotInitialized ; } return t_StatusCode ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ template WmiStatusCode WmiPriorityQueue :: DeQueue () { WmiStatusCode t_StatusCode = e_StatusCode_Success ; if ( m_Size ) { m_Size -- ; WmiKeyElementPair t_KeyElementPair ; t_StatusCode = m_Array.Get ( t_KeyElementPair , m_Size ) ; if t_StatusCode == e_StatusCode_Success ) { t_StatusCode = m_Array.Set ( t_KeyElementPair , 0 ) ; } if t_StatusCode == e_StatusCode_Success ) { t_StatusCode = ShuffleDown ( 0 ) ; } } else { t_StatusCode = e_StatusCode_NotInitialized ; } return t_StatusCode ; } /****************************************************************************** * * Name: * * * Description: * * *****************************************************************************/ template WmiStatusCode WmiPriorityQueue :: Sort () { WmiStatusCode t_StatusCode = e_StatusCode_Success ; if ( m_Size ) { t_StatusCode = QuickSort ,WmiKeyElementPair> ( m_Array , m_Size ) ; } else { t_StatusCode = e_StatusCode_NotInitialized ; } return t_StatusCode ; } #endif __PRIORITYQUEUE_CPP