Commit 9187c1d4 authored by Yann Boucher's avatar Yann Boucher
Browse files

Ajout d'un accès indexé à un neighborhood et à sa taille, ajout d'une fonction...

Ajout d'un accès indexé à un neighborhood et à sa taille, ajout d'une fonction load_from_neighborhood à PropertyList pour les CoordinateProperty
parent aa48c4ee
Pipeline #79000 passed with stages
in 16 seconds
......@@ -99,6 +99,12 @@ private:
void ui_update_alphabet(const Alphabet& alph);
//! \brief Sauvegarde la configuration actuelle.
void save_grid_configuration();
//! \brief Charge une configuration liée au modèle donné.
void load_grid_configuration();
//! \brief Retourne le modèle par défaut à charger
QJsonObject default_model() const;
private:
......
......@@ -12,7 +12,7 @@ Cette classe représente le voisinage d'une cellule.
#ifndef NEIGHBOURHOOD_HPP
#define NEIGHBOURHOOD_HPP
#include <vector>
#include <map>
#include <utility>
#include <string>
#include "coord.hpp"
......@@ -35,8 +35,8 @@ public:
//! \brief Classe représentant un voisinage, c'est à dire une liste de cellules dont leur état et leur position.
class Neighborhood {
//! \brief Vecteur de voisins contenant la position relative et l'état du voisin
vector< pair<Coord, unsigned int> > neighborPositions;
//! \brief Map de voisins contenant la position relative et l'état du voisin
map<Coord, unsigned int> neighborPositions;
public:
......@@ -59,11 +59,24 @@ public:
//! \param Coord, State : coordonée relative et état du voisin
void addNeighbor(Coord c, unsigned int s) {
if(isUnique(c))
neighborPositions.push_back(make_pair(c, s));
neighborPositions[c] = s;
else
throw NeighborhoodException("La coordonnée existe déjà. \n");
}
//! \brief Retourne le nombre de voisins dans le Neighborhood.
unsigned size() const
{ return neighborPositions.size(); }
//! \brief Retourne la cellule numéro i (index allant de 0 à size()-1, permettant d'indexer les cellules indépendamment de leur position
pair<Coord, unsigned int> neighbor_at_index(unsigned i) const
{
if (i >= size())
throw NeighborhoodException("Index invalide\n");
auto it = neighborPositions.begin();
std::advance(it, i);
return *it;
}
};
#endif // NEIGHBOURHOOD_HPP
......@@ -32,6 +32,7 @@ Fichier définissant la classe Property représentant une propriété chargable,
#include <QFile>
#include "coord.hpp"
#include "neighborhood.hpp"
#include "neighborhoodWidget.hpp"
struct StringProperty;
......@@ -254,6 +255,18 @@ public:
throw std::out_of_range("Invalid index value");
}
//! \brief Charge un voisinage dans la PropertyList
void load_from_neighborhood(const Neighborhood& n)
{
clear();
for (unsigned i = 0; i < n.size(); ++i)
{
Property& prop = push_back();
CoordinateProperty& coord_p = static_cast<CoordinateProperty&>(prop);
coord_p = n.neighbor_at_index(i).first;
}
}
public:
//! \brief Vrai si la liste est extensible, faux si elle est fixe.
const bool dynamic;
......
......@@ -506,6 +506,18 @@ void MainWindow::ui_update_alphabet(const Alphabet &alpha)
ui->nbrStatesComboBox->addItem(QString::number(alpha.taille()));
}
void MainWindow::save_grid_configuration()
{
Structure grid_data = ui->grid_view->get_grid().to_structure();
QJsonObject json_data;
}
void MainWindow::load_grid_configuration()
{
}
QJsonObject MainWindow::default_model() const
{
const char* json = R"(
......
......@@ -2,39 +2,26 @@
unsigned int Neighborhood::getNb(unsigned int s) const
{
unsigned int res = 0;
std::vector< pair<Coord, unsigned int> >::const_iterator it;
for (it = neighborPositions.begin(); it != neighborPositions.end(); ++it) {
unsigned int res = 0;
for (auto it = neighborPositions.begin(); it != neighborPositions.end(); ++it) {
if (it->second == s) {
res++;
}
}
res++;
}
}
return res;
return res;
}
unsigned int Neighborhood::getAt(Coord c) const
{
std::vector< pair<Coord, unsigned int> >::const_iterator it;
for (it = neighborPositions.begin(); it != neighborPositions.end(); ++it) {
if (it->first == c) {
return it->second;
}
}
throw NeighborhoodException("Error Neighborhood::getAt");
if (!neighborPositions.count(c))
throw NeighborhoodException("Error Neighborhood::getAt");
return neighborPositions.at(c);
}
bool Neighborhood::isUnique(Coord c) const
{
std::vector< pair<Coord, unsigned int> >::const_iterator it;
for (it = neighborPositions.begin(); it != neighborPositions.end(); ++it) {
if (it->first == c) {
return false;
}
}
return true;
return neighborPositions.count(c) == 0;
}
......@@ -8,6 +8,7 @@ class PropertyClass : public HasUserProperties
{
public:
DEFINE_CONFIGURABLE_PROPERTY(StringProperty, test_str, "Test String", "hello world");
DEFINE_CONFIGURABLE_DYNLIST(CoordinateProperty, coords, "Coordinates", ());
};
void CellulutTests::test_property()
......@@ -17,7 +18,21 @@ void CellulutTests::test_property()
QVERIFY(test.test_str.str == "hello world");
QVERIFY(test.test_str.identifier() == "test_str");
QVERIFY(test.test_str.display_name() == "Test String");
QVERIFY(test.get_properties().size() == 1);
QVERIFY(test.get_properties().size() == 2);
QVERIFY(test.get_properties()[0].get() == &test.test_str);
Neighborhood n;
n.addNeighbor({0, 1}, 1);
n.addNeighbor({-2, 1}, 1);
n.addNeighbor({1, 1}, 2);
test.coords.load_from_neighborhood(n);
QCOMPARE(test.coords.size(), 3);
for (unsigned i = 0; i < test.coords.size(); ++i)
{
CoordinateProperty& coord = static_cast<CoordinateProperty&>(test.coords.at(i));
QCOMPARE(coord.c, n.neighbor_at_index(i).first);
}
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment