Main Page   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Namespace Members   Compound Members   File Members   Related Pages  

MemoryBlock.h

Go to the documentation of this file.
00001 
00002 /*
00003     TEDDY - General graphics application library
00004     Copyright (C) 1999-2002  Timo Suoranta
00005     tksuoran@cc.helsinki.fi
00006 
00007         Adapted from
00008 
00009         The Universe Development Kit
00010         Copyright (C) 2000  Sean O'Neil
00011         soneil@home.com
00012 
00013     This library is free software; you can redistribute it and/or
00014     modify it under the terms of the GNU Lesser General Public
00015     License as published by the Free Software Foundation; either
00016     version 2.1 of the License, or (at your option) any later version.
00017 
00018     This library is distributed in the hope that it will be useful,
00019     but WITHOUT ANY WARRANTY; without even the implied warranty of
00020     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00021     Lesser General Public License for more details.
00022 
00023     You should have received a copy of the GNU Lesser General Public
00024     License along with this library; if not, write to the Free Software
00025     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00026 
00027     $Id: MemoryBlock.h,v 1.4 2002/01/11 14:35:03 tksuoran Exp $
00028 */
00029 
00030 
00031 #ifndef TEDDY__SYS_SUPPORT__MEMORY_BLOCK__H
00032 #define TEDDY__SYS_SUPPORT__MEMORY_BLOCK__H
00033 
00034 
00035 #include <cstring>
00036 
00037 
00038 namespace Teddy      {
00039 namespace SysSupport {
00040 
00041 
00046 class MemoryBlock {
00047 public:
00048     MemoryBlock(){
00049         elements      = 0;
00050         element_size  = 0;
00051         pool          = NULL;
00052         free_stack    = NULL;
00053         free_position = 0;
00054     }
00055 
00056     MemoryBlock( int elements, int element_size ){
00057         pool       = NULL;
00058         free_stack = NULL;
00059         init( elements, element_size );
00060     }
00061 
00062     ~MemoryBlock(){
00063         cleanup();
00064     }
00065 
00066     void cleanup(){
00067         if( free_stack != NULL ){
00068             delete (char*)(free_stack);
00069             free_stack = NULL;
00070         }
00071 
00072         if( pool != NULL ){
00073             delete (char*)(pool);
00074             pool = NULL;
00075         }
00076     }
00077 
00078     void init( int elements, int element_size ){
00079         cleanup();
00080         elements     = elements;
00081         element_size = element_size;
00082         pool         = new char[elements * element_size];
00083         //      TRACE("CMemoryBlock::Init() allocating %d bytes.\n", nElements * nElementSize);
00084         free_stack   = new void *[elements];
00085         for( free_position = 0; free_position < elements; free_position++ ){
00086             free_stack[free_position] = (void *)( (int)pool + free_position * element_size );
00087         }
00088     }
00089 
00090     int getElementSize     (){ return element_size;  }
00091     int getFreeElementCount(){ return free_position; }
00092 
00093     void *getElement(){
00094         void *block = NULL;
00095         if( free_position ){
00096             block = free_stack[--free_position];
00097         }
00098         return block;
00099     }
00100 
00101     void releaseElement( void *block ){
00102         free_stack[free_position++] = block;
00103     }
00104 
00105 protected:
00106     int    elements;
00107     int    element_size;
00108     void  *pool;
00109     void **free_stack;
00110     int    free_position;
00111 };
00112 
00113 
00114 };  //  namespace SysSupport
00115 };  //  namespace Teddy
00116 
00117 
00118 #endif  //  TEDDY__SYS_SUPPORT__MEMORY_BLOCK__H
00119