1 #ifndef _objtab_h
2 #define _objtab_h
3
4 #ifndef _real_h
5 # include "real.h"
6 #endif
7 #ifndef _object_h
8 # include "object.h"
9 #endif
10
11 #define DIRECT_ACCESS 1
12
13
14 class ObjTab {
15 public:
ObjTab()16 ObjTab() : size(0) { };
17 ~ObjTab();
18
19 void Init(int size);
GetSize()20 int GetSize() { return size; }
21
22 Object *&operator[](unsigned i);
23
24 Real &GetTime(unsigned i) const;
25 void SetTime(unsigned i, const Real &time_val);
26 void SetTimeDirect(unsigned i, const Real &time_val);
27
28 void StartRecalc();
29 void ToFront( int i );
30 void ToBack( int i );
31 void StopRecalc();
32
33 private:
34 int size; // Gr��e der Felder
35 Object **obj; // Feld mit den Objektzeigern
36 Real *time; // Feld mit den dazu geh�renden Zeiten
37
38 #if (!DIRECT_ACCESS)
39 unsigned *ind; // Indexfeld bei normalen Zugriffen
40 unsigned *new_ind; // Feld zu Erstellung der neuen Index-Liste
41 unsigned front, back; // Indizes innerhalb der Index-Liste
42 #endif
43 };
44
45 #if (DIRECT_ACCESS)
46 inline Object *&ObjTab::operator[](unsigned i) { return obj[i]; }
47
GetTime(unsigned i)48 inline Real &ObjTab::GetTime(unsigned i) const
49 { return time[i]; }
SetTime(unsigned i,const Real & time_val)50 inline void ObjTab::SetTime(unsigned i, const Real &time_val)
51 { time[i] = time_val; }
SetTimeDirect(unsigned i,const Real & time_val)52 inline void ObjTab::SetTimeDirect(unsigned i, const Real &time_val)
53 { time[i] = time_val; }
54
StartRecalc()55 inline void ObjTab::StartRecalc() { }
ToFront(int)56 inline void ObjTab::ToFront( int ) { }
ToBack(int)57 inline void ObjTab::ToBack( int ) { }
StopRecalc()58 inline void ObjTab::StopRecalc() { }
59 #else
60 inline Object *&ObjTab::operator[](unsigned i)
61 { return obj[ind[i]]; }
62
GetTime(unsigned i)63 inline Real &ObjTab::GetTime(unsigned i) const
64 { return time[ind[i]]; }
SetTime(unsigned i,const Real & time_val)65 inline void ObjTab::SetTime(unsigned i, const Real &time_val)
66 { time[ind[i]] = time_val; }
SetTimeDirect(unsigned i,const Real & time_val)67 inline void ObjTab::SetTimeDirect(unsigned i, const Real &time_val)
68 { time[i] = time_val; }
69
StartRecalc()70 inline void ObjTab::StartRecalc() { front=size; back=0; }
ToFront(int i)71 inline void ObjTab::ToFront( int i ) { new_ind[--front]=ind[i]; }
ToBack(int i)72 inline void ObjTab::ToBack( int i ) { new_ind[back++]=ind[i]; }
StopRecalc()73 inline void ObjTab::StopRecalc() {
74 memcpy( &ind[0], &new_ind[front], (size-front)*sizeof(unsigned) );
75 memcpy( &ind[size-front], &new_ind[0], back*sizeof(unsigned) );
76 }
77 #endif
78
79
80 #endif
81