idGenerator.h

Engine/source/core/idGenerator.h

More...

Classes:

Detailed Description

 1
 2//-----------------------------------------------------------------------------
 3// Copyright (c) 2012 GarageGames, LLC
 4//
 5// Permission is hereby granted, free of charge, to any person obtaining a copy
 6// of this software and associated documentation files (the "Software"), to
 7// deal in the Software without restriction, including without limitation the
 8// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
 9// sell copies of the Software, and to permit persons to whom the Software is
10// furnished to do so, subject to the following conditions:
11//
12// The above copyright notice and this permission notice shall be included in
13// all copies or substantial portions of the Software.
14//
15// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21// IN THE SOFTWARE.
22//-----------------------------------------------------------------------------
23
24#ifndef _IDGENERATOR_H_
25#define _IDGENERATOR_H_
26
27#ifndef _PLATFORM_H_
28#include "platform/platform.h"
29#endif
30#ifndef _TVECTOR_H_
31#include "core/util/tVector.h"
32#endif
33
34class IdGenerator
35{
36private:
37   U32 mIdBlockBase;
38   U32 mIdRangeSize;
39   Vector<U32> mPool;
40   U32 mNextId;
41
42   void reclaim();
43
44public:
45   IdGenerator(U32 base, U32 numIds)
46   {
47      VECTOR_SET_ASSOCIATION(mPool);
48
49      mIdBlockBase = base;
50      mIdRangeSize = numIds;
51      mNextId = mIdBlockBase;
52   }
53
54   void reset()
55   {
56      mPool.clear();
57      mNextId = mIdBlockBase;
58   }
59
60   U32 alloc()
61   {
62      // fist check the pool:
63      if(!mPool.empty())
64      {
65         U32 id = mPool.last();
66         mPool.pop_back();
67         reclaim();
68         return id;
69      }
70      if(mIdRangeSize && mNextId >= mIdBlockBase + mIdRangeSize)
71         return 0;
72
73      return mNextId++;
74   }
75
76   void free(U32 id)
77   {
78      AssertFatal(id >= mIdBlockBase, "IdGenerator::alloc: invalid id, id does not belong to this IdGenerator.");
79      if(id == mNextId - 1)
80      {
81         mNextId--;
82         reclaim();
83      }
84      else
85         mPool.push_back(id);
86   }
87
88   U32 numIdsUsed()
89   {
90      return mNextId - mIdBlockBase - mPool.size();
91   }
92};
93
94#endif
95