00001 #include <Utilitarios/Manipuladores/ignoradores.H>
00002
00003 #include <Erros/erros.H>
00004
00005 inline bool Utilitarios::DataTempo::eBissexto(Ano ano) {
00006 return ano % 4 == 0 and (ano % 100 != 0 or ano % 400 == 0);
00007 }
00008
00009 inline int Utilitarios::DataTempo::numeroDeDiasEm(Mes mes, Ano ano) {
00010 static int numero_de_dias[numero_total_de_meses + 1][2] = {
00011 {0, 0},
00012 {31, 31},
00013 {28, 29},
00014 {31, 31},
00015 {30, 30},
00016 {31, 31},
00017 {30, 30},
00018 {31, 31},
00019 {31, 31},
00020 {30, 30},
00021 {31, 31},
00022 {30, 30},
00023 {31, 31}
00024 };
00025 return numero_de_dias[int(mes)][eBissexto(ano)];
00026 }
00027
00028 inline Utilitarios::DataTempo::Mes&
00029 Utilitarios::DataTempo::operator ++ (Mes& mes) {
00030 if(mes == dezembro)
00031 mes = janeiro;
00032 else
00033 mes = Mes(int(mes) + 1);
00034 return mes;
00035 }
00036
00037 inline Utilitarios::DataTempo::Mes&
00038 Utilitarios::DataTempo::operator -- (Mes& mes) {
00039 if(mes == janeiro)
00040 mes = dezembro;
00041 else
00042 mes = Mes(int(mes) - 1);
00043 return mes;
00044 }
00045
00046 inline Utilitarios::DataTempo::Mes
00047 Utilitarios::DataTempo::operator ++ (Mes& mes, int) {
00048 Mes mes_antigo = mes;
00049 ++mes;
00050 return mes_antigo;
00051 }
00052
00053 inline Utilitarios::DataTempo::Mes
00054 Utilitarios::DataTempo::operator -- (Mes& mes, int) {
00055 Mes mes_antigo = mes;
00056 --mes;
00057 return mes_antigo;
00058 }
00059
00060 #if __GNUC__ > 1 && __GNUC_MINOR__ >= 96
00061 inline Utilitarios::DataTempo::Mes&
00062 Utilitarios::DataTempo::operator += (Mes& mes, int numero_de_meses) {
00063 if(numero_de_meses < 0)
00064 numero_de_meses = numero_total_de_meses -
00065 (-numero_de_meses % numero_total_de_meses);
00066 return mes = Mes((int(mes) - 1 + numero_de_meses) % numero_total_de_meses +
00067 1);
00068 }
00069
00070 inline Utilitarios::DataTempo::Mes&
00071 Utilitarios::DataTempo::operator -= (Mes& mes, int numero_de_meses) {
00072 return mes += -numero_de_meses;
00073 }
00074 #endif
00075
00076 inline Utilitarios::DataTempo::Mes
00077 Utilitarios::DataTempo::operator + (Mes mes, int numero_de_meses) {
00078 if(numero_de_meses < 0)
00079 numero_de_meses = numero_total_de_meses -
00080 (-numero_de_meses % numero_total_de_meses);
00081 return Mes((int(mes) - 1 + numero_de_meses) % numero_total_de_meses + 1);
00082 }
00083
00084 inline Utilitarios::DataTempo::Mes
00085 Utilitarios::DataTempo::operator + (int numero_de_meses, Mes mes) {
00086 return mes + numero_de_meses;
00087 }
00088
00089 inline int Utilitarios::DataTempo::operator - (Mes um_mes, Mes outro_mes) {
00090 if(int(um_mes) >= int(outro_mes))
00091 return int(um_mes) - int(outro_mes);
00092 else
00093 return numero_total_de_meses + int(um_mes) - int(outro_mes);
00094 }
00095
00096 inline Utilitarios::DataTempo::Mes
00097 Utilitarios::DataTempo::operator - (Mes mes, int numero_de_meses) {
00098 return mes + -numero_de_meses;
00099 }
00100
00101 inline std::ostream&
00102 Utilitarios::DataTempo::operator << (std::ostream& saida, Mes mes) {
00103 return saida << nomes_dos_meses[mes];
00104 }
00105
00106
00107 inline Utilitarios::DataTempo::DiaDaSemana&
00108 Utilitarios::DataTempo::operator ++ (DiaDaSemana& dia_da_semana) {
00109 if(dia_da_semana == sabado)
00110 dia_da_semana = domingo;
00111 else
00112 dia_da_semana = DiaDaSemana(int(dia_da_semana) + 1);
00113 return dia_da_semana;
00114 }
00115
00116 inline Utilitarios::DataTempo::DiaDaSemana&
00117 Utilitarios::DataTempo::operator -- (DiaDaSemana& dia_da_semana) {
00118 if(dia_da_semana == domingo)
00119 dia_da_semana = sabado;
00120 else
00121 dia_da_semana = DiaDaSemana(int(dia_da_semana) - 1);
00122 return dia_da_semana;
00123 }
00124
00125 inline Utilitarios::DataTempo::DiaDaSemana
00126 Utilitarios::DataTempo::operator ++ (DiaDaSemana& dia_da_semana, int) {
00127 DiaDaSemana dia_antigo = dia_da_semana;
00128 ++dia_da_semana;
00129 return dia_antigo;
00130 }
00131
00132 inline Utilitarios::DataTempo::DiaDaSemana
00133 Utilitarios::DataTempo::operator -- (DiaDaSemana& dia_da_semana, int) {
00134 DiaDaSemana dia_antigo = dia_da_semana;
00135 --dia_da_semana;
00136 return dia_antigo;
00137 }
00138
00139 #if __GNUC__ > 1 && __GNUC_MINOR__ >= 96
00140 inline Utilitarios::DataTempo::DiaDaSemana&
00141 Utilitarios::DataTempo::operator += (DiaDaSemana& dia_da_semana,
00142 int numero_de_dias) {
00143 if(numero_de_dias < 0)
00144 numero_de_dias = numero_total_de_dias_da_semana -
00145 (-numero_de_dias % numero_total_de_dias_da_semana);
00146 return dia_da_semana = DiaDaSemana((int(dia_da_semana) + numero_de_dias) %
00147 numero_total_de_dias_da_semana);
00148 }
00149
00150 inline Utilitarios::DataTempo::DiaDaSemana&
00151 Utilitarios::DataTempo::operator -= (DiaDaSemana& dia_da_semana,
00152 int numero_de_dias) {
00153 return dia_da_semana += -numero_de_dias;
00154 }
00155 #endif
00156
00157 inline Utilitarios::DataTempo::DiaDaSemana
00158 Utilitarios::DataTempo::operator + (DiaDaSemana dia_da_semana,
00159 int numero_de_dias) {
00160 if(numero_de_dias < 0)
00161 numero_de_dias = numero_total_de_dias_da_semana -
00162 (-numero_de_dias % numero_total_de_dias_da_semana);
00163 return DiaDaSemana((int(dia_da_semana) + numero_de_dias) %
00164 numero_total_de_dias_da_semana);
00165 }
00166
00167 inline Utilitarios::DataTempo::DiaDaSemana
00168 Utilitarios::DataTempo::operator + (int numero_de_dias,
00169 DiaDaSemana dia_da_semana) {
00170 return dia_da_semana + numero_de_dias;
00171 }
00172
00173 inline int Utilitarios::DataTempo::operator - (DiaDaSemana um_dia_da_semana,
00174 DiaDaSemana outro_dia_da_semana)
00175 {
00176 if(int(um_dia_da_semana) >= int(outro_dia_da_semana))
00177 return int(um_dia_da_semana) - int(outro_dia_da_semana);
00178 else
00179 return numero_total_de_dias_da_semana +
00180 int(um_dia_da_semana) - int(outro_dia_da_semana);
00181 }
00182
00183 inline Utilitarios::DataTempo::DiaDaSemana
00184 Utilitarios::DataTempo::operator - (DiaDaSemana dia_da_semana,
00185 int numero_de_dias) {
00186 return dia_da_semana + -numero_de_dias;
00187 }
00188
00189 inline std::ostream&
00190 Utilitarios::DataTempo::operator << (std::ostream& saida,
00191 DiaDaSemana dia_da_semana) {
00192 return saida << nomes_dos_dias_da_semana[dia_da_semana];
00193 }
00194
00195
00196 inline Utilitarios::DataTempo::Data::Data(Ano ano, Mes mes, Dia dia)
00197 : ano_(ano), mes_(mes), dia_(dia)
00198 {
00199 assert(cumpreInvariante());
00200 }
00201
00202 inline Utilitarios::DataTempo::Data::Data()
00203 : ano_(2000), mes_(janeiro), dia_(1)
00204 {
00205 assert(cumpreInvariante());
00206 }
00207
00208 inline Utilitarios::DataTempo::Data::Data(long dia_juliano)
00209 {
00210 long l = dia_juliano + 68569;
00211 long n = (4 * l) / 146097;
00212 l = l - (146097 * n + 3) / 4;
00213 long i = (4000 * (l + 1)) / 1461001;
00214 l = l - (1461 * i) / 4 + 31;
00215 long j = (80 * l) / 2447;
00216 dia_ = Dia(l - (2447 * j) / 80);
00217 l = j / 11;
00218 mes_ = Mes(j + 2 - (12 * l));
00219 ano_ = Ano(100 * (n - 49) + i + l);
00220
00221 assert(cumpreInvariante());
00222 }
00223
00224 inline Utilitarios::DataTempo::Data::Data(std::istream& entrada) {
00225 assert(entrada);
00226
00227 carrega(entrada);
00228 }
00229
00230 inline Utilitarios::DataTempo::Ano const&
00231 Utilitarios::DataTempo::Data::ano() const {
00232 return ano_;
00233 }
00234
00235 inline Utilitarios::DataTempo::Mes const&
00236 Utilitarios::DataTempo::Data::mes() const {
00237 return mes_;
00238 }
00239
00240 inline Utilitarios::DataTempo::Dia const&
00241 Utilitarios::DataTempo::Data::dia() const {
00242 return dia_;
00243 }
00244
00245 inline Utilitarios::DataTempo::DiaDaSemana
00246 Utilitarios::DataTempo::Data::diaDaSemana() const {
00247 return DiaDaSemana((diaJuliano() + 1) %
00248 numero_total_de_dias_da_semana);
00249 }
00250
00251 inline long int Utilitarios::DataTempo::Data::diaJuliano() const {
00252 return ((1461 * (ano_ + 4800 + (int(mes_) - 14) / 12)) / 4 +
00253 (367 * (int(mes_) - 2 - 12 * ((int(mes_) - 14) / 12))) / 12 -
00254 (3 * ((ano_ + 4900 + (int(mes_) - 14) / 12) / 100)) / 4 +
00255 dia_ - 32075);
00256 }
00257
00258 inline bool Utilitarios::DataTempo::Data::anoEBissexto() const {
00259 return eBissexto(ano_);
00260 }
00261
00262 inline int Utilitarios::DataTempo::Data::numeroDeDiasNoMes() const {
00263 return numeroDeDiasEm(mes_, ano_);
00264 }
00265
00266 inline void Utilitarios::DataTempo::Data::guarda(std::ostream& saida) const {
00267 assert(saida);
00268
00269 saida << ano_ << endl
00270 << int(mes_) << endl
00271 << dia_ << endl;
00272
00273 if(not saida)
00274 throw Erros::ErroAoGuardar("Utilitarios::DataTempo::Data");
00275 }
00276
00277 inline Utilitarios::DataTempo::Data&
00278 Utilitarios::DataTempo::Data::operator ++ () {
00279 return *this += 1;
00280 }
00281
00282 inline Utilitarios::DataTempo::Data&
00283 Utilitarios::DataTempo::Data::operator -- () {
00284 return *this -= 1;
00285 }
00286
00287 inline Utilitarios::DataTempo::Data
00288 Utilitarios::DataTempo::Data::operator ++ (int) {
00289 Data data_anterior = *this;
00290 ++*this;
00291 return data_anterior;
00292 }
00293
00294 inline Utilitarios::DataTempo::Data
00295 Utilitarios::DataTempo::Data::operator -- (int) {
00296 Data data_anterior = *this;
00297 --*this;
00298 return data_anterior;
00299 }
00300
00301
00302 inline Utilitarios::DataTempo::Data&
00303 Utilitarios::DataTempo::Data::operator += (Duracao const& duracao) {
00304 return *this = *this + duracao;
00305 }
00306
00307 inline Utilitarios::DataTempo::Data&
00308 Utilitarios::DataTempo::Data::operator -= (Duracao const& duracao) {
00309 return *this = *this - duracao;
00310 }
00311
00312 inline void
00313 Utilitarios::DataTempo::Data::estabeleceDataActualPedidaAoUtilizador() {
00314 data_actual_obtida_do_sistema = false;
00315 }
00316
00317 inline void Utilitarios::DataTempo::Data::estabeleceDataActualObtidaDoSistema()
00318 {
00319 data_actual_obtida_do_sistema = true;
00320 }
00321
00322 inline bool Utilitarios::DataTempo::Data::cumpreInvariante() const {
00323 return ano_ >= ano_minimo and
00324 0 < dia_ and dia_ <= numeroDeDiasEm(mes_, ano_);
00325 }
00326
00327 inline bool Utilitarios::DataTempo::operator == (Data const& uma_data,
00328 Data const& outra_data) {
00329 return uma_data.ano() == outra_data.ano() and
00330 uma_data.mes() == outra_data.mes() and
00331 uma_data.dia() == outra_data.dia();
00332 }
00333
00334 inline bool Utilitarios::DataTempo::operator != (Data const& uma_data,
00335 Data const& outra_data) {
00336 return not (uma_data == outra_data);
00337 }
00338
00339 inline bool Utilitarios::DataTempo::operator < (Data const& uma_data,
00340 Data const& outra_data) {
00341 return uma_data.diaJuliano() < outra_data.diaJuliano();
00342 }
00343
00344 inline bool Utilitarios::DataTempo::operator > (Data const& uma_data,
00345 Data const& outra_data) {
00346 return outra_data < uma_data;
00347 }
00348
00349 inline bool Utilitarios::DataTempo::operator <= (Data const& uma_data,
00350 Data const& outra_data) {
00351 return not (uma_data > outra_data);
00352 }
00353
00354 inline bool Utilitarios::DataTempo::operator >= (Data const& uma_data,
00355 Data const& outra_data) {
00356 return not (uma_data < outra_data);
00357 }
00358
00359 inline Utilitarios::DataTempo::Duracao
00360 Utilitarios::DataTempo::operator - (Data const& uma_data,
00361 Data const& outra_data) {
00362 return uma_data.diaJuliano() - outra_data.diaJuliano();
00363 }
00364
00365 inline Utilitarios::DataTempo::Data
00366 Utilitarios::DataTempo::operator - (Data const& data,
00367 Duracao const& duracao) {
00368 return data + -duracao;
00369 }
00370
00371 inline Utilitarios::DataTempo::Data
00372 Utilitarios::DataTempo::operator + (Data const& data,
00373 Duracao const& duracao) {
00374 return Data(data.diaJuliano() + duracao);
00375 }
00376
00377 inline Utilitarios::DataTempo::Data
00378 Utilitarios::DataTempo::operator + (Duracao const& duracao,
00379 Data const& data) {
00380 return Data(data.diaJuliano() + duracao);
00381 }
00382
00383 inline std::ostream& Utilitarios::DataTempo::operator << (std::ostream& saida,
00384 Data const& data) {
00385 return saida << data.ano() << '/' << int(data.mes()) << '/'
00386 << data.dia();
00387 }
00388
00389