70 lines
1.1 KiB
C++
70 lines
1.1 KiB
C++
#ifndef TURBO_LIST_H
|
|
#define TURBO_LIST_H
|
|
|
|
#include<cstdint>
|
|
#include<cstdlib>
|
|
#include<cassert>
|
|
|
|
class TurboList {
|
|
int *old;
|
|
int *nex;
|
|
|
|
uint32_t mid; // non-inclusive . . . m
|
|
uint32_t end; // non-inclusive e . . . .
|
|
|
|
uint32_t capacity;
|
|
uint32_t count;
|
|
public:
|
|
inline TurboList(uint32_t initial_cap = 16) noexcept :
|
|
old(nullptr),
|
|
mid(0),
|
|
end(0),
|
|
capacity(initial_cap),
|
|
count(0) {
|
|
|
|
nex = (int *) malloc(this->capacity * sizeof(int));
|
|
}
|
|
|
|
inline ~TurboList() noexcept {
|
|
if(nex) free(nex);
|
|
if(old) free(old);
|
|
}
|
|
|
|
inline int& operator[](uint32_t i) noexcept {
|
|
if(i < mid) {
|
|
return old[i];
|
|
} else {
|
|
return nex[i];
|
|
}
|
|
}
|
|
|
|
inline void insert(int elem) noexcept {
|
|
if(count < capacity) {
|
|
// INSERT
|
|
if(mid > 0) {
|
|
nex[mid - 1] = old[mid - 1];
|
|
--mid;
|
|
}
|
|
nex[end++] = elem;
|
|
++count;
|
|
} else {
|
|
// GROW
|
|
assert(mid == 0);
|
|
if(old) free(old);
|
|
old = nex;
|
|
mid = end;
|
|
capacity *= 2;
|
|
nex = (int *) malloc(this->capacity * sizeof(int));
|
|
|
|
// Will go into the INSERT code path here
|
|
insert(elem);
|
|
}
|
|
}
|
|
|
|
inline uint32_t size() noexcept {
|
|
return count;
|
|
}
|
|
};
|
|
|
|
#endif /* TURBO_LIST_H */
|