-
Notifications
You must be signed in to change notification settings - Fork 6
/
SacoVetor.hpp
140 lines (122 loc) · 2.62 KB
/
SacoVetor.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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
#ifndef SACO_VETOR_HPP
#define SACO_VETOR_HPP
#include "SacoTAD.hpp" // para 'static_assert'
class IteradorVetor1
{
public:
char *elemento; // elemento atual
char *sentinela; // elemento sentinela "final"
char atual(); // inglês 'current'
bool terminou(); // inglês 'isDone'
void proximo(); // inglês 'next'
// range-based loop (requer *, != and ++)
char operator*()
{
return atual();
}
//
bool operator!=(const IteradorVetor1 &other)
{
return elemento != other.elemento;
}
//
void operator++()
{
proximo();
}
};
char IteradorVetor1::atual()
{
return *this->elemento;
}
bool IteradorVetor1::terminou()
{
return this->elemento == this->sentinela;
}
void IteradorVetor1::proximo()
{
this->elemento++;
}
// verifica se agregado IteradorNoEnc1 satisfaz conceito IteradorTAD
static_assert(IteradorTAD<IteradorVetor1>);
constexpr int MAX_N = 5;
class SacoVetor1
{
public:
typedef char Tipo;
typedef IteradorVetor1 ItTipo;
//
Tipo elementos[MAX_N]; // elementos
int N; // num. de elementos na lista
void cria(); // inicializa agregado
void libera(); // finaliza agregado
void adiciona(Tipo dado);
ItTipo itera();
ItTipo busca(Tipo dado);
void remove(ItTipo it);
// range-based loop
ItTipo begin()
{
return itera();
}
// sentinela marcador de fim
ItTipo end()
{
return IteradorVetor1{.elemento = elementos + N};
}
};
void SacoVetor1::cria()
{
this->N = 0;
}
void SacoVetor1::libera()
{
this->N = 0;
}
void SacoVetor1::adiciona(char dado)
{
this->elementos[N] = dado;
this->N++; // N = N + 1
}
IteradorVetor1 SacoVetor1::itera()
{
IteradorVetor1 it{
.elemento = this->elementos,
.sentinela = this->elementos + N};
return it;
}
IteradorVetor1 SacoVetor1::busca(char dado)
{
for (int i = 0; i < N; i++)
if (elementos[i] == dado)
return IteradorVetor1{
.elemento = this->elementos + i,
.sentinela = this->elementos + N};
return IteradorVetor1{
.elemento = this->elementos + N,
.sentinela = this->elementos + N};
}
void SacoVetor1::remove(IteradorVetor1 it)
{
auto *i = it.elemento;
while (i != (this->elementos + N))
{
(*i) = *(i + 1);
i++;
}
this->N--; // N = N - 1
}
IteradorVetor1 buscarec(IteradorVetor1 it, char dado)
{
if (it.atual() == dado)
return it;
else
{
it.proximo();
return buscarec(it, dado);
}
}
//
// verifica se agregado SacoVetor1 satisfaz conceito SacoTAD
static_assert(SacoTAD<SacoVetor1>);
#endif //SACO_VETOR_HPP