
// 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) <https://www.irdl.fr/>.
//
// 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 <https://www.gnu.org/licenses/>.
//
// For more information, please consult: <https://herezh.irdl.fr/>.

// définition d'un tableau de réel de dimension quelconque. Dans le cas ou la dimension est comprise
// entre 1 et 20, on utilise des listes de réels pour allouer de la mémoire et pour la désallouer, ce qui
// permet d'être beaucoup plus rapide que l'opérateur classique new.  

// la construstion de la classe s'appuit sur une spécialisation d'une classe template.


#include "Tableau_double.h"

		
// Constructeur fonction de la taille du tableau
Tableau_double::Tableau_double (int nb)
{
   #ifdef MISE_AU_POINT
	if ( nb<0 )
	// cas ou la taille selectionnee est negative
	{	cout << "\nErreur : taille invalide !\n";
		cout << "Tableau_double::Tableau_double(int ) \n";
		Sortie(1);
	};
   #endif    		
	if ( nb!=0 )
	       { taille=nb;
	          switch (nb)
	            {/*  case 1 :    
		        iapointe = new Reel1Pointe();
		        t = & (*(((Reel1Pointe*)iapointe)->ipointe)).donnees;
                             t[0] =  defaut; // initialisation
		        break;
		     case 2 :    
		        iapointe = new Reel2Pointe();
		        t =  (*(((Reel2Pointe*)iapointe)->ipointe)).donnees;
                             t[0] =  defaut; t[2] =  defaut;  // initialisation
		        break;
		     case 3 :    
		        iapointe = new Reel3Pointe();
		        t =  (*(((Reel3Pointe*)iapointe)->ipointe)).donnees;
                             t[0] =  defaut; t[1] =  defaut; t[2] =  defaut; // initialisation
		        break;*/
		     case 4 :    
		        iapointe = new Reel4Pointe();
		        Reel4Pointe* toto = (Reel4Pointe*)iapointe;
		        t =  (*(((Reel4Pointe*)iapointe)->ipointe)).donnees;
                             t[0] = 1; t[1] =  2; t[2] =  3; t[3] =  4;// initialisation
		        break;
	/*	     case 5 :    
		        iapointe = new Reel5Pointe();
		        t =  (*(((Reel5Pointe*)iapointe)->ipointe)).donnees;
                             t[0] =  defaut; t[1] =  defaut; t[2] =  defaut; t[3] =  defaut;
                             t[4] =  defaut;// initialisation
		        break;
		     case 6 :    
		        iapointe = new Reel6Pointe();
		        t =  (*(((Reel6Pointe*)iapointe)->ipointe)).donnees;
                             t[0] =  defaut; t[1] =  defaut; t[2] =  defaut; t[3] =  defaut;
                             t[4] =  defaut;t[5] =  defaut;// initialisation
		        break;
		     case 7 :    
		        iapointe = new Reel7Pointe();
		        t =  (*(((Reel7Pointe*)iapointe)->ipointe)).donnees;
                             t[0] =  defaut; t[1] =  defaut; t[2] =  defaut; t[3] =  defaut;
                             t[4] =  defaut;t[5] =  defaut;t[6] =  defaut;// initialisation
		        break;
		     case 8 :    
		        iapointe = new Reel8Pointe();
		        t =  (*(((Reel8Pointe*)iapointe)->ipointe)).donnees;
                             t[0] =  defaut; t[1] =  defaut; t[2] =  defaut; t[3] =  defaut;
                             t[4] =  defaut;t[5] =  defaut;t[6] =  defaut;t[7] =  defaut;
                            // initialisation
		        break;
		     case 9 :    
		        iapointe = new Reel9Pointe();
		        t =  (*(((Reel9Pointe*)iapointe)->ipointe)).donnees;
                             t[0] =  defaut; t[1] =  defaut; t[2] =  defaut; t[3] =  defaut;
                             t[4] =  defaut;t[5] =  defaut;t[6] =  defaut;t[7] =  defaut;t[8] =  defaut;
                             // initialisation
		        break;
	/*	     case 10 :    
		        iapointe = new Reel10Pointe();
		        t =  (*(((Reel10Pointe*)iapointe)->ipointe))->donnees;
                             t[0] =  defaut; t[1] =  defaut; t[2] =  defaut; t[3] =  defaut;
                             t[4] =  defaut;t[5] =  defaut;t[6] =  defaut;t[7] =  defaut;t[8] =  defaut;
                             t[9] =  defaut;// initialisation
		        break;
		     case 11 :    
		        iapointe = new Reel11Pointe();
		        t =  (*(((Reel11Pointe*)iapointe)->ipointe))->donnees;
                             t[0] =  defaut; t[1] =  defaut; t[2] =  defaut; t[3] =  defaut;
                             t[4] =  defaut;t[5] =  defaut;t[6] =  defaut;t[7] =  defaut;t[8] =  defaut;
                             t[9] =  defaut;t[10] =  defaut;// initialisation
		        break;
		     case 12 :    
		        iapointe = new Reel12Pointe();
		        t =  (*(((Reel12Pointe*)iapointe)->ipointe))->donnees;
                             t[0] =  defaut; t[1] =  defaut; t[2] =  defaut; t[3] =  defaut;
                             t[4] =  defaut;t[5] =  defaut;t[6] =  defaut;t[7] =  defaut;t[8] =  defaut;
                             t[9] =  defaut;t[10] =  defaut;t[11] =  defaut;// initialisation
		        break;
		     case 13 :    
		        iapointe = new Reel13Pointe();
		        t =  (*(((Reel13Pointe*)iapointe)->ipointe))->donnees;
                             t[0] =  defaut; t[1] =  defaut; t[2] =  defaut; t[3] =  defaut;
                             t[4] =  defaut;t[5] =  defaut;t[6] =  defaut;t[7] =  defaut;t[8] =  defaut;
                             t[9] =  defaut;t[10] =  defaut;t[11] =  defaut;t[12] =  defaut;
                             // initialisation
		        break;
		     case 14 :    
		        iapointe = new Reel14Pointe();
		        t =  (*(((Reel14Pointe*)iapointe)->ipointe))->donnees;
                             t[0] =  defaut; t[1] =  defaut; t[2] =  defaut; t[3] =  defaut;
                             t[4] =  defaut;t[5] =  defaut;t[6] =  defaut;t[7] =  defaut;t[8] =  defaut;
                             t[9] =  defaut;t[10] =  defaut;t[11] =  defaut;t[12] =  defaut;t[13] =  defaut;
                             // initialisation
		        break;
		     case 15 :    
		        iapointe = new Reel15Pointe();
		        t =  (*(((Reel15Pointe*)iapointe)->ipointe))->donnees;
                             t[0] =  defaut; t[1] =  defaut; t[2] =  defaut; t[3] =  defaut;
                             t[4] =  defaut;t[5] =  defaut;t[6] =  defaut;t[7] =  defaut;t[8] =  defaut;
                             t[9] =  defaut;t[10] =  defaut;t[11] =  defaut;t[12] =  defaut;t[13] =  defaut;
                             t[14] =  defaut;// initialisation
		        break;
		     case 16 :    
		        iapointe = new Reel16Pointe();
		        t =  (*(((Reel16Pointe*)iapointe)->ipointe))->donnees;
                             t[0] =  defaut; t[1] =  defaut; t[2] =  defaut; t[3] =  defaut;
                             t[4] =  defaut;t[5] =  defaut;t[6] =  defaut;t[7] =  defaut;t[8] =  defaut;
                             t[9] =  defaut;t[10] =  defaut;t[11] =  defaut;t[12] =  defaut;t[13] =  defaut;
                             t[14] =  defaut;t[15] =  defaut;// initialisation
		        break;
		     case 17 :    
		        iapointe = new Reel17Pointe();
		        t =  (*(((Reel17Pointe*)iapointe)->ipointe))->donnees;
                             t[0] =  defaut; t[1] =  defaut; t[2] =  defaut; t[3] =  defaut;
                             t[4] =  defaut;t[5] =  defaut;t[6] =  defaut;t[7] =  defaut;t[8] =  defaut;
                             t[9] =  defaut;t[10] =  defaut;t[11] =  defaut;t[12] =  defaut;t[13] =  defaut;
                             t[14] =  defaut;t[15] =  defaut;t[16] =  defaut;// initialisation
		        break;
		     case 18 :    
		        iapointe = new Reel18Pointe();
		        t =  (*(((Reel18Pointe*)iapointe)->ipointe))->donnees;
                             t[0] =  defaut; t[1] =  defaut; t[2] =  defaut; t[3] =  defaut;
                             t[4] =  defaut;t[5] =  defaut;t[6] =  defaut;t[7] =  defaut;t[8] =  defaut;
                             t[9] =  defaut;t[10] =  defaut;t[11] =  defaut;t[12] =  defaut;t[13] =  defaut;
                             t[14] =  defaut;t[15] =  defaut;t[16] =  defaut;t[17] =  defaut;
                             // initialisation
		        break;
		     case 19 :    
		        iapointe = new Reel19Pointe();
		        t =  (*(((Reel19Pointe*)iapointe)->ipointe))->donnees;
                             t[0] =  defaut; t[1] =  defaut; t[2] =  defaut; t[3] =  defaut;
                             t[4] =  defaut;t[5] =  defaut;t[6] =  defaut;t[7] =  defaut;t[8] =  defaut;
                             t[9] =  defaut;t[10] =  defaut;t[11] =  defaut;t[12] =  defaut;t[13] =  defaut;
                             t[14] =  defaut;t[15] =  defaut;t[16] =  defaut;t[17] =  defaut;t[18] =  defaut;
                              // initialisation
		        break;
		     case 20 :    
		        iapointe = new Reel20Pointe();
		        t =  (*(((Reel20Pointe*)iapointe)->ipointe))->donnees;
                             t[0] =  defaut; t[1] =  defaut; t[2] =  defaut; t[3] =  defaut;
                             t[4] =  defaut;t[5] =  defaut;t[6] =  defaut;t[7] =  defaut;t[8] =  defaut;
                             t[9] =  defaut;t[10] =  defaut;t[11] =  defaut;t[12] =  defaut;t[13] =  defaut;
                             t[14] =  defaut;t[15] =  defaut;t[16] =  defaut;t[17] =  defaut;t[18] =  defaut;
                             t[19] =  defaut;  // initialisation
		        break;  */
		      default :
		         // allocation classique
		         t=new double [taille]; // allocation de la place memoire
		         double* ptr=t;
		         for (int i=0;i<taille;i++)
		         // initialisation des composantes a l'aide de l'attribut statique defaut
			(*ptr++)=defaut;
	              }
	          }   
	// else       	
	// autres cas
	  // cas ou la taille selectionnee est nulle : initialisation identique a 
	  // l'appel du constructeur par defaut, comme il y a appel préalable 
	  //  au constructeur par défaut
	  // de la classe mére, on ne fait rien, le travail est fait dans la classe mère
};
		
// Constructeur fonction de la taille du tableau et d'une 
// valeur d'initialisation pour les composantes
Tableau_double::Tableau_double (int nb,double val)
    {};
		
// Constructeur fonction d'un tableau de double
Tableau_double::Tableau_double (int nb,double* tab)
    {};
		
// Constructeur de copie
Tableau_double::Tableau_double (const Tableau_double & tab)
    {};

// DESTRUCTEUR :
		
Tableau_double::~Tableau_double ()
{	          switch (taille)
	            {  case 1 :   
		       delete  ((Reel1Pointe*)iapointe);
		        break;
		     case 2 :   
//		       Reel2Pointe* toto = (Reel2Pointe*)iapointe;
		   //    delete 
		       delete  ((Reel2Pointe*)iapointe);
                          //   listdouble2.erase(*(((Reel2Pointe*)iapointe)->ipointe)) ; // suppression de l'élément de la liste
		        break;
		     case 3 :   
		       delete  ((Reel3Pointe*)iapointe);
		        break;
		     case 4 :   
		       Reel4Pointe* toto = (Reel4Pointe*)iapointe;
                            delete toto;
		     //  delete  ((Reel4Pointe*)iapointe);
		        break;
		     case 5 :   
		       delete  ((Reel5Pointe*)iapointe);
		        break;
		     case 6 :   
		       delete  ((Reel6Pointe*)iapointe);
		        break;
		     case 7 :   
		       delete  ((Reel7Pointe*)iapointe);
		        break;
		     case 8 :   
		       delete  ((Reel8Pointe*)iapointe);
		        break;
		     case 9 :   
		       delete  ((Reel9Pointe*)iapointe);
		        break;
		/*     case 3 :   
                             listdouble3.erase(*(((Reel3Pointe*)iapointe)->ipointe)) ; // suppression de l'élément de la liste
		        break;
		     case 3 :   
                             listdouble3.erase(*(((Reel3Pointe*)iapointe)->ipointe)) ; // suppression de l'élément de la liste
		        break;
		     case 3 :   
                             listdouble3.erase(*(((Reel3Pointe*)iapointe)->ipointe)) ; // suppression de l'élément de la liste
		        break;
		     case 3 :   
                             listdouble3.erase(*(((Reel3Pointe*)iapointe)->ipointe)) ; // suppression de l'élément de la liste
		        break;
		     case 3 :   
                             listdouble3.erase(*(((Reel3Pointe*)iapointe)->ipointe)) ; // suppression de l'élément de la liste
		        break;
		     case 3 :   
                             listdouble3.erase(*(((Reel3Pointe*)iapointe)->ipointe)) ; // suppression de l'élément de la liste
		        break;
		     case 3 :   
                             listdouble3.erase(*(((Reel3Pointe*)iapointe)->ipointe)) ; // suppression de l'élément de la liste
		        break;
		     case 3 :   
                             listdouble3.erase(*(((Reel3Pointe*)iapointe)->ipointe)) ; // suppression de l'élément de la liste
		        break;
		     case 3 :   
                             listdouble3.erase(*(((Reel3Pointe*)iapointe)->ipointe)) ; // suppression de l'élément de la liste
		        break;
		     case 3 :   
                             listdouble3.erase(*(((Reel3Pointe*)iapointe)->ipointe)) ; // suppression de l'élément de la liste
		        break;
		     case 3 :   
                             listdouble3.erase(*(((Reel3Pointe*)iapointe)->ipointe)) ; // suppression de l'élément de la liste
		        break;
		   /*  default :
		         // desallocation classique
		         delete 
		         t=new double [taille]; // allocation de la place memoire
		         double* ptr=t;
		         for (int i=0;i<taille;i++)
		         // initialisation des composantes a l'aide de l'attribut statique defaut
			(*ptr++)=defaut; */
	              }
};

 
		
// METHODES :
		
		
// Surcharge de l'operateur d'affectation =
Tableau_double& Tableau_double::operator= (const Tableau_double& tab)
   {};
				
// Change la taille du tableau (la nouvelle taille est n)
void Tableau_double::Change_taille (int n)
   {};
		
// Enleve la ieme composante du tableau
void Tableau_double::Enleve (int i)
   {};
		
// Enleve toutes les composantes du tableau dont la valeur est val
void Tableau_double::Enleve_val (double val)
   {};
		
// Permet de desallouer l'ensemble des elements du tableau
void Tableau_double::Libere ()
   {};
	
		

