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