-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathStation.h
142 lines (122 loc) · 4.44 KB
/
Station.h
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
141
142
//
// Created by manue on 15/03/2023.
//
#ifndef RAILWAY_STATION_H
#define RAILWAY_STATION_H
#include <string>
class Station {
public:
/**@brief Construtor sem parâmetros. Constrói uma estação com todos os atributos vazios.
*
* Complexidade Temporal: O(1)
*/
Station();
/**@brief Construtor com parâmetro. Sanitiza name e constrói uma estação com esse nome sanitizado e os restantes atributos vazios.
*
* Complexidade Temporal: O(n), sendo n o comprimento de name
* @param name nome (a sanitizar)
*/
Station(const std::string &name);
/**@brief Construtor com parâmetros. Sanitiza name e constrói uma estação com esse nome sanitizado (para pesquisa) e por sanitizar (para imprimir), distrito district, concelho municipality, freguesia township, linha line e id id.
*
* Complexidade Temporal: O(n), sendo n o comprimento de name
* @param name nome
* @param district distrito
* @param municipality concelho
* @param township freguesia
* @param line linha
* @param id id
*/
Station(const std::string &name, const std::string &district, const std::string &municipality,
const std::string &township, const std::string &line, int id);
/**@brief Retorna o nome sanitizado da estação.
*
* Complexidade Temporal: O(1)
* @return nome sanitizado da estação
*/
const std::string &getSanitizedName() const;
/**@brief Retorna o nome da estação.
*
* Complexidade Temporal: O(1)
* @return nome da estação
*/
const std::string &getName() const;
/**@brief Retorna o distrito da estação.
*
* Complexidade Temporal: O(1)
* @return distrito da estação
*/
const std::string &getDistrict() const;
/**@brief Retorna o concelho da estação.
*
* Complexidade Temporal: O(1)
* @return concelho da estação
*/
const std::string &getMunicipality() const;
/**@brief Retorna o id da estação.
*
* Complexidade Temporal: O(1)
* @return id da estação
*/
int getId() const;
/**@brief Compara a estação e rhs quanto ao nome sanitizado.
*
* Complexidade Temporal: O(n), sendo n o maior comprimento entre os nomes sanitizados
* @param rhs estação com a qual comparar
* @return true se a estação e rhs têm igual nome sanitizado, false caso contrário
*/
bool operator==(const Station &rhs) const;
/**@brief Compara a estação e rhs quanto ao nome sanitizado, por ordem lexicográfica.
*
* Complexidade Temporal: O(n), sendo n o maior comprimento entre os nomes sanitizados
* @param rhs estação com a qual comparar
* @return true se a estação tem nome sanitizado lexicograficamente anterior a rhs, false caso contrário
*/
bool operator<(const Station &rhs) const;
/**@brief Imprime o nome, o distrito, o concelho, a freguesia e a linha da estação.
*
* Complexidade Temporal: O(1)
*/
void print() const;
private:
std::string sanitizedName;
std::string name;
std::string district;
std::string municipality;
std::string township;
std::string line;
int id;
/**@brief Sanitiza str, i. e., remove os caracteres especiais (diacríticos) de str.
*
* Complexidade Temporal: O(n), sendo n o comprimento de str
* @param str string a sanitizar
* @return str sanitizada
*/
static std::string sanitize(const std::string &str);
};
struct stationHash {
/**@brief Função de dispersão para a tabela de dispersão de estações.
*
* Complexidade Temporal: O(n), sendo n o comprimento do nome sanitizado
* @param station estação a mapear
* @return valor da hash para a estação a mapear
*/
int operator()(const Station &station) const {
const std::string &str = station.getSanitizedName();
int v = 0;
for (const char &ch: str)
v = 37 * v + ch;
return v;
}
/**@brief Função de igualdade para a tabela de dispersão de estações.
*
* Complexidade Temporal: O(n), sendo n o maior comprimento entre os nomes sanitizados
* @param station1 estação 1
* @param station2 estação 2
* @return true se as estações são iguais, false caso contrário
*/
bool operator()(const Station &station1, const Station &station2) const {
return station1 == station2;
}
};
#endif //RAILWAY_STATION_H