This commit is contained in:
David Rose 2003-03-14 23:43:58 +00:00
parent d026d9d928
commit dc9782ee09
3 changed files with 235 additions and 235 deletions

View File

@ -1,47 +1,47 @@
#include "stdafx.h" #include "stdafx.h"
#include <iostream> #include <iostream>
#include <map> #include <map>
#include <cassert> #include <cassert>
using namespace std; using namespace std;
#include "uniqueIdAllocator.h" #include "uniqueIdAllocator.h"
int _tmain(int argc, _TCHAR* argv[]) { int _tmain(int argc, _TCHAR* argv[]) {
cout <<"UniqueIdAllocator Test"<<endl; cout <<"UniqueIdAllocator Test"<<endl;
UniqueIdAllocator b=UniqueIdAllocator(2, 9); UniqueIdAllocator b=UniqueIdAllocator(2, 9);
b.printTo(cout); b.printTo(cout);
b.allocate(); b.printTo(cout); b.allocate(); b.printTo(cout);
b.allocate(); b.printTo(cout); b.allocate(); b.printTo(cout);
b.allocate(); b.printTo(cout); b.allocate(); b.printTo(cout);
b.allocate(); b.printTo(cout); b.allocate(); b.printTo(cout);
b.allocate(); b.printTo(cout); b.allocate(); b.printTo(cout);
b.allocate(); b.printTo(cout); b.allocate(); b.printTo(cout);
b.free(2); b.printTo(cout); b.free(2); b.printTo(cout);
b.free(3); b.printTo(cout); b.free(3); b.printTo(cout);
b.free(4); b.printTo(cout); b.free(4); b.printTo(cout);
b.free(5); b.printTo(cout); b.free(5); b.printTo(cout);
b.allocate(); b.printTo(cout); b.allocate(); b.printTo(cout);
b.allocate(); b.printTo(cout); b.allocate(); b.printTo(cout);
b.allocate(); b.printTo(cout); b.allocate(); b.printTo(cout);
b.free(3); b.printTo(cout); b.free(3); b.printTo(cout);
b.free(2); b.printTo(cout); b.free(2); b.printTo(cout);
b.allocate(); b.printTo(cout); b.allocate(); b.printTo(cout);
b.allocate(); b.printTo(cout); b.allocate(); b.printTo(cout);
b.allocate(); b.printTo(cout); b.allocate(); b.printTo(cout);
b.allocate(); b.printTo(cout); b.allocate(); b.printTo(cout);
b.allocate(); b.printTo(cout); b.allocate(); b.printTo(cout);
b.allocate(); b.printTo(cout); b.allocate(); b.printTo(cout);
b.allocate(); b.printTo(cout); b.allocate(); b.printTo(cout);
b.free(4); b.printTo(cout); b.free(4); b.printTo(cout);
b.free(3); b.printTo(cout); b.free(3); b.printTo(cout);
b.allocate(); b.printTo(cout); b.allocate(); b.printTo(cout);
return 0; return 0;
} }

View File

@ -1,138 +1,138 @@
// Filename: uniqueIdAllocator.cxx // Filename: uniqueIdAllocator.cxx
// Created by: schuyler 2003-03-13 // Created by: schuyler 2003-03-13
// //
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
// //
// PANDA 3D SOFTWARE // PANDA 3D SOFTWARE
// Copyright (c) 2001, Disney Enterprises, Inc. All rights reserved // Copyright (c) 2001, Disney Enterprises, Inc. All rights reserved
// //
// All use of this software is subject to the terms of the Panda 3d // All use of this software is subject to the terms of the Panda 3d
// Software license. You should have received a copy of this license // Software license. You should have received a copy of this license
// along with this source code; you will also find a current copy of // along with this source code; you will also find a current copy of
// the license at http://www.panda3d.org/license.txt . // the license at http://www.panda3d.org/license.txt .
// //
// To contact the maintainers of this program write to // To contact the maintainers of this program write to
// panda3d@yahoogroups.com . // panda3d@yahoogroups.com .
// //
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
// //
#include "pandabase.h" #include "pandabase.h"
#include "notify.h" #include "notify.h"
#include "uniqueIdAllocator.h" #include "uniqueIdAllocator.h"
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
// Function: // Function:
// Access: // Access:
// Description: Create a free id pool in the range [min:max]. // Description: Create a free id pool in the range [min:max].
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
UniqueIdAllocator:: UniqueIdAllocator::
UniqueIdAllocator(U32 min, U32 max) UniqueIdAllocator(U32 min, U32 max)
: _min(min), _max(max) { : _min(min), _max(max) {
//cout<<"UniqueIdAllocator::UniqueIdAllocator("<<min<<", "<<max<<")"<<endl; //cout<<"UniqueIdAllocator::UniqueIdAllocator("<<min<<", "<<max<<")"<<endl;
_size=_max-_min+1; // +1 because min and max are inclusive. _size=_max-_min+1; // +1 because min and max are inclusive.
assert(_size); // size must be > 0. assert(_size); // size must be > 0.
_table=new U32[_size]; _table=new U32[_size];
assert(_table); // This should be redundant if new throws an exception. assert(_table); // This should be redundant if new throws an exception.
for (U32 i=0; i<_size; ++i) { for (U32 i=0; i<_size; ++i) {
_table[i]=i+1; _table[i]=i+1;
} }
_table[_size-1]=-1; _table[_size-1]=-1;
_next_free=0; _next_free=0;
_last_free=_size-1; _last_free=_size-1;
_free=_size; _free=_size;
} }
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
// Function: // Function:
// Access: // Access:
// Description: // Description:
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
UniqueIdAllocator:: UniqueIdAllocator::
~UniqueIdAllocator() { ~UniqueIdAllocator() {
//cout<<"UniqueIdAllocator::~UniqueIdAllocator()"<<endl; //cout<<"UniqueIdAllocator::~UniqueIdAllocator()"<<endl;
delete [] _table; delete [] _table;
} }
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
// Function: // Function:
// Access: // Access:
// Description: Receive an id between _min and _max (that were passed // Description: Receive an id between _min and _max (that were passed
// to the constructor). This code will succede or call // to the constructor). This code will succede or call
// exit(). // exit().
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
U32 UniqueIdAllocator:: U32 UniqueIdAllocator::
allocate() { allocate() {
if (_next_free==-1) { if (_next_free==-1) {
// ...all ids allocated. // ...all ids allocated.
cerr<<"UniqueIdAllocator Error: all ids allocated."<<endl; cerr<<"UniqueIdAllocator Error: all ids allocated."<<endl;
// TODO:throw an exception rather than calling exit. // TODO:throw an exception rather than calling exit.
exit(1); exit(1);
} }
// This next block is redundant with the one above it, but I'm leaving // This next block is redundant with the one above it, but I'm leaving
// the one above in place, in case anyone removes this next block. // the one above in place, in case anyone removes this next block.
if (_free<=(_size>>2)) { if (_free<=(_size>>2)) {
// ...under 1/4 of the ids are free. // ...under 1/4 of the ids are free.
cerr<<"UniqueIdAllocator Error: 75% of ids allocated."<<endl; cerr<<"UniqueIdAllocator Error: 75% of ids allocated."<<endl;
// TODO:throw an exception rather than calling exit. // TODO:throw an exception rather than calling exit.
exit(1); exit(1);
} }
U32 id=_min+_next_free; U32 id=_min+_next_free;
_next_free=_table[_next_free]; _next_free=_table[_next_free];
assert(_table[id-_min]=-2); // this assignment is debug only. assert(_table[id-_min]=-2); // this assignment is debug only.
--_free; --_free;
//cout<<"UniqueIdAllocator::allocate() returning "<<id<<endl; //cout<<"UniqueIdAllocator::allocate() returning "<<id<<endl;
return id; return id;
} }
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
// Function: // Function:
// Access: // Access:
// Description: Free an allocated index (index must be between _min // Description: Free an allocated index (index must be between _min
// and _max that were passed to the constructor). // and _max that were passed to the constructor).
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
void UniqueIdAllocator:: void UniqueIdAllocator::
free(U32 index) { free(U32 index) {
//cout<<"UniqueIdAllocator::free(index)"<<endl; //cout<<"UniqueIdAllocator::free(index)"<<endl;
assert(index>=_min); // Attempt to free out-of-range id. assert(index>=_min); // Attempt to free out-of-range id.
assert(index<=_max); // Attempt to free out-of-range id. assert(index<=_max); // Attempt to free out-of-range id.
index=index-_min; index=index-_min;
assert(_table[index]==-2); // Attempt to free non-allocated id. assert(_table[index]==-2); // Attempt to free non-allocated id.
_table[index]=-1; _table[index]=-1;
_table[_last_free]=index; _table[_last_free]=index;
#if 0 //[ #if 0 //[
// This is only necessary if the free pool is allowed to go empty. // This is only necessary if the free pool is allowed to go empty.
// Since we don't allow that, it is an optimization to comment // Since we don't allow that, it is an optimization to comment
// this out. // this out.
if (_next_free==-1) { if (_next_free==-1) {
_next_free=index; _next_free=index;
} }
#endif //] #endif //]
_last_free=index; _last_free=index;
++_free; ++_free;
} }
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
// Function: // Function:
// Access: // Access:
// Description: ...intended for debugging only. // Description: ...intended for debugging only.
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
void UniqueIdAllocator:: void UniqueIdAllocator::
printTo(ostream& os) const { printTo(ostream& os) const {
os <<"[_next_free: "<<long(_next_free) os <<"[_next_free: "<<long(_next_free)
<<"; _last_free: "<<long(_last_free) <<"; _last_free: "<<long(_last_free)
<<"; _size: "<<_size <<"; _size: "<<_size
<<"; _free: "<<_free <<"; _free: "<<_free
<<"; used: "<<_size-_free <<"; used: "<<_size-_free
<<"; %used: "<<float(_size-_free)/_size // This differs the %used code above. <<"; %used: "<<float(_size-_free)/_size // This differs the %used code above.
<<";\n "; <<";\n ";
for (U32 i=0; i<_size; ++i) { for (U32 i=0; i<_size; ++i) {
os<<long(_table[i])<<", "; os<<long(_table[i])<<", ";
} }
os<<"]"<<endl; os<<"]"<<endl;
} }

View File

@ -1,50 +1,50 @@
// Filename: uniqueIdAllocator.h // Filename: uniqueIdAllocator.h
// Created by: schuyler 2003-03-13 // Created by: schuyler 2003-03-13
// //
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
// //
// PANDA 3D SOFTWARE // PANDA 3D SOFTWARE
// Copyright (c) 2001, Disney Enterprises, Inc. All rights reserved // Copyright (c) 2001, Disney Enterprises, Inc. All rights reserved
// //
// All use of this software is subject to the terms of the Panda 3d // All use of this software is subject to the terms of the Panda 3d
// Software license. You should have received a copy of this license // Software license. You should have received a copy of this license
// along with this source code; you will also find a current copy of // along with this source code; you will also find a current copy of
// the license at http://www.panda3d.org/license.txt . // the license at http://www.panda3d.org/license.txt .
// //
// To contact the maintainers of this program write to // To contact the maintainers of this program write to
// panda3d@yahoogroups.com . // panda3d@yahoogroups.com .
// //
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
// //
#ifndef _UNIQUEIDALLOCATOR_H //[ #ifndef _UNIQUEIDALLOCATOR_H //[
#define _UNIQUEIDALLOCATOR_H #define _UNIQUEIDALLOCATOR_H
#include "pandabase.h" #include "pandabase.h"
typedef unsigned long U32; typedef unsigned long U32;
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
// Class : UniqueIdAllocator // Class : UniqueIdAllocator
// Description : // Description :
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
class EXPCL_PANDA UniqueIdAllocator { class EXPCL_PANDA UniqueIdAllocator {
PUBLISHED: PUBLISHED:
UniqueIdAllocator(U32 min=0, U32 max=20); UniqueIdAllocator(U32 min=0, U32 max=20);
~UniqueIdAllocator(); ~UniqueIdAllocator();
U32 allocate(); U32 allocate();
void free(U32 index); void free(U32 index);
void printTo(ostream& os) const; void printTo(ostream& os) const;
protected: protected:
U32* _table; U32* _table;
U32 _min; U32 _min;
U32 _max; U32 _max;
U32 _next_free; U32 _next_free;
U32 _last_free; U32 _last_free;
U32 _size; U32 _size;
U32 _free; U32 _free;
}; };
#endif //] #endif //]