squtils.h 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. /* see copyright notice in squirrel.h */
  2. #ifndef _SQUTILS_H_
  3. #define _SQUTILS_H_
  4. #include <new>
  5. #ifndef SQ_EXCLUDE_DEFAULT_MEMFUNCTIONS
  6. void *sq_vm_malloc(SQUnsignedInteger size);
  7. void *sq_vm_realloc(void *p,SQUnsignedInteger oldsize,SQUnsignedInteger size);
  8. void sq_vm_free(void *p,SQUnsignedInteger size);
  9. #else
  10. #include <stdlib.h>
  11. #define sq_vm_malloc(x) malloc(x)
  12. #define sq_vm_realloc(a, b, c) realloc(a, c)
  13. #define sq_vm_free(x, y) free(x)
  14. #endif
  15. #define sq_new(__ptr,__type) {__ptr=(__type *)sq_vm_malloc(sizeof(__type));new (__ptr) __type;}
  16. #define sq_delete(__ptr,__type) {__ptr->~__type();sq_vm_free(__ptr,sizeof(__type));}
  17. #define SQ_MALLOC(__size) sq_vm_malloc((__size));
  18. #define SQ_FREE(__ptr,__size) sq_vm_free((__ptr),(__size));
  19. #define SQ_REALLOC(__ptr,__oldsize,__size) sq_vm_realloc((__ptr),(__oldsize),(__size));
  20. #define sq_aligning(v) (((size_t)(v) + (SQ_ALIGNMENT-1)) & (~(SQ_ALIGNMENT-1)))
  21. //sqvector mini vector class, supports objects by value
  22. template<typename T> class sqvector
  23. {
  24. public:
  25. sqvector():_vals(NULL),_size(0),_allocated(0)
  26. {
  27. }
  28. sqvector(const sqvector<T>& v)
  29. {
  30. copy(v);
  31. }
  32. void copy(const sqvector<T>& v)
  33. {
  34. if(_size) {
  35. resize(0); //destroys all previous stuff
  36. }
  37. //resize(v._size);
  38. if(v._size > _allocated) {
  39. _realloc(v._size);
  40. }
  41. for(SQSizeType i = 0; i < v._size; i++) {
  42. new ((void *)&_vals[i]) T(v._vals[i]);
  43. }
  44. _size = v._size;
  45. }
  46. ~sqvector()
  47. {
  48. if(_allocated) {
  49. for(SQSizeType i = 0; i < _size; i++)
  50. _vals[i].~T();
  51. SQ_FREE(_vals, (_allocated * sizeof(T)));
  52. }
  53. }
  54. void reserve(SQSizeType newsize) { _realloc(newsize); }
  55. void resize(SQSizeType newsize, const T& fill = T())
  56. {
  57. if(newsize > _allocated)
  58. _realloc(newsize);
  59. if(newsize > _size) {
  60. while(_size < newsize) {
  61. new ((void *)&_vals[_size]) T(fill);
  62. _size++;
  63. }
  64. }
  65. else{
  66. for(SQUnsignedInteger i = newsize; i < _size; i++) {
  67. _vals[i].~T();
  68. }
  69. _size = newsize;
  70. }
  71. }
  72. void shrinktofit() { if(_size > 4) { _realloc(_size); } }
  73. T& top() const { return _vals[_size - 1]; }
  74. inline SQSizeType size() const { return _size; }
  75. inline SQSizeType sizeOf() const { return sizeof(T); }
  76. bool empty() const { return (_size <= 0); }
  77. inline T &push_back(const T& val = T())
  78. {
  79. if(_allocated <= _size)
  80. _realloc(_size * 2);
  81. return *(new ((void *)&_vals[_size++]) T(val));
  82. }
  83. inline void pop_back()
  84. {
  85. _size--; _vals[_size].~T();
  86. }
  87. bool insert(SQSizeType idx, const T& val)
  88. {
  89. if(idx > _size) return false;
  90. resize(_size + 1);
  91. for(SQSizeType i = _size - 1; i > idx; i--) {
  92. _vals[i] = _vals[i - 1];
  93. }
  94. _vals[idx] = val;
  95. return true;
  96. }
  97. bool remove(SQSizeType idx)
  98. {
  99. if(idx < _size){
  100. _vals[idx].~T();
  101. if(idx < (_size - 1)) {
  102. memmove(&_vals[idx], &_vals[idx+1], sizeof(T) * (_size - idx - 1));
  103. }
  104. _size--;
  105. return true;
  106. }
  107. return false;
  108. }
  109. void removeFromBegining(SQSizeType count)
  110. {
  111. if(count <= _size){
  112. for(SQSizeType i=0; i < count; ++i) _vals[i].~T();
  113. if(count < (_size - 1)) {
  114. memmove(&_vals[0], &_vals[count], sizeof(T) * (_size - count));
  115. }
  116. _size -= count;
  117. }
  118. }
  119. SQSizeType capacity() { return _allocated; }
  120. inline T &back() const { return _vals[_size - 1]; }
  121. inline T get(SQSizeType pos) const{ return _vals[pos]; }
  122. inline void set(SQSizeType pos, T val) const{ _vals[pos] = val; }
  123. inline T& operator[](SQSizeType pos) const{ return _vals[pos]; }
  124. T* _vals;
  125. private:
  126. void _realloc(SQSizeType newsize)
  127. {
  128. newsize = (newsize > 0)?newsize:4;
  129. _vals = (T*)SQ_REALLOC(_vals, _allocated * sizeof(T), newsize * sizeof(T));
  130. _allocated = newsize;
  131. }
  132. SQSizeType _size;
  133. SQSizeType _allocated;
  134. };
  135. class SQCharBuf : public sqvector<char>
  136. {
  137. public:
  138. void append(const char *p, SQSizeType count)
  139. {
  140. SQSizeType old_size = size();
  141. resize(old_size + count);
  142. memcpy(_vals+old_size, p, count);
  143. }
  144. const char *data(){return _vals;}
  145. };
  146. #endif //_SQUTILS_H_