// 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-2021 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: 8/6/2003 * * $ * * AUTEUR: G RIO (mailto:gerardrio56@free.fr) * * $ * * PROJET: Herezh++ * * $ * ************************************************************************ * BUT: définir un tableau template de dimension 4. * * $ * * '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' * * * VERIFICATION: * * * * ! date ! auteur ! but ! * * ------------------------------------------------------------ * * ! ! ! ! * * $ * * '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' * * MODIFICATIONS: * * ! date ! auteur ! but ! * * ------------------------------------------------------------ * * $ * ************************************************************************/ #ifndef TABLEAU4_T_H #define TABLEAU4_T_H #include "Tableau_T.h" /// @addtogroup Les_Tableaux_generiques /// @{ /// template class Tableau4 : public Tableau { public : // CONSTRUCTEURS : // Constructeur par defaut Tableau4 (); // Constructeur fonction de la taille du tableau // dans le cas d'une taille il s'agit d'un tableau 4 fois la même dim Tableau4 (const int nb); // cas de 4 dimensions différentes Tableau4 (const int nb1,const int nb2,const int nb3,const int nb4); // Constructeur fonction de la taille du tableau et d'une // valeur d'initialisation pour les composantes //1) tableau 4 dim identique Tableau4 (const int nb,const T& val); //2) tableau avec des dimensions différentes Tableau4 (const int nb1,const int nb2,const int nb3,const int nb4,const T& val); // Constructeur de copie Tableau4 (const Tableau4 & tab); // DESTRUCTEUR : ~Tableau4 (); // METHODES : // Retourne la première taille du tableau inline int Taille1 () const { return taille1; }; // Retourne la deuxième taille du tableau inline int Taille2 () const{ return taille2; }; // Retourne la troisième taille du tableau inline int Taille3 () const{ return taille3; }; // Retourne la quatrième taille du tableau inline int Taille4 () const{ return taille4; }; // 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 << "Tableau4_T::Taille () \n"; Sortie(1); return 0; // pour éviter le warning }; inline T& operator() (int i, int j, int k, int l) // 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) || (k<1) || (k>taille3) || (l<1) || (l>taille4)) { cout << "\nErreur : composante inexistante !, (i,j) demandé = (" << i << ',' << j << ","<t[taille4*((k-1) + taille3*((j-1)+taille2*(i-1))) + l-1]; }; inline T operator() (int i, int j, int k, int l) 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) || (k<1) || (k>taille3) || (l<1) || (l>taille4)) { cout << "\nErreur : composante inexistante !, (i,j) demandé = (" << i << ',' << j << ","<t[taille4*((k-1) + taille3*((j-1)+taille2*(i-1))) + l-1]; }; inline int operator!= (const Tableau4& 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 Tableau4& tab) const ; // const {return ((*this)==tab); }; // Surcharge de l'operateur d'affectation = Tableau4& operator= (const Tableau4& tab); // Change la taille du tableau (la nouvelle taille est n) // uniquement valable pour les tableaux de dimension identique // N.B. : Si la nouvelle taille est superieure a l'ancienne alors le tableau est // complete par defaut, mais les valeurs anciennes et nouvelles sont mises à la valeur par défaut de T // contrairement au Tableau_T void Change_taille (int n); // Change la taille du tableau (les nouvelles tailles sont n1 et n2,n3,n4) // et toutes les valeurs sont initialisées à la valeur par défaut de T void Change_taille (int n1, int n2,int n3, int n4); // Change la taille du tableau (la nouvelle taille est n) // et initialisation de toutes les valeurs, anciennes et nouvelles à tb void Change_taille (int n,T& tb) { cout << "\n fonction non disponible pour des tableaux a quatre dim" << "\n Tableau4::Change_taille (int n,T& tb)"; Sortie(1); }; // 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 int taille3; // troisième taille du tableau int taille4; // quatrième taille du tableau }; /// @} // end of group //================================= def des differents elements ================== // Constructeur par defaut template inline Tableau4::Tableau4 () : Tableau (),taille1(0),taille2(0),taille3(0),taille4(0) { } // Constructeur fonction de la taille du tableau // dans le cas d'une taille identique template inline Tableau4::Tableau4 (const int nb) : Tableau (nb*nb*nb*nb),taille1(nb),taille2(nb),taille3(nb),taille4(nb) { } // cas de deux dimensions différentes template inline Tableau4::Tableau4 (const int nb1,const int nb2,const int nb3,const int nb4) : Tableau (nb1*nb2*nb3*nb4),taille1(nb1),taille2(nb2),taille3(nb3),taille4(nb4) { } // Constructeur fonction de la taille du tableau et d'une // valeur d'initialisation pour les composantes //1) tableau de dim identique template inline Tableau4::Tableau4 (const int nb,const T& val) : Tableau (nb*nb*nb*nb,val),taille1(nb),taille2(nb),taille3(nb),taille4(nb) { } //2) tableau rectangulaire template inline Tableau4::Tableau4 (const int nb1,const int nb2,const int nb3,const int nb4,const T& val) : Tableau (nb1*nb2*nb3*nb4,val),taille1(nb1),taille2(nb2),taille3(nb3),taille4(nb4) { } // Constructeur de copie template inline Tableau4::Tableau4 (const Tableau4 & tab) : Tableau (tab),taille1(tab.taille1),taille2(tab.taille2) ,taille3(tab.taille3),taille4(tab.taille4) { } // DESTRUCTEUR : template inline Tableau4::~Tableau4 () { Libere(); } // METHODES : template inline Tableau4 & Tableau4::operator= (const Tableau4 & 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; taille3 = tab.taille3;taille4 = tab.taille4; 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 Tableau4::Change_taille (int n) { #ifdef MISE_AU_POINT if ((taille1 != taille2) || (taille1 != taille3) || (taille1 != taille4) || (taille2 != taille3) || (taille2 != taille4)) { cout << "\nErreur : le changement de taille demande n'est valide que pour des tableaux de meme 4 dimensions," << " ici taille 1= " << taille1 << " et taille2 = " << taille2 << " et taille3 = " << taille3 << " et taille4 = " << taille4<< '\n'; cout << "Tableau4::Change_taille (int n) \n"; Sortie(1); }; if ( n < 0) { cout << "\nErreur : la nouvelle taille demandée est négative , n= " << n << '\n'; cout << "Tableau4::Change_taille (int n) \n"; Sortie(1); }; #endif if (n != taille1) { // on intervient que si la nouvelle dimension est différente T tb; // def d'une valeur par défaut // déf du tableau avec initialisation à tb this->Tableau::Change_taille (n*n*n*n,tb); taille1 = n; taille2 = n;taille3 = n;taille4 = n; } } // Change la taille du tableau (les nouvelles tailles sont n1 et n2) template inline void Tableau4::Change_taille (int n1, int n2,int n3, int n4) { #ifdef MISE_AU_POINT if (( n1 < 0) || (n2 < 0) || (n3<0) || (n4<0)) { cout << "\nErreur : une des nouvelles tailles demandée est négative , n1= " << n1 << " n2 = " << n2 << " n3 = " << n3 << " n4 = " << n4 <<'\n'; cout << "Tableau4::Change_taille (int n1,int n2,int n3, int n4) \n"; Sortie(1); }; #endif if ( (n1 != taille1) || (n2 != taille2) || (n3 != taille3) || (n4 != taille4)) // dans le cas où il y a un changement de taille on répercute { // dimensionnement du nouveau tableau T tb; // def d'une valeur par défaut // déf du tableau avec initialisation à tb this->Tableau::Change_taille (n1*n2*n3*n4,tb); taille1 = n1; taille2 = n2;taille3 = n3;taille4 = n4; } } // Permet de desallouer l'ensemble des elements du tableau template inline void Tableau4::Libere () { this->Tableau::Libere (); taille1 = 0; taille2 = 0; taille3 = 0;taille4 = 0; } // Surcharge de l'operateur == template inline int Tableau4::operator== (const Tableau4& tab) const { if ((tab.taille1 != taille1) || (tab.taille2 != taille2) || (tab.taille3 != taille3) || (tab.taille4 != taille4)) return 0; else return this->Tableau::operator== (tab); } #endif