-
Notifications
You must be signed in to change notification settings - Fork 0
/
ListaAtomica.hpp
90 lines (69 loc) · 1.55 KB
/
ListaAtomica.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
80
81
82
83
84
85
86
87
88
89
90
#ifndef LISTA_ATOMICA_H__
#define LISTA_ATOMICA_H__
#include <atomic>
template <typename T>
class Lista {
private:
struct Nodo {
Nodo(const T& val) : _val(val), _next(nullptr) {}
T _val;
Nodo *_next;
};
std::atomic<Nodo *> _head;
public:
Lista() : _head(nullptr) {}
~Lista() {
Nodo *n, *t;
n = _head.load();
while (n) {
t = n;
n = n->_next;
delete t;
}
}
void push_front(const T& val) {
Nodo* n = new Nodo(val);
n->_next = _head.load();
while(!_head.compare_exchange_weak(n->_next,n));
}
T& front() const {
return _head.load()->_val;
}
T& iesimo(int i) const {
Nodo *n = _head.load();
int j;
for (int j = 0; j < i; j++)
n = n->_next;
return n->_val;
}
class Iterador {
public:
Iterador() : _lista(nullptr), _nodo_sig(nullptr) {}
Iterador& operator = (const typename Lista::Iterador& otro) {
_lista = otro._lista;
_nodo_sig = otro._nodo_sig;
return *this;
}
bool HaySiguiente() const {
return _nodo_sig != nullptr;
}
T& Siguiente() {
return _nodo_sig->_val;
}
void Avanzar() {
_nodo_sig = _nodo_sig->_next;
}
bool operator == (const typename Lista::Iterador& otro) const {
return _lista._head.load() == otro._lista._head.load() && _nodo_sig == otro._nodo_sig;
}
private:
Lista *_lista;
typename Lista::Nodo *_nodo_sig;
Iterador(Lista<T>* lista,typename Lista<T>::Nodo* sig) : _lista(lista), _nodo_sig(sig) {}
friend typename Lista<T>::Iterador Lista<T>::CrearIt();
};
Iterador CrearIt() {
return Iterador(this, _head);
}
};
#endif /* LISTA_ATOMICA_H__ */