00001 00006 #ifndef UTILITARIOS_DATA_H 00007 #define UTILITARIOS_DATA_H 00008 00009 #include <iostream> 00010 #include <string> 00011 00012 namespace Utilitarios { 00013 00019 00020 00021 00031 typedef long Duracao; 00032 00036 typedef int Dia; 00037 00041 typedef int Ano; 00042 00046 enum Mes { 00047 janeiro = 1, 00048 fevereiro, 00049 marco, 00050 abril, 00051 maio, 00052 junho, 00053 julho, 00054 agosto, 00055 setembro, 00056 outubro, 00057 novembro, 00058 dezembro 00059 }; 00060 00064 int const numero_total_de_meses = 12; 00065 00070 extern std::string nomes_dos_meses[numero_total_de_meses + 1]; 00071 00075 enum DiaDaSemana { 00076 domingo = 0, 00077 segunda_feira, 00078 terca_feira, 00079 quarta_feira, 00080 quinta_feira, 00081 sexta_feira, 00082 sabado 00083 }; 00084 00088 int const numero_total_de_dias_da_semana = 7; 00089 00094 extern std::string 00095 nomes_dos_dias_da_semana[numero_total_de_dias_da_semana]; 00096 00098 00100 00101 00107 bool eBissexto(Ano const ano); 00108 00114 int numeroDeDiasEm(Mes const mes, Ano const ano); 00115 00117 00119 00120 00129 Mes& operator++(Mes& mes); 00130 00139 Mes& operator--(Mes& mes); 00140 00149 Mes operator++(Mes& mes, int); 00150 00159 Mes operator--(Mes& mes, int); 00160 00169 Mes& operator+=(Mes& mes, int const numero_de_meses); 00170 00179 Mes& operator-=(Mes& mes, int const numero_de_meses); 00180 00189 Mes operator+(Mes const mes, int const numero_de_meses); 00190 00191 00200 Mes operator+(int const numero_de_meses, Mes const mes); 00201 00209 int operator-(Mes const um_mes, Mes const outro_mes); 00210 00219 Mes operator-(Mes const mes, int const numero_de_meses); 00220 00228 std::ostream& operator<<(std::ostream& saida, Mes const mes); 00229 00238 std::istream& operator>>(std::istream& entrada, Mes& mes); 00239 00241 00243 00244 00253 DiaDaSemana& operator++(DiaDaSemana& dia_da_semana); 00254 00263 DiaDaSemana& operator--(DiaDaSemana& dia_da_semana); 00264 00273 DiaDaSemana operator++(DiaDaSemana& dia_da_semana, int); 00274 00283 DiaDaSemana operator--(DiaDaSemana& dia_da_semana, int); 00284 00293 DiaDaSemana& operator+=(DiaDaSemana& dia_da_semana, 00294 int const numero_de_dias); 00295 00304 DiaDaSemana& operator-=(DiaDaSemana& dia_da_semana, 00305 int const numero_de_dias); 00306 00316 DiaDaSemana operator+(DiaDaSemana const dia_da_semana, 00317 int const numero_de_dias); 00318 00328 DiaDaSemana operator+(int const numero_de_dias, 00329 DiaDaSemana const dia_da_semana); 00330 00340 int operator-(DiaDaSemana const um_dia_da_semana, 00341 DiaDaSemana const outro_dia_da_semana); 00342 00352 DiaDaSemana operator-(DiaDaSemana const dia_da_semana, 00353 int const numero_de_dias); 00354 00363 std::ostream& operator<<(std::ostream& saida, 00364 DiaDaSemana const dia_da_semana); 00365 00374 std::istream& operator>>(std::istream& entrada, 00375 DiaDaSemana& dia_da_semana); 00376 00378 00402 class Data { 00403 public: 00405 00406 00411 Data(Ano const ano, Mes const mes, Dia const dia); 00412 00418 Data(); 00419 00426 Data(long const dia_juliano); 00427 00429 00431 00432 00438 Ano const& ano() const; 00439 00445 Mes const& mes() const; 00446 00452 Dia const& dia() const; 00453 00459 DiaDaSemana diaDaSemana() const; 00460 00468 long int diaJuliano() const; 00469 00476 int numeroDeDiasNoMes() const; 00477 00479 00481 00482 00488 bool anoEBissexto() const; 00489 00491 00493 00494 00503 Data(std::istream& entrada); 00504 00512 void carregaDe(std::istream& entrada); 00513 00522 void guardaEm(std::ostream& saida) const; 00523 00525 00527 00528 00534 Data& operator++(); 00535 00541 Data& operator--(); 00542 00548 Data operator++(int); 00549 00555 Data operator--(int); 00556 00562 Data& operator+=(Duracao const& duracao); 00563 00569 Data& operator-=(Duracao const& duracao); 00570 00572 00574 00575 00586 static Data actual(); 00587 00596 static void estabeleceDataActualPedidaAoUtilizador(); 00597 00606 static void estabeleceDataActualObtidaDoSistema(); 00607 00609 00611 00612 00614 static Ano const inicio_do_calendario_gregoriano = 1582; 00615 00619 static int const ano_minimo = inicio_do_calendario_gregoriano + 1; 00620 00621 private: 00622 Ano ano_; 00623 Mes mes_; 00624 Dia dia_; 00625 00626 static bool data_actual_obtida_do_sistema; 00627 00634 bool cumpreInvariante() const; 00635 }; 00636 00638 00639 00647 bool operator==(Data const& uma_data, Data const& outra_data); 00648 00656 bool operator!=(Data const& uma_data, Data const& outra_data); 00657 00665 bool operator<(Data const& uma_data, Data const& outra_data); 00666 00674 bool operator>(Data const& uma_data, Data const& outra_data); 00675 00683 bool operator<=(Data const& uma_data, Data const& outra_data); 00684 00692 bool operator>=(Data const& uma_data, Data const& outra_data); 00693 00702 Duracao operator-(Data const& uma_data, Data const& outra_data); 00703 00711 Data operator-(Data const& data, Duracao const& duracao); 00712 00720 Data operator+(Data const& data, Duracao const& duracao); 00721 00729 Data operator+(Duracao const& duracao, Data const& data); 00730 00738 std::ostream& operator<<(std::ostream& saida, Data const& data); 00739 00748 std::istream& operator>>(std::istream& entrada, Data& data); 00749 00751 } 00752 00753 #include <Utilitarios/data_impl.H> 00754 00755 #endif // UTILITARIOS_DATA_H