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