4 * Auteur : Ivan DUTKA-MALEN - EDF R&D
5 * Date : Septembre 2003
15 //#include "MEDMEM_STRING.hxx"
16 #include "Batch_GenericType.hxx"
17 #include "Batch_IntType.hxx"
18 #include "Batch_BoolType.hxx"
19 #include "Batch_CharType.hxx"
20 #include "Batch_LongType.hxx"
21 #include "Batch_StringType.hxx"
22 #include "Batch_Versatile.hxx"
23 #include "Batch_TypeMismatchException.hxx"
24 #include "Batch_ListIsFullException.hxx"
29 // Constructeur par recopie
30 Versatile::Versatile(const Versatile & V) : _discriminator(V._discriminator), _maxsize(V._maxsize), _name(V._name) // , _str_value(0)
32 Versatile::const_iterator it;
34 // On prend un a un les elements de l'objet passe en argument qu'on duplique
35 for(it=V.begin(); it!=V.end(); it++)
36 push_back( (*it)->clone() ); // Attention, la methode clone fait un new implicite
40 Versatile::~Versatile()
45 // Operateur d'affectation entre objets
46 Versatile & Versatile::operator = (const Versatile & Vrhs) throw(TypeMismatchException)
48 // ATTENTION : le forçage de type leve une exception TypeMismatchException entre cas de conflit
49 setType(Vrhs._discriminator);
50 setMaxSize(Vrhs._maxsize);
53 // On efface les donnees precedentes
56 // On copie les donnees de Vrhs
57 Versatile::const_iterator it;
59 for(it=Vrhs.begin(); it!=Vrhs.end(); it++)
60 push_back( (*it)->clone() ); // Attention, la methode clone fait un new implicite
65 // Operateur d'affectation a partir d'un long
66 Versatile & Versatile::operator = (const long l) throw(TypeMismatchException)
68 // ATTENTION : le forçage de type leve une exception TypeMismatchException entre cas de conflit
71 // On efface les donnees precedentes
74 // On ajoute un element interne de type long a l'objet
75 LongType * pL = new LongType(l);
81 // Operateur d'affectation a partir d'une string
82 Versatile & Versatile::operator = (const string & ch) throw(TypeMismatchException)
84 // ATTENTION : le forçage de type leve une exception TypeMismatchException entre cas de conflit
87 // On efface les donnees precedentes
90 // On ajoute un element interne de type string a l'objet
91 StringType * pS = new StringType(ch);
98 // Operateur de concatenation a partir d'une string
99 Versatile & Versatile::operator +=(const string & ch) throw(TypeMismatchException,ListIsFullException)
101 // ATTENTION : le forçage de type leve une exception TypeMismatchException entre cas de conflit
104 // Si la taille maximale est atteinte, on leve une exception ListIsFullException
105 if (_maxsize == 0) push_back(new StringType(ch));
106 else if ((_maxsize > 0) && (size() < _maxsize)) push_back(new StringType(ch));
108 //MEDMEM::STRING msg;
110 msg << "Taille maximum : " << _maxsize;
111 throw(ListIsFullException(msg.str()));
116 // Operateur de concatenation a partir d'une string
117 Versatile & Versatile::operator , (const string & ch) throw(TypeMismatchException,ListIsFullException)
123 // Operateur d'affectation a partir d'un Couple
124 Versatile & Versatile::operator = (const Couple & cp) throw(TypeMismatchException)
126 // ATTENTION : le forçage de type leve une exception TypeMismatchException entre cas de conflit
129 // On efface les donnees precedentes
132 // On ajoute un element interne de type Couple a l'objet
133 CoupleType * pC = new CoupleType(cp);
140 // Operateur de concatenation a partir d'un Couple
141 Versatile & Versatile::operator +=(const Couple & cp) throw(TypeMismatchException,ListIsFullException)
143 // ATTENTION : le forçage de type leve une exception TypeMismatchException entre cas de conflit
146 // Si la taille maximale est atteinte, on leve une exception ListIsFullException
147 if (_maxsize == 0) push_back(new CoupleType(cp));
148 else if ((_maxsize > 0) && (size() < _maxsize)) push_back(new CoupleType(cp));
150 //MEDMEM::STRING msg;
152 msg << "Taille maximum : " << _maxsize;
153 throw(ListIsFullException(msg.str()));
158 // Operateur de concatenation a partir d'un Couple
159 Versatile & Versatile::operator , (const Couple & cp) throw(TypeMismatchException,ListIsFullException)
165 ostream & operator << (ostream & os, const Versatile & V)
167 Versatile::const_iterator it;
170 for(it=V.begin(); it!=V.end(); it++, sep=" ") {
171 string s = (*it)->affiche();
177 // Positionnement du type de l'element interne
178 void Versatile::setType(DiscriminatorType t) throw(TypeMismatchException)
180 // Si le type est deja defini et ne correspond pas au type en argument
181 // une exception TypeMismatchException est levee
182 if ( (_discriminator == UNDEFINED) || (_discriminator == t) )
185 //MEDMEM::STRING sst;
187 sst << "Trying to change type of Versatile object \""
189 throw(TypeMismatchException(sst.str()));
193 // Positionnement du nombre d'elements internes
194 void Versatile::setMaxSize(int i)
198 // Si la nouvelle taille est inferieure au nombre d'elements deja
199 // presents, les elements en surplus sont effaces (troncature)
200 if (size() > _maxsize)
202 int reste = size() - _maxsize;
203 Versatile::iterator it;
204 for(it=end(); (it!=begin()) && reste; it--, reste--)
213 // Conversion de type vers un long
214 Versatile::operator long() const throw(TypeMismatchException)
216 // Si le type ne correspond pas ou si la liste contient plus d'un element,
217 // la conversion est impossible et une exception TypeMismatchException
219 if ( (_maxsize != 1) || (_discriminator != LONG) || (size() == 0) ) {
220 //MEDMEM::STRING sst;
222 sst << "Cannot cast Versatile object \""
223 << _name << "\" to long";
224 throw(TypeMismatchException(sst.str()));
226 return *( static_cast<LongType *>(this->front()) );
229 // Conversion de type vers un Couple
230 Versatile::operator Couple() const throw(TypeMismatchException)
232 // Si le type ne correspond pas ou si la liste contient plus d'un element,
233 // la conversion est impossible et une exception TypeMismatchException
235 if ( (_maxsize != 1) || (_discriminator != COUPLE) || (size() == 0) ) {
236 //MEDMEM::STRING sst;
238 sst << "Cannot cast Versatile object \""
239 << _name << "\" to Couple";
240 throw(TypeMismatchException(sst.str()));
242 return *( static_cast<CoupleType *>(this->front()) );
245 // Conversion de type vers une string
246 string Versatile::str() const throw(TypeMismatchException)
248 // Si le type ne correspond pas, la conversion est impossible et
249 // une exception TypeMismatchException est levee
250 if ( (_discriminator != STRING) || (size() == 0) ) {
251 //MEDMEM::STRING sst;
253 sst << "Cannot cast Versatile object \""
254 << _name << "\" to string";
255 throw(TypeMismatchException(sst.str()));
258 // La chaine renvoyee est la concatenation des chaines internes
260 Versatile::const_iterator it;
261 const char * sep = "";
262 for(it=begin(); it!=end(); it++, s+=sep, sep=" ")
263 s += *( static_cast<StringType *>(*it));
268 // Conversion de type vers une string
269 Versatile::operator string () const throw(TypeMismatchException)
274 // Efface tous les elements internes de l'objet
275 void Versatile::eraseAll()
285 // Recuperation du type de l'element interne
286 DiscriminatorType Versatile::getType() const
288 return _discriminator;
291 // Recuperation du nom de l'objet
292 string Versatile::getName() const
297 // Positionnement du nom de l'objet
298 void Versatile::setName(const string & name)