Program Listing for File flex_array.hpp¶
↰ Return to documentation for file (src_ed/flex_array.hpp)
#ifndef flex_array_h
#define flex_array_h
#include <iostream>
#include <cstdio>
#include <cstring>
#include "assert.h"
#define MIN_SIZE 16
template<typename T>
struct flex_array
{
size_t segment_size;
size_t pos;
T *x;
flex_array<T> *next;
flex_array<T> *current;
flex_array(size_t _segment_size): segment_size(_segment_size), pos(0L), x(nullptr), next(nullptr), current(nullptr)
{
if(segment_size < MIN_SIZE) segment_size = MIN_SIZE;
x = (T *)malloc(segment_size*sizeof(T)); QCM_ASSERT(x);
current = this;
}
~flex_array(){
if(next) delete next;
free(x);
memset(this,0,sizeof(*this));
}
void Put(T elem){
if(current->pos == segment_size){
current->next = new flex_array<T>(segment_size); QCM_ASSERT(current->next);
current = current->next;
}
current->x[current->pos++] = elem;
}
void streamline(){
if(current->pos == segment_size) return;
T *array;
array = current->x;
current->x = (T *)malloc(current->pos*sizeof(T)); QCM_ASSERT(current->x);
memcpy(current->x,array,current->pos*sizeof(T));
free(array);
}
size_t size(){ // returns the number of elements in the array
size_t n=pos;
if(next) n += next->size();
return n;
}
};
#endif