Página principal   Lista de namespaces   Hierarquia de classes   Lista de componentes   Lista de ficheiros   Membros do namespace   Componentes   Declarações  

data_impl.H

Ir para a documentação deste ficheiro.
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}, // lixo; não há dia 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 // desdeinicio: inclusive ambos atefim 
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 

Gerado em Tue Apr 10 15:38:16 2001 para Pacotes por doxygen1.2.6 escrito por Dimitri van Heesch, © 1997-2001