#define LIST                                                                   \
    struct LISTNAME {                                                          \
        int size;                                                              \
        LISTTYPE[] data;                                                       \
    };                                                                         \
                                                                               \
    void listNew(LISTNAME list) {                                              \
        list.size = 0;                                                         \
        list.data = new LISTTYPE[4];                                           \
    }                                                                          \
                                                                               \
    void listAdd(LISTNAME list, LISTTYPE i) {                                  \
        int l = length(list.data);                                             \
        if(list.size >= l) {                                                   \
            LISTTYPE[] newData = new LISTTYPE[l * 2];                          \
            for(int k = 0; k < l; k++) {                                       \
                newData[k] = list.data[k];                                     \
            }                                                                  \
            list.data = newData;                                               \
        }                                                                      \
        list.data[list.size] = i;                                              \
        list.size++;                                                           \
    }                                                                          \
                                                                               \
    int listGetLength(LISTNAME list) {                                         \
        return list.size;                                                      \
    }                                                                          \
                                                                               \
    LISTTYPE listGetIndex(LISTNAME list, int index) {                          \
        return list.data[index];                                               \
    }

#define LISTNAME IntList
#define LISTTYPE int
LIST

#undef LISTNAME
#undef LISTTYPE
#define LISTNAME FloatList
#define LISTTYPE float
LIST