4 * Auteur : Ivan DUTKA-MALEN - EDF R&D
5 * Date : Septembre 2003
14 //#include "MEDMEM_STRING.hxx"
15 #include "Batch_GenericType.hxx"
16 #include "Batch_IntType.hxx"
17 #include "Batch_BoolType.hxx"
18 #include "Batch_CharType.hxx"
19 #include "Batch_LongType.hxx"
20 #include "Batch_StringType.hxx"
21 #include "Batch_Versatile.hxx"
22 #include "Batch_TypeMismatchException.hxx"
23 #include "Batch_ListIsFullException.hxx"
28 // Constructeur par recopie
29 Versatile::Versatile(const Versatile & V) : _discriminator(V._discriminator), _maxsize(V._maxsize), _name(V._name) // , _str_value(0)
31 Versatile::const_iterator it;
33 // On prend un a un les elements de l'objet passe en argument qu'on duplique
34 for(it=V.begin(); it!=V.end(); it++)
35 push_back( (*it)->clone() ); // Attention, la methode clone fait un new implicite
39 Versatile::~Versatile()
44 // Operateur d'affectation entre objets
45 Versatile & Versatile::operator = (const Versatile & Vrhs) throw(TypeMismatchException)
47 // ATTENTION : le forçage de type leve une exception TypeMismatchException entre cas de conflit
48 setType(Vrhs._discriminator);
49 setMaxSize(Vrhs._maxsize);
52 // On efface les donnees precedentes
55 // On copie les donnees de Vrhs
56 Versatile::const_iterator it;
58 for(it=Vrhs.begin(); it!=Vrhs.end(); it++)
59 push_back( (*it)->clone() ); // Attention, la methode clone fait un new implicite
64 // Operateur d'affectation a partir d'un long
65 Versatile & Versatile::operator = (const long l) throw(TypeMismatchException)
67 // ATTENTION : le forçage de type leve une exception TypeMismatchException entre cas de conflit
70 // On efface les donnees precedentes
73 // On ajoute un element interne de type long a l'objet
74 LongType * pL = new LongType(l);
80 // Operateur d'affectation a partir d'une string
81 Versatile & Versatile::operator = (const string & ch) throw(TypeMismatchException)
83 // ATTENTION : le forçage de type leve une exception TypeMismatchException entre cas de conflit
86 // On efface les donnees precedentes
89 // On ajoute un element interne de type string a l'objet
90 StringType * pS = new StringType(ch);
97 // Operateur de concatenation a partir d'une string
98 Versatile & Versatile::operator +=(const string & ch) throw(TypeMismatchException,ListIsFullException)
100 // ATTENTION : le forçage de type leve une exception TypeMismatchException entre cas de conflit
103 // Si la taille maximale est atteinte, on leve une exception ListIsFullException
104 if (_maxsize == 0) push_back(new StringType(ch));
105 else if ((_maxsize > 0) && (size() < _maxsize)) push_back(new StringType(ch));
107 //MEDMEM::STRING msg;
109 msg << "Taille maximum : " << _maxsize;
110 throw(ListIsFullException(msg.str()));
115 // Operateur de concatenation a partir d'une string
116 Versatile & Versatile::operator , (const string & ch) throw(TypeMismatchException,ListIsFullException)
122 // Operateur d'affectation a partir d'un Couple
123 Versatile & Versatile::operator = (const Couple & cp) throw(TypeMismatchException)
125 // ATTENTION : le forçage de type leve une exception TypeMismatchException entre cas de conflit
128 // On efface les donnees precedentes
131 // On ajoute un element interne de type Couple a l'objet
132 CoupleType * pC = new CoupleType(cp);
139 // Operateur de concatenation a partir d'un Couple
140 Versatile & Versatile::operator +=(const Couple & cp) throw(TypeMismatchException,ListIsFullException)
142 // ATTENTION : le forçage de type leve une exception TypeMismatchException entre cas de conflit
145 // Si la taille maximale est atteinte, on leve une exception ListIsFullException
146 if (_maxsize == 0) push_back(new CoupleType(cp));
147 else if ((_maxsize > 0) && (size() < _maxsize)) push_back(new CoupleType(cp));
149 //MEDMEM::STRING msg;
151 msg << "Taille maximum : " << _maxsize;
152 throw(ListIsFullException(msg.str()));
157 // Operateur de concatenation a partir d'un Couple
158 Versatile & Versatile::operator , (const Couple & cp) throw(TypeMismatchException,ListIsFullException)
164 ostream & operator << (ostream & os, const Versatile & V)
166 Versatile::const_iterator it;
169 for(it=V.begin(); it!=V.end(); it++, sep=" ") {
170 string s = (*it)->affiche();
176 // Positionnement du type de l'element interne
177 void Versatile::setType(DiscriminatorType t) throw(TypeMismatchException)
179 // Si le type est deja defini et ne correspond pas au type en argument
180 // une exception TypeMismatchException est levee
181 if ( (_discriminator == UNDEFINED) || (_discriminator == t) )
184 //MEDMEM::STRING sst;
186 sst << "Trying to change type of Versatile object \""
188 throw(TypeMismatchException(sst.str()));
192 // Positionnement du nombre d'elements internes
193 void Versatile::setMaxSize(int i)
197 // Si la nouvelle taille est inferieure au nombre d'elements deja
198 // presents, les elements en surplus sont effaces (troncature)
199 if (size() > _maxsize)
201 int reste = size() - _maxsize;
202 Versatile::iterator it;
203 for(it=end(); (it!=begin()) && reste; it--, reste--)
212 // Conversion de type vers un long
213 Versatile::operator long() const throw(TypeMismatchException)
215 // Si le type ne correspond pas ou si la liste contient plus d'un element,
216 // la conversion est impossible et une exception TypeMismatchException
218 if ( (_maxsize != 1) || (_discriminator != LONG) || (size() == 0) ) {
219 //MEDMEM::STRING sst;
221 sst << "Cannot cast Versatile object \""
222 << _name << "\" to long";
223 throw(TypeMismatchException(sst.str()));
225 return *( static_cast<LongType *>(this->front()) );
228 // Conversion de type vers un Couple
229 Versatile::operator Couple() const throw(TypeMismatchException)
231 // Si le type ne correspond pas ou si la liste contient plus d'un element,
232 // la conversion est impossible et une exception TypeMismatchException
234 if ( (_maxsize != 1) || (_discriminator != COUPLE) || (size() == 0) ) {
235 //MEDMEM::STRING sst;
237 sst << "Cannot cast Versatile object \""
238 << _name << "\" to Couple";
239 throw(TypeMismatchException(sst.str()));
241 return *( static_cast<CoupleType *>(this->front()) );
244 // Conversion de type vers une string
245 string Versatile::str() const throw(TypeMismatchException)
247 // Si le type ne correspond pas, la conversion est impossible et
248 // une exception TypeMismatchException est levee
249 if ( (_discriminator != STRING) || (size() == 0) ) {
250 //MEDMEM::STRING sst;
252 sst << "Cannot cast Versatile object \""
253 << _name << "\" to string";
254 throw(TypeMismatchException(sst.str()));
257 // La chaine renvoyee est la concatenation des chaines internes
259 Versatile::const_iterator it;
260 const char * sep = "";
261 for(it=begin(); it!=end(); it++, s+=sep, sep=" ")
262 s += *( static_cast<StringType *>(*it));
267 // Conversion de type vers une string
268 Versatile::operator string () const throw(TypeMismatchException)
273 // Efface tous les elements internes de l'objet
274 void Versatile::eraseAll()
284 // Recuperation du type de l'element interne
285 DiscriminatorType Versatile::getType() const
287 return _discriminator;
290 // Recuperation du nom de l'objet
291 string Versatile::getName() const
296 // Positionnement du nom de l'objet
297 void Versatile::setName(const string & name)