summaryrefslogtreecommitdiff
path: root/utils/IdTable.h
blob: e062ce26c24889dde0dde274110d4d2503e84265 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
/*
 *	CENA C++ Utilities
 *
 *	by Stephane Chatty
 *
 *	Copyright 1990, 1991, 1992, 1993, 1994
 *	Laboratoire de Recherche en Informatique (LRI)
 *	Centre d'Etudes de la Navigation Aerienne (CENA)
 *
 *	tables for managing an ID scheme, originally by Michel Beaudouin-Lafon
 *
 *	$Id$
 *	$CurLog$
 */

#ifndef IdTable_H_
#define IdTable_H_

#include "cplus_bugs.h"
#include "word.h"
#include "bool.h"

typedef void CcuIdItem;
typedef lword CcuID;
typedef sword CcuIdType;
typedef sword CcuIdIndex;

class CcuIdTable {
friend	class	CcuIdIter;
friend	class	CcuIdCell;

protected:
	CcuIdCell*	Entries;	// the table itself
	CcuIdCell*	LastCell;		// its end
	CcuIdIndex	FirstFree;		// index of first free entry
	CcuIdIndex	LastFree;	// index of end of free list
	short	NumFree;	// number of free Entries

	bool	Grow (int);

public:
		CcuIdTable (int);	// initial size should be power of 2
	
	CcuID	Store (CcuIdItem*, CcuIdType = 0);
	CcuIdItem*	Get (CcuID, CcuIdType* = 0);
	CcuIdItem*	Remove (CcuID, bool* = 0, CcuIdType* = 0);
	void	Change (CcuID, CcuIdItem*, CcuIdType = 0);
	
};

class CcuIdIter {
public:
	enum	iditer_status	{ Normal, StartOfTable, EndOfTable };

protected:
	const CcuIdTable*	TheTable;
	iditer_status	StatusFlag;
	CcuIdCell*		Entries;
	CcuIdCell*		CurCell;
	
public:
inline		CcuIdIter (const CcuIdTable& t) : TheTable (&t), StatusFlag (StartOfTable)	{ CurCell = Entries = t.Entries; }
inline	void	Reset ()				{ CurCell = Entries = TheTable->Entries; StatusFlag = StartOfTable; }
inline	CcuIdIter&	operator = (const CcuIdTable& t)	{ TheTable = &t; StatusFlag = StartOfTable; CurCell = Entries = t.Entries; return *this; }
inline	CcuIdIter&	operator = (const CcuIdIter& it)	{ TheTable = it.TheTable; StatusFlag = it.StatusFlag; CurCell = it.CurCell; Entries = it.Entries; return *this; }

	CcuIdIter&	operator ++ ();
	CcuIdItem*	Current () const;
inline	CcuIdItem*	operator * () const		{ return Current (); }
inline	operator int () const	{ return StatusFlag == Normal; }
	CcuIdType		CurType () const;
	CcuID		CurId () const;
	
};
template <class ITEM> class CcuIdTableOf : public CcuIdTable {
public:
inline		CcuIdTableOf (int sz) : CcuIdTable (sz)	{}
	
inline	CcuID	Store (ITEM* it, CcuIdType typ = 0)	{ return CcuIdTable::Store (it, typ); }
inline	ITEM*	Get (CcuID id, CcuIdType* typ = 0)	{ return (ITEM*) CcuIdTable::Get (id, typ); }
inline	ITEM*	Remove (CcuID id, bool* f = 0, CcuIdType* t = 0)	{ return (ITEM*) CcuIdTable::Remove (id, f, t); }
inline	void	Change (CcuID id, ITEM* i, CcuIdType t = 0)	{ CcuIdTable::Change (id, i, t); }
};

template <class ITEM> class CcuIdIterOf : public CcuIdIter {
public:
inline			CcuIdIterOf (CcuIdTableOf <ITEM> & t) : CcuIdIter (t)	{ }
inline	CcuIdIterOf<ITEM>&	operator =  (const CcuIdTableOf <ITEM>& t)	{ return (CcuIdIterOf<ITEM>&) CcuIdIter::operator = (t); }
inline	CcuIdIterOf<ITEM>&	operator =  (const CcuIdIterOf<ITEM>& li)	{ return (CcuIdIterOf<ITEM>&) CcuIdIter::operator = (li); }
inline	CcuIdIterOf<ITEM>&	operator ++ ()	{ return (CcuIdIterOf<ITEM>&) CcuIdIter::operator ++ (); }
inline	ITEM*	Current () const	{ return (ITEM*) CcuIdIter::Current (); }
inline	ITEM*	operator * () const		{ return Current (); }
};



#endif	/* IdTable_H_ */