// =============================================================== //
//                                                                 //
//   File      : ali_tarray.hxx                                    //
//   Purpose   :                                                   //
//                                                                 //
//   Institute of Microbiology (Technical University Munich)       //
//   http://www.arb-home.de/                                       //
//                                                                 //
// =============================================================== //

#ifndef ALI_TARRAY_HXX
#define ALI_TARRAY_HXX

#ifndef ALI_TLIST_HXX
#include "ali_tlist.hxx"
#endif

template<class T>
class ALI_TARRAY : virtual Noncopyable {
    T **array;
    unsigned long size_of_array;

public:
    ALI_TARRAY(unsigned long Size) {
        size_of_array = Size;
        array = (T **) calloc((unsigned int) Size, sizeof(T));
        ali_out_of_memory_if(!array);
    }
    ALI_TARRAY(ALI_TLIST<T>* list) {
        size_of_array = list->cardinality();
        array = (T (*) []) calloc((unsigned int) size_of_array, sizeof(T));
        ali_out_of_memory_if(!array);
        if (!list->is_empty()) {
            unsigned long l = 0;
            (*array)[l++] = list->first();
            while (list->has_next() && l < size_of_array)
                (*array)[l++] = list->next();
            if (list->has_next())
                ali_fatal_error("List inconsitent", "ALI_TARRAY::ALI_TARRAY()");
        }
    }
    ~ALI_TARRAY() {
        if (array)
            free((char *) array);
    }
    unsigned long size() {
        return size_of_array;
    }
    void set(unsigned long position, T value) {
        if (position >= size_of_array)
            ali_fatal_error("Access out of array", "ALI_TARRAY::set()");
        (*array)[position] = value;
    }
    T get(unsigned long position) {
        if (position >= size_of_array)
            ali_fatal_error("Access out of array", "ALI_TARRAY::get()");
        return (*array)[position];
    }
};

#else
#error ali_tarray.hxx included twice
#endif // ALI_TARRAY_HXX
