47 |
47 |
48 |
48 |
49 void ResourceArray::sort(size_t esize, ftype f) { |
49 void ResourceArray::sort(size_t esize, ftype f) { |
50 if (!is_empty()) qsort(_data, length(), esize, f); |
50 if (!is_empty()) qsort(_data, length(), esize, f); |
51 } |
51 } |
52 void CHeapArray::sort(size_t esize, ftype f) { |
52 template <MEMFLAGS F> void CHeapArray<F>::sort(size_t esize, ftype f) { |
53 if (!is_empty()) qsort(_data, length(), esize, f); |
53 if (!is_empty()) qsort(_data, length(), esize, f); |
54 } |
54 } |
55 |
55 |
56 |
56 |
57 void ResourceArray::expand(size_t esize, int i, int& size) { |
57 void ResourceArray::expand(size_t esize, int i, int& size) { |
68 memcpy(data, _data, esize * length()); |
68 memcpy(data, _data, esize * length()); |
69 _data = data; |
69 _data = data; |
70 } |
70 } |
71 |
71 |
72 |
72 |
73 void CHeapArray::expand(size_t esize, int i, int& size) { |
73 template <MEMFLAGS F> void CHeapArray<F>::expand(size_t esize, int i, int& size) { |
74 // determine new size |
74 // determine new size |
75 if (size == 0) size = 4; // prevent endless loop |
75 if (size == 0) size = 4; // prevent endless loop |
76 while (i >= size) size *= 2; |
76 while (i >= size) size *= 2; |
77 // allocate and initialize new data section |
77 // allocate and initialize new data section |
78 void* data = NEW_C_HEAP_ARRAY(char*, esize * size); |
78 void* data = NEW_C_HEAP_ARRAY(char*, esize * size, F); |
79 memcpy(data, _data, esize * length()); |
79 memcpy(data, _data, esize * length()); |
80 FREE_C_HEAP_ARRAY(char*, _data); |
80 FREE_C_HEAP_ARRAY(char*, _data, F); |
81 _data = data; |
81 _data = data; |
82 } |
82 } |
83 |
83 |
84 |
84 |
85 void ResourceArray::remove_at(size_t esize, int i) { |
85 void ResourceArray::remove_at(size_t esize, int i) { |
89 void* src = (char*)dst + esize; |
89 void* src = (char*)dst + esize; |
90 size_t cnt = (length() - i)*esize; |
90 size_t cnt = (length() - i)*esize; |
91 memmove(dst, src, cnt); |
91 memmove(dst, src, cnt); |
92 } |
92 } |
93 |
93 |
94 void CHeapArray::remove_at(size_t esize, int i) { |
94 template <MEMFLAGS F> void CHeapArray<F>::remove_at(size_t esize, int i) { |
95 assert(0 <= i && i < length(), "index out of bounds"); |
95 assert(0 <= i && i < length(), "index out of bounds"); |
96 _length--; |
96 _length--; |
97 void* dst = (char*)_data + i*esize; |
97 void* dst = (char*)_data + i*esize; |
98 void* src = (char*)dst + esize; |
98 void* src = (char*)dst + esize; |
99 size_t cnt = (length() - i)*esize; |
99 size_t cnt = (length() - i)*esize; |