7 |
using std::vector; |
using std::vector; |
8 |
using std::cout; |
using std::cout; |
9 |
using std::cerr; |
using std::cerr; |
10 |
|
using std::string; |
11 |
|
|
12 |
// XXX NOT ENOUGH SAFETY CHECKS FOR REMOVE! |
// XXX NOT ENOUGH SAFETY CHECKS FOR REMOVE! |
13 |
// GET MUSTN'T CHECK; MUST CHECK RANGE BEFORE. |
// GET MUSTN'T CHECK; MUST CHECK RANGE BEFORE. |
15 |
*/ |
*/ |
16 |
template<class T> class ObjectStorer { |
template<class T> class ObjectStorer { |
17 |
vector<T *> vec; |
vector<T *> vec; |
18 |
|
string name; |
19 |
public: |
public: |
20 |
ObjectStorer() { |
ObjectStorer(string name="") : name(name) { |
21 |
// to avoid '0' as id |
// to avoid '0' as id |
22 |
vec.insert(vec.end(), 0); |
vec.insert(vec.end(), 0); |
23 |
} |
} |
48 |
void remove(int p) { |
void remove(int p) { |
49 |
if(p == 0) return; |
if(p == 0) return; |
50 |
if((unsigned)p >= vec.size()) { |
if((unsigned)p >= vec.size()) { |
51 |
cerr << "Trying to delete element past end "<<p<<"\n"; |
cerr << name<<": Trying to delete element past end "<<p<<"\n"; |
52 |
return; |
return; |
53 |
} |
} |
54 |
if(vec[p] == NULL) { |
if(vec[p] == NULL) { |
55 |
cerr << "Trying to delete null element! "<<p<<"\n"; |
cerr << name<<": Trying to delete null element! "<<p<<"\n"; |
56 |
return; |
return; |
57 |
} |
} |
58 |
delete vec[p]; |
delete vec[p]; |
63 |
*/ |
*/ |
64 |
T *get(int p) { |
T *get(int p) { |
65 |
if((unsigned)p >= vec.size()) { |
if((unsigned)p >= vec.size()) { |
66 |
cerr << "Trying to get element past end\n"; |
cerr << name<<": Trying to get element past end\n"; |
67 |
return 0; |
return 0; |
68 |
} |
} |
69 |
if(vec[p] == NULL) { |
if(vec[p] == NULL) { |
70 |
cerr << "Trying to get null element!\n"; |
cerr << name<<": Trying to get null element!\n"; |
71 |
return 0; |
return 0; |
72 |
} |
} |
73 |
return vec[p]; |
return vec[p]; |