| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195 |
- //
- // Copyright 2020 Electronic Arts Inc.
- //
- // TiberianDawn.DLL and RedAlert.dll and corresponding source code is free
- // software: you can redistribute it and/or modify it under the terms of
- // the GNU General Public License as published by the Free Software Foundation,
- // either version 3 of the License, or (at your option) any later version.
- // TiberianDawn.DLL and RedAlert.dll and corresponding source code is distributed
- // in the hope that it will be useful, but with permitted additional restrictions
- // under Section 7 of the GPL. See the GNU General Public License in LICENSE.TXT
- // distributed with this program. You should have received a copy of the
- // GNU General Public License along with permitted additional restrictions
- // with this program. If not, see https://github.com/electronicarts/CnC_Remastered_Collection
- /* $Header: /CounterStrike/HEAP.H 1 3/03/97 10:24a Joe_bostic $ */
- /***********************************************************************************************
- *** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
- ***********************************************************************************************
- * *
- * Project Name : Command & Conquer *
- * *
- * File Name : HEAP.H *
- * *
- * Programmer : Joe L. Bostic *
- * *
- * Start Date : 02/18/95 *
- * *
- * Last Update : February 18, 1995 [JLB] *
- * *
- *---------------------------------------------------------------------------------------------*
- * Functions: *
- * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
- #ifndef HEAP_H
- #define HEAP_H
- #include "vector.h"
- /**************************************************************************
- ** This is a block memory management handler. It is used when memory is to
- ** be treated as a series of blocks of fixed size. This is similar to an
- ** array of integral types, but unlike such an array, the memory blocks
- ** are anonymously. This facilitates the use of this class when overloading
- ** the new and delete operators for a normal class object.
- */
- class FixedHeapClass
- {
- public:
- FixedHeapClass(int size);
- virtual ~FixedHeapClass(void);
- int Count(void) const {return ActiveCount;};
- int Length(void) const {return TotalCount;};
- int Avail(void) const {return TotalCount-ActiveCount;};
- virtual int ID(void const * pointer) const;
- virtual int Set_Heap(int count, void * buffer=0);
- virtual void * Allocate(void);
- virtual void Clear(void);
- virtual int Free(void * pointer);
- virtual int Free_All(void);
- void * operator[](int index) {return ((char *)Buffer) + (index * Size);};
- void const * operator[](int index) const {return ((char *)Buffer) + (index * Size);};
- protected:
- /*
- ** If the memory block buffer was allocated by this class, then this flag
- ** will be true. The block must be deallocated by this class if true.
- */
- unsigned IsAllocated:1;
- /*
- ** This is the size of each sub-block within the buffer.
- */
- int Size;
- /*
- ** This records the absolute number of sub-blocks in the buffer.
- */
- int TotalCount;
- /*
- ** This is the total blocks allocated out of the heap. This number
- ** will never exceed Count.
- */
- int ActiveCount;
- /*
- ** Pointer to the heap's memory buffer.
- */
- void * Buffer;
- /*
- ** This is a boolean vector array of allocation flag bits.
- */
- BooleanVectorClass FreeFlag;
- private:
- // The assignment operator is not supported.
- FixedHeapClass & operator = (FixedHeapClass const &);
- // The copy constructor is not supported.
- FixedHeapClass(FixedHeapClass const &);
- };
- /**************************************************************************
- ** This template serves only as an interface to the heap manager class. By
- ** using this template, the object pointers are automatically converted
- ** to the correct type without any code overhead.
- */
- template<class T>
- class TFixedHeapClass : public FixedHeapClass
- {
- public:
- TFixedHeapClass(void) : FixedHeapClass(sizeof(T)) {};
- virtual ~TFixedHeapClass(void) {};
- virtual int ID(T const * pointer) const {return FixedHeapClass::ID(pointer);};
- virtual T * Alloc(void) {return (T*)FixedHeapClass::Allocate();};
- virtual int Free(T * pointer) {return(FixedHeapClass::Free(pointer));};
- T & operator[](int index) {return *(T *)(((char *)Buffer) + (index * Size));};
- T const & operator[](int index) const {return *(T*)(((char *)Buffer) + (index * Size));};
- };
- /**************************************************************************
- ** This is a derivative of the fixed heap class. This class adds the
- ** ability to quickly iterate through the active (allocated) objects. Since the
- ** active array is a sequence of pointers, the overhead of this class
- ** is 4 bytes per potential allocated object (be warned).
- */
- class FixedIHeapClass : public FixedHeapClass
- {
- public:
- FixedIHeapClass(int size) : FixedHeapClass(size) {};
- virtual ~FixedIHeapClass(void) {};
- virtual int Set_Heap(int count, void * buffer=0);
- virtual void * Allocate(void);
- virtual void Clear(void);
- virtual int Free(void * pointer);
- virtual int Free_All(void);
- virtual int Logical_ID(void const * pointer) const;
- virtual int Logical_ID(int id) const {return(Logical_ID((*this)[id]));}
- virtual void * Active_Ptr(int index) {return ActivePointers[index];};
- virtual void const * Active_Ptr(int index) const {return ActivePointers[index];};
- /*
- ** This is an array of pointers to allocated objects. Using this array
- ** to control iteration through the objects ensures a minimum of processing.
- ** It also allows access to this array so that custom sorting can be
- ** performed.
- */
- DynamicVectorClass<void *> ActivePointers;
- };
- /**************************************************************************
- ** This template serves only as an interface to the iteratable heap manager
- ** class. By using this template, the object pointers are automatically converted
- ** to the correct type without any code overhead.
- */
- class FileClass;
- template<class T>
- class TFixedIHeapClass : public FixedIHeapClass
- {
- public:
- TFixedIHeapClass(void) : FixedIHeapClass(sizeof(T)) {};
- virtual ~TFixedIHeapClass(void) {};
- virtual int ID(T const * pointer) const {return FixedIHeapClass::ID(pointer);};
- virtual int Logical_ID(T const * pointer) const {return(FixedIHeapClass::Logical_ID(pointer));}
- virtual int Logical_ID(int id) const {return(FixedIHeapClass::Logical_ID(id));}
- virtual T * Alloc(void) {return (T*)FixedIHeapClass::Allocate();};
- virtual int Free(T * pointer) {return FixedIHeapClass::Free(pointer);};
- virtual int Free(void * pointer) {return FixedIHeapClass::Free(pointer);};
- virtual int Save(Pipe & file) const;
- virtual int Load(Straw & file);
- virtual void Code_Pointers(void);
- virtual void Decode_Pointers(void);
- virtual T * Ptr(int index) const {return (T*)FixedIHeapClass::ActivePointers[index];};
- virtual T * Raw_Ptr(int index) {return (index >= 0 && index < Length()) ? (T*)((*this)[index]) : NULL;};
- };
- #endif
|