00001 #ifndef UTILITARIOS_DATATEMPO_DATA_H
00002 #define UTILITARIOS_DATATEMPO_DATA_H
00003
00004 #include <iostream>
00005 #include <string>
00006
00007 namespace Utilitarios {
00008
00011 namespace DataTempo {
00012
00021 typedef long Duracao;
00022
00023
00025 typedef int Dia;
00026
00027
00029 typedef int Ano;
00030
00032 bool eBissexto(Ano ano);
00033
00034
00036 enum Mes {
00037 janeiro = 1,
00038 fevereiro,
00039 marco,
00040 abril,
00041 maio,
00042 junho,
00043 julho,
00044 agosto,
00045 setembro,
00046 outubro,
00047 novembro,
00048 dezembro
00049 };
00050
00051 int const numero_total_de_meses = 12;
00052
00053 extern std::string nomes_dos_meses[numero_total_de_meses + 1];
00054
00055 int numeroDeDiasEm(Mes mes, Ano ano);
00056
00058 Mes& operator ++ (Mes& mes);
00059
00061 Mes& operator -- (Mes& mes);
00062
00064 Mes operator ++ (Mes& mes, int);
00065
00067 Mes operator -- (Mes& mes, int);
00068
00069 #if __GNUC__ > 1 && __GNUC_MINOR__ >= 96
00070
00071 Mes& operator += (Mes& mes, int numero_de_meses);
00072
00074 Mes& operator -= (Mes& mes, int numero_de_meses);
00075 #endif
00076
00078 Mes operator + (Mes mes, int numero_de_meses);
00079
00081 Mes operator + (int numero_de_meses, Mes mes);
00082
00084 int operator - (Mes um_mes, Mes outro_mes);
00085
00087 Mes operator - (Mes mes, int numero_de_meses);
00088
00090 std::ostream& operator << (std::ostream& saida, Mes mes);
00091
00093 std::istream& operator >> (std::istream& entrada, Mes& mes);
00094
00095
00097 enum DiaDaSemana {
00098 domingo = 0,
00099 segunda_feira,
00100 terca_feira,
00101 quarta_feira,
00102 quinta_feira,
00103 sexta_feira,
00104 sabado
00105 };
00106
00107 int const numero_total_de_dias_da_semana = 7;
00108
00109 extern std::string
00110 nomes_dos_dias_da_semana[numero_total_de_dias_da_semana];
00111
00113 DiaDaSemana& operator ++ (DiaDaSemana& dia_da_semana);
00114
00116 DiaDaSemana& operator -- (DiaDaSemana& dia_da_semana);
00117
00119 DiaDaSemana operator ++ (DiaDaSemana& dia_da_semana, int);
00120
00122 DiaDaSemana operator -- (DiaDaSemana& dia_da_semana, int);
00123
00124 #if __GNUC__ > 1 && __GNUC_MINOR__ >= 96
00125
00126 DiaDaSemana& operator += (DiaDaSemana& dia_da_semana,
00127 int numero_de_dias);
00128
00130 DiaDaSemana& operator -= (DiaDaSemana& dia_da_semana,
00131 int numero_de_dias);
00132 #endif
00133
00136 DiaDaSemana operator + (DiaDaSemana dia_da_semana, int numero_de_dias);
00137
00140 DiaDaSemana operator + (int numero_de_dias, DiaDaSemana dia_da_semana);
00141
00144 int operator - (DiaDaSemana um_dia_da_semana,
00145 DiaDaSemana outro_dia_da_semana);
00146
00148 DiaDaSemana operator - (DiaDaSemana dia_da_semana, int numero_de_dias);
00149
00151 std::ostream& operator << (std::ostream& saida,
00152 DiaDaSemana dia_da_semana);
00153
00155 std::istream& operator >> (std::istream& entrada,
00156 DiaDaSemana& dia_da_semana);
00157
00158
00202 class Data {
00203 public:
00205 Data(Ano ano, Mes mes, Dia dia);
00206
00208 Data();
00209
00211 Data(std::istream& entrada);
00212
00214 Data(long int dia_juliano);
00215
00217 Ano const& ano() const;
00218
00220 Mes const& mes() const;
00221
00223 Dia const& dia() const;
00224
00226 DiaDaSemana diaDaSemana() const;
00227
00229 long int diaJuliano() const;
00230
00232 bool anoEBissexto() const;
00233
00235 int numeroDeDiasNoMes() const;
00236
00238 void guarda(std::ostream& saida) const;
00239
00241 Data& operator ++ ();
00242
00244 Data& operator -- ();
00245
00247 Data operator ++ (int);
00248
00250 Data operator -- (int);
00251
00253 Data& operator += (Duracao const& duracao);
00254
00256 Data& operator -= (Duracao const& duracao);
00257
00259 void carrega(std::istream& entrada);
00260
00269 static Data actual();
00270
00275 static void estabeleceDataActualPedidaAoUtilizador();
00276
00281 static void estabeleceDataActualObtidaDoSistema();
00282
00283 static int const inicio_do_calendario_gregoriano = 1582;
00285 static int const ano_minimo = inicio_do_calendario_gregoriano + 1;
00286
00287 private:
00288 Ano ano_;
00289 Mes mes_;
00290 Dia dia_;
00291
00292 static bool data_actual_obtida_do_sistema;
00293
00294 bool cumpreInvariante() const;
00295 };
00296
00298 bool operator == (Data const& uma_data, Data const& outra_data);
00299
00301 bool operator != (Data const& uma_data, Data const& outra_data);
00302
00304 bool operator < (Data const& uma_data, Data const& outra_data);
00305
00307 bool operator > (Data const& uma_data, Data const& outra_data);
00308
00310 bool operator <= (Data const& uma_data, Data const& outra_data);
00311
00313 bool operator >= (Data const& uma_data, Data const& outra_data);
00314
00316 Duracao operator - (Data const& uma_data, Data const& outra_data);
00317
00319 Data operator - (Data const& data, Duracao const& duracao);
00320
00322 Data operator + (Data const& data, Duracao const& duracao);
00323
00325 Data operator + (Duracao const& duracao, Data const& data);
00326
00328 std::ostream& operator << (std::ostream& saida, Data const& data);
00329
00331 std::istream& operator >> (std::istream& entrada, Data& data);
00332
00333 }
00334 }
00335
00336 #include <Utilitarios/DataTempo/data_impl.H>
00337
00338 #endif // UTILITARIOS_DATATEMPO_DATA_H