squtils.h 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. /* see copyright notice in squirrel.h */
  2. #ifndef _SQUTILS_H_
  3. #define _SQUTILS_H_
  4. void *sq_vm_malloc(SQUnsignedInteger size);
  5. void *sq_vm_realloc(void *p,SQUnsignedInteger oldsize,SQUnsignedInteger size);
  6. void sq_vm_free(void *p,SQUnsignedInteger size);
  7. #define sq_new(__ptr,__type) {__ptr=(__type *)sq_vm_malloc(sizeof(__type));new (__ptr) __type;}
  8. #define sq_delete(__ptr,__type) {__ptr->~__type();sq_vm_free(__ptr,sizeof(__type));}
  9. #define SQ_MALLOC(__size) sq_vm_malloc((__size));
  10. #define SQ_FREE(__ptr,__size) sq_vm_free((__ptr),(__size));
  11. #define SQ_REALLOC(__ptr,__oldsize,__size) sq_vm_realloc((__ptr),(__oldsize),(__size));
  12. #define sq_aligning(v) (((size_t)(v) + (SQ_ALIGNMENT-1)) & (~(SQ_ALIGNMENT-1)))
  13. //sqvector mini vector class, supports objects by value
  14. template<typename T> class sqvector
  15. {
  16. public:
  17. sqvector()
  18. {
  19. _vals = NULL;
  20. _size = 0;
  21. _allocated = 0;
  22. }
  23. sqvector(const sqvector<T>& v)
  24. {
  25. copy(v);
  26. }
  27. void copy(const sqvector<T>& v)
  28. {
  29. if(_size) {
  30. resize(0); //destroys all previous stuff
  31. }
  32. //resize(v._size);
  33. if(v._size > _allocated) {
  34. _realloc(v._size);
  35. }
  36. for(SQUnsignedInteger i = 0; i < v._size; i++) {
  37. new ((void *)&_vals[i]) T(v._vals[i]);
  38. }
  39. _size = v._size;
  40. }
  41. ~sqvector()
  42. {
  43. if(_allocated) {
  44. for(SQUnsignedInteger i = 0; i < _size; i++)
  45. _vals[i].~T();
  46. SQ_FREE(_vals, (_allocated * sizeof(T)));
  47. }
  48. }
  49. void reserve(SQUnsignedInteger newsize) { _realloc(newsize); }
  50. void resize(SQUnsignedInteger newsize, const T& fill = T())
  51. {
  52. if(newsize > _allocated)
  53. _realloc(newsize);
  54. if(newsize > _size) {
  55. while(_size < newsize) {
  56. new ((void *)&_vals[_size]) T(fill);
  57. _size++;
  58. }
  59. }
  60. else{
  61. for(SQUnsignedInteger i = newsize; i < _size; i++) {
  62. _vals[i].~T();
  63. }
  64. _size = newsize;
  65. }
  66. }
  67. void shrinktofit() { if(_size > 4) { _realloc(_size); } }
  68. T& top() const { return _vals[_size - 1]; }
  69. inline SQUnsignedInteger size() const { return _size; }
  70. bool empty() const { return (_size <= 0); }
  71. inline T &push_back(const T& val = T())
  72. {
  73. if(_allocated <= _size)
  74. _realloc(_size * 2);
  75. return *(new ((void *)&_vals[_size++]) T(val));
  76. }
  77. inline void pop_back()
  78. {
  79. _size--; _vals[_size].~T();
  80. }
  81. void insert(SQUnsignedInteger idx, const T& val)
  82. {
  83. resize(_size + 1);
  84. for(SQUnsignedInteger i = _size - 1; i > idx; i--) {
  85. _vals[i] = _vals[i - 1];
  86. }
  87. _vals[idx] = val;
  88. }
  89. void remove(SQUnsignedInteger idx)
  90. {
  91. _vals[idx].~T();
  92. if(idx < (_size - 1)) {
  93. memmove(&_vals[idx], &_vals[idx+1], sizeof(T) * (_size - idx - 1));
  94. }
  95. _size--;
  96. }
  97. SQUnsignedInteger capacity() { return _allocated; }
  98. inline T &back() const { return _vals[_size - 1]; }
  99. inline T& operator[](SQUnsignedInteger pos) const{ return _vals[pos]; }
  100. T* _vals;
  101. private:
  102. void _realloc(SQUnsignedInteger newsize)
  103. {
  104. newsize = (newsize > 0)?newsize:4;
  105. _vals = (T*)SQ_REALLOC(_vals, _allocated * sizeof(T), newsize * sizeof(T));
  106. _allocated = newsize;
  107. }
  108. SQUnsignedInteger _size;
  109. SQUnsignedInteger _allocated;
  110. };
  111. #endif //_SQUTILS_H_