mirror of
https://github.com/blupi-games/planetblupi
synced 2024-12-30 10:15:36 +01:00
63 lines
1.1 KiB
C++
63 lines
1.1 KiB
C++
// Class CFifo, gestion d'une liste en fifo
|
|
|
|
#include <stdlib.h>
|
|
#include "fifo.h"
|
|
|
|
|
|
// gestion d'une pile classée en valeur croissantes
|
|
// typiquement reprend les coordonnées les plus proches
|
|
// du but en premier lieu
|
|
|
|
CPileTriee::CPileTriee(long taille)
|
|
{
|
|
m_taille = taille;
|
|
m_max = m_out = 0;
|
|
m_data = (Element*) malloc (sizeof(Element)*taille);
|
|
}
|
|
|
|
CPileTriee::~CPileTriee()
|
|
{
|
|
free( m_data );
|
|
}
|
|
|
|
long CPileTriee::get()
|
|
{
|
|
if (m_out == m_max) return -1;
|
|
long val = m_data [m_out].pos;
|
|
m_out++;
|
|
if (m_out>=m_taille) m_out = 0;
|
|
return val;
|
|
}
|
|
|
|
void CPileTriee::put(long pos, long dist)
|
|
{
|
|
long i=m_out;
|
|
long p,d,m;
|
|
|
|
while (i!=m_max)
|
|
{
|
|
// le point est-il plus proche que celui-là ?
|
|
if (dist<m_data[i].dist)
|
|
{
|
|
// oui, insert et décale le suivant
|
|
p = m_data[i].pos;
|
|
d = m_data[i].dist;
|
|
m_data[i].pos = pos;
|
|
m_data[i].dist = dist;
|
|
pos = p;
|
|
dist = d;
|
|
}
|
|
i++;
|
|
if (i>=m_taille) i=0;
|
|
}
|
|
|
|
// ajoute le point éloigné à la suite
|
|
m = m_max+1;
|
|
if (m>=m_taille) m=0;
|
|
if (m!=m_out)
|
|
{
|
|
m_data[m_max].pos = pos;
|
|
m_data[m_max].dist = dist;
|
|
m_max = m;
|
|
}
|
|
} |