mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-31 22:25:30 +00:00
84 lines
2.3 KiB
C
84 lines
2.3 KiB
C
|
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
||
|
*
|
||
|
* The contents of this file are subject to the Netscape Public License
|
||
|
* Version 1.0 (the "NPL"); you may not use this file except in
|
||
|
* compliance with the NPL. You may obtain a copy of the NPL at
|
||
|
* http://www.mozilla.org/NPL/
|
||
|
*
|
||
|
* Software distributed under the NPL is distributed on an "AS IS" basis,
|
||
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
|
||
|
* for the specific language governing rights and limitations under the
|
||
|
* NPL.
|
||
|
*
|
||
|
* The Initial Developer of this code under the NPL is Netscape
|
||
|
* Communications Corporation. Portions created by Netscape are
|
||
|
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
|
||
|
* Reserved.
|
||
|
*/
|
||
|
#ifndef _COLLECTOR_H_
|
||
|
#define _COLLECTOR_H_
|
||
|
|
||
|
#include "Pool.h"
|
||
|
|
||
|
/* A class that holds a collection of objects of class N of a fixed size that
|
||
|
* may not all be added to the collection at the same time. Keeps track of
|
||
|
* how many objects have been actually added, and whether or not the
|
||
|
* collection is full (ie all objects have been added).
|
||
|
*/
|
||
|
template<class N> class Collector {
|
||
|
private:
|
||
|
N **entries;
|
||
|
Uint32 numEntries;
|
||
|
|
||
|
bool allEntriesBuilt;
|
||
|
Uint32 numEntriesBuilt;
|
||
|
|
||
|
Pool &pool;
|
||
|
|
||
|
public:
|
||
|
Collector(Pool &p) :
|
||
|
entries(0), numEntries(0), allEntriesBuilt(false), numEntriesBuilt(0),
|
||
|
pool(p) { }
|
||
|
|
||
|
/* Set the size of the collection. You can only do this once */
|
||
|
void setSize(Uint32 n) {
|
||
|
assert(!numEntries);
|
||
|
|
||
|
numEntries = n;
|
||
|
entries = new (pool) N *[n];
|
||
|
|
||
|
for (Uint32 i = 0; i < n; i++)
|
||
|
entries[i] = 0;
|
||
|
}
|
||
|
|
||
|
/* Add an entry to the collection at index n. You can only do this once. */
|
||
|
void set(Uint32 n, N *entry) {
|
||
|
assert(n < numEntries && !entries[n] && entry);
|
||
|
|
||
|
entries[n] = entry;
|
||
|
if (++numEntriesBuilt == numEntries)
|
||
|
allEntriesBuilt = true;
|
||
|
}
|
||
|
|
||
|
/* Get the entry at index n, NIL if none has been set yet. */
|
||
|
N *get(Uint32 n) {
|
||
|
assert(n < numEntries);
|
||
|
return entries[n];
|
||
|
}
|
||
|
|
||
|
/* return true if all entries have been built */
|
||
|
bool built() { return allEntriesBuilt; }
|
||
|
|
||
|
/* Return number of entries built */
|
||
|
Int32 getNumEntriesBuilt() { return numEntriesBuilt; }
|
||
|
|
||
|
/* return all entries */
|
||
|
N **getEntries() { return entries; }
|
||
|
|
||
|
/* return number of entries */
|
||
|
Uint32 getSize() { return numEntries; }
|
||
|
};
|
||
|
|
||
|
|
||
|
#endif /* _COLLECTOR_H_ */
|