summaryrefslogtreecommitdiff
path: root/hammer/activeitemlist.h
diff options
context:
space:
mode:
Diffstat (limited to 'hammer/activeitemlist.h')
-rw-r--r--hammer/activeitemlist.h281
1 files changed, 281 insertions, 0 deletions
diff --git a/hammer/activeitemlist.h b/hammer/activeitemlist.h
new file mode 100644
index 0000000..80cb4c0
--- /dev/null
+++ b/hammer/activeitemlist.h
@@ -0,0 +1,281 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $Workfile: $
+// $Date: $
+//
+//-----------------------------------------------------------------------------
+// $Log: $
+//
+// $NoKeywords: $
+//=============================================================================//
+
+#ifndef ACTIVEITEMLIST_H
+#define ACTIVEITEMLIST_H
+#pragma once
+
+// memdbgon must be the last include file in a .cpp file!!!
+#include <tier0/memdbgon.h>
+
+//=============================================================================
+
+typedef int ITEM_HANDLE;
+
+//=============================================================================
+
+template <class T> class ActiveItemList
+{
+public:
+
+ ActiveItemList();
+ ActiveItemList( int size );
+
+ void SetSize( int size );
+ int GetSize( void );
+
+ int GetNumberOfItems( void );
+ T* GetFirstItem( void );
+ T* GetNextItem( void );
+
+ ITEM_HANDLE GetEmptyItemHandle( void );
+
+ T* GetItem( ITEM_HANDLE handle );
+ void RemoveItem( ITEM_HANDLE handle );
+
+ void SetActiveItem( ITEM_HANDLE handle );
+ T* GetActiveItem( void );
+
+ void Free( void );
+
+protected:
+
+ int m_NumItems; // the number of items in the list
+ int m_ActiveItem; // the active item index
+ int m_CurrentItem;
+ int m_ListSize; // size of the list
+ T *m_pList; // the active item list
+ bool *m_pEmptyList; // keep an empty list
+};
+
+//=============================================================================
+
+
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+template <class T> ActiveItemList<T>::ActiveItemList()
+{
+ m_NumItems = 0;
+ m_ActiveItem = -1;
+ m_CurrentItem = -1;
+ m_ListSize = 0;
+ m_pList = NULL;
+ m_pEmptyList = NULL;
+}
+
+
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+template <class T> ActiveItemList<T>::ActiveItemList( int size )
+{
+ int i; // loop counter
+
+ // set the size of the list
+ m_ListSize = size;
+
+ //
+ // allocate memory for the list
+ //
+ if( !( m_pList = new T[size] ) )
+ return;
+
+ if( !( m_pEmptyList = new bool[size] ) )
+ return;
+
+ //
+ // initialize the active item list
+ //
+ m_NumItems = 0;
+ m_ActiveItem = -1;
+ m_CurrentItem = -1;
+
+ for( i = 0; i < size; i++ )
+ m_pEmptyList[i] = true;
+}
+
+
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+template <class T> void ActiveItemList<T>::SetSize( int size )
+{
+ int i; // loop counter
+
+ // set the size of the list
+ m_ListSize = size;
+
+ //
+ // allocate memory for the list
+ //
+ if( !( m_pList = new T[size] ) )
+ return;
+
+ if( !( m_pEmptyList = new bool[size] ) )
+ return;
+
+ //
+ // initialize the active item list
+ //
+ m_NumItems = 0;
+ m_ActiveItem = -1;
+ m_CurrentItem = -1;
+
+ for( i = 0; i < size; i++ )
+ m_pEmptyList[i] = true;
+}
+
+
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+template <class T> int ActiveItemList<T>::GetSize( void )
+{
+ return m_ListSize;
+}
+
+
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+template <class T> int ActiveItemList<T>::GetNumberOfItems( void )
+{
+ return m_NumItems;
+}
+
+
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+template <class T> T* ActiveItemList<T>::GetFirstItem( void )
+{
+ int i; // loop counter
+
+ // reset current item index
+ m_CurrentItem = -1;
+
+ //
+ // find the first item in the list
+ //
+ for( i = 0; i < m_ListSize; i++ )
+ {
+ if( !m_pEmptyList[i] )
+ {
+ m_CurrentItem = i;
+ return &m_pList[i];
+ }
+ }
+
+ // no items found
+ return NULL;
+}
+
+
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+template <class T> T* ActiveItemList<T>::GetNextItem( void )
+{
+ int i; // loop counter
+
+ //
+ // find the next item in the list
+ //
+ for( i = m_CurrentItem + 1; i < m_ListSize; i++ )
+ {
+ if( !m_pEmptyList[i] )
+ {
+ m_CurrentItem = i;
+ return &m_pList[i];
+ }
+ }
+
+ // no more items found
+ return NULL;
+}
+
+
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+template <class T> ITEM_HANDLE ActiveItemList<T>::GetEmptyItemHandle( void )
+{
+ int i; // loop counter
+
+ //
+ // find an empty item slot and return the handle
+ //
+ for( i = 0; i < m_ListSize; i++ )
+ {
+ if( m_pEmptyList[i] )
+ {
+ m_pEmptyList[i] = false;
+ m_NumItems++;
+ return i;
+ }
+ }
+
+ // no empty item slot
+ return -1;
+}
+
+
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+template <class T> T* ActiveItemList<T>::GetItem( ITEM_HANDLE handle )
+{
+ return &m_pList[handle];
+}
+
+
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+template <class T> void ActiveItemList<T>::RemoveItem( ITEM_HANDLE handle )
+{
+ //
+ // set the item to empty and decrement the number of items in list
+ //
+ m_pEmptyList[handle] = true;
+ m_NumItems--;
+}
+
+
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+template <class T> void ActiveItemList<T>::SetActiveItem( ITEM_HANDLE handle )
+{
+ // set the active item
+ m_ActiveItem = handle;
+}
+
+
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+template <class T> T* ActiveItemList<T>::GetActiveItem( void )
+{
+ if( m_ActiveItem == -1 )
+ return NULL;
+
+ return &m_pList[m_ActiveItem];
+}
+
+
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+template <class T> void ActiveItemList<T>::Free( void )
+{
+ //
+ // clean up lists
+ //
+ if( m_pList )
+ delete [] m_pList;
+
+ if( m_pEmptyList )
+ delete [] m_pEmptyList;
+}
+
+
+#endif // ACTIVEITEMLIST_H \ No newline at end of file