/*  Plik naglowkowy zawiera definicje i implementacje wekotora, ktory bedzie
*   w grze sluzyl do przechowywania punktow potrzebnych do rysowania nici.
*   Wektor zawiera tylko potrzebne prograowi funkcje.
*
*          autor: r.Q
*          licencja: GNU GPL
*
*/
#include <stdio.h>
#include <stdlib.h>
#include <windef.h>

#ifndef _WEKTOR_H_
#define _WEKTOR_H_

#define LEN_PER_VEC 20    // dlugosc pojedynczego wektora

typedef struct {
        ushort_t aktualnaDlugosc;      // wskazuje element ZA-OSTATNI
        ushort_t pojemnosc;
        POINT* pElementy;
        } WEKTOR;
  
WEKTOR* TworzWektor();
bool DodajElement(WEKTOR*, POINT*); // funkcja dodaje element na koniec wektora
bool CzyscWektor(WEKTOR*);            // funkcja NIE USUWA wektora, tylko go zeruje
void KasujWektor(WEKTOR*);            // funkcja niszczy zawartosc wektora
POINT* PobierzElement(WEKTOR*, int);  // funkcja zwraca obiekt o podanym indeksie
POINT* PobierzPierwszy(WEKTOR*);      // funkcja zwraca pierwszy element wektora
POINT* PobierzOstatni(WEKTOR*);       // funkcja zwraca ostatni element wektora
ushort_t PobierzDlugosc(WEKTOR*);     // funkcja zwraca dlugosc wektora
bool JestPusty(WEKTOR*);              // sprawdza, czy wektor jest pusty

//////////////////////////////////Implementacja/////////////////////////////////        
WEKTOR* TworzWektor() {
        WEKTOR* pWektor;
        if(!(pWektor = (WEKTOR*)malloc(sizeof(WEKTOR))))
                    return NULL;
        pWektor->aktualnaDlugosc = 0;
        pWektor->pojemnosc = LEN_PER_VEC;
        if(!(pWektor->pElementy = (POINT*)malloc(LEN_PER_VEC * sizeof(POINT))))
                    return NULL;
        return pWektor;
}
bool DodajElement(WEKTOR* wektor, POINT* ptElement) {
     // jesli nie ma juz miejsca w wektorze, zarezerwuj wiecej miejsca
     if(!wektor->pojemnosc) {
         POINT* pTemp;
         if(!(pTemp = (POINT*)malloc((wektor->aktualnaDlugosc + LEN_PER_VEC) * sizeof(POINT))))
                   return false;
         memcpy(pTemp, wektor->pElementy, (wektor->aktualnaDlugosc) * sizeof(POINT));
         free(wektor->pElementy);
         wektor->pElementy = pTemp;
         wektor->pojemnosc = LEN_PER_VEC;
     }
     wektor->pElementy[wektor->aktualnaDlugosc].x = ptElement->x;
     wektor->pElementy[wektor->aktualnaDlugosc++].y = ptElement->y;
     wektor->pojemnosc--;
     return true;
}
bool CzyscWektor(WEKTOR* wektor) {
     free(wektor->pElementy);
     if(!(wektor->pElementy = (POINT*)malloc(LEN_PER_VEC * sizeof(POINT))))
                    return false;
     wektor->aktualnaDlugosc = 0;
     wektor->pojemnosc = LEN_PER_VEC;
     return true;
}
void KasujWektor(WEKTOR* wektor) {
     free(wektor->pElementy);
     wektor->pElementy = NULL;
}
POINT* PobierzElement(WEKTOR* wektor, int pos) {
       return (&wektor->pElementy[pos]);
}
POINT* PobierzPierwszy(WEKTOR* wektor) {
       return (&wektor->pElementy[0]);
}
POINT* PobierzOstatni(WEKTOR* wektor) {
       if(JestPusty(wektor)) return NULL;
       return (&wektor->pElementy[wektor->aktualnaDlugosc - 1]);
}
ushort_t PobierzDlugosc(WEKTOR* wektor) {
         return (wektor->aktualnaDlugosc);
}
bool JestPusty(WEKTOR* wektor) {
     if(!wektor->aktualnaDlugosc)
          return true;
     return false;
}

#endif      /* _WEKTOR_H_ */
