File: vec.h

package info (click to toggle)
exult 1.2-4
  • links: PTS
  • area: contrib
  • in suites: sarge
  • size: 9,040 kB
  • ctags: 10,543
  • sloc: cpp: 99,373; sh: 8,333; ansic: 4,659; makefile: 988; yacc: 769; lex: 313; xml: 19
file content (100 lines) | stat: -rw-r--r-- 2,348 bytes parent folder | download | duplicates (8)
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
99
100
/*
 *  Copyright (C) 2000-2001  The Exult Team
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 */

#ifndef VEC_H
#define VEC_H

#include	<vector>

template <class T>
class Exult_vector : public std::vector<T>
{
private:
	typedef	std::vector<T>	baseClass;
public:
	typedef typename		baseClass::size_type       size_type;
	typedef typename		baseClass::iterator		   iterator;

	Exult_vector<T>() : baseClass()
		{}
	Exult_vector<T>(size_type n) : baseClass()
		{ reserve(n); }

#ifndef MACOS /* should be something like PROPER_STD_CPP_LIB or so */
	T& at(int i) { return (*this)[i]; }
#endif
	void put(int i, T& v)		// Set i'th entry.
		{
			if (i >= (int)this->size())
				{
				insert(this->begin() + this->size(), i - this->size(), 0);
				push_back(v);
				}
			else
				(*this)[i] = v;
		}
	int put(T& v)			// Put in a free spot & return it.
		{
			int i = find(0);
			if (i < 0)
				i = this->size();
			put(i, v);
			return (i);
		}
	size_type	find( const T& obj ) const
		{
			size_type pos = 0;
			for (const T *X = &*this->begin(); X != &*this->end(); ++X, ++pos)
				{
				if( *X == obj )
					return pos;
				}
			return -1;
		}

	size_type	append( const T& obj )
		{
			push_back( obj );
			return this->size() - 1;
		}

	void		remove( const T& obj )
		{
			// Correct way. An iterator isn't a pointer, necessarily
			for(iterator X = this->begin(); X != this->end(); ++X)
			{
				if( *X == obj )
				{
					erase(X);
					return;
				}
			}
		}
};


class	Game_object;
class	Egg_object;
class	Actor;

typedef	Exult_vector<Game_object*>	Game_object_vector;
typedef	Exult_vector<Egg_object*>	Egg_vector;
typedef	Exult_vector<Actor*>		Actor_vector;


#endif