New grow and skid sounds from remaxim
[supertux.git] / src / squirrel / squirrel / squtils.h
index 86456ba..b6a436e 100644 (file)
-/*     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
+/*     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(SQUnsignedInteger i = 0; i < v._size; i++) {
+                       new ((void *)&_vals[i]) T(v._vals[i]);
+               }
+               _size = v._size;
+       }
+       ~sqvector()
+       {
+               if(_allocated) {
+                       for(SQUnsignedInteger i = 0; i < _size; i++)
+                               _vals[i].~T();
+                       SQ_FREE(_vals, (_allocated * sizeof(T)));
+               }
+       }
+       void reserve(SQUnsignedInteger newsize) { _realloc(newsize); }
+       void resize(SQUnsignedInteger 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(SQUnsignedInteger 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 SQUnsignedInteger 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(SQUnsignedInteger idx, const T& val)
+       {
+               resize(_size + 1);
+               for(SQUnsignedInteger i = _size - 1; i > idx; i--) {
+                       _vals[i] = _vals[i - 1];
+               }
+       _vals[idx] = val;
+       }
+       void remove(SQUnsignedInteger idx)
+       {
+               _vals[idx].~T();
+               if(idx < (_size - 1)) {
+                       memmove(&_vals[idx], &_vals[idx+1], sizeof(T) * (_size - idx - 1));
+               }
+               _size--;
+       }
+       SQUnsignedInteger capacity() { return _allocated; }
+       inline T &back() const { return _vals[_size - 1]; }
+       inline T& operator[](SQUnsignedInteger pos) const{ return _vals[pos]; }
+       T* _vals;
+private:
+       void _realloc(SQUnsignedInteger newsize)
+       {
+               newsize = (newsize > 0)?newsize:4;
+               _vals = (T*)SQ_REALLOC(_vals, _allocated * sizeof(T), newsize * sizeof(T));
+               _allocated = newsize;
+       }
+       SQUnsignedInteger _size;
+       SQUnsignedInteger _allocated;
+};
+
+#endif //_SQUTILS_H_