1 /* see copyright notice in squirrel.h */
\r
5 void *sq_vm_malloc(SQUnsignedInteger size);
\r
6 void *sq_vm_realloc(void *p,SQUnsignedInteger oldsize,SQUnsignedInteger size);
\r
7 void sq_vm_free(void *p,SQUnsignedInteger size);
\r
9 #define sq_new(__ptr,__type) {__ptr=(__type *)sq_vm_malloc(sizeof(__type));new (__ptr) __type;}
\r
10 #define sq_delete(__ptr,__type) {__ptr->~__type();sq_vm_free(__ptr,sizeof(__type));}
\r
11 #define SQ_MALLOC(__size) sq_vm_malloc((__size));
\r
12 #define SQ_FREE(__ptr,__size) sq_vm_free((__ptr),(__size));
\r
13 #define SQ_REALLOC(__ptr,__oldsize,__size) sq_vm_realloc((__ptr),(__oldsize),(__size));
\r
15 #define sq_aligning(v) (((size_t)(v) + (SQ_ALIGNMENT-1)) & (~(SQ_ALIGNMENT-1)))
\r
17 //sqvector mini vector class, supports objects by value
\r
18 template<typename T> class sqvector
\r
27 sqvector(const sqvector<T>& v)
\r
31 void copy(const sqvector<T>& v)
\r
34 resize(0); //destroys all previous stuff
\r
37 if(v._size > _allocated) {
\r
40 for(SQUnsignedInteger i = 0; i < v._size; i++) {
\r
41 new ((void *)&_vals[i]) T(v._vals[i]);
\r
48 for(SQUnsignedInteger i = 0; i < _size; i++)
\r
50 SQ_FREE(_vals, (_allocated * sizeof(T)));
\r
53 void reserve(SQUnsignedInteger newsize) { _realloc(newsize); }
\r
54 void resize(SQUnsignedInteger newsize, const T& fill = T())
\r
56 if(newsize > _allocated)
\r
58 if(newsize > _size) {
\r
59 while(_size < newsize) {
\r
60 new ((void *)&_vals[_size]) T(fill);
\r
65 for(SQUnsignedInteger i = newsize; i < _size; i++) {
\r
71 void shrinktofit() { if(_size > 4) { _realloc(_size); } }
\r
72 T& top() const { return _vals[_size - 1]; }
\r
73 inline SQUnsignedInteger size() const { return _size; }
\r
74 bool empty() const { return (_size <= 0); }
\r
75 inline T &push_back(const T& val = T())
\r
77 if(_allocated <= _size)
\r
78 _realloc(_size * 2);
\r
79 return *(new ((void *)&_vals[_size++]) T(val));
\r
81 inline void pop_back()
\r
83 _size--; _vals[_size].~T();
\r
85 void insert(SQUnsignedInteger idx, const T& val)
\r
88 for(SQUnsignedInteger i = _size - 1; i > idx; i--) {
\r
89 _vals[i] = _vals[i - 1];
\r
93 void remove(SQUnsignedInteger idx)
\r
96 if(idx < (_size - 1)) {
\r
97 memmove(&_vals[idx], &_vals[idx+1], sizeof(T) * (_size - idx - 1));
\r
101 SQUnsignedInteger capacity() { return _allocated; }
\r
102 inline T &back() const { return _vals[_size - 1]; }
\r
103 inline T& operator[](SQUnsignedInteger pos) const{ return _vals[pos]; }
\r
106 void _realloc(SQUnsignedInteger newsize)
\r
108 newsize = (newsize > 0)?newsize:4;
\r
109 _vals = (T*)SQ_REALLOC(_vals, _allocated * sizeof(T), newsize * sizeof(T));
\r
110 _allocated = newsize;
\r
112 SQUnsignedInteger _size;
\r
113 SQUnsignedInteger _allocated;
\r
116 #endif //_SQUTILS_H_
\r