1 // Created on: 1992-06-24
2 // Created by: Gilles DEBARBOUILLE
3 // Copyright (c) 1992-1999 Matra Datavision
4 // Copyright (c) 1999-2014 OPEN CASCADE SAS
6 // This file is part of Open CASCADE Technology software library.
8 // This library is free software; you can redistribute it and/or modify it under
9 // the terms of the GNU Lesser General Public License version 2.1 as published
10 // by the Free Software Foundation, with special exception defined in the file
11 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
12 // distribution for complete text of the license and disclaimer of any warranty.
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
17 // Updated: Gerard GRAS le 090597
18 // reason is PRO6934 -> plantage sur HP 10.2
19 // changes are : Replace the field theword,themean from HAsciiString
21 // because the compiler try to destroies the handle of HAsciiString to early
22 // due to inline use probably.
23 // See also Units_Token.lxx
25 #define PRO8727 //GG_180697
26 // Mauvaise construction d'un token par copie
27 // plantatoire sur HP.
29 #include <Units_Token.ixx>
30 #include <TCollection_AsciiString.hxx>
31 #include <Units_Operators.hxx>
35 //=======================================================================
36 //function : Units_Token
38 //=======================================================================
40 Units_Token::Units_Token()
45 thedimensions=new Units_Dimensions(0.,0.,0.,0.,0.,0.,0.,0.,0.);
47 cout << " CREATES Token " << endl;
52 //=======================================================================
53 //function : Units_Token
55 //=======================================================================
57 Units_Token::Units_Token(const Standard_CString aword)
62 thedimensions=new Units_Dimensions(0.,0.,0.,0.,0.,0.,0.,0.,0.);
64 cout << " CREATES Token " << endl;
69 //=======================================================================
70 //function : Units_Token
72 //=======================================================================
74 Units_Token::Units_Token(const Standard_CString aword,
75 const Standard_CString amean)
80 thedimensions=new Units_Dimensions(0.,0.,0.,0.,0.,0.,0.,0.,0.);
82 cout << " CREATES Token " << endl;
87 //=======================================================================
88 //function : Units_Token
90 //=======================================================================
92 Units_Token::Units_Token(const Standard_CString aword,
93 const Standard_CString amean,
94 const Standard_Real avalue)
99 thedimensions=new Units_Dimensions(0.,0.,0.,0.,0.,0.,0.,0.,0.);
101 cout << " CREATES Token " << endl;
106 //=======================================================================
107 //function : Units_Token
109 //=======================================================================
111 Units_Token::Units_Token(const Standard_CString aword,
112 const Standard_CString amean,
113 const Standard_Real avalue,
114 const Handle(Units_Dimensions)& adimensions)
119 if(adimensions.IsNull())
120 thedimensions = new Units_Dimensions(0.,0.,0.,0.,0.,0.,0.,0.,0.);
122 thedimensions = new Units_Dimensions(adimensions->Mass(),
123 adimensions->Length(),
125 adimensions->ElectricCurrent(),
126 adimensions->ThermodynamicTemperature(),
127 adimensions->AmountOfSubstance(),
128 adimensions->LuminousIntensity(),
129 adimensions->PlaneAngle(),
130 adimensions->SolidAngle());
132 cout << " CREATES Token " << endl;
137 //=======================================================================
140 //=======================================================================
142 Handle(Units_Token) Units_Token::Creates() const
145 TCollection_AsciiString word = Word();
146 TCollection_AsciiString mean = Mean();
147 return new Units_Token(word.ToCString(),mean.ToCString(),Value(),Dimensions());
149 return new Units_Token(*this);
153 //=======================================================================
156 //=======================================================================
158 Standard_Integer Units_Token::Length() const
160 return theword.Length();
163 //=======================================================================
164 //function : Dimensions
166 //=======================================================================
168 void Units_Token::Dimensions(const Handle(Units_Dimensions)& adimensions)
170 if(adimensions.IsNull())
171 thedimensions = new Units_Dimensions(0.,0.,0.,0.,0.,0.,0.,0.,0.);
173 thedimensions = new Units_Dimensions(adimensions->Mass(),
174 adimensions->Length(),
176 adimensions->ElectricCurrent(),
177 adimensions->ThermodynamicTemperature(),
178 adimensions->AmountOfSubstance(),
179 adimensions->LuminousIntensity(),
180 adimensions->PlaneAngle(),
181 adimensions->SolidAngle());
184 //=======================================================================
185 //function : Units_Token
187 //=======================================================================
189 Units_Token::Units_Token(const Handle(Units_Token)& atoken)
191 theword = atoken->Word();
192 themean = atoken->Mean();
193 thevalue = atoken->Value();
194 thedimensions = atoken->Dimensions();
197 //=======================================================================
200 //=======================================================================
202 void Units_Token::Update(const Standard_CString amean)
204 TCollection_AsciiString string = Mean();
205 if(string.Search(amean) != -1)
206 cout<<Word()<<" encountered twice with the same signification : "<<amean<<endl;
207 string = string + amean;
211 //=======================================================================
214 //=======================================================================
216 Handle(Units_Token) Units_Token::Add (const Standard_Integer) const
218 // Standard_CString s=new char[thelength+1];
219 // strcpy(s,theword);
220 // s[thelength-1]=s[thelength-1]+int(i);
221 return new Units_Token();
224 //=======================================================================
227 //=======================================================================
229 Handle(Units_Token) Units_Token::Add (const Handle(Units_Token)& atoken) const
231 TCollection_AsciiString word = Word();
232 if(thedimensions->IsEqual(atoken->Dimensions()))
233 return new Units_Token(word.ToCString(), " ", thevalue+atoken->Value(), thedimensions);
235 return new Units_Token(" ");
238 //=======================================================================
239 //function : Subtract
241 //=======================================================================
243 Handle(Units_Token) Units_Token::Subtract (const Handle(Units_Token)& atoken) const
245 TCollection_AsciiString word = Word();
246 if(thedimensions->IsEqual(atoken->Dimensions()))
247 return new Units_Token(word.ToCString(), " ", thevalue-atoken->Value(), thedimensions);
249 return new Units_Token(" ");
252 //=======================================================================
253 //function : Multiply
255 //=======================================================================
257 Handle(Units_Token) Units_Token::Multiply (const Handle(Units_Token)& atoken) const
259 TCollection_AsciiString string = Word();
260 string.Insert(1,'(');
261 string = string + ")*(";
262 string = string + atoken->Word();
263 string = string + ")";
264 return new Units_Token
265 (string.ToCString()," ", thevalue*atoken->Value(), thedimensions * (atoken->Dimensions()));
268 //=======================================================================
269 //function : Multiplied
271 //=======================================================================
273 Standard_Real Units_Token::Multiplied (const Standard_Real avalue) const
275 return avalue * thevalue;
278 //=======================================================================
281 //=======================================================================
283 Handle(Units_Token) Units_Token::Divide (const Handle(Units_Token)& atoken)
286 if(fabs(atoken->Value())<1.e-40) {
288 cout<<"Warning: division on token with value=0 => return initial token."<<endl;
292 TCollection_AsciiString string = Word();
293 string.Insert(1,'(');
294 string = string + ")/(";
295 string = string + atoken->Word();
296 string = string + ")";
297 return new Units_Token
298 (string.ToCString()," ", thevalue/atoken->Value(), thedimensions / (atoken->Dimensions()));
301 //=======================================================================
304 //=======================================================================
306 Standard_Real Units_Token::Divided (const Standard_Real avalue) const
308 return avalue / thevalue;
311 //=======================================================================
314 //=======================================================================
316 Handle(Units_Token) Units_Token::Power(const Handle(Units_Token)& atoken) const
318 TCollection_AsciiString string = Word();
319 string.Insert(1,'(');
320 string = string + ")**(";
321 string = string + atoken->Word();
322 string = string + ")";
323 return new Units_Token
324 (string.ToCString()," ",pow(thevalue,atoken->Value()),pow(thedimensions,atoken->Value()));
327 //=======================================================================
330 //=======================================================================
332 Handle(Units_Token) Units_Token::Power(const Standard_Real anexponent) const
334 TCollection_AsciiString exponent(anexponent);
335 TCollection_AsciiString string = Word();
336 string.Insert(1,'(');
337 string = string + ")**(";
338 string = string + exponent;
339 string = string + ")";
340 return new Units_Token
341 (string.ToCString()," ",pow(thevalue,anexponent),pow(thedimensions,anexponent));
344 //=======================================================================
347 //=======================================================================
349 Standard_Boolean Units_Token::IsEqual (const Standard_CString astring) const
351 TCollection_AsciiString string = Word();
353 Standard_Integer length = string.Length();
355 unsigned int length = string.Length();
357 if(strlen(astring) == length)
358 return (strncmp(string.ToCString(),astring,unsigned(length)) == 0)
359 ? Standard_True : Standard_False;
361 return Standard_False;
364 //=======================================================================
367 //=======================================================================
369 Standard_Boolean Units_Token::IsEqual (const Handle(Units_Token)& atoken) const
371 TCollection_AsciiString string1 = Word();
372 TCollection_AsciiString string2 = atoken->Word();
373 Standard_Integer length = string1.Length();
374 if(length == atoken->Length())
375 return (strcmp(string1.ToCString(),string2.ToCString()) == 0) ? Standard_True : Standard_False;
377 return Standard_False;
380 //=======================================================================
383 //=======================================================================
385 void Units_Token::Dump(const Standard_Integer ashift,
386 const Standard_Integer alevel) const
389 TCollection_AsciiString word = Word();
390 TCollection_AsciiString mean = Mean();
392 for(i=0; i<ashift; i++)cout<<" ";
393 cout << "Units_Token::Dump of " << this << endl;
394 for(i=0; i<ashift; i++)cout<<" ";
395 cout<<word.ToCString()<<endl;
396 for(i=0; i<ashift; i++)cout<<" ";
397 cout<<" value : "<<thevalue<<endl;
398 for(i=0; i<ashift; i++)cout<<" ";
399 cout<<" mean : "<<mean.ToCString()<<endl;
400 if(alevel)thedimensions->Dump(ashift);
403 //=======================================================================
404 //function : operator +
406 //=======================================================================
408 Handle(Units_Token) operator +(const Handle(Units_Token)& atoken,const Standard_Integer aninteger)
410 return atoken->Add(aninteger);
413 //=======================================================================
414 //function : operator +
416 //=======================================================================
418 Handle(Units_Token) operator +(const Handle(Units_Token)& atoken1,const Handle(Units_Token)& atoken2)
420 return atoken1->Add(atoken2);
423 //=======================================================================
424 //function : operator -
426 //=======================================================================
428 Handle(Units_Token) operator -(const Handle(Units_Token)& atoken1,const Handle(Units_Token)& atoken2)
430 return atoken1->Subtract(atoken2);
433 //=======================================================================
434 //function : operator *
436 //=======================================================================
438 Handle(Units_Token) operator *(const Handle(Units_Token)& atoken1,const Handle(Units_Token)& atoken2)
440 return atoken1->Multiply(atoken2);
443 //=======================================================================
444 //function : operator /
446 //=======================================================================
448 Handle(Units_Token) operator /(const Handle(Units_Token)& atoken1,const Handle(Units_Token)& atoken2)
450 return atoken1->Divide(atoken2);
453 //=======================================================================
456 //=======================================================================
458 Handle(Units_Token) pow(const Handle(Units_Token)& atoken1, const Handle(Units_Token)& atoken2)
460 return atoken1->Power(atoken2);
463 //=======================================================================
466 //=======================================================================
468 Handle(Units_Token) pow(const Handle(Units_Token)& atoken,const Standard_Real areal)
470 return atoken->Power(areal);
473 //=======================================================================
474 //function : operator ==
476 //=======================================================================
478 Standard_Boolean operator ==(const Handle(Units_Token)& atoken,const Standard_CString astring)
480 return atoken->IsEqual(astring);
483 //=======================================================================
484 //function : operator ==
486 //=======================================================================
488 //Standard_Boolean operator ==(const Handle(Units_Token)& atoken1,const Handle(Units_Token)& atoken2)
490 // return atoken1->IsEqual(atoken2);
493 //=======================================================================
494 //function : operator !=
496 //=======================================================================
498 Standard_Boolean operator !=(const Handle(Units_Token)& atoken,const Standard_CString astring)
500 return atoken->IsNotEqual(astring);
503 //=======================================================================
504 //function : operator !=
506 //=======================================================================
508 //Standard_Boolean operator !=(const Handle(Units_Token)& atoken1,const Handle(Units_Token)& atoken2)
510 // return atoken1->IsNotEqual(atoken2);
513 //=======================================================================
514 //function : operator <=
516 //=======================================================================
518 Standard_Boolean operator <=(const Handle(Units_Token)& atoken,const Standard_CString astring)
520 return atoken->IsLessOrEqual(astring);
523 //=======================================================================
524 //function : operator >
526 //=======================================================================
528 Standard_Boolean operator >(const Handle(Units_Token)& atoken,const Standard_CString astring)
530 return atoken->IsGreater(astring);
533 //=======================================================================
534 //function : operator >
536 //=======================================================================
538 Standard_Boolean operator >(const Handle(Units_Token)& atoken1,const Handle(Units_Token)& atoken2)
540 return atoken1->IsGreater(atoken2);
543 //=======================================================================
544 //function : operator >=
546 //=======================================================================
548 Standard_Boolean operator >=(const Handle(Units_Token)& atoken1,const Handle(Units_Token)& atoken2)
550 return atoken1->IsGreaterOrEqual(atoken2);
553 void Units_Token::Destroy () {
556 cout << " DESTROIES Token" << endl;