// This file is part of the Herezh++ application. // // The finite element software Herezh++ is dedicated to the field // of mechanics for large transformations of solid structures. // It is developed by Gérard Rio (APP: IDDN.FR.010.0106078.000.R.P.2006.035.20600) // INSTITUT DE RECHERCHE DUPUY DE LÔME (IRDL) . // // Herezh++ is distributed under GPL 3 license ou ultérieure. // // Copyright (C) 1997-2022 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, // or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty // of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. // See the GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // // For more information, please consult: . /************************************************************************ * DATE: 23/01/97 * * $ * * AUTEUR: G RIO (mailto:gerardrio56@free.fr) * * $ * * PROJET: Herezh++ * * $ * ************************************************************************ * BUT: définir un tableau template de dimension 2. * * $ * * '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' * * * VERIFICATION: * * * * ! date ! auteur ! but ! * * ------------------------------------------------------------ * * ! ! ! ! * * $ * * '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' * * MODIFICATIONS: * * ! date ! auteur ! but ! * * ------------------------------------------------------------ * * $ * ************************************************************************/ #ifndef TABLEAU2_T_H #define TABLEAU2_T_H #include "Tableau_T.h" /// @addtogroup Les_Tableaux_generiques /// @{ /// template class Tableau2 : public Tableau { public : // CONSTRUCTEURS : // Constructeur par defaut Tableau2 (); // Constructeur fonction de la taille du tableau // dans le cas d'une taille il s'agit d'un tableau carré Tableau2 (const int nb); // cas de deux dimensions différentes Tableau2 (const int nb1,const int nb2); // Constructeur fonction de la taille du tableau et d'une // valeur d'initialisation pour les composantes //1) tableau carré Tableau2 (const int nb,const T& val); //2) tableau rectangulaire Tableau2 (const int nb1,const int nb2,const T& val); // Constructeur de copie Tableau2 (const Tableau2 & tab); // DESTRUCTEUR : virtual ~Tableau2 (); // METHODES : inline int Taille1 () const // Retourne la première taille du tableau { return taille1; }; inline int Taille2 () const // Retourne la seconde taille du tableau { return taille2; }; // gestion d'erreur // cette fonction n'est plus valable d'où la surcharge pour filtrer les // appels éventuels inline int Taille () const { cout << "\nErreur : fonction non disponible \n" ; cout << "TABLEAU2_T::Taille () \n"; Sortie(1); return 0; // pour éviter le warning }; inline T& operator() (int i, int j) // Retourne la (ieme,jeme) composante du tableau : acces en lecture et ecriture { #ifdef MISE_AU_POINT if ( (i<1) || (i>taille1) || (j<1) || (j>taille2) ) { cout << "\nErreur : composante inexistante !, (i,j) demandé = (" << i << ',' << j << ")" << '\n'; cout << "TABLEAU2_T::OPERATOR() (int, int ) \n"; Sortie(1); }; #endif return this->t[(i-1)*taille2 + j-1]; }; inline T operator() (int i, int j) const // Retourne la (ieme,jeme) composante du tableau : acces en lecture uniquement { #ifdef MISE_AU_POINT if ( (i<1) || (i>taille1) || (j<1) || (j>taille2) ) { cout << "\nErreur : composante inexistante !, (i,j) demandé = (" << i << ',' << j << ")" << '\n'; cout << "TABLEAU2_T::OPERATOR() (int, int ) \n"; Sortie(1); }; #endif return this->t[(i-1)*taille2 + j-1]; }; inline int operator!= (const Tableau2& tab) const // Surcharge de l'operateur != // Renvoie 1 si les deux tableaux ne sont pas egaux // Renvoie 0 sinon { if ( (*this)==tab ) // test de l'egalite des deux tableaux a l'aide // de l'operateur surcharge == return 0; else return 1; }; // Surcharge de l'operateur == int operator== (const Tableau2& tab) const ; // const {return ((*this)==tab); }; // Surcharge de l'operateur d'affectation = Tableau2& operator= (const Tableau2& tab); // Change la taille du tableau (la nouvelle taille est n) // uniquement valable pour les tableaux carrés // N.B. : Si la nouvelle taille est superieure a l'ancienne alors le tableau est // complete par defaut void Change_taille (int n); // idem et initialisation de toutes les valeurs, anciennes et nouvelles à tb void Change_taille (int n,const T& tb); // Change la taille du tableau (les nouvelles tailles sont n1 et n2) void Change_taille (int n1, int n2); // Change la taille du tableau (les nouvelles tailles sont n1 et n2) // et initialisation de toutes les valeurs, anciennes et nouvelles à tb void Change_taille (int n1, int n2,const T& tb); // Permet de desallouer l'ensemble des elements du tableau void Libere (); protected : int taille1; // la première taille du tableau int taille2; // seconde taille du tableau }; /// @} // end of group //================================= def des differents elements ================== // Constructeur par defaut template inline Tableau2::Tableau2 () : Tableau () { taille1=0;taille2=0; } // Constructeur fonction de la taille du tableau // dans le cas d'une taille il s'agit d'un tableau carré template inline Tableau2::Tableau2 (const int nb) : Tableau (nb*nb) { taille1=nb;taille2=nb; } // cas de deux dimensions différentes template inline Tableau2::Tableau2 (const int nb1,const int nb2) : Tableau (nb1*nb2) { taille1=nb1;taille2=nb2; } // Constructeur fonction de la taille du tableau et d'une // valeur d'initialisation pour les composantes //1) tableau carré template inline Tableau2::Tableau2 (const int nb,const T& val) : Tableau (nb*nb,val) { taille1=nb;taille2=nb; } //2) tableau rectangulaire template inline Tableau2::Tableau2 (const int nb1,const int nb2,const T& val) : Tableau (nb1*nb2,val) { taille1=nb1;taille2=nb2; } // Constructeur de copie template inline Tableau2::Tableau2 (const Tableau2 & tab) : Tableau (tab) { taille1 = tab.taille1; taille2 = tab.taille2; } // DESTRUCTEUR : template inline Tableau2::~Tableau2 () { Libere(); } // METHODES : template inline Tableau2 & Tableau2::operator= (const Tableau2 & tab) // Surcharge de l'operateur = : realise l'egalite entre deux tableaux de pointeurs { Tableau & T1 = *this; //this->Tableau::operator= (T1,T2); T1 = (Tableau) tab; taille1 = tab.taille1; taille2 = tab.taille2; return (*this); } // Change la taille du tableau (la nouvelle taille est n) // uniquement valable pour les tableaux carrés // N.B. : Si la nouvelle taille est superieure a l'ancienne alors le tableau est // complete par defaut template inline void Tableau2::Change_taille (int n) { #ifdef MISE_AU_POINT if (taille1 != taille2) { cout << "\nErreur : le changement de taille demandé n'est valide que pour des tableaux carrés," << " ici taille 1= " << taille1 << " et taille2 = " << taille2 << '\n'; cout << "Tableau2::Change_taille (int n) \n"; Sortie(1); }; if ( n < 0) { cout << "\nErreur : la nouvelle taille demandée est négative , n= " << n << '\n'; cout << "Tableau2::Change_taille (int n) \n"; Sortie(1); }; #endif this->Tableau::Change_taille (n*n); taille1 = n; taille2 = n; } // idem et initialisation de toutes les valeurs, anciennes et nouvelles à tb template inline void Tableau2::Change_taille (int n,const T& tb) { #ifdef MISE_AU_POINT if (taille1 != taille2) { cout << "\nErreur : le changement de taille demandé n'est valide que pour des tableaux carrés," << " ici taille 1= " << taille1 << " et taille2 = " << taille2 << '\n'; cout << "Tableau2::Change_taille (int n) \n"; Sortie(1); }; if ( n < 0) { cout << "\nErreur : la nouvelle taille demandée est négative , n= " << n << '\n'; cout << "Tableau2::Change_taille (int n) \n"; Sortie(1); }; #endif this->Tableau::Change_taille (n*n,tb); taille1 = n; taille2 = n; } // Change la taille du tableau (les nouvelles tailles sont n1 et n2) template inline void Tableau2::Change_taille (int n1, int n2) { #ifdef MISE_AU_POINT if (( n1 < 0) || (n2 < 0)) { cout << "\nErreur : une des nouvelles tailles demandée est négative , n1= " << n1 << " n2 = " << n2 <<'\n'; cout << "Tableau2::Change_taille (int n1,int n2) \n"; Sortie(1); }; #endif this->Tableau::Change_taille (n1*n2); taille1 = n1; taille2 = n2; } // Permet de desallouer l'ensemble des elements du tableau template inline void Tableau2::Libere () { this->Tableau::Libere (); taille1 = 0; taille2 = 0; } // Surcharge de l'operateur == template inline int Tableau2::operator== (const Tableau2& tab) const { if ((tab.taille1 != taille1) || (tab.taille2 != taille2)) return 0; else return this->Tableau::operator== (tab); } // Change la taille du tableau (les nouvelles tailles sont n1 et n2) // et initialisation de toutes les valeurs, anciennes et nouvelles à tb template inline void Tableau2::Change_taille (int n1, int n2,const T& tb) { #ifdef MISE_AU_POINT if (( n1 < 0) || (n2 < 0)) { cout << "\nErreur : une des nouvelles tailles demandée est négative , n1= " << n1 << " n2 = " << n2 <<'\n'; cout << "Tableau2::Change_taille (int n1,int n2) \n"; Sortie(1); }; #endif this->Tableau::Change_taille (n1*n2,tb); taille1 = n1; taille2 = n2; } #endif