Integration of OCCT 6.5.0 from SVN
[occt.git] / src / Units / Units_Token.cxx
CommitLineData
7fd59977 1// File: Units_Token.cxx
2// Created: Wed Jun 24 12:49:08 1992
3// Author: Gilles DEBARBOUILLE
4// <gde@phobox>
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
8// to AsciiString.
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
12
13#define PRO8727 //GG_180697
14// Mauvaise construction d'un token par copie
15// plantatoire sur HP.
16
17#include <Units_Token.ixx>
18#include <TCollection_AsciiString.hxx>
19#include <Units_Operators.hxx>
20
21#define XTRACE 1
22
23//=======================================================================
24//function : Units_Token
25//purpose :
26//=======================================================================
27
28Units_Token::Units_Token()
29{
30 theword=" ";
31 themean=" ";
32 thevalue=0.;
33 thedimensions=new Units_Dimensions(0.,0.,0.,0.,0.,0.,0.,0.,0.);
34#ifdef TRACE
35 cout << " CREATES Token " << endl;
36 Dump(0,0);
37#endif
38}
39
40//=======================================================================
41//function : Units_Token
42//purpose :
43//=======================================================================
44
45Units_Token::Units_Token(const Standard_CString aword)
46{
47 theword=aword;
48 themean=" ";
49 thevalue=0.;
50 thedimensions=new Units_Dimensions(0.,0.,0.,0.,0.,0.,0.,0.,0.);
51#ifdef TRACE
52 cout << " CREATES Token " << endl;
53 Dump(0,0);
54#endif
55}
56
57//=======================================================================
58//function : Units_Token
59//purpose :
60//=======================================================================
61
62Units_Token::Units_Token(const Standard_CString aword,
63 const Standard_CString amean)
64{
65 theword=aword;
66 themean=amean;
67 thevalue=0.;
68 thedimensions=new Units_Dimensions(0.,0.,0.,0.,0.,0.,0.,0.,0.);
69#ifdef TRACE
70 cout << " CREATES Token " << endl;
71 Dump(0,0);
72#endif
73}
74
75//=======================================================================
76//function : Units_Token
77//purpose :
78//=======================================================================
79
80Units_Token::Units_Token(const Standard_CString aword,
81 const Standard_CString amean,
82 const Standard_Real avalue)
83{
84 theword=aword;
85 themean=amean;
86 thevalue=avalue;
87 thedimensions=new Units_Dimensions(0.,0.,0.,0.,0.,0.,0.,0.,0.);
88#ifdef TRACE
89 cout << " CREATES Token " << endl;
90 Dump(0,0);
91#endif
92}
93
94//=======================================================================
95//function : Units_Token
96//purpose :
97//=======================================================================
98
99Units_Token::Units_Token(const Standard_CString aword,
100 const Standard_CString amean,
101 const Standard_Real avalue,
102 const Handle(Units_Dimensions)& adimensions)
103{
104 theword=aword;
105 themean=amean;
106 thevalue=avalue;
107 if(adimensions.IsNull())
108 thedimensions = new Units_Dimensions(0.,0.,0.,0.,0.,0.,0.,0.,0.);
109 else
110 thedimensions = new Units_Dimensions(adimensions->Mass(),
111 adimensions->Length(),
112 adimensions->Time(),
113 adimensions->ElectricCurrent(),
114 adimensions->ThermodynamicTemperature(),
115 adimensions->AmountOfSubstance(),
116 adimensions->LuminousIntensity(),
117 adimensions->PlaneAngle(),
118 adimensions->SolidAngle());
119#ifdef TRACE
120 cout << " CREATES Token " << endl;
121 Dump(0,0);
122#endif
123}
124
125//=======================================================================
126//function : Creates
127//purpose :
128//=======================================================================
129
130Handle(Units_Token) Units_Token::Creates() const
131{
132#ifdef PRO8727
133 TCollection_AsciiString word = Word();
134 TCollection_AsciiString mean = Mean();
135 return new Units_Token(word.ToCString(),mean.ToCString(),Value(),Dimensions());
136#else
137 return new Units_Token(*this);
138#endif
139}
140
141//=======================================================================
142//function : Length
143//purpose :
144//=======================================================================
145
146Standard_Integer Units_Token::Length() const
147{
148 return theword.Length();
149}
150
151//=======================================================================
152//function : Dimensions
153//purpose :
154//=======================================================================
155
156void Units_Token::Dimensions(const Handle(Units_Dimensions)& adimensions)
157{
158 if(adimensions.IsNull())
159 thedimensions = new Units_Dimensions(0.,0.,0.,0.,0.,0.,0.,0.,0.);
160 else
161 thedimensions = new Units_Dimensions(adimensions->Mass(),
162 adimensions->Length(),
163 adimensions->Time(),
164 adimensions->ElectricCurrent(),
165 adimensions->ThermodynamicTemperature(),
166 adimensions->AmountOfSubstance(),
167 adimensions->LuminousIntensity(),
168 adimensions->PlaneAngle(),
169 adimensions->SolidAngle());
170}
171
172//=======================================================================
173//function : Units_Token
174//purpose :
175//=======================================================================
176
177Units_Token::Units_Token(const Handle(Units_Token)& atoken)
178{
179 theword = atoken->Word();
180 themean = atoken->Mean();
181 thevalue = atoken->Value();
182 thedimensions = atoken->Dimensions();
183}
184
185//=======================================================================
186//function : Update
187//purpose :
188//=======================================================================
189
190void Units_Token::Update(const Standard_CString amean)
191{
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;
196 themean = string;
197}
198
199//=======================================================================
200//function : Add
201//purpose :
202//=======================================================================
203
204Handle(Units_Token) Units_Token::Add (const Standard_Integer) const
205{
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();
210}
211
212//=======================================================================
213//function : Add
214//purpose :
215//=======================================================================
216
217Handle(Units_Token) Units_Token::Add (const Handle(Units_Token)& atoken) const
218{
219 TCollection_AsciiString word = Word();
220 if(thedimensions->IsEqual(atoken->Dimensions()))
221 return new Units_Token(word.ToCString(), " ", thevalue+atoken->Value(), thedimensions);
222 else
223 return new Units_Token(" ");
224}
225
226//=======================================================================
227//function : Subtract
228//purpose :
229//=======================================================================
230
231Handle(Units_Token) Units_Token::Subtract (const Handle(Units_Token)& atoken) const
232{
233 TCollection_AsciiString word = Word();
234 if(thedimensions->IsEqual(atoken->Dimensions()))
235 return new Units_Token(word.ToCString(), " ", thevalue-atoken->Value(), thedimensions);
236 else
237 return new Units_Token(" ");
238}
239
240//=======================================================================
241//function : Multiply
242//purpose :
243//=======================================================================
244
245Handle(Units_Token) Units_Token::Multiply (const Handle(Units_Token)& atoken) const
246{
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()));
254}
255
256//=======================================================================
257//function : Multiplied
258//purpose :
259//=======================================================================
260
261Standard_Real Units_Token::Multiplied (const Standard_Real avalue) const
262{
263 return avalue * thevalue;
264}
265
266//=======================================================================
267//function : Divide
268//purpose :
269//=======================================================================
270
271Handle(Units_Token) Units_Token::Divide (const Handle(Units_Token)& atoken)
272 const
273{
274 if(fabs(atoken->Value())<1.e-40) {
275#ifdef DEB
276 cout<<"Warning: division on token with value=0 => return initial token."<<endl;
277#endif
278 return this;
279 }
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()));
287}
288
289//=======================================================================
290//function : Divided
291//purpose :
292//=======================================================================
293
294Standard_Real Units_Token::Divided (const Standard_Real avalue) const
295{
296 return avalue / thevalue;
297}
298
299//=======================================================================
300//function : Power
301//purpose :
302//=======================================================================
303
304Handle(Units_Token) Units_Token::Power(const Handle(Units_Token)& atoken) const
305{
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()));
313}
314
315//=======================================================================
316//function : Power
317//purpose :
318//=======================================================================
319
320Handle(Units_Token) Units_Token::Power(const Standard_Real anexponent) const
321{
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));
330}
331
332//=======================================================================
333//function : IsEqual
334//purpose :
335//=======================================================================
336
337Standard_Boolean Units_Token::IsEqual (const Standard_CString astring) const
338{
339 TCollection_AsciiString string = Word();
340#ifdef UNX
341 Standard_Integer length = string.Length();
342#else
343 unsigned int length = string.Length();
344#endif
345 if(strlen(astring) == length)
346 return (strncmp(string.ToCString(),astring,unsigned(length)) == 0)
347 ? Standard_True : Standard_False;
348 else
349 return Standard_False;
350}
351
352//=======================================================================
353//function : IsEqual
354//purpose :
355//=======================================================================
356
357Standard_Boolean Units_Token::IsEqual (const Handle(Units_Token)& atoken) const
358{
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;
364 else
365 return Standard_False;
366}
367
368//=======================================================================
369//function : Dump
370//purpose :
371//=======================================================================
372
373void Units_Token::Dump(const Standard_Integer ashift,
374 const Standard_Integer alevel) const
375{
376 int i;
377 TCollection_AsciiString word = Word();
378 TCollection_AsciiString mean = Mean();
379
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);
389}
390
391//=======================================================================
392//function : operator +
393//purpose :
394//=======================================================================
395
396Handle(Units_Token) operator +(const Handle(Units_Token)& atoken,const Standard_Integer aninteger)
397{
398 return atoken->Add(aninteger);
399}
400
401//=======================================================================
402//function : operator +
403//purpose :
404//=======================================================================
405
406Handle(Units_Token) operator +(const Handle(Units_Token)& atoken1,const Handle(Units_Token)& atoken2)
407{
408 return atoken1->Add(atoken2);
409}
410
411//=======================================================================
412//function : operator -
413//purpose :
414//=======================================================================
415
416Handle(Units_Token) operator -(const Handle(Units_Token)& atoken1,const Handle(Units_Token)& atoken2)
417{
418 return atoken1->Subtract(atoken2);
419}
420
421//=======================================================================
422//function : operator *
423//purpose :
424//=======================================================================
425
426Handle(Units_Token) operator *(const Handle(Units_Token)& atoken1,const Handle(Units_Token)& atoken2)
427{
428 return atoken1->Multiply(atoken2);
429}
430
431//=======================================================================
432//function : operator /
433//purpose :
434//=======================================================================
435
436Handle(Units_Token) operator /(const Handle(Units_Token)& atoken1,const Handle(Units_Token)& atoken2)
437{
438 return atoken1->Divide(atoken2);
439}
440
441//=======================================================================
442//function : pow
443//purpose :
444//=======================================================================
445
446Handle(Units_Token) pow(const Handle(Units_Token)& atoken1, const Handle(Units_Token)& atoken2)
447{
448 return atoken1->Power(atoken2);
449}
450
451//=======================================================================
452//function : pow
453//purpose :
454//=======================================================================
455
456Handle(Units_Token) pow(const Handle(Units_Token)& atoken,const Standard_Real areal)
457{
458 return atoken->Power(areal);
459}
460
461//=======================================================================
462//function : operator ==
463//purpose :
464//=======================================================================
465
466Standard_Boolean operator ==(const Handle(Units_Token)& atoken,const Standard_CString astring)
467{
468 return atoken->IsEqual(astring);
469}
470
471//=======================================================================
472//function : operator ==
473//purpose :
474//=======================================================================
475
476//Standard_Boolean operator ==(const Handle(Units_Token)& atoken1,const Handle(Units_Token)& atoken2)
477//{
478// return atoken1->IsEqual(atoken2);
479//}
480
481//=======================================================================
482//function : operator !=
483//purpose :
484//=======================================================================
485
486Standard_Boolean operator !=(const Handle(Units_Token)& atoken,const Standard_CString astring)
487{
488 return atoken->IsNotEqual(astring);
489}
490
491//=======================================================================
492//function : operator !=
493//purpose :
494//=======================================================================
495
496//Standard_Boolean operator !=(const Handle(Units_Token)& atoken1,const Handle(Units_Token)& atoken2)
497//{
498// return atoken1->IsNotEqual(atoken2);
499//}
500
501//=======================================================================
502//function : operator <=
503//purpose :
504//=======================================================================
505
506Standard_Boolean operator <=(const Handle(Units_Token)& atoken,const Standard_CString astring)
507{
508 return atoken->IsLessOrEqual(astring);
509}
510
511//=======================================================================
512//function : operator >
513//purpose :
514//=======================================================================
515
516Standard_Boolean operator >(const Handle(Units_Token)& atoken,const Standard_CString astring)
517{
518 return atoken->IsGreater(astring);
519}
520
521//=======================================================================
522//function : operator >
523//purpose :
524//=======================================================================
525
526Standard_Boolean operator >(const Handle(Units_Token)& atoken1,const Handle(Units_Token)& atoken2)
527{
528 return atoken1->IsGreater(atoken2);
529}
530
531//=======================================================================
532//function : operator >=
533//purpose :
534//=======================================================================
535
536Standard_Boolean operator >=(const Handle(Units_Token)& atoken1,const Handle(Units_Token)& atoken2)
537{
538 return atoken1->IsGreaterOrEqual(atoken2);
539}
540
541void Units_Token::Destroy () {
542
543#ifdef TRACE
544 cout << " DESTROIES Token" << endl;
545 Dump(0,0);
546#endif
547}