80
real sMetricPrefix::Multiplier (sString Prefix)
93
real sMetricPrefix::Multiplier (int Log)
82
if( Prefix == ""){ return (real)1.0e0;
83
}else if( Prefix == "k"){ return (real)1.0e3;
84
}else if( Prefix == "m"){ return (real)1.0e-3;
85
}else if( Prefix == "M"){ return (real)1.0e6;
86
}else if( Prefix == "µ"){ return (real)1.0e-6;
87
}else if( Prefix == "G"){ return (real)1.0e9;
88
}else if( Prefix == "n"){ return (real)1.0e-9;
89
}else if( Prefix == "T"){ return (real)1.0e12;
90
}else if( Prefix == "p"){ return (real)1.0e-12;
91
}else if( Prefix == "P"){ return (real)1.0e15;
92
}else if( Prefix == "f"){ return (real)1.0e-15;
93
}else if( Prefix == "E"){ return (real)1.0e18;
94
}else if( Prefix == "a"){ return (real)1.0e-18;
95
}else if( Prefix == "Z"){ return (real)1.0e21;
96
}else if( Prefix == "z"){ return (real)1.0e-21;
97
}else if( Prefix == "Y"){ return (real)1.0e24;
98
}else if( Prefix == "y"){ return (real)1.0e-24;
99
}else if( Prefix == "h"){ return (real)1.0e2;
100
}else if( Prefix == "c"){ return (real)1.0e-2;
101
}else if( Prefix == "da"){ return (real)1.0e1;
102
}else if( Prefix == "d"){ return (real)1.0e-1;
96
case 0: return (real)1.0e0;
97
case 3: return (real)1.0e3;
98
case -3: return (real)1.0e-3;
99
case 6: return (real)1.0e6;
100
case -6: return (real)1.0e-6;
101
case 9: return (real)1.0e9;
102
case -9: return (real)1.0e-9;
103
case 12: return (real)1.0e12;
104
case -12: return (real)1.0e-12;
105
case 15: return (real)1.0e15;
106
case -15: return (real)1.0e-15;
107
case 18: return (real)1.0e18;
108
case -18: return (real)1.0e-18;
109
case 21: return (real)1.0e21;
110
case -21: return (real)1.0e-21;
111
case 24: return (real)1.0e24;
112
case -24: return (real)1.0e-24;
113
case 2: return (real)1.0e2;
114
case -2: return (real)1.0e-2;
115
case 1: return (real)1.0e1;
116
case -1: return (real)1.0e-1;
117
default: return power10(Log);
151
sString sMetricPrefix::CombinedSymbol (int Log)
153
sString PP(Symbol(Log));
158
while( (Log < -2) || (Log > 2) ){
169
PP = Symbol(Log) + PP;
174
//----------------------------------------------------------- sUnit::sSystem ---
176
sUnit::sSystem::~sSystem ()
178
// StoragePlace.SetToNULL();
179
// while( ! UnitList.empty() ){
186
sUnit::sSystem::sSystem ()
137
191
//-------------------------------------------------------------------- sUnit ---
193
psUnit sUnit::Register (sString symbol
194
,sString prefix_allowance
195
,sPhysValue definition)
197
if( symbol.Empty() ){
200
psUnit ExistingU = Find(symbol);
202
if( ExistingU->ThePrefixAllowance != prefix_allowance ){
203
ExistingU->ThePrefixAllowance = prefix_allowance;
204
// RANet::Log.Put(sLog::Debug,"Units"
205
// ,sString("Prefix allowance changed for '")+symbol+"'");
207
sString Old("basic");
208
if( ExistingU->TheDefinition ){
209
Old = ExistingU->TheDefinition->Text();
210
delete ExistingU->TheDefinition;
212
ExistingU->TheDefinition = new sPhysValue(definition);
213
// RANet::Log.Put(sLog::Debug,"Units"
214
// ,sString("Definition changed for '")+symbol
215
// +"': was "+Old+"; now "+definition.Text());
218
psUnit NewU( new sUnit(symbol
220
,new sPhysValue(definition) ) );
221
System.UnitList[NewU->Symbol()]=NewU;
222
// RANet::Log.Put(sLog::Debug,"Units"
223
// ,sString("New unit registered: ")
224
// +symbol+" = "+definition.Text());
231
psUnit sUnit::Register (sString symbol
232
,sString prefix_allowance)
234
if( symbol.Empty() ){
237
psUnit ExistingU = Find(symbol);
239
if( ExistingU->ThePrefixAllowance != prefix_allowance ){
240
ExistingU->ThePrefixAllowance = prefix_allowance;
241
// RANet::Log.Put(sLog::Debug,"Units"
242
// ,sString("Prefix allowance changed for '")+symbol+"'");
246
psUnit NewU( new sUnit(symbol,prefix_allowance,NULL) );
247
System.UnitList[NewU->Symbol()]=NewU;
248
// RANet::Log.Put(sLog::Debug,"Units"
249
// ,sString("New unit registered: ")+symbol);
256
psUnit sUnit::Register (sString symbol
257
,sPhysValue definition)
259
if( symbol.Empty() ){
262
psUnit ExistingU = Find(symbol);
264
sString Old("basic");
265
if( ExistingU->TheDefinition ){
266
Old = ExistingU->TheDefinition->Text();
267
delete ExistingU->TheDefinition;
269
ExistingU->TheDefinition = new sPhysValue(definition);
270
// RANet::Log.Put(sLog::Debug,"Units"
271
// ,sString("Definition changed for '")+symbol
272
// +"': was "+Old+"; now "+definition.Text());
275
psUnit NewU( new sUnit(symbol
276
,sMetricPrefix::StandardAllowance
277
,new sPhysValue(definition) ) );
278
System.UnitList[NewU->Symbol()]=NewU;
279
// RANet::Log.Put(sLog::Debug,"Units"
280
// ,sString("New unit registered: ")
281
// +symbol+" = "+definition.Text());
288
psUnit sUnit::Register (sString symbol)
290
if( symbol.Empty() ){
293
psUnit ExistingU = Find(symbol);
297
psUnit NewU( new sUnit(symbol
298
,sMetricPrefix::StandardAllowance
300
System.UnitList[NewU->Symbol()]=NewU;
301
// RANet::Log.Put(sLog::Debug,"Units"
302
// ,sString("New unit registered: ")+symbol+" (basic)");
309
psUnit sUnit::Find (sString symbol)
311
map<sString,psUnit>::iterator U = System.UnitList.find(symbol);
312
if( U == System.UnitList.end() ){
320
bool sUnit::ParseUnitWithPrefix (sString lexem
325
unit=sUnit::Find(lexem);
327
for( int L = 24 ; (L >= -24) && (unit == NULL) ; --L ){
328
sString Prefix = sMetricPrefix::Symbol(L);
330
if( ! Prefix.Empty() && (Prefix != "?") ){
331
if( (lexem.Substr(0,Prefix.Length()) == Prefix)
332
&& (lexem.Length() > Prefix.Length()) ){
333
// TRACE(Prefix+"|"+lexem.Tail(Prefix.Length()));
334
if( ParseUnitWithPrefix(lexem.Tail(Prefix.Length()),unit,K) ){
335
// TRACE(unit->Symbol());
343
return ! (unit == NULL);
347
/*! Резервирует наиболее важные единицы.
349
Помогает избежать следующей проблемы:
351
Новые единицы автоматически регистрируются в плагинах и диалоге. И, например,
352
"ms" будет зарегистрирована как базовая, если до этого не регистрировалась "s".
353
Если "s" зарегистрирована до первого появления "ms", то "ms" распознаётся как
356
Последнее, впрочем, не мешает всяким извращенцам явно зарегистрировать "ms" со
357
смыслом, отличным от milli-"s". Тогда "ms" будет означать, например, единицу
358
маразма, "Mms" - мегамаразм, но "ks" и "ns" останутся производными от "s".
361
void sUnit::MakeVeryBasicDefinitions ()
368
//cannot use sPhysValue yet!
371
//------------------------------------
139
373
/*! copying is not allowed */
140
374
sUnit::sUnit (rcsUnit U)
143
377
,Is_1_Flag(U.Is_1_Flag)
378
,IsObsoleteFlag(U.IsObsoleteFlag)
144
379
,TheSymbol(U.TheSymbol)
145
,TheSense(U.TheSense)
380
,ThePrefixAllowance(U.ThePrefixAllowance)
381
,TheDefinition(U.TheDefinition)
150
386
/*! assignment op is not allowed */
151
rsUnit sUnit::operator = (sUnit U)
387
rsUnit sUnit::operator = (rcsUnit U)
153
389
Is_1_Flag = U.Is_1_Flag;
390
IsObsoleteFlag = U.IsObsoleteFlag;
154
391
TheSymbol = U.TheSymbol;
155
TheSense = U.TheSense;
392
ThePrefixAllowance = U.ThePrefixAllowance;
393
TheDefinition = U.TheDefinition;
160
psUnit sUnit::Unit (sString id)
162
map<sString,psUnit>::iterator U = UnitList.find(id);
163
if( U == UnitList.end() ){
178
psUnit sUnit::Register (sString symbol ,sString sense)
180
if( symbol.Empty() ){
183
psUnit U ( new sUnit(symbol,sense) );
184
psUnit UU = Unit( U->Id() );
196
sUnit::sUnit (sString symbol ,sString sense)
400
,IsObsoleteFlag(false)
401
,TheSymbol(Symbol::Unit_1)
402
,ThePrefixAllowance(sMetricPrefix::NoPrefixAllowed)
408
sUnit::sUnit (sString symbol
409
,sString prefix_allowance
410
,psPhysValue definition)
197
411
:Is_1_Flag(false)
412
,IsObsoleteFlag(false)
198
413
,TheSymbol(symbol)
414
,ThePrefixAllowance(prefix_allowance)
415
,TheDefinition(definition)
204
420
sUnit::sUnit (rsObjectStream a_stream)
205
421
:sStorable(a_stream)
207
425
a_stream.READ_INTO(Is_1_Flag);
426
a_stream.READ_INTO(IsObsoleteFlag);
208
427
a_stream.ReadString(TheSymbol);
209
a_stream.ReadString(TheSense);
210
Register(TheSymbol,TheSense);
428
a_stream.ReadString(ThePrefixAllowance);
429
a_stream.READ_INTO(HasDefinition);
431
TheDefinition = new sPhysValue(a_stream);
214
437
void sUnit::Store (rsObjectStream a_stream)
439
bool HasDefinition = (TheDefinition != NULL);
216
440
sStorable::Store(a_stream);
217
441
a_stream.WRITE_FROM(Is_1_Flag);
442
a_stream.WRITE_FROM(IsObsoleteFlag);
218
443
a_stream.WriteString(TheSymbol);
219
a_stream.WriteString(TheSense);
444
a_stream.WriteString(ThePrefixAllowance);
445
a_stream.WRITE_FROM(HasDefinition);
447
TheDefinition->Store(a_stream);
452
bool sUnit::PrefixAllowed (int prefix_index) const
454
char A = ThePrefixAllowance[24-prefix_index];
455
return (A != '.') && (A != '-');
459
//void sUnit::SetPrefixAllowance (sString)
464
//void sUnit::SetDefinition (sPhysValue)
222
468
//------------------------------------------------------------------- sUnits ---
470
sUnits sUnits::Parse (sString S)
472
// RANet::Log.OpenBlock(sLog::Debug,"sUnits::Parse",S);
474
bool Division = false;
475
size_t P = std::min( S.Pos("*") , S.Pos("/") );
480
while( ! S.Empty() ){
481
Term = S.Substr(0,P);
483
size_t PP = std::min( Term.Pos("+") , Term.Pos("-") );
484
for( char D = '0' ; D <= '9' ; ++D )
485
PP = std::min( PP , Term.Pos(sString(D)) );
486
if( PP < Term.Length() ){
487
sString PowerText=Term.Tail(PP);
488
Term=Term.Substr(0,PP);
491
if( Division ) Power = - Power;
492
Term.EatLeadingSpaces();
493
if( ! Term.Empty() ){
494
if( sUnit::ParseUnitWithPrefix(Term,Unit,PrefixLg) ){
495
UU.Product.push_back(sTerm(Unit,Power,PrefixLg));
496
}else if( sUnit::RegisterDialog ){
497
if( (*sUnit::RegisterDialog)(Term) ){
498
if( sUnit::ParseUnitWithPrefix(Term,Unit,PrefixLg) ){
499
UU.Product.push_back(sTerm(Unit,Power,PrefixLg));
503
UU.Product.push_back(sTerm(sUnit::Register(Term),Power,0));
507
Division = (S[P] == '/');
509
P = std::min( S.Pos("*") , S.Pos("/") );
511
// RANet::Log.Put(sLog::Debug,"sUnits::Parse",UU.Text());
512
// RANet::Log.CloseBlock(sLog::Debug,"sUnits::Parse");
516
//----------------------------------------
224
518
sUnits::~sUnits ()
259
558
a_stream.WRITE_FROM(Terminator);
262
562
sUnits::sUnits (rcsUnits U)
265
565
,Product(U.Product)
566
,InBasicTerms(U.InBasicTerms)
270
rsUnits sUnits::operator = (sUnits U)
277
579
sUnits::sUnits (psUnit unit
281
if( unit != sUnit::_1_ ){
282
Product.push_back(sTerm(unit,power,prefix_lg));
288
sUnits::sUnits (sString S)
290
bool Division = false;
291
size_t P = std::min( S.Pos("*") , S.Pos("/") );
295
while( ! S.Empty() ){
296
Term = S.Substr(0,P);
298
size_t PP = std::min( Term.Pos("+") , Term.Pos("-") );
299
for( char D = '0' ; D <= '9' ; ++D )
300
PP = std::min( PP , Term.Pos(sString(D)) );
301
if( PP < Term.Length() ){
302
sString PowerText=Term.Tail(PP);
303
Term=Term.Substr(0,PP);
307
if( ! Term.Empty() ){
308
for( int L = 24 ; (L >= -24) && (PrefixLg == 0) ; --L ){
309
sString Prefix = sMetricPrefix::Symbol(L);
310
if( ! Prefix.Empty() && (Prefix != "?") ){
311
if( (Term.Substr(0,Prefix.Length()) == Prefix)
312
&& (Term.Length() > Prefix.Length()) ) {
314
Term=Term.Tail(Prefix.Length());
319
if( Division ) Power = - Power;
320
if( ! Term.Empty() ){
321
Product.push_back(sTerm(sUnit::Register(Term),Power,PrefixLg));
324
Division = S[P] == '/';
326
P = std::min( S.Pos("*") , S.Pos("/") );
332
sPhysValue sUnits::operator * (sUnits U) const
334
sUnits ResultingUnits(*this);
335
for( std::list<sTerm>::const_iterator i = U.Product.begin()
336
; i != U.Product.end() ; i++ ){
337
ResultingUnits.Product.push_back(*i);
340
ResultingUnits.SimplifyProduct(Order);
341
sPhysValue Result(ResultingUnits);
342
Result.ShiftOrder(Order);
347
sPhysValue sUnits::operator / (sUnits U) const
349
sUnits ResultingUnits(*this);
350
for( std::list<sTerm>::const_iterator i = U.Product.begin()
351
; i != U.Product.end() ; i++ ){
352
sTerm T( i->Unit , - i->Power , i->PrefixLg );
353
ResultingUnits.Product.push_back(T);
356
ResultingUnits.SimplifyProduct(Order);
357
sPhysValue Result(ResultingUnits);
358
Result.ShiftOrder(Order);
363
bool sUnits::Comparable (rcsUnits U, real & coeff) const
365
/*! @todo{VB_!_RAlgebra} ToBasic/U.ToBasic() */
367
std::list<sTerm>::const_iterator i = Product.begin();
368
std::list<sTerm>::const_iterator iU = U.Product.begin();
369
while( (i != Product.end()) && (iU != U.Product.end()) ){
370
if( (i->Unit->Id() == iU->Unit->Id()) && (i->Power == iU->Power) ){
371
coeff_log += (i->PrefixLg - iU->PrefixLg) * i->Power;
582
:InBasicTerms(unit->IsBasic())
585
Product.push_back(sTerm(unit,power,prefix_lg));
589
sUnits::sUnits (sString text)
592
sUnits U( sUnits::Parse(text) );
594
InBasicTerms = U.InBasicTerms;
604
bool sUnits::Is_1_ () const
606
return Product.empty();
610
rsUnits sUnits::operator = (rcsUnits U)
613
InBasicTerms = U.InBasicTerms;
619
sPhysValue sUnits::operator * (rcsUnits U) const
621
sPhysValue Result(*this);
622
Result.TheOrder += Result.TheUnits.MultBy(U);
627
sPhysValue sUnits::operator / (rcsUnits U) const
629
sPhysValue Result(*this);
630
Result.TheOrder += Result.TheUnits.DivideBy(U);
635
int sUnits::MultBy (rcsUnits U)
637
for( tProduct::const_iterator i = U.Product.begin()
638
; i != U.Product.end() ; i++ ){
639
Product.push_back(*i);
641
InBasicTerms = false;
643
return SimplifyProduct();
647
int sUnits::DivideBy (rcsUnits U)
649
for( tProduct::const_iterator i = U.Product.begin()
650
; i != U.Product.end() ; i++ ){
651
Product.push_back( sTerm( i->Unit , - i->Power , i->PrefixLg ) );
653
InBasicTerms = false;
655
return SimplifyProduct();
659
sPhysValue sUnits::ToBasic () const
664
SubstituteDefinitions(Coeff,U);
665
U.InBasicTerms = true;
667
Order = U.SimplifyProduct();
668
sPhysValue Result(Coeff,U);
675
void sUnits::SubstituteDefinitions (real & coeff
679
bool Changed = false;
680
for( tProduct::const_iterator i = units.Product.begin()
681
; i != units.Product.end() ; i++ ){
682
psPhysValue D = i->Unit->Definition();
685
real C = sMetricPrefix::Multiplier(i->PrefixLg)
687
sUnits DU(D->Units());
689
for( int p = i->Power ; p != 0 ; p-- ) coeff *= C;
690
}else if( i->Power < 0 ){
691
for( int p = i->Power ; p != 0 ; p++ ) coeff /= C;
693
for( tProduct::const_iterator j = DU.Product.begin()
694
; j != DU.Product.end() ; j++ ){
695
Result.Product.push_back( sTerm(j->Unit
700
Result.Product.push_back(*i);
378
if( (i != Product.end()) || (iU != U.Product.end()) )
380
coeff = power10( coeff_log );
385
void sUnits::SimplifyProduct (int & log_shift)
387
std::list<sTerm> P(Product);
704
SubstituteDefinitions(coeff,Result);
710
bool sUnits::Comparable (rcsUnits units
713
// RANet::Log.OpenBlock(sLog::Debug,"sUnits::Comparable"
714
// ,sString("Comparing '")+Text()+"' to '"+units.Text()+"'");
715
sPhysValue R( ToBasic() / units.ToBasic() );
716
if( R.TheUnits.Product.empty() ){
717
ratio = R.ArbValue();
718
// RANet::Log.Put(sLog::Debug,"sUnits::Comparable"
719
// ,sString("Comparable with ratio=")+R.Text());
720
// RANet::Log.CloseBlock(sLog::Debug,"sUnits::Comparable");
723
// RANet::Log.Put(sLog::Debug,"sUnits::Comparable",sString("NOT comparable"));
724
// RANet::Log.CloseBlock(sLog::Debug,"sUnits::Comparable");
729
/*! Упрощает результат произведения или деления единиц.
731
В результате сомножители отсортированы, не дублируются, не содержат _1_
732
и лишены метрических префиксов.
733
Результирующий показатель порядкового множителя возвращается.
735
int sUnits::SimplifyProduct (int log_shift)
391
740
while( ! P.empty() ){
392
741
sTerm T(P.front());
394
if( Product.empty() ){
743
log_shift += T.PrefixLg*T.Power;
745
if( T.Unit == sUnit::_1_ ){
747
}else if( Product.empty() ){
395
748
Product.push_back(T);
396
}else if( Product.back().Unit->Id() != T.Unit->Id() ){
749
}else if( Product.back().Unit->Symbol() != T.Unit->Symbol() ){
397
750
Product.push_back(T);
399
Product.back().PrefixLg = Product.back().PrefixLg*Product.back().Power
400
+ T.PrefixLg*T.Power;
401
752
Product.back().Power += T.Power;
402
753
if( Product.back().Power == 0 ){
403
log_shift += Product.back().PrefixLg;
404
754
Product.pop_back();
406
Product.back().PrefixLg /= Product.back().Power;
410
/*! @todo{VB_!_RAlgebra} second pass with PrefixAllowance: Refine(log_shift)?*/
414
//void sUnits::Normalize (int log_shift)
416
// MultiplierExp += log_shift;
417
// std::list<sTerm> P(Product);
420
// while( ! P.empty() ){
421
// sTerm T(P.front());
423
// MultiplierExp += T.PrefixLg * T.Power;
425
// /*! @todo{VB_!_RAlgebra}
426
// if( ! T.Unit->PrefixAllowed(0) ){
427
// изменить префикс (если можно), поправить MultiplierExp
430
// if( Product.empty() ){
431
// Product.push_back(T);
432
// }else if( Product.back().Unit->Id() != T.Unit->Id() ){
433
// Product.push_back(T);
435
// Product.back().Power += T.Power;
436
// if( Product.back().Power == 0 )
437
// Product.pop_back();
443
//sUnits sUnits::Refine () const
446
// /*! @todo{VB_!_RAlgebra} sUnits::Refine*/
447
// if( ! Product.empty() ){
762
void sUnits::SmartSort ()
766
for( tProduct::const_iterator i = P.begin() ; i != P.end() ; i++ ){
767
if( i->Power > 0 ) Product.push_back(*i);
769
for( tProduct::const_iterator i = P.begin() ; i != P.end() ; i++ ){
770
if( i->Power < 0 ) Product.push_back(*i);
775
int sUnits::DissolveOrder (unsigned short int level
777
,int min_rest_expected
778
,int max_rest_expected)
780
// RANet::Log.OpenBlock(sLog::Debug,"sUnits::DissolveOrder"
781
// ,sString("'")+Text()+"'");
782
// TRACENOCR(log_shift);
783
log_shift = SimplifyProduct(log_shift);
784
if( ! Product.empty() ){
786
//! @todo{PhysValues} начинать с разрешённых префиксов
787
tPrefixes BestChoice(0,Product.size());
788
int BestWeight = std::numeric_limits<int>::min();
789
int BestRestOrder = log_shift;
790
FindBestChoice(BestChoice,BestWeight,BestRestOrder
791
,min_rest_expected,max_rest_expected
792
,BestChoice,0 ,log_shift ,0
796
for( tProduct::iterator i = Product.begin() ; i != Product.end() ; i++ ){
797
i->PrefixLg = BestChoice[ii++];
799
log_shift = BestRestOrder;
801
// RANet::Log.Put(sLog::Debug,"sUnits::DissolveOrder",sString("result '")+Text()+"'");
802
// RANet::Log.CloseBlock(sLog::Debug,"sUnits::DissolveOrder");
807
void sUnits::FindBestChoice (tPrefixes & best_choice
809
,int & best_rest_order
810
,int min_rest_expected
811
,int max_rest_expected
812
,tPrefixes current_prefixes
816
,unsigned short int level
819
if( (term_to_vary >= level)
820
|| (term_to_vary >= current_prefixes.size()) ){
821
if( (rest_order > max_rest_expected) || (rest_order < min_rest_expected) )
823
if( weight > best_weight ){
824
best_weight = weight;
825
best_rest_order = rest_order;
826
best_choice = current_prefixes;
827
// TRACE(best_weight);
828
// TRACE(best_rest_order);
829
// sString best_text;
830
// for( tProduct::const_iterator i = best_choice.begin()
831
// ; i != best_choice.end() ; i++ ){
832
// if( ! best_text.Empty() ){
835
// if( i->PrefixLg ){
836
// best_text += sMetricPrefix::CombinedSymbol(i->PrefixLg);
838
// best_text += i->Unit->Symbol();
839
// if( i->Power != 1 ){
840
// best_text << i->Power;
846
tProduct::const_iterator i = Product.begin();
847
for( size_t ii = 0 ; ii < term_to_vary ; ii++ ){
850
for( int L = 24 ; L >= -24 ; --L ){
851
if( i->Unit->PrefixAllowed(L) ){
853
WeightDownshift = ( L==0 ? 0 //за каждый префикс
854
: ( term_to_vary==0 ? 700 //на первом месте
855
: 1000 ))//на остальных
856
+ ( (L % 3)==0 ? 0 : 2000 ) //за каждый "кривой" префикс
857
+ ( L>0 ? L*30 : -L*35 ) //за "величину" префикса
859
current_prefixes[term_to_vary] = L;
860
FindBestChoice(best_choice,best_weight,best_rest_order
861
,min_rest_expected,max_rest_expected
863
,weight - WeightDownshift
864
,rest_order - L * i->Power
873
//void sUnits::OrderPushIn (int log_shift)
875
// if( log_shift == 0 ){
877
// }else if( Product.empty() ){
878
// Product.push_back(sTerm(sUnit::_1_,1,log_shift));
880
// for( tProduct::iterator i = Product.begin()
881
// ; (i != Product.end()) && (log_shift != 0) ; i++ ){
882
// i->PrefixLg += log_shift / i->Power;
883
// log_shift = log_shift % i->Power;
885
// if( log_shift != 0 ){
886
// Product.push_front(sTerm(sUnit::_1_,1,log_shift));
454
892
sString sUnits::Text (eTextFormat F) const
457
for( std::list<sTerm>::const_iterator i = Product.begin()
458
; i != Product.end() ; i++ ){
459
if( (F == Plain) && ! T.Empty() )
462
T += sMetricPrefix::Symbol(i->PrefixLg);
895
int NegativePowerCount = 0;
898
for( tProduct::const_iterator i = Product.begin()
899
; i != Product.end() ; i++ ){
901
if( i->Power < 0 ) NegativePowerCount++;
903
for( tProduct::const_iterator i = Product.begin()
904
; i != Product.end() ; i++ ){
905
int i_Power = i->Power;
908
if( (i_Power < 0) && (NegativePowerCount == 1)
909
&& (TermCount == NumOfTerms) ){
921
T += sMetricPrefix::CombinedSymbol(i->PrefixLg);
922
IF_DEBUG( if( F == HTML ) T += "|" );
463
924
T += i->Unit->Symbol();
926
if( F == HTML ) T += "<sup>";
928
if( F == HTML ) T += "</sup>";
476
//sString sUnits::TextRefined () const
478
// return Refine().Text();
481
934
//------------------------------------------------------------------------------
482
935
}; //namespace RA