1 | #ifndef QUEUE_H_ |
---|
2 | #define QUEUE_H_ |
---|
3 | |
---|
4 | #include <set> |
---|
5 | #include "raw_address.h" |
---|
6 | #include "util.h" |
---|
7 | #include "queue.h" |
---|
8 | #include <iostream> |
---|
9 | |
---|
10 | /* |
---|
11 | * Ceci est une simple file d'attente pour les requêtes de données qui partent |
---|
12 | * du processeur. |
---|
13 | * |
---|
14 | * Les données sont supprimées de cette file dès qu'elles ont été chargées dans |
---|
15 | * le processeur. La taille de cette file est fixe. Si un élément est ajouté |
---|
16 | * alors qu'il dépasse la taille, il ne sera pas inséré. Néanmoins, un message |
---|
17 | * devrait s'afficher sur la console. |
---|
18 | * |
---|
19 | * Le stockage interne est un arbre binaire rouge-noir qui permet insertion et |
---|
20 | * suppression en O(log n) de la STL. |
---|
21 | * |
---|
22 | * Note: si les élements stockés ne sont plus des entiers, il faudra |
---|
23 | * probablement ajouter une fonction pour comparer les elements afin que set |
---|
24 | * puisse les trier. |
---|
25 | */ |
---|
26 | |
---|
27 | template <typename T> |
---|
28 | class Queue { |
---|
29 | private: |
---|
30 | unsigned int max_size; |
---|
31 | std::set<T> elements; |
---|
32 | |
---|
33 | public: |
---|
34 | Queue(int max_size) { |
---|
35 | this->max_size = max_size; |
---|
36 | } |
---|
37 | |
---|
38 | void insert(T &element); |
---|
39 | void remove(T &element); |
---|
40 | bool is_full(); |
---|
41 | bool is_empty(); |
---|
42 | void print(); |
---|
43 | }; |
---|
44 | |
---|
45 | using namespace std; |
---|
46 | |
---|
47 | template < typename T > void Queue<T>::insert(T &element) { |
---|
48 | if (elements.size() <= max_size) { |
---|
49 | elements.insert(element); |
---|
50 | } else { |
---|
51 | std::cerr << "insertion ignored" << std::endl; |
---|
52 | } |
---|
53 | } |
---|
54 | |
---|
55 | template <typename T> bool Queue<T>::is_full() { |
---|
56 | return (elements.size() == max_size); |
---|
57 | } |
---|
58 | |
---|
59 | template < typename T >bool Queue<T>::is_empty() { |
---|
60 | return (elements.empty()); |
---|
61 | } |
---|
62 | |
---|
63 | template < typename T > void Queue<T>::remove(T &element) { |
---|
64 | |
---|
65 | cout << "\t" << "QUEUE suppression de " << element << endl; |
---|
66 | |
---|
67 | if (elements.size() > 1) { |
---|
68 | typename std::set<T>::iterator it; |
---|
69 | it = elements.find(element); |
---|
70 | if (it != elements.end()) |
---|
71 | elements.erase(it); |
---|
72 | else |
---|
73 | std::cerr << "removal ignored" << std::endl; |
---|
74 | } |
---|
75 | |
---|
76 | // if (elements.size() > 0) { |
---|
77 | // std::cout << "QUEUE : j'efface l'element : " << element << std::endl; |
---|
78 | // elements.erase(element); |
---|
79 | // } else { |
---|
80 | // std::cerr << "removal ignored" << std::endl; |
---|
81 | // } |
---|
82 | } |
---|
83 | |
---|
84 | template < typename T > void Queue<T>::print() { |
---|
85 | typename std::set<T>::iterator it; |
---|
86 | |
---|
87 | cout << "\t" << "QUEUE begin" << endl; |
---|
88 | for (it = elements.begin(); it != elements.end(); it++) |
---|
89 | { |
---|
90 | cout << "\t\t" << "element : " << *it << endl; |
---|
91 | } |
---|
92 | |
---|
93 | cout << "\t" << "QUEUE end" << endl; |
---|
94 | } |
---|
95 | |
---|
96 | #endif |
---|