diff options
author | Piotr Dziwinski <piotrdz@gmail.com> | 2012-06-26 22:37:26 +0200 |
---|---|---|
committer | Piotr Dziwinski <piotrdz@gmail.com> | 2012-06-26 22:37:26 +0200 |
commit | 6a059b437dca706a72233a57ba4c22011aba6dde (patch) | |
tree | 4d4bbef5e19bbde38ccd173c661377cdc9167ba7 /src/common/iman.cpp | |
parent | b696edaed3e21839315d639590402e22f90fe195 (diff) | |
parent | bf06998ece3ba9d47b595e3761beba54b3793036 (diff) | |
download | colobot-6a059b437dca706a72233a57ba4c22011aba6dde.tar.gz colobot-6a059b437dca706a72233a57ba4c22011aba6dde.tar.bz2 colobot-6a059b437dca706a72233a57ba4c22011aba6dde.zip |
Merge branch 'dev-opengl' into dev
Diffstat (limited to 'src/common/iman.cpp')
-rw-r--r-- | src/common/iman.cpp | 324 |
1 files changed, 162 insertions, 162 deletions
diff --git a/src/common/iman.cpp b/src/common/iman.cpp index 53735a4..28ee3d3 100644 --- a/src/common/iman.cpp +++ b/src/common/iman.cpp @@ -1,162 +1,162 @@ -// * This file is part of the COLOBOT source code
-// * Copyright (C) 2001-2008, Daniel ROUX & EPSITEC SA, www.epsitec.ch
-// *
-// * This program 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.
-// *
-// * This program is distributed in the hope that it will be useful,
-// * but WITHOUT ANY WARRANTY; without even the implied warranty of
-// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// * GNU General Public License for more details.
-// *
-// * You should have received a copy of the GNU General Public License
-// * along with this program. If not, see http://www.gnu.org/licenses/.
-
-// iman.cpp
-
-
-#include <stdio.h>
-
-#include "common/struct.h"
-#include "common/iman.h"
-
-
-
-
-// Object's constructor.
-
-CInstanceManager::CInstanceManager()
-{
- int i;
-
- for ( i=0 ; i<CLASS_MAX ; i++ )
- {
- m_table[i].totalPossible = 0;
- m_table[i].totalUsed = 0;
- m_table[i].classPointer = 0;
- }
-}
-
-// Object's destructor.
-
-CInstanceManager::~CInstanceManager()
-{
- int i;
-
- for ( i=0 ; i<CLASS_MAX ; i++ )
- {
- if ( m_table[i].classPointer != 0 )
- {
- free(m_table[i].classPointer);
- }
- }
-}
-
-
-// Empty the list of all classes.
-
-void CInstanceManager::Flush()
-{
- int i;
-
- for ( i=0 ; i<CLASS_MAX ; i++ )
- {
- if ( m_table[i].classPointer != 0 )
- {
- free(m_table[i].classPointer);
- }
- m_table[i].classPointer = 0;
- }
-}
-
-// Empty all instances of a given class.
-
-void CInstanceManager::Flush(ClassType classType)
-{
- if ( classType < 0 || classType >= CLASS_MAX ) return;
- if ( m_table[classType].classPointer == 0 ) return;
-
- free(m_table[classType].classPointer);
- m_table[classType].classPointer = 0;
-}
-
-
-// Adds a new instance of a class.
-
-bool CInstanceManager::AddInstance(ClassType classType, void* pointer, int max)
-{
- int i;
-
- if ( classType < 0 || classType >= CLASS_MAX ) return false;
-
- if ( m_table[classType].classPointer == 0 )
- {
- m_table[classType].classPointer = (void**)malloc(max*sizeof(void*));
- m_table[classType].totalPossible = max;
- m_table[classType].totalUsed = 0;
- }
-
- if ( m_table[classType].totalUsed >= m_table[classType].totalPossible ) return false;
-
- i = m_table[classType].totalUsed++;
- m_table[classType].classPointer[i] = pointer;
- return true;
-}
-
-// Deletes an instance of a class.
-
-bool CInstanceManager::DeleteInstance(ClassType classType, void* pointer)
-{
- int i;
-
- if ( classType < 0 || classType >= CLASS_MAX ) return false;
-
- for ( i=0 ; i<m_table[classType].totalUsed ; i++ )
- {
- if ( m_table[classType].classPointer[i] == pointer )
- {
- m_table[classType].classPointer[i] = 0;
- }
- }
-
- Compress(classType);
- return true;
-}
-
-// Seeking an existing instance. Returns 0 if it does not exist.
-// Must be super fast!
-
-void* CInstanceManager::SearchInstance(ClassType classType, int rank)
-{
-#if _DEBUG
- if ( classType < 0 || classType >= CLASS_MAX ) return 0;
- if ( m_table[classType].classPointer == 0 ) return 0;
-#endif
- if ( rank >= m_table[classType].totalUsed ) return 0;
-
- return m_table[classType].classPointer[rank];
-}
-
-
-// Fills holes in a table.
-
-void CInstanceManager::Compress(ClassType classType)
-{
- int i, j;
-
- if ( classType < 0 || classType >= CLASS_MAX ) return;
-
- j = 0;
- for ( i=0 ; i<m_table[classType].totalUsed ; i++ )
- {
- if ( m_table[classType].classPointer[i] != 0 )
- {
- m_table[classType].classPointer[j++] = m_table[classType].classPointer[i];
- }
- }
- m_table[classType].totalUsed = j;
-}
-
-
+// * This file is part of the COLOBOT source code +// * Copyright (C) 2001-2008, Daniel ROUX & EPSITEC SA, www.epsitec.ch +// * +// * This program 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. +// * +// * This program is distributed in the hope that it will be useful, +// * but WITHOUT ANY WARRANTY; without even the implied warranty of +// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// * GNU General Public License for more details. +// * +// * You should have received a copy of the GNU General Public License +// * along with this program. If not, see http://www.gnu.org/licenses/. + +// iman.cpp + + +#include <stdio.h> + +#include "common/struct.h" +#include "common/iman.h" + + + + +// Object's constructor. + +CInstanceManager::CInstanceManager() +{ + int i; + + for ( i=0 ; i<CLASS_MAX ; i++ ) + { + m_table[i].totalPossible = 0; + m_table[i].totalUsed = 0; + m_table[i].classPointer = 0; + } +} + +// Object's destructor. + +CInstanceManager::~CInstanceManager() +{ + int i; + + for ( i=0 ; i<CLASS_MAX ; i++ ) + { + if ( m_table[i].classPointer != 0 ) + { + free(m_table[i].classPointer); + } + } +} + + +// Empty the list of all classes. + +void CInstanceManager::Flush() +{ + int i; + + for ( i=0 ; i<CLASS_MAX ; i++ ) + { + if ( m_table[i].classPointer != 0 ) + { + free(m_table[i].classPointer); + } + m_table[i].classPointer = 0; + } +} + +// Empty all instances of a given class. + +void CInstanceManager::Flush(ClassType classType) +{ + if ( classType < 0 || classType >= CLASS_MAX ) return; + if ( m_table[classType].classPointer == 0 ) return; + + free(m_table[classType].classPointer); + m_table[classType].classPointer = 0; +} + + +// Adds a new instance of a class. + +bool CInstanceManager::AddInstance(ClassType classType, void* pointer, int max) +{ + int i; + + if ( classType < 0 || classType >= CLASS_MAX ) return false; + + if ( m_table[classType].classPointer == 0 ) + { + m_table[classType].classPointer = (void**)malloc(max*sizeof(void*)); + m_table[classType].totalPossible = max; + m_table[classType].totalUsed = 0; + } + + if ( m_table[classType].totalUsed >= m_table[classType].totalPossible ) return false; + + i = m_table[classType].totalUsed++; + m_table[classType].classPointer[i] = pointer; + return true; +} + +// Deletes an instance of a class. + +bool CInstanceManager::DeleteInstance(ClassType classType, void* pointer) +{ + int i; + + if ( classType < 0 || classType >= CLASS_MAX ) return false; + + for ( i=0 ; i<m_table[classType].totalUsed ; i++ ) + { + if ( m_table[classType].classPointer[i] == pointer ) + { + m_table[classType].classPointer[i] = 0; + } + } + + Compress(classType); + return true; +} + +// Seeking an existing instance. Returns 0 if it does not exist. +// Must be super fast! + +void* CInstanceManager::SearchInstance(ClassType classType, int rank) +{ +#if _DEBUG + if ( classType < 0 || classType >= CLASS_MAX ) return 0; + if ( m_table[classType].classPointer == 0 ) return 0; +#endif + if ( rank >= m_table[classType].totalUsed ) return 0; + + return m_table[classType].classPointer[rank]; +} + + +// Fills holes in a table. + +void CInstanceManager::Compress(ClassType classType) +{ + int i, j; + + if ( classType < 0 || classType >= CLASS_MAX ) return; + + j = 0; + for ( i=0 ; i<m_table[classType].totalUsed ; i++ ) + { + if ( m_table[classType].classPointer[i] != 0 ) + { + m_table[classType].classPointer[j++] = m_table[classType].classPointer[i]; + } + } + m_table[classType].totalUsed = j; +} + + |