-/* see copyright notice in squirrel.h */
-#ifndef _SQUTILS_H_
-#define _SQUTILS_H_
-
-#define sq_new(__ptr,__type) {__ptr=(__type *)sq_vm_malloc(sizeof(__type));new (__ptr) __type;}
-#define sq_delete(__ptr,__type) {__ptr->~__type();sq_vm_free(__ptr,sizeof(__type));}
-#define SQ_MALLOC(__size) sq_vm_malloc(__size);
-#define SQ_FREE(__ptr,__size) sq_vm_free(__ptr,__size);
-#define SQ_REALLOC(__ptr,__oldsize,__size) sq_vm_realloc(__ptr,__oldsize,__size);
-
-//sqvector mini vector class, supports objects by value
-template<typename T> class sqvector
-{
-public:
- sqvector()
- {
- _vals = NULL;
- _size = 0;
- _allocated = 0;
- }
- sqvector(const sqvector<T>& v)
- {
- copy(v);
- }
- void copy(const sqvector<T>& v)
- {
- resize(v._size);
- for(unsigned int i = 0; i < v._size; i++) {
- new ((void *)&_vals[i]) T(v._vals[i]);
- }
- _size = v._size;
- }
- ~sqvector()
- {
- if(_allocated) {
- for(unsigned int i = 0; i < _size; i++)
- _vals[i].~T();
- SQ_FREE(_vals, (_allocated * sizeof(T)));
- }
- }
- void reserve(unsigned int newsize) { _realloc(newsize); }
- void resize(unsigned int newsize, const T& fill = T())
- {
- if(newsize > _allocated)
- _realloc(newsize);
- if(newsize > _size) {
- while(_size < newsize) {
- new ((void *)&_vals[_size]) T(fill);
- _size++;
- }
- }
- else{
- for(unsigned int i = newsize; i < _size; i++) {
- _vals[i].~T();
- }
- _size = newsize;
- }
- }
- void shrinktofit() { if(_size > 4) { _realloc(_size); } }
- T& top() const { return _vals[_size - 1]; }
- inline unsigned int size() const { return _size; }
- bool empty() const { return (_size <= 0); }
- inline T &push_back(const T& val = T())
- {
- if(_allocated <= _size)
- _realloc(_size * 2);
- return *(new ((void *)&_vals[_size++]) T(val));
- }
- inline void pop_back()
- {
- _size--; _vals[_size].~T();
- }
- void insert(unsigned int idx, const T& val)
- {
- resize(_size + 1);
- for(unsigned int i = _size - 1; i > idx; i--) {
- _vals[i] = _vals[i - 1];
- }
- _vals[idx] = val;
- }
- void remove(unsigned int idx)
- {
- _vals[idx].~T();
- if(idx < (_size - 1)) {
- memcpy(&_vals[idx], &_vals[idx+1], sizeof(T) * (_size - idx - 1));
- }
- _size--;
- }
- unsigned int capacity() { return _allocated; }
- inline T &back() const { return _vals[_size - 1]; }
- inline T& operator[](unsigned int pos) const{ return _vals[pos]; }
- T* _vals;
-private:
- void _realloc(unsigned int newsize)
- {
- newsize = (newsize > 0)?newsize:4;
- _vals = (T*)SQ_REALLOC(_vals, _allocated * sizeof(T), newsize * sizeof(T));
- _allocated = newsize;
- }
- unsigned int _size;
- unsigned int _allocated;
-};
-
-#endif //_SQUTILS_H_
+/* see copyright notice in squirrel.h */\r
+#ifndef _SQUTILS_H_\r
+#define _SQUTILS_H_\r
+\r
+#define sq_new(__ptr,__type) {__ptr=(__type *)sq_vm_malloc(sizeof(__type));new (__ptr) __type;}\r
+#define sq_delete(__ptr,__type) {__ptr->~__type();sq_vm_free(__ptr,sizeof(__type));}\r
+#define SQ_MALLOC(__size) sq_vm_malloc(__size);\r
+#define SQ_FREE(__ptr,__size) sq_vm_free(__ptr,__size);\r
+#define SQ_REALLOC(__ptr,__oldsize,__size) sq_vm_realloc(__ptr,__oldsize,__size);\r
+\r
+//sqvector mini vector class, supports objects by value\r
+template<typename T> class sqvector\r
+{\r
+public:\r
+ sqvector()\r
+ {\r
+ _vals = NULL;\r
+ _size = 0;\r
+ _allocated = 0;\r
+ }\r
+ sqvector(const sqvector<T>& v)\r
+ {\r
+ copy(v);\r
+ }\r
+ void copy(const sqvector<T>& v)\r
+ {\r
+ resize(v._size);\r
+ for(SQUnsignedInteger i = 0; i < v._size; i++) {\r
+ new ((void *)&_vals[i]) T(v._vals[i]);\r
+ }\r
+ _size = v._size;\r
+ }\r
+ ~sqvector()\r
+ {\r
+ if(_allocated) {\r
+ for(SQUnsignedInteger i = 0; i < _size; i++)\r
+ _vals[i].~T();\r
+ SQ_FREE(_vals, (_allocated * sizeof(T)));\r
+ }\r
+ }\r
+ void reserve(SQUnsignedInteger newsize) { _realloc(newsize); }\r
+ void resize(SQUnsignedInteger newsize, const T& fill = T())\r
+ {\r
+ if(newsize > _allocated)\r
+ _realloc(newsize);\r
+ if(newsize > _size) {\r
+ while(_size < newsize) {\r
+ new ((void *)&_vals[_size]) T(fill);\r
+ _size++;\r
+ }\r
+ }\r
+ else{\r
+ for(SQUnsignedInteger i = newsize; i < _size; i++) {\r
+ _vals[i].~T();\r
+ }\r
+ _size = newsize;\r
+ }\r
+ }\r
+ void shrinktofit() { if(_size > 4) { _realloc(_size); } }\r
+ T& top() const { return _vals[_size - 1]; }\r
+ inline SQUnsignedInteger size() const { return _size; }\r
+ bool empty() const { return (_size <= 0); }\r
+ inline T &push_back(const T& val = T())\r
+ {\r
+ if(_allocated <= _size)\r
+ _realloc(_size * 2);\r
+ return *(new ((void *)&_vals[_size++]) T(val));\r
+ }\r
+ inline void pop_back()\r
+ {\r
+ _size--; _vals[_size].~T();\r
+ }\r
+ void insert(SQUnsignedInteger idx, const T& val)\r
+ {\r
+ resize(_size + 1);\r
+ for(SQUnsignedInteger i = _size - 1; i > idx; i--) {\r
+ _vals[i] = _vals[i - 1];\r
+ }\r
+ _vals[idx] = val;\r
+ }\r
+ void remove(SQUnsignedInteger idx)\r
+ {\r
+ _vals[idx].~T();\r
+ if(idx < (_size - 1)) {\r
+ memcpy(&_vals[idx], &_vals[idx+1], sizeof(T) * (_size - idx - 1));\r
+ }\r
+ _size--;\r
+ }\r
+ SQUnsignedInteger capacity() { return _allocated; }\r
+ inline T &back() const { return _vals[_size - 1]; }\r
+ inline T& operator[](SQUnsignedInteger pos) const{ return _vals[pos]; }\r
+ T* _vals;\r
+private:\r
+ void _realloc(SQUnsignedInteger newsize)\r
+ {\r
+ newsize = (newsize > 0)?newsize:4;\r
+ _vals = (T*)SQ_REALLOC(_vals, _allocated * sizeof(T), newsize * sizeof(T));\r
+ _allocated = newsize;\r
+ }\r
+ SQUnsignedInteger _size;\r
+ SQUnsignedInteger _allocated;\r
+};\r
+\r
+#endif //_SQUTILS_H_\r