grid.hpp 3.09 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/**
\file grid.h
\date 24/04/2021
\author Merwane Bouri
\version 1
\brief Grid

Cette classe représente un réseau de cellules.

        **/

#ifndef GRID_H
#define GRID_H

#include <iostream>
#include <vector>

#include "coord.hpp"

20
    using namespace std;
21

Merwane Bouri's avatar
Merwane Bouri committed
22
/**
23
\class Grid
Merwane Bouri's avatar
Merwane Bouri committed
24
25
26
\brief Représente une grille d'états.

Cette structure représente une grille d'états.
27
28
29
        **/

    class Structure;
30

31
32
33
34
35
36
37
38
//! \brief Enum spécifiant la stratégie à adopter aux frontières du réseau.
enum class BoundaryPolicy
{
    //! \brief Frontière torique.
    Periodic,
    //! \brief Frontière toujours égale à l'état 0.
    Inert
};
39

40
41
42
class Grid{
    int nb_rows;
    int nb_col;
43
    std::vector<unsigned char> matrix;
44
    BoundaryPolicy policy;
45
public:
Merwane Bouri's avatar
Merwane Bouri committed
46
    //! \brief Constructeur par défaut, avec le nombre de ligne et de colonne souhaités
47
    Grid(size_t l,size_t c);
Merwane Bouri's avatar
Merwane Bouri committed
48
49
50

    //! \brief Retourne le nombre de lignes
    //! \return Retourne le nombre de lignes de la Grille
51
    size_t get_rows() const {return nb_rows;}
Merwane Bouri's avatar
Merwane Bouri committed
52
53
54

    //! \brief Retourne le nombre de colonnes
    //! \return Retourne le nombre de colonnes de la Grille
55
56
    size_t get_col() const{return nb_col;}

57
58
59
60
    //! \brief Configure la stratégie à adopter par rapport aux frontières du réseau.
    void set_boundary_policy(BoundaryPolicy p)
    { policy = p; }

Merwane Bouri's avatar
Merwane Bouri committed
61
    //! \brief Initialise la cellule de coordonnée pos à l'état 'state'
62
    void set_cell(Coord pos, unsigned int state)
63
    {
64
        // fast path, no boundaries concerned
65
66
67
68
69
        if (pos.x >= 0 && pos.y >= 0 && pos.x < nb_col && pos.y < nb_rows)
        {
            matrix[pos.y*nb_col + pos.x] = state;
            return;
        }
70
71
72
73
74
75
76
77
78
79
80
81
82
        else
        {
            if (policy == BoundaryPolicy::Inert)
                return;
            else
            {
                int i = pos.y;
                int j = pos.x;
                matrix[((i%nb_rows + nb_rows)%nb_rows)*nb_col
                       +((j%nb_col+nb_col)%nb_col)]
                    =state;
            }
        }
83
    }
Merwane Bouri's avatar
Merwane Bouri committed
84
85
86

    //! \brief Retourne l'état d'une cellule
    //! \return Retourne l'état d'une cellule de coordonnées pos
87
88
    unsigned int get_state(Coord pos) const {
        // fast path, no boundaries concerned
89
90
91
92
        if (pos.x >= 0 && pos.y >= 0 && pos.x < nb_col && pos.y < nb_rows)
        {
            return matrix[pos.y*nb_col + pos.x];
        }
93
94
95
96
97
98
99
100
101
102
103
104
        else
        {
            if (policy == BoundaryPolicy::Inert)
                return 0;
            else
            {
                int i = pos.y;
                int j = pos.x;
                return matrix[((i%nb_rows + nb_rows)%nb_rows)*nb_col
                              +((j%nb_col+nb_col)%nb_col)];
            }
        }
105
    }
Merwane Bouri's avatar
Merwane Bouri committed
106
    //! \brief Recopie de la grille
107
    Grid& operator=(const Grid& g);
Merwane Bouri's avatar
Merwane Bouri committed
108
109

    //! \brief Vérifie si deux grilles sont identiques
110
    bool operator==(const Grid&) const;
111
112
113

    //! \brief Retourne une structure représentant le contenu non-nul de la Grid (les cellules d'état != 0), pour un enregistrement dans un fichier par exemple.
    Structure to_structure() const;
114
115
116
117
};
ostream& operator<<(ostream& f, const Grid& g);

#endif // GRID_H