-
Notifications
You must be signed in to change notification settings - Fork 0
/
Liste.hpp
79 lines (70 loc) · 2.31 KB
/
Liste.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
/**
* La classe Liste definit la liste pouvant contenir des jeux et des concepteurs et gere les operations qui sont possible de faire sur l'objet Liste.
* /fichier Liste.hpp
* /auteurs Pascal Gallant et Arthur Panoyan
* /date 26 octobre 2021
* Créé le 6 octobre 2021
*/
#pragma once
#include <iostream>
#include <memory>
#include <cassert>
#include "gsl/span"
#include "cppitertools/range.hpp"
template <typename T>
class Liste
{
public:
// Constructeurs et surcharges d'opérateurs
Liste() = default;
~Liste() {}
std::shared_ptr<T> operator[] (const int indice) const
{
return elements_.get()[indice];
}
Liste<T>& operator= (const Liste<T> autre) {
this->capacite_ = autre.getCapacite();
this->nElements_ = autre.size();
this->elements_.reset();
this->elements_ = autre.getElements();
return *this;
}
//: Méthode pour ajouter un élément à la liste
void ajouterElement(std::shared_ptr<T> element)
{
if (nElements_ == capacite_)
changerCapacite(capacite_ * 2+1);
elements_.get()[nElements_] = element;
nElements_++;
}
// Pour size, on utilise le même nom que les accesseurs de la bibliothèque standard, qui permet d'utiliser certaines fonctions de la bibliotheque sur cette classe.
unsigned size() const { return nElements_; }
unsigned getCapacite() const { return capacite_; }
std::shared_ptr<std::shared_ptr<T>[]> getElements() const { return elements_; }
//: Méthode pour changer la capacité de la liste
void changerCapacite(unsigned nouvelleCapacite) {
if (nouvelleCapacite > nElements_) {
auto nouvelleListe = std::make_shared<std::shared_ptr<T>[]>(nouvelleCapacite);
for (unsigned i : iter::range(nElements_)) {
nouvelleListe.get()[i] = elements_.get()[i];
}
elements_ = nouvelleListe;
capacite_ = nouvelleCapacite;
}
}
//: Méthode pour trouver une élément selon un critère (lambda).
template <typename critereLambda>
std::shared_ptr<T> trouver(const critereLambda& critere) {
for (int i : iter::range(nElements_)) {
if (critere(*elements_.get()[i])) {
return elements_.get()[i];
}
}
return nullptr;
}
private:
unsigned nElements_=0;
unsigned capacite_=0;
//: Attribut contenant les éléments de la liste.
std::shared_ptr<std::shared_ptr<T>[]> elements_ = nullptr;
};