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