1 // File: Units_Token.cxx
2 // Created: Wed Jun 24 12:49:08 1992
3 // Author: Gilles DEBARBOUILLE
5 // Updated: Gerard GRAS le 090597
6 // reason is PRO6934 -> plantage sur HP 10.2
7 // changes are : Replace the field theword,themean from HAsciiString
9 // because the compiler try to destroies the handle of HAsciiString to early
10 // due to inline use probably.
11 // See also Units_Token.lxx
13 #define PRO8727 //GG_180697
14 // Mauvaise construction d'un token par copie
15 // plantatoire sur HP.
17 #include <Units_Token.ixx>
18 #include <TCollection_AsciiString.hxx>
19 #include <Units_Operators.hxx>
23 //=======================================================================
24 //function : Units_Token
26 //=======================================================================
28 Units_Token::Units_Token()
33 thedimensions=new Units_Dimensions(0.,0.,0.,0.,0.,0.,0.,0.,0.);
35 cout << " CREATES Token " << endl;
40 //=======================================================================
41 //function : Units_Token
43 //=======================================================================
45 Units_Token::Units_Token(const Standard_CString aword)
50 thedimensions=new Units_Dimensions(0.,0.,0.,0.,0.,0.,0.,0.,0.);
52 cout << " CREATES Token " << endl;
57 //=======================================================================
58 //function : Units_Token
60 //=======================================================================
62 Units_Token::Units_Token(const Standard_CString aword,
63 const Standard_CString amean)
68 thedimensions=new Units_Dimensions(0.,0.,0.,0.,0.,0.,0.,0.,0.);
70 cout << " CREATES Token " << endl;
75 //=======================================================================
76 //function : Units_Token
78 //=======================================================================
80 Units_Token::Units_Token(const Standard_CString aword,
81 const Standard_CString amean,
82 const Standard_Real avalue)
87 thedimensions=new Units_Dimensions(0.,0.,0.,0.,0.,0.,0.,0.,0.);
89 cout << " CREATES Token " << endl;
94 //=======================================================================
95 //function : Units_Token
97 //=======================================================================
99 Units_Token::Units_Token(const Standard_CString aword,
100 const Standard_CString amean,
101 const Standard_Real avalue,
102 const Handle(Units_Dimensions)& adimensions)
107 if(adimensions.IsNull())
108 thedimensions = new Units_Dimensions(0.,0.,0.,0.,0.,0.,0.,0.,0.);
110 thedimensions = new Units_Dimensions(adimensions->Mass(),
111 adimensions->Length(),
113 adimensions->ElectricCurrent(),
114 adimensions->ThermodynamicTemperature(),
115 adimensions->AmountOfSubstance(),
116 adimensions->LuminousIntensity(),
117 adimensions->PlaneAngle(),
118 adimensions->SolidAngle());
120 cout << " CREATES Token " << endl;
125 //=======================================================================
128 //=======================================================================
130 Handle(Units_Token) Units_Token::Creates() const
133 TCollection_AsciiString word = Word();
134 TCollection_AsciiString mean = Mean();
135 return new Units_Token(word.ToCString(),mean.ToCString(),Value(),Dimensions());
137 return new Units_Token(*this);
141 //=======================================================================
144 //=======================================================================
146 Standard_Integer Units_Token::Length() const
148 return theword.Length();
151 //=======================================================================
152 //function : Dimensions
154 //=======================================================================
156 void Units_Token::Dimensions(const Handle(Units_Dimensions)& adimensions)
158 if(adimensions.IsNull())
159 thedimensions = new Units_Dimensions(0.,0.,0.,0.,0.,0.,0.,0.,0.);
161 thedimensions = new Units_Dimensions(adimensions->Mass(),
162 adimensions->Length(),
164 adimensions->ElectricCurrent(),
165 adimensions->ThermodynamicTemperature(),
166 adimensions->AmountOfSubstance(),
167 adimensions->LuminousIntensity(),
168 adimensions->PlaneAngle(),
169 adimensions->SolidAngle());
172 //=======================================================================
173 //function : Units_Token
175 //=======================================================================
177 Units_Token::Units_Token(const Handle(Units_Token)& atoken)
179 theword = atoken->Word();
180 themean = atoken->Mean();
181 thevalue = atoken->Value();
182 thedimensions = atoken->Dimensions();
185 //=======================================================================
188 //=======================================================================
190 void Units_Token::Update(const Standard_CString amean)
192 TCollection_AsciiString string = Mean();
193 if(string.Search(amean) != -1)
194 cout<<Word()<<" encountered twice with the same signification : "<<amean<<endl;
195 string = string + amean;
199 //=======================================================================
202 //=======================================================================
204 Handle(Units_Token) Units_Token::Add (const Standard_Integer) const
206 // Standard_CString s=new char[thelength+1];
207 // strcpy(s,theword);
208 // s[thelength-1]=s[thelength-1]+int(i);
209 return new Units_Token();
212 //=======================================================================
215 //=======================================================================
217 Handle(Units_Token) Units_Token::Add (const Handle(Units_Token)& atoken) const
219 TCollection_AsciiString word = Word();
220 if(thedimensions->IsEqual(atoken->Dimensions()))
221 return new Units_Token(word.ToCString(), " ", thevalue+atoken->Value(), thedimensions);
223 return new Units_Token(" ");
226 //=======================================================================
227 //function : Subtract
229 //=======================================================================
231 Handle(Units_Token) Units_Token::Subtract (const Handle(Units_Token)& atoken) const
233 TCollection_AsciiString word = Word();
234 if(thedimensions->IsEqual(atoken->Dimensions()))
235 return new Units_Token(word.ToCString(), " ", thevalue-atoken->Value(), thedimensions);
237 return new Units_Token(" ");
240 //=======================================================================
241 //function : Multiply
243 //=======================================================================
245 Handle(Units_Token) Units_Token::Multiply (const Handle(Units_Token)& atoken) const
247 TCollection_AsciiString string = Word();
248 string.Insert(1,'(');
249 string = string + ")*(";
250 string = string + atoken->Word();
251 string = string + ")";
252 return new Units_Token
253 (string.ToCString()," ", thevalue*atoken->Value(), thedimensions * (atoken->Dimensions()));
256 //=======================================================================
257 //function : Multiplied
259 //=======================================================================
261 Standard_Real Units_Token::Multiplied (const Standard_Real avalue) const
263 return avalue * thevalue;
266 //=======================================================================
269 //=======================================================================
271 Handle(Units_Token) Units_Token::Divide (const Handle(Units_Token)& atoken)
274 if(fabs(atoken->Value())<1.e-40) {
276 cout<<"Warning: division on token with value=0 => return initial token."<<endl;
280 TCollection_AsciiString string = Word();
281 string.Insert(1,'(');
282 string = string + ")/(";
283 string = string + atoken->Word();
284 string = string + ")";
285 return new Units_Token
286 (string.ToCString()," ", thevalue/atoken->Value(), thedimensions / (atoken->Dimensions()));
289 //=======================================================================
292 //=======================================================================
294 Standard_Real Units_Token::Divided (const Standard_Real avalue) const
296 return avalue / thevalue;
299 //=======================================================================
302 //=======================================================================
304 Handle(Units_Token) Units_Token::Power(const Handle(Units_Token)& atoken) const
306 TCollection_AsciiString string = Word();
307 string.Insert(1,'(');
308 string = string + ")**(";
309 string = string + atoken->Word();
310 string = string + ")";
311 return new Units_Token
312 (string.ToCString()," ",pow(thevalue,atoken->Value()),pow(thedimensions,atoken->Value()));
315 //=======================================================================
318 //=======================================================================
320 Handle(Units_Token) Units_Token::Power(const Standard_Real anexponent) const
322 TCollection_AsciiString exponent(anexponent);
323 TCollection_AsciiString string = Word();
324 string.Insert(1,'(');
325 string = string + ")**(";
326 string = string + exponent;
327 string = string + ")";
328 return new Units_Token
329 (string.ToCString()," ",pow(thevalue,anexponent),pow(thedimensions,anexponent));
332 //=======================================================================
335 //=======================================================================
337 Standard_Boolean Units_Token::IsEqual (const Standard_CString astring) const
339 TCollection_AsciiString string = Word();
341 Standard_Integer length = string.Length();
343 unsigned int length = string.Length();
345 if(strlen(astring) == length)
346 return (strncmp(string.ToCString(),astring,unsigned(length)) == 0)
347 ? Standard_True : Standard_False;
349 return Standard_False;
352 //=======================================================================
355 //=======================================================================
357 Standard_Boolean Units_Token::IsEqual (const Handle(Units_Token)& atoken) const
359 TCollection_AsciiString string1 = Word();
360 TCollection_AsciiString string2 = atoken->Word();
361 Standard_Integer length = string1.Length();
362 if(length == atoken->Length())
363 return (strcmp(string1.ToCString(),string2.ToCString()) == 0) ? Standard_True : Standard_False;
365 return Standard_False;
368 //=======================================================================
371 //=======================================================================
373 void Units_Token::Dump(const Standard_Integer ashift,
374 const Standard_Integer alevel) const
377 TCollection_AsciiString word = Word();
378 TCollection_AsciiString mean = Mean();
380 for(i=0; i<ashift; i++)cout<<" ";
381 cout << "Units_Token::Dump of " << hex << (long ) this << dec << endl;
382 for(i=0; i<ashift; i++)cout<<" ";
383 cout<<word.ToCString()<<endl;
384 for(i=0; i<ashift; i++)cout<<" ";
385 cout<<" value : "<<thevalue<<endl;
386 for(i=0; i<ashift; i++)cout<<" ";
387 cout<<" mean : "<<mean.ToCString()<<endl;
388 if(alevel)thedimensions->Dump(ashift);
391 //=======================================================================
392 //function : operator +
394 //=======================================================================
396 Handle(Units_Token) operator +(const Handle(Units_Token)& atoken,const Standard_Integer aninteger)
398 return atoken->Add(aninteger);
401 //=======================================================================
402 //function : operator +
404 //=======================================================================
406 Handle(Units_Token) operator +(const Handle(Units_Token)& atoken1,const Handle(Units_Token)& atoken2)
408 return atoken1->Add(atoken2);
411 //=======================================================================
412 //function : operator -
414 //=======================================================================
416 Handle(Units_Token) operator -(const Handle(Units_Token)& atoken1,const Handle(Units_Token)& atoken2)
418 return atoken1->Subtract(atoken2);
421 //=======================================================================
422 //function : operator *
424 //=======================================================================
426 Handle(Units_Token) operator *(const Handle(Units_Token)& atoken1,const Handle(Units_Token)& atoken2)
428 return atoken1->Multiply(atoken2);
431 //=======================================================================
432 //function : operator /
434 //=======================================================================
436 Handle(Units_Token) operator /(const Handle(Units_Token)& atoken1,const Handle(Units_Token)& atoken2)
438 return atoken1->Divide(atoken2);
441 //=======================================================================
444 //=======================================================================
446 Handle(Units_Token) pow(const Handle(Units_Token)& atoken1, const Handle(Units_Token)& atoken2)
448 return atoken1->Power(atoken2);
451 //=======================================================================
454 //=======================================================================
456 Handle(Units_Token) pow(const Handle(Units_Token)& atoken,const Standard_Real areal)
458 return atoken->Power(areal);
461 //=======================================================================
462 //function : operator ==
464 //=======================================================================
466 Standard_Boolean operator ==(const Handle(Units_Token)& atoken,const Standard_CString astring)
468 return atoken->IsEqual(astring);
471 //=======================================================================
472 //function : operator ==
474 //=======================================================================
476 //Standard_Boolean operator ==(const Handle(Units_Token)& atoken1,const Handle(Units_Token)& atoken2)
478 // return atoken1->IsEqual(atoken2);
481 //=======================================================================
482 //function : operator !=
484 //=======================================================================
486 Standard_Boolean operator !=(const Handle(Units_Token)& atoken,const Standard_CString astring)
488 return atoken->IsNotEqual(astring);
491 //=======================================================================
492 //function : operator !=
494 //=======================================================================
496 //Standard_Boolean operator !=(const Handle(Units_Token)& atoken1,const Handle(Units_Token)& atoken2)
498 // return atoken1->IsNotEqual(atoken2);
501 //=======================================================================
502 //function : operator <=
504 //=======================================================================
506 Standard_Boolean operator <=(const Handle(Units_Token)& atoken,const Standard_CString astring)
508 return atoken->IsLessOrEqual(astring);
511 //=======================================================================
512 //function : operator >
514 //=======================================================================
516 Standard_Boolean operator >(const Handle(Units_Token)& atoken,const Standard_CString astring)
518 return atoken->IsGreater(astring);
521 //=======================================================================
522 //function : operator >
524 //=======================================================================
526 Standard_Boolean operator >(const Handle(Units_Token)& atoken1,const Handle(Units_Token)& atoken2)
528 return atoken1->IsGreater(atoken2);
531 //=======================================================================
532 //function : operator >=
534 //=======================================================================
536 Standard_Boolean operator >=(const Handle(Units_Token)& atoken1,const Handle(Units_Token)& atoken2)
538 return atoken1->IsGreaterOrEqual(atoken2);
541 void Units_Token::Destroy () {
544 cout << " DESTROIES Token" << endl;