home *** CD-ROM | disk | FTP | other *** search
/ GameStar 2006 March / Gamestar_82_2006-03_dvd.iso / DVDStar / Editace / quake4_sdkv10.exe / source / idlib / containers / Stack.h < prev    next >
C/C++ Source or Header  |  2005-11-14  |  1KB  |  60 lines

  1.  
  2. #ifndef __STACK_H__
  3. #define __STACK_H__
  4.  
  5. /*
  6. ===============================================================================
  7.  
  8.     Stack template
  9.  
  10. ===============================================================================
  11. */
  12.  
  13. #define idStack( type, next )        idStackTemplate<type, (int)&(((type*)NULL)->next)>
  14.  
  15. template< class type, int nextOffset >
  16. class idStackTemplate {
  17. public:
  18.                             idStackTemplate( void );
  19.  
  20.     void                    Add( type *element );
  21.     type *                    Get( void );
  22.  
  23. private:
  24.     type *                    top;
  25.     type *                    bottom;
  26. };
  27.  
  28. #define STACK_NEXT_PTR( element )        (*(type**)(((byte*)element)+nextOffset))
  29.  
  30. template< class type, int nextOffset >
  31. idStackTemplate<type,nextOffset>::idStackTemplate( void ) {
  32.     top = bottom = NULL;
  33. }
  34.  
  35. template< class type, int nextOffset >
  36. void idStackTemplate<type,nextOffset>::Add( type *element ) {
  37.     STACK_NEXT_PTR(element) = top;
  38.     top = element;
  39.     if ( !bottom ) {
  40.         bottom = element;
  41.     }
  42. }
  43.  
  44. template< class type, int nextOffset >
  45. type *idStackTemplate<type,nextOffset>::Get( void ) {
  46.     type *element;
  47.  
  48.     element = top;
  49.     if ( element ) {
  50.         top = STACK_NEXT_PTR(top);
  51.         if ( bottom == element ) {
  52.             bottom = NULL;
  53.         }
  54.         STACK_NEXT_PTR(element) = NULL;
  55.     }
  56.     return element;
  57. }
  58.  
  59. #endif /* !__STACK_H__ */
  60.