~swag/armagetronad/0.2.9-sty+ct+ap-fork

« back to all changes in this revision

Viewing changes to src/tools/tSafePTRBase.cpp

  • Committer: luke-jr
  • Date: 2006-05-29 01:55:42 UTC
  • Revision ID: svn-v3-list-QlpoOTFBWSZTWZvbKhsAAAdRgAAQABK6798QIABURMgAAaeoNT1TxT1DQbKaeobXKiyAmlWT7Y5MkdJOtXDtB7w7DOGFBHiOBxaUIu7HQyyQSvxdyRThQkJvbKhs:7d95bf1e-0414-0410-9756-b78462a59f44:armagetronad%2Fbranches%2F0.2.8%2Farmagetronad:4612
Unify tags/branches of modules released together

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 
 
3
*************************************************************************
 
4
 
 
5
ArmageTron -- Just another Tron Lightcycle Game in 3D.
 
6
Copyright (C) 2000  Manuel Moos (manuel@moosnet.de)
 
7
 
 
8
**************************************************************************
 
9
 
 
10
This program is free software; you can redistribute it and/or
 
11
modify it under the terms of the GNU General Public License
 
12
as published by the Free Software Foundation; either version 2
 
13
of the License, or (at your option) any later version.
 
14
 
 
15
This program is distributed in the hope that it will be useful,
 
16
but WITHOUT ANY WARRANTY; without even the implied warranty of
 
17
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
18
GNU General Public License for more details.
 
19
 
 
20
You should have received a copy of the GNU General Public License
 
21
along with this program; if not, write to the Free Software
 
22
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 
23
  
 
24
***************************************************************************
 
25
 
 
26
*/
 
27
 
 
28
#include "tSafePTR.h"
 
29
//#include <unistd>
 
30
#include "tList.h"
 
31
 
 
32
/*
 
33
class tPTRList:public tArray<tCheckedPTRBase *> {
 
34
  friend tCheckedPTRBase;
 
35
 
 
36
  // Array<T *> list;
 
37
public:
 
38
  tPTRList():tArray<tCheckedPTRBase *>(10000){}
 
39
 
 
40
  void Add(tCheckedPTRBase *t){
 
41
    if (t->id<0){    // tEventQueue relies on the fact that we put t in
 
42
      t->id=Len();   // the last place.
 
43
      operator[](t->id)=t;
 
44
      if ((t->id)==710)
 
45
        st_Breakpoint();
 
46
    }
 
47
  }
 
48
  void Remove(tCheckedPTRBase *t){
 
49
    // con << "offset=" << offset << '\n';
 
50
    if (t->id>=0 && Len()>0){
 
51
#ifdef DEBUG
 
52
      if ((t->id)==710)
 
53
        st_Breakpoint();
 
54
 
 
55
      if (t->id>=Len())
 
56
        tERR_ERROR("Scr. list structure!");
 
57
      
 
58
      tCheckedPTRBase *test=operator()(t->id);
 
59
      if (test!=t)
 
60
        tERR_ERROR("Screwed list structure!");
 
61
#endif
 
62
    // the check for Len() is done, since this may be
 
63
      // called on an allready descructed list.
 
64
      tCheckedPTRBase *other=operator()(Len()-1);
 
65
      operator()(t->id)=other;
 
66
 
 
67
      if ((other->id)==710)
 
68
        st_Breakpoint();
 
69
 
 
70
      other->id=t->id;
 
71
      SetLen(Len()-1);
 
72
    }
 
73
    t->id=-1;
 
74
  }
 
75
};
 
76
*/
 
77
 
 
78
List<tCheckedPTRBase> tCheckedPTRs;
 
79
 
 
80
tCheckedPTRBase::tCheckedPTRBase(void *x):id(-1),target(x){
 
81
    Check();
 
82
    tCheckedPTRs.Add(this,id);
 
83
#ifdef DEBUG
 
84
    //con <<  "Added defined tCheckedPTR " << this << " no " << id << '\n';
 
85
    Check();
 
86
#endif
 
87
}
 
88
 
 
89
tCheckedPTRBase::tCheckedPTRBase(const tCheckedPTRBase& x)
 
90
        :id(-1),target(x.target){
 
91
    Check();
 
92
    tCheckedPTRs.Add(this,id);
 
93
#ifdef DEBUG
 
94
    //con <<  "Added defined tCheckedPTR  " << this << "  no " << id << '\n';
 
95
    Check();
 
96
#endif
 
97
}
 
98
 
 
99
tCheckedPTRBase::tCheckedPTRBase():id(-1),target(NULL){
 
100
    Check();
 
101
    tCheckedPTRs.Add(this,id);
 
102
#ifdef DEBUG
 
103
    //con <<  "Added NULL tCheckedPTR " << this << "  no " << id << '\n';
 
104
    Check();
 
105
#endif
 
106
}
 
107
 
 
108
 
 
109
tCheckedPTRBase::~tCheckedPTRBase(){
 
110
#ifdef DEBUG
 
111
    //con <<  "Removed tCheckedPTR no " << id << '\n';
 
112
    Check();
 
113
#endif
 
114
    tCheckedPTRs.Remove(this,id);
 
115
    Check();
 
116
};
 
117
 
 
118
 
 
119
 
 
120
 
 
121
 
 
122
 
 
123
 
 
124
class gWallRim;
 
125
class gNetPlayerWall;
 
126
class eCamera;
 
127
class tConfItemBase;
 
128
class ePlayer;
 
129
class ePlayerNetID;
 
130
class uAction;
 
131
 
 
132
/*
 
133
 
 
134
#include "tConfiguration.h"
 
135
#include "eGameObject.h"
 
136
#include "eTess.h"
 
137
 
 
138
 
 
139
extern List<gWallRim> se_rimWalls;
 
140
extern List<gNetPlayerWall> sg_netPlayerWalls;
 
141
extern List<gNetPlayerWall> gridded_sg_netPlayerWalls;
 
142
extern List<eCamera> se_cameras;
 
143
//extern List<tConfItemBase> tConfItemBase::tConfItems;
 
144
//extern List<eGameObject> eGameObject::gameObjects;
 
145
extern List<ePlayer> PlayerConfig;
 
146
extern List<ePlayerNetID> se_PlayerNetIDs;
 
147
extern List<uAction> s_playerActions;
 
148
extern List<uAction> s_cameraActions;
 
149
extern List<uAction> s_globalActions;
 
150
extern List<uAction> su_allActions;
 
151
//extern List<ePoint> ePoint::points;
 
152
//extern List<eEdge> eEdge::edges;
 
153
//extern List<eFace> eFace::faces;
 
154
 
 
155
 
 
156
template<class T> void suspicious(const List<T> &l,tCheckedPTRBase *adr){
 
157
  T *best=NULL;
 
158
  int best_ind=-1;
 
159
  int i;
 
160
  for (i=l.Len()-1;i>=0;i--){
 
161
    T *t=l(i);
 
162
    int dist=int(adr)-int(t);
 
163
    if (dist>=0 && dist <1000 && int(t)>int(best)){
 
164
      best=t;
 
165
      best_ind=i;
 
166
    }
 
167
  }
 
168
  if (best){
 
169
    tERR_ERROR("Suspicious object has index " << best_ind << " and is at adress " 
 
170
          << best << ".");
 
171
1  }
 
172
}
 
173
 
 
174
*/
 
175
 
 
176
 
 
177
 
 
178
void tCheckedPTRBase::CheckDestructed(void *test){
 
179
    for(int i=tCheckedPTRs.Len()-1;i>=0;i--){
 
180
        tCheckedPTRBase * adr=tCheckedPTRs(i);
 
181
        if (adr->id!=i)
 
182
            tERR_ERROR("Checked ptr list screwed! "
 
183
                       << adr << ":" << adr->id << ":" << adr->target << ":" << i);
 
184
 
 
185
        if (adr->target==test){
 
186
            /*
 
187
            suspicious(se_rimWalls,adr);
 
188
            suspicious(sg_netPlayerWalls,adr);
 
189
            suspicious(gridded_sg_netPlayerWalls,adr);
 
190
            suspicious(se_cameras,adr);
 
191
            suspicious(tConfItemBase::tConfItems,adr);
 
192
            suspicious(eGameObject::gameObjects,adr);
 
193
            suspicious(eGameObject::gameObjectsInactive,adr);
 
194
            suspicious(PlayerConfig,adr);
 
195
            suspicious(se_PlayerNetID,adr);
 
196
            suspicious(s_playerActions,adr);
 
197
            suspicious(s_cameraActions,adr);
 
198
            suspicious(s_globalActions,adr);
 
199
            suspicious(su_allActions,adr);
 
200
            suspicious(ePoint::points,adr);
 
201
            suspicious(eEdge::edges,adr);
 
202
            suspicious(eFace::faces,adr);
 
203
            */
 
204
 
 
205
            tERR_ERROR("Object destroyed, but pointer at " << adr <<
 
206
                       " still points to it!");
 
207
        }
 
208
    }
 
209
 
 
210
}
 
211
 
 
212
void tCheckedPTRBase::Check(){
 
213
    for(int i=tCheckedPTRs.Len()-1;i>=0;i--){
 
214
        tCheckedPTRBase * adr=tCheckedPTRs(i);
 
215
        if (adr->id!=i)
 
216
            tERR_ERROR("Checked ptr list screwed! "
 
217
                       << adr << ":" << adr->id << ":" << adr->target << ":" << i);
 
218
    }
 
219
}
 
220
 
 
221
 
 
222
 
 
223
 
 
224
 
 
225