00001
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef _Variable_h
00025 #define _Variable_h
00026
00027 #include "Quantity/Quantity.h"
00028 #include "Quantity/QuantityError.h"
00029 #include "Quantity/Generic.h"
00030 #include "Quantity/Dynamic.h"
00031 #include "Quantity/Dedimensionalization.h"
00032
00033 #include "Typelist.h"
00034 #include "NullType.h"
00035 #include "Functor.h"
00036 #include "HierarchyGenerators.h"
00037
00038 namespace quantity {
00039
00041
00042
00043
00045
00047
00050 template<bool>
00051 struct VariableError;
00052
00054
00058 template<bool>
00059 struct ReturnError;
00060
00062
00066 template<bool>
00067 struct AssignmentError;
00068
00070
00074 template<>
00075 struct AssignmentError<false>
00076 {
00078
00080 static const bool RET = true;
00081 };
00082
00084
00088 template<bool>
00089 struct OperationError;
00090
00092
00096 template<>
00097 struct OperationError<false>
00098 {
00100
00102 static const bool RET = true;
00103 };
00104
00106
00107
00108
00110
00112
00114 template<class Q1, class Q2> struct SameDimensioned;
00115
00117
00125 template<template<class, class, class> class Q1, class UT1,
00126 long RL1_N, long RL1_D, long RM1_N, long RM1_D,
00127 long RT1_N, long RT1_D, long RE1_N, long RE1_D,
00128 long RTE1_N, long RTE1_D, long RA1_N, long RA1_D,
00129 long RLU1_N, long RLU1_D,
00130 class UL1, class DU1, class U1, class ST1,
00131 template<class, class, class> class Q2, class UT2,
00132 long RL2_N, long RL2_D, long RM2_N, long RM2_D,
00133 long RT2_N, long RT2_D, long RE2_N, long RE2_D,
00134 long RTE2_N, long RTE2_D, long RA2_N, long RA2_D,
00135 long RLU2_N, long RLU2_D,
00136 class UL2, class DU2, class U2, class ST2,
00137 class N1, class N2>
00138 struct SameDimensioned
00139 <Q1<Quantity<
00140 dimension::Dimension<BSUtilities::Rational<RL1_N, RL1_D>,
00141 BSUtilities::Rational<RM1_N, RM1_D>,
00142 BSUtilities::Rational<RT1_N, RT1_D>,
00143 BSUtilities::Rational<RE1_N, RE1_D>,
00144 BSUtilities::Rational<RTE1_N, RTE1_D>,
00145 BSUtilities::Rational<RA1_N, RA1_D>,
00146 BSUtilities::Rational<RLU1_N, RLU1_D> >,
00147 UT1, UL1, DU1, ST1>, U1, N1>,
00148 Q2<Quantity<
00149 dimension::Dimension<BSUtilities::Rational<RL2_N, RL2_D>,
00150 BSUtilities::Rational<RM2_N, RM2_D>,
00151 BSUtilities::Rational<RT2_N, RT2_D>,
00152 BSUtilities::Rational<RE2_N, RE2_D>,
00153 BSUtilities::Rational<RTE2_N, RTE2_D>,
00154 BSUtilities::Rational<RA2_N, RA2_D>,
00155 BSUtilities::Rational<RLU2_N, RLU2_D> >,
00156 UT2, UL2, DU2, ST2>, U2, N2> >
00157 {
00158 enum {RET = dimension::Equal<
00159 dimension::Dimension<BSUtilities::Rational<RL1_N, RL1_D>,
00160 BSUtilities::Rational<RM1_N, RM1_D>,
00161 BSUtilities::Rational<RT1_N, RT1_D>,
00162 BSUtilities::Rational<RE1_N, RE1_D>,
00163 BSUtilities::Rational<RTE1_N, RTE1_D>,
00164 BSUtilities::Rational<RA1_N, RA1_D>,
00165 BSUtilities::Rational<RLU1_N, RLU1_D> >,
00166 dimension::Dimension<BSUtilities::Rational<RL2_N, RL2_D>,
00167 BSUtilities::Rational<RM2_N, RM2_D>,
00168 BSUtilities::Rational<RT2_N, RT2_D>,
00169 BSUtilities::Rational<RE2_N, RE2_D>,
00170 BSUtilities::Rational<RTE2_N, RTE2_D>,
00171 BSUtilities::Rational<RA2_N, RA2_D>,
00172 BSUtilities::Rational<RLU2_N, RLU2_D> > >::EQ};
00173 };
00174
00175
00177
00182 template<class Q1, class Q2> struct CheckSecondDimension;
00183
00184 template<template<class, class, class> class Q1, class UT1, class D1,
00185 class UL1, class DU1, class U1, class ST1, class N1,
00186 template<class, class, class> class Q2, class UT2, class D2,
00187 class UL2, class DU2, class U2, class ST2, class N2>
00188 struct CheckSecondDimension
00189 <Q1<Quantity<D1, UT1, UL1, DU1, ST1>, U1, N1>,
00190 Q2<Quantity<D2, UT2, UL2, DU2, ST2>, U2, N2> >
00191 {
00192 private:
00193 typedef Q1<Quantity<D1, UT1, UL1, DU1, ST1>, U1, N1> Quant1;
00194 typedef Q2<Quantity<D2, UT2, UL2, DU2, ST2>, U2, N2> Quant2;
00195
00196 public:
00197 typedef
00198 typename BSUtilities::IF<SameDimensioned<Quant1, Quant2>::RET,
00199 Quant2, DimensionError<true> >::RET RET;
00200 };
00201
00203
00204
00205
00207
00209
00212 template<class Q1, class Q2> struct GenerateVariable;
00213
00215
00216
00217
00219
00221
00228 template<class PQ, class SU = typename PQ::DefaultUnit::Unit,
00229 class DD = typename DefaultDedimensionalizer<PQ, SU>::F>
00230 class Variable;
00231
00233
00236 template<long RL_N, long RL_D, long RM_N, long RM_D,
00237 long RT_N, long RT_D, long RE_N, long RE_D, long RTE_N, long RTE_D,
00238 long RA_N, long RA_D, long RLU_N, long RLU_D,
00239 class BT, class UL, class DU, class SU, class ST, class R,
00240 class DDH, class DDT>
00241 class Variable<Quantity<dimension::Dimension<
00242 BSUtilities::Rational<RL_N, RL_D>,
00243 BSUtilities::Rational<RM_N, RM_D>,
00244 BSUtilities::Rational<RT_N, RT_D>,
00245 BSUtilities::Rational<RE_N, RE_D>,
00246 BSUtilities::Rational<RTE_N, RTE_D>,
00247 BSUtilities::Rational<RA_N, RA_D>,
00248 BSUtilities::Rational<RLU_N, RLU_D> >, BT, UL, DU, ST>,
00249 SU, Loki::Functor<R, Loki::Typelist<DDH, DDT> > >
00250 : public
00251 Quantity<dimension::Dimension<BSUtilities::Rational<RL_N, RL_D>,
00252 BSUtilities::Rational<RM_N, RM_D>,
00253 BSUtilities::Rational<RT_N, RT_D>,
00254 BSUtilities::Rational<RE_N, RE_D>,
00255 BSUtilities::Rational<RTE_N, RTE_D>,
00256 BSUtilities::Rational<RA_N, RA_D>,
00257 BSUtilities::Rational<RLU_N, RLU_D> >, BT, UL, DU, ST>
00258 {
00259 public:
00261
00263 typedef dimension::Dimension<BSUtilities::Rational<RL_N, RL_D>,
00264 BSUtilities::Rational<RM_N, RM_D>,
00265 BSUtilities::Rational<RT_N, RT_D>,
00266 BSUtilities::Rational<RE_N, RE_D>,
00267 BSUtilities::Rational<RTE_N, RTE_D>,
00268 BSUtilities::Rational<RA_N, RA_D>,
00269 BSUtilities::Rational<RLU_N, RLU_D> > DIM;
00270
00272 typedef typename Loki::Typelist<DDH, DDT> DDL;
00273
00275
00282 typedef typename Loki::TL::TypeAt<DDL, 0>::Result DDP;
00283
00285 typedef typename Loki::Functor<R, DDL> DD;
00286
00288
00291 typedef Quantity<DIM, BT, UL, DU, ST> ABQ;
00292
00294
00296 typedef Variable<ABQ, SU, DD> V;
00297
00299
00304 typedef ABQ PQ;
00305
00307 typedef typename BSUtilities::IF<BSUtilities::SameType
00308 <DD, typename DefaultDedimensionalizer<PQ, SU>::F>::sameType,
00309 DedimReturn<PQ, SU>, V>::RET DDR;
00310
00311 private:
00313
00317 static DDR defaultDedimensionalizer (DDP) {return DDR(ST(1.));}
00318
00320
00322 static const DD _defaultDD;
00323
00325
00333 DD _dedimensionalizer;
00334
00336
00339 ST _value;
00340
00341 public:
00343
00348 typedef
00349 typename unit::CheckUnit<unit::Unit<BT>, SU>::Check Unit;
00350
00352
00355 Variable (void) : ABQ (), _dedimensionalizer (_defaultDD),
00356 _value (ST(0)) {}
00357
00359
00361 Variable (const DD &dedimensionalizer)
00362 : ABQ (), _dedimensionalizer (dedimensionalizer),
00363 _value (ST(0)) {}
00364
00366
00369 Variable (const ST value)
00370 : ABQ (), _dedimensionalizer (_defaultDD), _value (value) {}
00371
00373
00376 Variable (const ST value, const DD &dedimensionalizer)
00377 : ABQ (), _dedimensionalizer (dedimensionalizer),
00378 _value (value) {}
00379
00381
00384 Variable (const ST value, const SU &)
00385 : ABQ (), _dedimensionalizer (_defaultDD), _value (value) {}
00386
00388
00391 Variable
00392 (const ST value, const SU &, const DD &dedimensionalizer)
00393 : ABQ (), _dedimensionalizer (dedimensionalizer),
00394 _value (value) {}
00395
00397
00403 template<class NU>
00404 Variable (const ST value, const NU &)
00405 : ABQ (), _value (Reverse<SU, ST>::VAL
00406 (Standardize<typename CheckAgainstAllUnits<NU, UL>::RET,
00407 ST>::VAL (value))) {}
00408
00410
00419 Variable (const ST value, const std::string &symbol)
00420 : ABQ ()
00421 {::unit::Unit<BT> *unitp = PQ::findBySymbol (symbol);
00422
00423 _value = Reverse<SU, ST>::VAL
00424 (dynamic_standardize<UL>::VAL (value, *unitp));
00425
00426 delete (unitp);
00427 }
00428
00430
00437 Variable (const ST value, const char * symbol)
00438 : ABQ ()
00439 {::unit::Unit<BT> *unitp
00440 = PQ::findBySymbol (std::string (symbol));
00441 _value = Reverse<SU, ST>::VAL
00442 (dynamic_standardize<UL>::VAL (value, *unitp));
00443
00444 delete (unitp);
00445 }
00446
00448
00451 template<template<class, class, class> class Q1>
00452 Variable (const Q1<PQ, SU, DD> &quantity)
00453 : ABQ (), _value (quantity.value ())
00454 {ABQ::namestring = quantity.name ();
00455 ABQ::symbolstring = quantity.symbol ();
00456 }
00457
00459
00472 template<template<class, class, class> class Q1,
00473 class SU1, class DD1>
00474 Variable (const Q1<PQ, SU1, DD1> &quantity)
00475 : ABQ (), _value (Reverse<SU, ST>::VAL
00476 (Standardize<SU1, ST>::VAL (quantity.value ())))
00477 {ABQ::namestring = quantity.name ();
00478 ABQ::symbolstring = quantity.symbol ();
00479 }
00480
00482
00491 template<template<class, class, class> class Q1,
00492 class BT1, class DIM1, class DU1, class SU1, class DD1>
00493 Variable (const Q1<Quantity<DIM1, BT1,
00494 Loki::Typelist<unit::NonPrefixable<BT1, unit::GenericUnit>,
00495 Loki::NullType>, DU1, ST>, SU1, DD1> &quantity)
00496 : ABQ (), _value (Reverse<Unit, ST>::VAL
00497 (Standardize<typename
00498 CheckSecondDimension<Variable<PQ, SU, DD>,
00499 Q1<Quantity<DIM1, BT1,
00500 Loki::Typelist<unit::NonPrefixable<BT1,
00501 unit::GenericUnit>, Loki::NullType>,
00502 DU1, ST>, SU1, DD1> >::RET::Unit, ST>::VAL
00503 (quantity.value ())))
00504 {ABQ::namestring = quantity.name ();
00505 ABQ::symbolstring = quantity.symbol ();
00506 }
00507
00509
00516 template<template<class, class, class> class Q1,
00517 class PQ1, class SU1, class DD1>
00518 Variable (const Q1<PQ1, SU1, DD1> &);
00519
00521
00526 Variable (const Dynamic<ST> &dynamic)
00527 {if (dynamic._rl_n == RL_N/BSUtilities::Gcd<RL_N, RL_D>::RET
00528 && dynamic._rl_d == RL_D/BSUtilities::Gcd<RL_N, RL_D>::RET
00529 && dynamic._rm_n == RM_N/BSUtilities::Gcd<RM_N, RM_D>::RET
00530 && dynamic._rm_d == RM_D/BSUtilities::Gcd<RM_N, RM_D>::RET
00531 && dynamic._rt_n == RT_N/BSUtilities::Gcd<RT_N, RT_D>::RET
00532 && dynamic._rt_d == RT_D/BSUtilities::Gcd<RT_N, RT_D>::RET
00533 && dynamic._re_n == RE_N/BSUtilities::Gcd<RE_N, RE_D>::RET
00534 && dynamic._re_d == RE_D/BSUtilities::Gcd<RE_N, RE_D>::RET
00535 && dynamic._rte_n
00536 == RTE_N/BSUtilities::Gcd<RTE_N, RTE_D>::RET
00537 && dynamic._rte_d
00538 == RTE_D/BSUtilities::Gcd<RTE_N, RTE_D>::RET
00539 && dynamic._ra_n == RA_N/BSUtilities::Gcd<RA_N, RA_D>::RET
00540 && dynamic._ra_d == RA_D/BSUtilities::Gcd<RA_N, RA_D>::RET
00541 && dynamic._rlu_n
00542 == RLU_N/BSUtilities::Gcd<RLU_N, RLU_D>::RET
00543 && dynamic._rlu_d
00544 == RLU_D/BSUtilities::Gcd<RLU_N, RLU_D>::RET)
00545
00546 _value = Reverse<SU, ST>::VAL (dynamic.value ());
00547
00548 else
00549 {throw DimensionMismatch ();}
00550
00551 }
00552
00554
00561 Variable & operator= (const Variable &new_variable)
00562 {if (this != &new_variable)
00563 {_value = new_variable.value ();}
00564
00565 return *this;
00566 }
00567
00569
00588 template<template<class, class, class> class Q1,
00589 class SU1, class DD1>
00590 Variable & operator= (const Q1<PQ, SU1, DD1> &quantity)
00591 {
00592 void *this_pointer = this;
00593 const void *new_pointer = &quantity;
00594
00595 if (this_pointer != new_pointer)
00596 {_value = Reverse<SU, ST>::VAL
00597 (Standardize<SU1, ST>::VAL (quantity.value ()));
00598 }
00599
00600 return *this;
00601 }
00602
00604
00613 template<template<class, class, class> class Q1,
00614 class PQ1, class SU1, class DD1>
00615 Variable & operator= (const Q1<PQ1, SU1, DD1> &quantity)
00616 {
00617 static const bool RET =
00618 BSUtilities::IF<BSUtilities::SameType<PQ, PQ1>::sameType,
00619 DimensionError<false>, DimensionError<true> >::RET::RET;
00620 return *this;
00621 }
00622
00624
00645 template<template<class, class, class> class Q1,
00646 class BT1, class DIM1, class DU1, class SU1, class DD1>
00647 Variable & operator= (const Q1<Quantity<DIM1, BT1,
00648 Loki::Typelist<unit::NonPrefixable<BT1, unit::GenericUnit>,
00649 Loki::NullType>, DU1, ST>, SU1, DD1> &quantity)
00650 {void *this_pointer = this;
00651 const void *new_pointer = &quantity;
00652
00653 if (this_pointer != new_pointer)
00654 {_value = Reverse<SU, ST>::VAL
00655 (Standardize<typename
00656 CheckSecondDimension<Variable<PQ, SU, DD>,
00657 Q1<Quantity<DIM1, BT1,
00658 Loki::Typelist<unit::NonPrefixable<BT1,
00659 unit::GenericUnit>, Loki::NullType>,
00660 DU1, ST>, SU1, DD1> >::RET::Unit, ST>::VAL
00661 (quantity.value ()));
00662 }
00663 return *this;
00664 }
00665
00667
00670 Variable & operator= (const Dynamic<ST> &dynamic)
00671 {if (dynamic._rl_n == RL_N && dynamic._rl_d == RL_D &&
00672 dynamic._rm_n == RM_N && dynamic._rm_d == RM_D &&
00673 dynamic._rt_n == RT_N && dynamic._rt_d == RT_D &&
00674 dynamic._re_n == RE_N && dynamic._re_d == RE_D &&
00675 dynamic._rte_n == RTE_N && dynamic._rte_d == RTE_D &&
00676 dynamic._ra_n == RA_N && dynamic._ra_d == RA_D &&
00677 dynamic._rlu_n == RLU_N && dynamic._rlu_d == RLU_D)
00678 _value = Reverse<SU, ST>::VAL (dynamic.value ());
00679
00680 else
00681 {throw DimensionMismatch ();}
00682
00683 return *this;
00684 }
00685
00687
00689 ST value (void) const {return _value;}
00690
00692
00695 ST standard_value (void) const
00696 {return Standardize<SU, ST>::VAL (_value);}
00697
00699
00704 template<class NU>
00705 ST value (const unit::NonPrefixable<BT, NU> &) const
00706 {return Reverse<typename CheckAgainstAllUnits<
00707 unit::NonPrefixable<BT, NU>, UL>::RET, ST>::VAL
00708 (Standardize<SU, ST>::VAL (_value));}
00709
00711
00716 template<class NU, class P>
00717 ST value
00718 (const unit::Prefixed<unit::Prefixable<BT, NU>, P> &) const
00719 {return Reverse<typename CheckAgainstAllUnits<
00720 unit::Prefixed<unit::Prefixable<BT, NU>, P>, UL>::RET,
00721 ST>::VAL (Standardize<SU, ST>::VAL (_value));}
00722
00724
00729 template<class CUL, class EL>
00730 ST value
00731 (const unit::Composed<unit::ComposeBase<BT, CUL>, EL> &)
00732 const
00733 {return Reverse<typename CheckAgainstAllUnits<
00734 unit::Composed<unit::ComposeBase<BT, CUL>, EL>, UL>::RET,
00735 ST>::VAL (Standardize<SU, ST>::VAL (_value));}
00736
00738
00747 ST value (const std::string &symbol)
00748 {ST value;
00749 ::unit::Unit<BT> *unitp = PQ::findBySymbol (symbol);
00750
00751 value = dynamic_reverse<UL>::VAL
00752 (Standardize<SU, ST>::VAL (_value), *unitp);
00753
00754 delete (unitp);
00755
00756 return value;
00757 }
00758
00760
00766 template<class NU>
00767 Variable<PQ, NU> operator () (const NU &) const
00768 {return Variable<PQ, NU> (_value, SU());}
00769
00771
00773 const std::string unitsymbol (void) const
00774 {return SU::Symbol ();}
00775
00777
00779 static std::string Unitsymbol (void) {return SU::Symbol ();}
00780
00782
00784 const std::string unitname (void) const {return SU::Name ();}
00785
00787
00789 static std::string Unitname (void) {return SU::Name ();}
00790
00792
00808 Variable & operator+= (const Variable &variable)
00809 {if(BSUtilities::IF<BSUtilities::SameType<UL,
00810 Loki::Typelist<unit::NonPrefixable<BT, unit::GenericUnit>,
00811 Loki::NullType> >::sameType, AssignmentError<true>,
00812 AssignmentError<false> >::RET::RET)
00813 _value += variable.value ();
00814 return *this;
00815 }
00816
00818
00827 template <template<class, class, class> class Q1,
00828 class SU1, class DD1>
00829 Variable & operator+= (const Q1<PQ, SU1, DD1> &quantity)
00830 {_value = Reverse<SU, ST>::VAL
00831 (Standardize<Unit, ST>::VAL (_value) +
00832 Standardize<SU1, ST>::VAL (quantity.value ()));
00833 return *this;
00834 }
00835
00837
00845 template <template<class, class, class> class Q1, class BT1,
00846 class DIM1, class DU1, class SU1, class DD1>
00847 Variable & operator+= (const Q1<Quantity<DIM1, BT1,
00848 Loki::Typelist<unit::NonPrefixable<BT1, unit::GenericUnit>,
00849 Loki::NullType>, DU1, ST>, SU1, DD1> &quantity)
00850 {_value = Reverse<SU, ST>::VAL
00851 (Standardize<Unit, ST>::VAL (_value) +
00852 Standardize<typename CheckSecondDimension<
00853 Variable<PQ, SU, DD>, Q1<Quantity<DIM1, BT1,
00854 Loki::Typelist<unit::NonPrefixable<BT1,
00855 unit::GenericUnit>, Loki::NullType>, DU1, ST>,
00856 SU1, DD1> >::RET::Unit, ST>::VAL
00857 (quantity.value ()));
00858 return *this;
00859 }
00860
00862
00868 template<template<class, class, class> class Q1, class PQ1,
00869 class SU1, class DD1>
00870 Variable & operator+= (const Q1<PQ1, SU1, DD1> &quantity)
00871 {
00872 static const bool RET =
00873 BSUtilities::IF<BSUtilities::SameType<PQ, PQ1>::sameType,
00874 DimensionError<false>, DimensionError<true> >::RET::RET;
00875 return *this;
00876 }
00877
00879
00893 Variable & operator-= (const Variable &new_variable)
00894 {if(BSUtilities::IF<BSUtilities::SameType<UL,
00895 Loki::Typelist<unit::NonPrefixable<BT, unit::GenericUnit>,
00896 Loki::NullType> >::sameType, AssignmentError<true>,
00897 AssignmentError<false> >::RET::RET)
00898 _value -= new_variable.value ();
00899 return *this;
00900 }
00901
00903
00911 template <template<class, class, class> class Q1,
00912 class SU1, class DD1>
00913 Variable & operator-= (const Q1<PQ, SU1, DD1> &quantity)
00914 {_value = Reverse<SU, ST>::VAL
00915 (Standardize<Unit, ST>::VAL (_value) -
00916 Standardize<SU1, ST>::VAL (quantity.value ()));
00917 return *this;
00918 }
00919
00921
00927 template <template<class, class, class> class Q1, class BT1,
00928 class DIM1, class DU1, class SU1, class DD1>
00929 Variable & operator-= (const Q1<Quantity<DIM1, BT1,
00930 Loki::Typelist<unit::NonPrefixable<BT1, unit::GenericUnit>,
00931 Loki::NullType>, DU1, ST>, SU1, DD1> &quantity)
00932 {_value = Reverse<SU, ST>::VAL
00933 (Standardize<Unit, ST>::VAL (_value) -
00934 Standardize<typename CheckSecondDimension<
00935 Variable<PQ, SU, DD>, Q1<Quantity<DIM1, BT1,
00936 Loki::Typelist<unit::NonPrefixable<BT1,
00937 unit::GenericUnit>, Loki::NullType>, DU1, ST>,
00938 SU1, DD1> >::RET::Unit, ST>::VAL
00939 (quantity.value ()));
00940 return *this;
00941 }
00942
00944
00948 template<template<class, class, class > class Q1,
00949 class PQ1, class SU1, class DD1>
00950 Variable & operator-= (const Q1<PQ1, SU1, DD1> &quantity)
00951 {
00952 static const bool RET =
00953 BSUtilities::IF<BSUtilities::SameType<PQ, PQ1>::sameType,
00954 DimensionError<false>, DimensionError<true> >::RET::RET;
00955 return *this;
00956 }
00957
00959
00962 Variable & operator*= (const ST factor)
00963 {_value *= factor;
00964 return *this;
00965 }
00966
00968
00972 Variable & operator/= (const ST divisor)
00973 {_value /= divisor;
00974 return *this;
00975 }
00976
00978
00980 Variable operator+ (void) const
00981 {return Variable (*this);}
00982
00984
00986 Variable operator- (void) const
00987 {return Variable (*this) *= ST(-1.0);}
00988
00990
00993 template<class Q>
00994 struct Plus
00995 {static Variable<PQ, SU, DD> exec
00996 (const Variable<PQ, SU, DD> &variable, const Q &quantity)
00997 {Variable<PQ, SU, DD> new_object (variable);
00998 return new_object += quantity;
00999 }
01000 };
01001
01003
01006 template<template<class, class, class> class Q1,
01007 class DIM1, class BT1, class UL1, class DU1, class SU1, class DD1>
01008 struct PlusGenerated
01009 {static Variable<PQ, SU, DD> exec
01010 (const Variable<PQ, SU, DD> &variable,
01011 const Q1<Quantity<DIM1, BT1, UL1, DU1, ST>, SU1, DD1>
01012 &quantity)
01013 {return Variable<PQ, SU, DD> (Reverse<SU, ST>::VAL
01014 (Standardize<SU, ST>::VAL (variable.value ())
01015 + Standardize<typename CheckSecondDimension<
01016 Variable<PQ, SU, DD>, Q1<Quantity<DIM1, BT1, UL1, DU1,
01017 ST>, SU1, DD1> >::RET::Unit, ST>::VAL
01018 (quantity.value ())));
01019 }
01020 };
01021
01023
01029 template <template<class, class, class> class Q1, class DIM1,
01030 class BT1, class UL1, class DU1, class SU1, class DD1>
01031 Variable operator+ (const Q1<Quantity<DIM1, BT1, UL1, DU1,
01032 ST>, SU1, DD1> &quantity) const
01033 {return BSUtilities::IF<BSUtilities::SameType<UL,
01034 Loki::Typelist<unit::NonPrefixable<BT,
01035 unit::GenericUnit>, Loki::NullType> >::sameType,
01036 typename PlusGenerated<Q1, DIM1, BT1, UL1,
01037 DU1, SU1, DD1>::PlusGenerated,
01038 typename Plus<Q1<Quantity<DIM1, BT1, UL1, DU1, ST>,
01039 SU1, DD1> >::Plus>::RET::exec (*this, quantity);
01040 }
01041
01043
01050 Variable operator+ (const Dynamic<ST> &quantity) const
01051 {Variable new_variable (quantity);
01052 return *this + new_variable;
01053 }
01054
01056
01063 template<template<class, class, class> class Q>
01064 friend Variable operator+
01065 (const Dynamic<ST> &quantity1,
01066 const Q<Quantity<DIM, BT, UL, DU, ST>, SU, DD> &quantity2)
01067 {Variable new_variable (quantity1);
01068 return new_variable + quantity2;
01069 }
01070
01072
01075 template<class Q>
01076 struct Minus
01077 {static Variable<PQ,SU, DD> exec
01078 (const Variable<PQ, SU, DD> &variable, const Q &quantity)
01079 {Variable<PQ, SU, DD> new_object (variable);
01080 return new_object -= quantity;
01081 }
01082 };
01083
01085
01088 template<template<class, class, class> class Q1,
01089 class DIM1, class BT1, class UL1, class DU1, class SU1, class DD1>
01090 struct MinusGenerated
01091 {static Variable<PQ, SU, DD> exec
01092 (const Variable<PQ, SU, DD> &variable,
01093 const Q1<Quantity<DIM1, BT1, UL1, DU1, ST>, SU1, DD1>
01094 &quantity)
01095 {return Variable<PQ, SU, DD> (Reverse<SU, ST>::VAL
01096 (Standardize<SU, ST>::VAL (variable.value ())
01097 - Standardize<typename CheckSecondDimension<
01098 Variable<PQ, SU, DD>, Q1<Quantity<DIM1, BT1, UL1, DU1,
01099 ST>, SU1, DD1> >::RET::Unit, ST>::VAL
01100 (quantity.value ())));
01101 }
01102 };
01103
01105
01111 template <template<class, class, class> class Q1, class DIM1,
01112 class BT1, class UL1, class DU1, class SU1, class DD1>
01113 Variable operator- (const Q1<Quantity<DIM1, BT1, UL1, DU1,
01114 ST>, SU1, DD1> &quantity) const
01115 {return BSUtilities::IF<BSUtilities::SameType<UL,
01116 Loki::Typelist<unit::NonPrefixable<BT,
01117 unit::GenericUnit>, Loki::NullType> >::sameType,
01118 typename MinusGenerated<Q1, DIM1, BT1, UL1,
01119 DU1, SU1, DD1>::MinusGenerated,
01120 typename Minus<Q1<Quantity<DIM1, BT1, UL1, DU1, ST>,
01121 SU1, DD1> >::Minus>::RET::exec (*this, quantity);
01122 }
01123
01125
01131 Variable operator- (const Dynamic<ST> &quantity) const
01132 {Variable new_variable (quantity);
01133 return *this - new_variable;
01134 }
01135
01137
01144 template<template<class, class, class> class Q>
01145 friend Variable operator-
01146 (const Dynamic<ST> &quantity1,
01147 const Q<Quantity<DIM, BT, UL, DU, ST>, SU, DD> &quantity2)
01148 {Variable new_variable (quantity1);
01149 return new_variable - quantity2;
01150 }
01151
01153
01155 Variable operator* (const ST factor) const
01156 {Variable<PQ, SU, DD> new_object (*this);
01157 return new_object *= factor;
01158 }
01159
01161
01163 Variable operator/ (const ST divisor) const
01164 {Variable<PQ, SU> new_object (*this);
01165 return new_object /= divisor;
01166 }
01167
01169
01179 template <template<class, class, class> class Q1, class DD1>
01180 friend Variable operator*
01181 (const ST factor, const Q1<PQ, SU, DD1> &variable)
01182 {return Variable<PQ, SU, DD> (variable) *= factor;}
01183
01185
01189 bool operator== (const Variable &rhs_variable) const
01190 {return _value == rhs_variable.value ();}
01191
01193
01198 template <template<class, class, class> class Q1, class SU1, class DD1>
01199 bool operator== (const Q1<PQ, SU1, DD1> &rhs_variable) const
01200 {return standard_value () == rhs_variable.standard_value ();
01201 }
01202
01204
01209 template <template<class, class, class> class Q1,
01210 class DIM1, class BT1, class UL1, class DU1, class SU1, class DD1>
01211 bool operator==
01212 (const Q1<Quantity<DIM1, BT1, UL1, DU1, ST>, SU1, DD1>
01213 &rhs_variable) const
01214 {
01215 return standard_value () == Standardize<typename
01216 CheckSecondDimension<Variable<PQ, SU, DD>,
01217 Q1<Quantity<DIM1, BT1, UL1, DU1, ST>, SU1, DD1>
01218 >::RET::Unit, ST>::VAL (rhs_variable.value ());
01219 }
01220
01222
01226 bool operator!= (const Variable &rhs_variable) const
01227 {return _value != rhs_variable.value ();}
01228
01230
01235 template <template<class, class, class> class Q1, class SU1, class DD1>
01236 bool operator!= (const Q1<PQ, SU1, DD1> &rhs_variable) const
01237 {return standard_value () != rhs_variable.standard_value ();
01238 }
01239
01241
01246 template <template<class, class, class> class Q1,
01247 class DIM1, class BT1, class UL1, class DU1, class SU1, class DD1>
01248 bool operator!=
01249 (const Q1<Quantity<DIM1, BT1, UL1, DU1, ST>, SU1, DD1>
01250 &rhs_variable) const
01251 {
01252 return standard_value () != Standardize<typename
01253 CheckSecondDimension<Variable<PQ, SU, DD>,
01254 Q1<Quantity<DIM1, BT1, UL1, DU1, ST>, SU1, DD1>
01255 >::RET::Unit, ST>::VAL (rhs_variable.value ());
01256 }
01257
01259
01263 bool operator> (const Variable &rhs_variable) const
01264 {return _value > rhs_variable.value ();}
01265
01267
01272 template <template<class, class, class> class Q1, class SU1, class DD1>
01273 bool operator> (const Q1<PQ, SU1, DD1> &rhs_variable) const
01274 {return standard_value () > rhs_variable.standard_value ();
01275 }
01276
01278
01283 template <template<class, class, class> class Q1,
01284 class DIM1, class BT1, class UL1, class DU1, class SU1, class DD1>
01285 bool operator>
01286 (const Q1<Quantity<DIM1, BT1, UL1, DU1, ST>, SU1, DD1>
01287 &rhs_variable) const
01288 {
01289 return standard_value () > Standardize<typename
01290 CheckSecondDimension<Variable<PQ, SU, DD>,
01291 Q1<Quantity<DIM1, BT1, UL1, DU1, ST>, SU1, DD1>
01292 >::RET::Unit, ST>::VAL (rhs_variable.value ());
01293 }
01294
01296
01300 bool operator< (const Variable &rhs_variable) const
01301 {return _value < rhs_variable.value ();}
01302
01304
01309 template <template<class, class, class> class Q1, class SU1, class DD1>
01310 bool operator< (const Q1<PQ, SU1, DD1> &rhs_variable) const
01311 {return standard_value () < rhs_variable.standard_value ();
01312 }
01313
01315
01320 template <template<class, class, class> class Q1,
01321 class DIM1, class BT1, class UL1, class DU1, class SU1, class DD1>
01322 bool operator<
01323 (const Q1<Quantity<DIM1, BT1, UL1, DU1, ST>, SU1, DD1>
01324 &rhs_variable) const
01325 {
01326 return standard_value () < Standardize<typename
01327 CheckSecondDimension<Variable<PQ, SU, DD>,
01328 Q1<Quantity<DIM1, BT1, UL1, DU1, ST>, SU1, DD1>
01329 >::RET::Unit, ST>::VAL (rhs_variable.value ());
01330 }
01331
01333
01337 bool operator>= (const Variable &rhs_variable) const
01338 {return _value >= rhs_variable.value ();}
01339
01341
01346 template <template<class, class, class> class Q1, class SU1, class DD1>
01347 bool operator>= (const Q1<PQ, SU1, DD1> &rhs_variable) const
01348 {return standard_value () >= rhs_variable.standard_value ();
01349 }
01350
01352
01357 template <template<class, class, class> class Q1,
01358 class DIM1, class BT1, class UL1, class DU1, class SU1, class DD1>
01359 bool operator>=
01360 (const Q1<Quantity<DIM1, BT1, UL1, DU1, ST>, SU1, DD1>
01361 &rhs_variable) const
01362 {
01363 return standard_value () >= Standardize<typename
01364 CheckSecondDimension<Variable<PQ, SU, DD>,
01365 Q1<Quantity<DIM1, BT1, UL1, DU1, ST>, SU1, DD1>
01366 >::RET::Unit, ST>::VAL (rhs_variable.value ());
01367 }
01368
01370
01374 bool operator<= (const Variable &rhs_variable) const
01375 {return _value <= rhs_variable.value ();}
01376
01378
01383 template <template<class, class, class> class Q1, class SU1, class DD1>
01384 bool operator<= (const Q1<PQ, SU1, DD1> &rhs_variable) const
01385 {return standard_value () <= rhs_variable.standard_value ();
01386 }
01387
01389
01394 template <template<class, class, class> class Q1,
01395 class DIM1, class BT1, class UL1, class DU1, class SU1, class DD1>
01396 bool operator<=
01397 (const Q1<Quantity<DIM1, BT1, UL1, DU1, ST>, SU1, DD1>
01398 &rhs_variable) const
01399 {
01400 return standard_value () <= Standardize<typename
01401 CheckSecondDimension<Variable<PQ, SU, DD>,
01402 Q1<Quantity<DIM1, BT1, UL1, DU1, ST>, SU1, DD1>
01403 >::RET::Unit, ST>::VAL (rhs_variable.value ());
01404 }
01405
01407
01412 template<class Q>
01413 typename GenerateVariable<Variable, Q>::Add operator*
01414 (const Q &factor) const
01415 {
01416 return typename GenerateVariable<Variable, Q>::Add
01417 (standard_value () * factor.standard_value ());
01418 }
01419
01421
01426 template<class Q>
01427 typename GenerateVariable<Variable, Q>::Sub operator/
01428 (const Q &factor) const
01429 {
01430 return typename GenerateVariable<Variable, Q>::Sub
01431 (standard_value () / factor.standard_value ());
01432 }
01433
01435
01438 friend
01439 typename GenerateVariable<Variable, Loki::NullType>::Inv
01440 operator/ (const ST numerator, const Variable &factor)
01441 {
01442 return typename
01443 GenerateVariable<Variable, Loki::NullType>::Inv
01444 (numerator / factor.standard_value ());
01445 }
01446
01448
01454 template<long N, long D>
01455 typename GenerateVariable<Variable,
01456 BSUtilities::Rational<N, D> >::Mult
01457 pow (const BSUtilities::Rational<N, D> &) const
01458 {return std::pow (standard_value (),
01459 static_cast<double>(N)/static_cast<double>(D));}
01460
01462
01468 template<int I>
01469 typename GenerateVariable<Variable,
01470 BSUtilities::Rational<I, long(1)> >::Mult
01471 pow (const typename Loki::Int2Type<I>) const
01472 {return std::pow (standard_value (), I);}
01473
01475
01481 template<class T>
01482 Dynamic<ST> pow (const T &exp) const
01483 {return Dynamic<ST>::pow (*this, exp);}
01484
01485
01487
01489 friend typename
01490 GenerateVariable<Variable, BSUtilities::Rational<1, 2>
01491 >::Mult sqrt (const Variable &variable)
01492 {
01493 return typename
01494 GenerateVariable<Variable, BSUtilities::Rational<1, 2>
01495 >::Mult (std::sqrt(variable.standard_value ()));
01496 }
01497
01499
01501 typename
01502 GenerateVariable<Variable, BSUtilities::Rational<1, 2>
01503 >::Mult sqrt (void) const
01504 {
01505 return typename
01506 GenerateVariable<Variable, BSUtilities::Rational<1, 2>
01507 >::Mult (std::sqrt(standard_value ()));
01508 }
01509
01511
01514 std::ostream & print_value (std::ostream &os) const
01515 {return os << _value << " " << SU::Symbol ();}
01516
01518
01520 void operator>> (std::string &str) const
01521 {str = BSUtilities::Conversion<Variable>::to_string (*this);}
01522
01524
01528 std::ostream & operator>> (std::ostream &os) const
01529 {return this->print (os);}
01530
01532
01534 void read_value (const std::string &str);
01535
01537
01539 friend void operator>>
01540 (const std::string &str, Variable &variable)
01541 {variable.read_value (str);}
01542
01544 void operator<< (const std::string &str) {read_value (str);}
01545
01547 void operator= (const std::string &str) {this->read_value (str);}
01548
01550
01554 std::istream & operator<< (std::istream &is)
01555 {std::string string; getline (is, string);
01556 this->read_value (string); return is;}
01557
01559
01562 friend std::istream & operator>>
01563 (std::istream &is, Variable &variable) {return variable << is;}
01564
01566
01571 void save (BSUtilities::xmlw::XmlStream &os) const
01572 {
01573 os << BSUtilities::xmlw::tag (Quantities::TAG)
01574 << BSUtilities::xmlw::attr (Quantities::MODETAG) << MODE
01575 << BSUtilities::xmlw::attr (Quantities::BASENAMETAG) << Name<ABQ>::String
01576 << BSUtilities::xmlw::attr (Quantities::VALUETAG) << _value
01577 << BSUtilities::xmlw::attr (Quantities::UNITTAG) << SU::Name ()
01578 << BSUtilities::xmlw::endtag (Quantities::TAG);
01579
01580 }
01581
01583
01586 void load (const TiXmlHandle node) const
01587 {
01588 TiXmlElement *element = node.Element();
01589
01590 if (element
01591 && (element->ValueStr () == Quantities::TAG)
01592 && (element->Attribute (Quantities::MODETAG) == MODE))
01593 {
01594
01595 }
01596 else
01597 throw LoadError
01598 ("error loading variable quantity: incorrect element");
01599 }
01600
01602
01606
01607
01608
01610
01612 static const std::string MODE;
01613
01614 };
01615
01617 template<long RL_N, long RL_D, long RM_N, long RM_D,
01618 long RT_N, long RT_D, long RE_N, long RE_D, long RTE_N, long RTE_D,
01619 long RA_N, long RA_D, long RLU_N, long RLU_D,
01620 class BT, class UL, class DU, class SU, class ST, class R,
01621 class DDH, class DDT>
01622 const std::string Variable<Quantity<dimension::Dimension<
01623 BSUtilities::Rational<RL_N, RL_D>,
01624 BSUtilities::Rational<RM_N, RM_D>,
01625 BSUtilities::Rational<RT_N, RT_D>,
01626 BSUtilities::Rational<RE_N, RE_D>,
01627 BSUtilities::Rational<RTE_N, RTE_D>,
01628 BSUtilities::Rational<RA_N, RA_D>,
01629 BSUtilities::Rational<RLU_N, RLU_D> >, BT, UL, DU, ST>,
01630 SU, Loki::Functor<R, Loki::Typelist<DDH, DDT>
01631 > >::MODE = "variable";
01632
01633 template<long RL_N, long RL_D, long RM_N, long RM_D,
01634 long RT_N, long RT_D, long RE_N, long RE_D, long RTE_N, long RTE_D,
01635 long RA_N, long RA_D, long RLU_N, long RLU_D,
01636 class BT, class UL, class DU, class SU, class ST, class R,
01637 class DDH, class DDT>
01638 const typename Loki::Functor<R, typename Loki::Typelist<DDH, DDT> >
01639 Variable<Quantity<dimension::Dimension<
01640 BSUtilities::Rational<RL_N, RL_D>,
01641 BSUtilities::Rational<RM_N, RM_D>,
01642 BSUtilities::Rational<RT_N, RT_D>,
01643 BSUtilities::Rational<RE_N, RE_D>,
01644 BSUtilities::Rational<RTE_N, RTE_D>,
01645 BSUtilities::Rational<RA_N, RA_D>,
01646 BSUtilities::Rational<RLU_N, RLU_D> >, BT, UL, DU, ST>,
01647 SU, Loki::Functor<R, Loki::Typelist<DDH, DDT>
01648 > >::_defaultDD =
01649 typename Loki::Functor<R, typename Loki::Typelist<DDH, DDT> >
01650 (defaultDedimensionalizer);
01651
01656 template<long RL_N, long RL_D, long RM_N, long RM_D,
01657 long RT_N, long RT_D, long RE_N, long RE_D, long RTE_N, long RTE_D,
01658 long RA_N, long RA_D, long RLU_N, long RLU_D,
01659 class BT, class UL, class DU, class SU, class ST, class R,
01660 class DDH, class DDT>
01661 void
01662 Variable<Quantity<dimension::Dimension<
01663 BSUtilities::Rational<RL_N, RL_D>,
01664 BSUtilities::Rational<RM_N, RM_D>,
01665 BSUtilities::Rational<RT_N, RT_D>,
01666 BSUtilities::Rational<RE_N, RE_D>,
01667 BSUtilities::Rational<RTE_N, RTE_D>,
01668 BSUtilities::Rational<RA_N, RA_D>,
01669 BSUtilities::Rational<RLU_N, RLU_D> >, BT, UL, DU, ST>,
01670 SU, Loki::Functor<R, Loki::Typelist<DDH, DDT> > >
01671 ::read_value (const std::string &str)
01672 {
01673 std::string value;
01674 std::string unit;
01675
01676 std::string::size_type start;
01677 std::string::size_type end;
01678
01679 start = str.find_first_not_of (" \0");
01680 end = start;
01681
01682 if (RS.name ())
01683 {
01684 if (start == std::string::npos)
01685 throw InputError ();
01686
01687 else
01688 {
01689 end = str.find_first_of (" \0", start);
01690
01691 if (end == std::string::npos)
01692 ABQ::namestring = str.substr (start);
01693
01694 else
01695 ABQ::namestring = (str.substr (start, end - start));
01696 }
01697 }
01698
01699 start = str.find_first_not_of (" \0", end);
01700 end = start;
01701
01702 if (RS.symbol ())
01703 {
01704 if (start == std::string::npos)
01705 throw InputError ();
01706
01707 else
01708 {
01709 end = str.find_first_of (" \0", start);
01710
01711 if (end == std::string::npos)
01712 ABQ::symbolstring = str.substr (start);
01713
01714 else
01715 ABQ::symbolstring = (str.substr (start, end - start));
01716 }
01717 }
01718
01719 start = str.find_first_not_of (" \0", end);
01720 end = start;
01721
01722 if (RS.equal () && (RS.name () || RS.symbol ()))
01723 {
01724 if (start == std::string::npos)
01725 throw InputError ();
01726
01727 else
01728 {
01729 end = str.find_first_of (" \0", start);
01730
01731 if (end == std::string::npos)
01732 throw InputError ();
01733
01734 else if (str.substr (start, end - start) != "=")
01735 throw InputError ();
01736 }
01737 }
01738
01739 start = str.find_first_not_of (" \0", end);
01740 end = start;
01741
01742 if (start == std::string::npos)
01743 throw InputError ();
01744
01745 else
01746 {
01747 end = str.find_first_of (" \0", start);
01748
01749 if (end == std::string::npos)
01750 value = str.substr (start);
01751
01752 else
01753 value = str.substr (start, end - start);
01754
01755 start = str.find_first_not_of (" \0", end);
01756
01757 if (start == std::string::npos)
01758 unit = "";
01759
01760 else
01761 {
01762 end = str.find_first_of (" \0\n", start);
01763
01764 if ((end = std::string::npos))
01765 unit = str.substr (start);
01766
01767 else
01768 unit = str.substr (start, end - start);
01769 }
01770 }
01771
01772 ST intermediate;
01773
01774 try {
01775 intermediate = BSUtilities::Conversion<ST>::string_to (value);
01776 }
01777
01778 catch (BSUtilities::ConversionFailure) {throw InputError ();}
01779
01780 start = unit.find_first_not_of (" \0");
01781 end = start;
01782
01783
01784
01785
01786 if (start == std::string::npos)
01787 {
01788 std::string assume_unit;
01789
01790
01791
01792
01793
01794 if ((assume_unit = RS.unit ()) != "")
01795 {
01796 try {
01797 ::unit::Unit<BT> *unitp = PQ::findBySymbol (assume_unit);
01798 intermediate
01799 = Reverse<SU, ST>::VAL
01800 (dynamic_standardize<UL>::VAL (intermediate, *unitp));
01801
01802 delete (unitp);
01803 }
01804
01805 catch (UnitMismatch) {throw InputError ();}
01806
01807 }
01808 }
01809
01810
01811
01812
01813 else
01814 {
01815 end = unit.find_first_of (" \0", start);
01816 try {
01817 ::unit::Unit<BT> *unitp
01818 = PQ::findBySymbol (unit.substr (start, end - start));
01819
01820 intermediate
01821 = Reverse<SU, ST>::VAL
01822 (dynamic_standardize<UL>::VAL (intermediate, *unitp));
01823
01824 delete (unitp);
01825 }
01826 catch (UnitMismatch) {throw InputError ();}
01827 }
01828
01829
01830 _value = intermediate;
01831
01832 }
01833
01835
01840 template<template<class, class, class> class Q1, class BT1,
01841 long RL1_N, long RL1_D, long RM1_N, long RM1_D,
01842 long RT1_N, long RT1_D, long RE1_N, long RE1_D,
01843 long RTE1_N, long RTE1_D, long RA1_N, long RA1_D,
01844 long RLU1_N, long RLU1_D, class UL1, class DU1, class SU1,
01845 class DD1,
01846 template<class, class, class> class Q2, class BT2,
01847 long RL2_N, long RL2_D, long RM2_N, long RM2_D,
01848 long RT2_N, long RT2_D, long RE2_N, long RE2_D,
01849 long RTE2_N, long RTE2_D, long RA2_N, long RA2_D,
01850 long RLU2_N, long RLU2_D,
01851 class UL2, class DU2, class SU2, class DD2, class ST>
01852 struct GenerateVariable
01853 <Q1<Quantity<
01854 dimension::Dimension<BSUtilities::Rational<RL1_N, RL1_D>,
01855 BSUtilities::Rational<RM1_N, RM1_D>,
01856 BSUtilities::Rational<RT1_N, RT1_D>,
01857 BSUtilities::Rational<RE1_N, RE1_D>,
01858 BSUtilities::Rational<RTE1_N, RTE1_D>,
01859 BSUtilities::Rational<RA1_N, RA1_D>,
01860 BSUtilities::Rational<RLU1_N, RLU1_D> >,
01861 BT1, UL1, DU1, ST>, SU1, DD1>,
01862 Q2<Quantity<
01863 dimension::Dimension<BSUtilities::Rational<RL2_N, RL2_D>,
01864 BSUtilities::Rational<RM2_N, RM2_D>,
01865 BSUtilities::Rational<RT2_N, RT2_D>,
01866 BSUtilities::Rational<RE2_N, RE2_D>,
01867 BSUtilities::Rational<RTE2_N, RTE2_D>,
01868 BSUtilities::Rational<RA2_N, RA2_D>,
01869 BSUtilities::Rational<RLU2_N, RLU2_D> >,
01870 BT2, UL2, DU2, ST>, SU2, DD2> >
01871 {
01872 private:
01874 typedef typename
01875 dimension::Dimension<BSUtilities::Rational<RL1_N, RL1_D>,
01876 BSUtilities::Rational<RM1_N, RM1_D>,
01877 BSUtilities::Rational<RT1_N, RT1_D>,
01878 BSUtilities::Rational<RE1_N, RE1_D>,
01879 BSUtilities::Rational<RTE1_N, RTE1_D>,
01880 BSUtilities::Rational<RA1_N, RA1_D>,
01881 BSUtilities::Rational<RLU1_N, RLU1_D> >
01882 ::template Add<dimension::Dimension<
01883 BSUtilities::Rational<RL2_N, RL2_D>,
01884 BSUtilities::Rational<RM2_N, RM2_D>,
01885 BSUtilities::Rational<RT2_N, RT2_D>,
01886 BSUtilities::Rational<RE2_N, RE2_D>,
01887 BSUtilities::Rational<RTE2_N, RTE2_D>,
01888 BSUtilities::Rational<RA2_N, RA2_D>,
01889 BSUtilities::Rational<RLU2_N, RLU2_D> > > AddT;
01890
01891 typedef unit::NonPrefixable<GenericClass<typename AddT::Res>,
01892 unit::GenericUnit> AddU;
01893 typedef Loki::Typelist<AddU, Loki::NullType> AddUnits;
01894 typedef Quantity<typename AddT::Res,
01895 GenericClass<typename AddT::Res>, AddUnits, AddU, ST> AddNewQ;
01896
01898 typedef typename
01899 dimension::Dimension<BSUtilities::Rational<RL1_N, RL1_D>,
01900 BSUtilities::Rational<RM1_N, RM1_D>,
01901 BSUtilities::Rational<RT1_N, RT1_D>,
01902 BSUtilities::Rational<RE1_N, RE1_D>,
01903 BSUtilities::Rational<RTE1_N, RTE1_D>,
01904 BSUtilities::Rational<RA1_N, RA1_D>,
01905 BSUtilities::Rational<RLU1_N, RLU1_D> >
01906 ::template Sub<dimension::Dimension<
01907 BSUtilities::Rational<RL2_N, RL2_D>,
01908 BSUtilities::Rational<RM2_N, RM2_D>,
01909 BSUtilities::Rational<RT2_N, RT2_D>,
01910 BSUtilities::Rational<RE2_N, RE2_D>,
01911 BSUtilities::Rational<RTE2_N, RTE2_D>,
01912 BSUtilities::Rational<RA2_N, RA2_D>,
01913 BSUtilities::Rational<RLU2_N, RLU2_D> > > SubT;
01914
01915 typedef unit::NonPrefixable<GenericClass<typename SubT::Res>,
01916 unit::GenericUnit> SubU;
01917 typedef Loki::Typelist<SubU, Loki::NullType> SubUnits;
01918 typedef Quantity<typename SubT::Res,
01919 GenericClass<typename SubT::Res>, SubUnits, SubU, ST> SubNewQ;
01920
01921 public:
01922 typedef Variable<AddNewQ, AddU> Add;
01923 typedef Variable<SubNewQ, SubU> Sub;
01924 };
01925
01927
01932 template<template<class, class, class> class Q1, class BT1,
01933 long RL1_N, long RL1_D, long RM1_N, long RM1_D,
01934 long RT1_N, long RT1_D, long RE1_N, long RE1_D,
01935 long RTE1_N, long RTE1_D, long RA1_N, long RA1_D,
01936 long RLU1_N, long RLU1_D,
01937 class UL1, class DU1, class SU1, class DD1, class ST1>
01938 struct GenerateVariable
01939 <Q1<Quantity<
01940 dimension::Dimension<BSUtilities::Rational<RL1_N, RL1_D>,
01941 BSUtilities::Rational<RM1_N, RM1_D>,
01942 BSUtilities::Rational<RT1_N, RT1_D>,
01943 BSUtilities::Rational<RE1_N, RE1_D>,
01944 BSUtilities::Rational<RTE1_N, RTE1_D>,
01945 BSUtilities::Rational<RA1_N, RA1_D>,
01946 BSUtilities::Rational<RLU1_N, RLU1_D> >,
01947 BT1, UL1, DU1, ST1>, SU1, DD1>, Loki::NullType>
01948 {
01949 private:
01951 typedef typename
01952 dimension::Dimension<BSUtilities::Rational<RL1_N, RL1_D>,
01953 BSUtilities::Rational<RM1_N, RM1_D>,
01954 BSUtilities::Rational<RT1_N, RT1_D>,
01955 BSUtilities::Rational<RE1_N, RE1_D>,
01956 BSUtilities::Rational<RTE1_N, RTE1_D>,
01957 BSUtilities::Rational<RA1_N, RA1_D>,
01958 BSUtilities::Rational<RLU1_N, RLU1_D> >::Inv InvT;
01959
01960 typedef unit::NonPrefixable<GenericClass<typename InvT::Res>,
01961 unit::GenericUnit> InvU;
01962 typedef Loki::Typelist<InvU, Loki::NullType> InvUnits;
01963 typedef Quantity< typename InvT::Res,
01964 GenericClass<typename InvT::Res>, InvUnits, InvU, ST1> InvNewQ;
01965
01966 public:
01967 typedef Variable<InvNewQ, InvU> Inv;
01968 };
01969
01971
01976 template<template<class, class, class> class Q1, class BT1,
01977 long RL1_N, long RL1_D, long RM1_N, long RM1_D,
01978 long RT1_N, long RT1_D, long RE1_N, long RE1_D,
01979 long RTE1_N, long RTE1_D, long RA1_N, long RA1_D,
01980 long RLU1_N, long RLU1_D, class UL1, class DU1, class R, class DDH, class DDT,
01981 class ST1, class SU1, long N, long D>
01982 struct GenerateVariable
01983 <Q1<Quantity<
01984 dimension::Dimension<BSUtilities::Rational<RL1_N, RL1_D>,
01985 BSUtilities::Rational<RM1_N, RM1_D>,
01986 BSUtilities::Rational<RT1_N, RT1_D>,
01987 BSUtilities::Rational<RE1_N, RE1_D>,
01988 BSUtilities::Rational<RTE1_N, RTE1_D>,
01989 BSUtilities::Rational<RA1_N, RA1_D>,
01990 BSUtilities::Rational<RLU1_N, RLU1_D> >,
01991 BT1, UL1, DU1, ST1>, SU1, Loki::Functor<R, Loki::Typelist<DDH, DDT> > >,
01992 BSUtilities::Rational<N, D> >
01993 {
01994 private:
01996 typedef typename
01997 dimension::Dimension<BSUtilities::Rational<RL1_N, RL1_D>,
01998 BSUtilities::Rational<RM1_N, RM1_D>,
01999 BSUtilities::Rational<RT1_N, RT1_D>,
02000 BSUtilities::Rational<RE1_N, RE1_D>,
02001 BSUtilities::Rational<RTE1_N, RTE1_D>,
02002 BSUtilities::Rational<RA1_N, RA1_D>,
02003 BSUtilities::Rational<RLU1_N, RLU1_D> >::template
02004 Mult<N, D> MultT;
02005
02006 typedef unit::NonPrefixable<GenericClass<typename MultT::Res>,
02007 unit::GenericUnit> MultU;
02008 typedef Loki::Typelist<MultU, Loki::NullType> MultUnits;
02009 typedef Quantity<typename MultT::Res,
02010 GenericClass<typename MultT::Res>, MultUnits, MultU, ST1>
02011 MultNewQ;
02012
02013 public:
02014 typedef Variable<MultNewQ, MultU> Mult;
02015 };
02016
02018
02025 template<template<class, class, class> class Q1, class BT1,
02026 long RL1_N, long RL1_D, long RM1_N, long RM1_D,
02027 long RT1_N, long RT1_D, long RE1_N, long RE1_D,
02028 long RTE1_N, long RTE1_D, long RA1_N, long RA1_D,
02029 long RLU1_N, long RLU1_D,
02030 class UL1, class DU1, class ST1, class SU1, class R,
02031 class DDH, class DDT, int I>
02032 inline typename GenerateVariable
02033 <Q1<Quantity<
02034 dimension::Dimension<BSUtilities::Rational<RL1_N, RL1_D>,
02035 BSUtilities::Rational<RM1_N, RM1_D>,
02036 BSUtilities::Rational<RT1_N, RT1_D>,
02037 BSUtilities::Rational<RE1_N, RE1_D>,
02038 BSUtilities::Rational<RTE1_N, RTE1_D>,
02039 BSUtilities::Rational<RA1_N, RA1_D>,
02040 BSUtilities::Rational<RLU1_N, RLU1_D> >,
02041 BT1, UL1, DU1, ST1>, SU1,
02042 Loki::Functor<R, Loki::Typelist<DDH, DDT> > >,
02043 BSUtilities::Rational<I, long(1)> >::Mult
02044 pow (const
02045 Q1<Quantity<
02046 dimension::Dimension<BSUtilities::Rational<RL1_N, RL1_D>,
02047 BSUtilities::Rational<RM1_N, RM1_D>,
02048 BSUtilities::Rational<RT1_N, RT1_D>,
02049 BSUtilities::Rational<RE1_N, RE1_D>,
02050 BSUtilities::Rational<RTE1_N, RTE1_D>,
02051 BSUtilities::Rational<RA1_N, RA1_D>,
02052 BSUtilities::Rational<RLU1_N, RLU1_D> >,
02053 BT1, UL1, DU1, ST1>, SU1,
02054 Loki::Functor<R, Loki::Typelist<DDH, DDT> > >
02055 &quantity, typename Loki::Int2Type<I>)
02056 {
02057 return typename
02058 GenerateVariable<
02059 Q1<Quantity<
02060 dimension::Dimension<BSUtilities::Rational<RL1_N, RL1_D>,
02061 BSUtilities::Rational<RM1_N, RM1_D>,
02062 BSUtilities::Rational<RT1_N, RT1_D>,
02063 BSUtilities::Rational<RE1_N, RE1_D>,
02064 BSUtilities::Rational<RTE1_N, RTE1_D>,
02065 BSUtilities::Rational<RA1_N, RA1_D>,
02066 BSUtilities::Rational<RLU1_N, RLU1_D> >,
02067 BT1, UL1, DU1, ST1>, SU1,
02068 Loki::Functor<R, Loki::Typelist<DDH, DDT> > >,
02069 BSUtilities::Rational<long(I), long(1)> >::Mult
02070 (quantity.pow(Loki::Int2Type<I> ()));
02071 }
02072
02074
02082 template<template<class, class, class> class Q1, class BT1,
02083 long RL1_N, long RL1_D, long RM1_N, long RM1_D,
02084 long RT1_N, long RT1_D, long RE1_N, long RE1_D,
02085 long RTE1_N, long RTE1_D, long RA1_N, long RA1_D,
02086 long RLU1_N, long RLU1_D,
02087 class UL1, class DU1, class ST1, class SU1, class R,
02088 class DDH, class DDT, long N, long D>
02089 inline typename GenerateVariable
02090 <Q1<Quantity<
02091 dimension::Dimension<BSUtilities::Rational<RL1_N, RL1_D>,
02092 BSUtilities::Rational<RM1_N, RM1_D>,
02093 BSUtilities::Rational<RT1_N, RT1_D>,
02094 BSUtilities::Rational<RE1_N, RE1_D>,
02095 BSUtilities::Rational<RTE1_N, RTE1_D>,
02096 BSUtilities::Rational<RA1_N, RA1_D>,
02097 BSUtilities::Rational<RLU1_N, RLU1_D> >,
02098 BT1, UL1, DU1, ST1>, SU1,
02099 Loki::Functor<R, Loki::Typelist<DDH, DDT> > >,
02100 BSUtilities::Rational<N, D> >::Mult
02101 pow (const
02102 Q1<Quantity<
02103 dimension::Dimension<BSUtilities::Rational<RL1_N, RL1_D>,
02104 BSUtilities::Rational<RM1_N, RM1_D>,
02105 BSUtilities::Rational<RT1_N, RT1_D>,
02106 BSUtilities::Rational<RE1_N, RE1_D>,
02107 BSUtilities::Rational<RTE1_N, RTE1_D>,
02108 BSUtilities::Rational<RA1_N, RA1_D>,
02109 BSUtilities::Rational<RLU1_N, RLU1_D> >,
02110 BT1, UL1, DU1, ST1>, SU1,
02111 Loki::Functor<R, Loki::Typelist<DDH, DDT> > >
02112 &quantity, const BSUtilities::Rational<N, D> &)
02113 { return typename
02114 GenerateVariable
02115 <Q1<Quantity<
02116 dimension::Dimension<BSUtilities::Rational<RL1_N, RL1_D>,
02117 BSUtilities::Rational<RM1_N, RM1_D>,
02118 BSUtilities::Rational<RT1_N, RT1_D>,
02119 BSUtilities::Rational<RE1_N, RE1_D>,
02120 BSUtilities::Rational<RTE1_N, RTE1_D>,
02121 BSUtilities::Rational<RA1_N, RA1_D>,
02122 BSUtilities::Rational<RLU1_N, RLU1_D> >,
02123 BT1, UL1, DU1, ST1>, SU1,
02124 Loki::Functor<R, Loki::Typelist<DDH, DDT> > >,
02125 BSUtilities::Rational<N, D> >::Mult
02126 (quantity.pow(BSUtilities::Rational<N, D> ()));
02127 }
02128
02130
02135 template<template<class, class, class> class Q1, class BT1,
02136 long RL1_N, long RL1_D, long RM1_N, long RM1_D,
02137 long RT1_N, long RT1_D, long RE1_N, long RE1_D,
02138 long RTE1_N, long RTE1_D, long RA1_N, long RA1_D,
02139 long RLU1_N, long RLU1_D,
02140 class UL1, class DU1, class ST1, class SU1, class R,
02141 class DDH, class DDT, class T>
02142 inline Dynamic<ST1> pow (const
02143 Q1<Quantity<
02144 dimension::Dimension<BSUtilities::Rational<RL1_N, RL1_D>,
02145 BSUtilities::Rational<RM1_N, RM1_D>,
02146 BSUtilities::Rational<RT1_N, RT1_D>,
02147 BSUtilities::Rational<RE1_N, RE1_D>,
02148 BSUtilities::Rational<RTE1_N, RTE1_D>,
02149 BSUtilities::Rational<RA1_N, RA1_D>,
02150 BSUtilities::Rational<RLU1_N, RLU1_D> >,
02151 BT1, UL1, DU1, ST1>, SU1,
02152 Loki::Functor<R, Loki::Typelist<DDH, DDT> > >
02153 &quantity, const T &exp)
02154 {return Dynamic<ST1> (quantity.pow(exp));}
02155
02157
02159 template<template<class, class, class> class Q, class BT,
02160 long RL_N, long RL_D, long RM_N, long RM_D,
02161 long RT_N, long RT_D, long RE_N, long RE_D,
02162 long RTE_N, long RTE_D, long RA_N, long RA_D,
02163 long RLU_N, long RLU_D,
02164 class UL, class DU, class ST, class SU, class DD>
02165 inline Variable<Quantity<
02166 dimension::Dimension<BSUtilities::Rational<RL_N, RL_D>,
02167 BSUtilities::Rational<RM_N, RM_D>,
02168 BSUtilities::Rational<RT_N, RT_D>,
02169 BSUtilities::Rational<RE_N, RE_D>,
02170 BSUtilities::Rational<RTE_N, RTE_D>,
02171 BSUtilities::Rational<RA_N, RA_D>,
02172 BSUtilities::Rational<RLU_N, RLU_D> >,
02173 BT, UL, DU, ST>, SU, DD>
02174 abs (const Q<Quantity<
02175 dimension::Dimension<BSUtilities::Rational<RL_N, RL_D>,
02176 BSUtilities::Rational<RM_N, RM_D>,
02177 BSUtilities::Rational<RT_N, RT_D>,
02178 BSUtilities::Rational<RE_N, RE_D>,
02179 BSUtilities::Rational<RTE_N, RTE_D>,
02180 BSUtilities::Rational<RA_N, RA_D>,
02181 BSUtilities::Rational<RLU_N, RLU_D> >,
02182 BT, UL, DU, ST>, SU, DD> &variable)
02183 {return Variable<Quantity<
02184 dimension::Dimension<BSUtilities::Rational<RL_N, RL_D>,
02185 BSUtilities::Rational<RM_N, RM_D>,
02186 BSUtilities::Rational<RT_N, RT_D>,
02187 BSUtilities::Rational<RE_N, RE_D>,
02188 BSUtilities::Rational<RTE_N, RTE_D>,
02189 BSUtilities::Rational<RA_N, RA_D>,
02190 BSUtilities::Rational<RLU_N, RLU_D> >,
02191 BT, UL, DU, ST>, SU, DD>
02192 (std::abs (variable.value ()));}
02193
02195
02197 template<template<class, class, class> class Q, class BT,
02198 long RL_N, long RL_D, long RM_N, long RM_D,
02199 long RT_N, long RT_D, long RE_N, long RE_D,
02200 long RTE_N, long RTE_D, long RA_N, long RA_D,
02201 long RLU_N, long RLU_D,
02202 class UL, class DU, class ST, class SU, class DD>
02203 inline Variable<Quantity<
02204 dimension::Dimension<BSUtilities::Rational<RL_N, RL_D>,
02205 BSUtilities::Rational<RM_N, RM_D>,
02206 BSUtilities::Rational<RT_N, RT_D>,
02207 BSUtilities::Rational<RE_N, RE_D>,
02208 BSUtilities::Rational<RTE_N, RTE_D>,
02209 BSUtilities::Rational<RA_N, RA_D>,
02210 BSUtilities::Rational<RLU_N, RLU_D> >,
02211 BT, UL, DU, ST>, SU, DD>
02212 ceil (const Q<Quantity<
02213 dimension::Dimension<BSUtilities::Rational<RL_N, RL_D>,
02214 BSUtilities::Rational<RM_N, RM_D>,
02215 BSUtilities::Rational<RT_N, RT_D>,
02216 BSUtilities::Rational<RE_N, RE_D>,
02217 BSUtilities::Rational<RTE_N, RTE_D>,
02218 BSUtilities::Rational<RA_N, RA_D>,
02219 BSUtilities::Rational<RLU_N, RLU_D> >,
02220 BT, UL, DU, ST>, SU, DD> &variable)
02221 {return Variable<Quantity<
02222 dimension::Dimension<BSUtilities::Rational<RL_N, RL_D>,
02223 BSUtilities::Rational<RM_N, RM_D>,
02224 BSUtilities::Rational<RT_N, RT_D>,
02225 BSUtilities::Rational<RE_N, RE_D>,
02226 BSUtilities::Rational<RTE_N, RTE_D>,
02227 BSUtilities::Rational<RA_N, RA_D>,
02228 BSUtilities::Rational<RLU_N, RLU_D> >,
02229 BT, UL, DU, ST>, SU, DD>
02230 (std::ceil (variable.value ()));}
02231
02233
02235 template<template<class, class, class> class Q, class BT,
02236 long RL_N, long RL_D, long RM_N, long RM_D,
02237 long RT_N, long RT_D, long RE_N, long RE_D,
02238 long RTE_N, long RTE_D, long RA_N, long RA_D,
02239 long RLU_N, long RLU_D,
02240 class UL, class DU, class ST, class SU, class DD>
02241 inline Variable<Quantity<
02242 dimension::Dimension<BSUtilities::Rational<RL_N, RL_D>,
02243 BSUtilities::Rational<RM_N, RM_D>,
02244 BSUtilities::Rational<RT_N, RT_D>,
02245 BSUtilities::Rational<RE_N, RE_D>,
02246 BSUtilities::Rational<RTE_N, RTE_D>,
02247 BSUtilities::Rational<RA_N, RA_D>,
02248 BSUtilities::Rational<RLU_N, RLU_D> >,
02249 BT, UL, DU, ST>, SU, DD>
02250 floor (const Q<Quantity<
02251 dimension::Dimension<BSUtilities::Rational<RL_N, RL_D>,
02252 BSUtilities::Rational<RM_N, RM_D>,
02253 BSUtilities::Rational<RT_N, RT_D>,
02254 BSUtilities::Rational<RE_N, RE_D>,
02255 BSUtilities::Rational<RTE_N, RTE_D>,
02256 BSUtilities::Rational<RA_N, RA_D>,
02257 BSUtilities::Rational<RLU_N, RLU_D> >,
02258 BT, UL, DU, ST>, SU, DD> &variable)
02259 {return Variable<Quantity<
02260 dimension::Dimension<BSUtilities::Rational<RL_N, RL_D>,
02261 BSUtilities::Rational<RM_N, RM_D>,
02262 BSUtilities::Rational<RT_N, RT_D>,
02263 BSUtilities::Rational<RE_N, RE_D>,
02264 BSUtilities::Rational<RTE_N, RTE_D>,
02265 BSUtilities::Rational<RA_N, RA_D>,
02266 BSUtilities::Rational<RLU_N, RLU_D> >,
02267 BT, UL, DU, ST>, SU, DD>
02268 (std::floor (variable.value ()));}
02269
02271
02273 template<template<class, class, class> class Q, class BT,
02274 long RL_N, long RL_D, long RM_N, long RM_D,
02275 long RT_N, long RT_D, long RE_N, long RE_D,
02276 long RTE_N, long RTE_D, long RA_N, long RA_D,
02277 long RLU_N, long RLU_D,
02278 class UL, class DU, class ST, class SU, class DD>
02279 inline Variable<Quantity<
02280 dimension::Dimension<BSUtilities::Rational<RL_N, RL_D>,
02281 BSUtilities::Rational<RM_N, RM_D>,
02282 BSUtilities::Rational<RT_N, RT_D>,
02283 BSUtilities::Rational<RE_N, RE_D>,
02284 BSUtilities::Rational<RTE_N, RTE_D>,
02285 BSUtilities::Rational<RA_N, RA_D>,
02286 BSUtilities::Rational<RLU_N, RLU_D> >,
02287 BT, UL, DU, ST>, SU, DD>
02288 frexp (const Q<Quantity<
02289 dimension::Dimension<BSUtilities::Rational<RL_N, RL_D>,
02290 BSUtilities::Rational<RM_N, RM_D>,
02291 BSUtilities::Rational<RT_N, RT_D>,
02292 BSUtilities::Rational<RE_N, RE_D>,
02293 BSUtilities::Rational<RTE_N, RTE_D>,
02294 BSUtilities::Rational<RA_N, RA_D>,
02295 BSUtilities::Rational<RLU_N, RLU_D> >,
02296 BT, UL, DU, ST>, SU, DD> &variable, int *exponent)
02297 {return Variable<Quantity<
02298 dimension::Dimension<BSUtilities::Rational<RL_N, RL_D>,
02299 BSUtilities::Rational<RM_N, RM_D>,
02300 BSUtilities::Rational<RT_N, RT_D>,
02301 BSUtilities::Rational<RE_N, RE_D>,
02302 BSUtilities::Rational<RTE_N, RTE_D>,
02303 BSUtilities::Rational<RA_N, RA_D>,
02304 BSUtilities::Rational<RLU_N, RLU_D> >,
02305 BT, UL, DU, ST>, SU, DD>
02306 (std::frexp (variable.value (), exponent));}
02307
02309
02311 template<template<class, class, class> class Q, class BT,
02312 long RL_N, long RL_D, long RM_N, long RM_D,
02313 long RT_N, long RT_D, long RE_N, long RE_D,
02314 long RTE_N, long RTE_D, long RA_N, long RA_D,
02315 long RLU_N, long RLU_D,
02316 class UL, class DU, class ST, class SU, class DD>
02317 inline Variable<Quantity<
02318 dimension::Dimension<BSUtilities::Rational<RL_N, RL_D>,
02319 BSUtilities::Rational<RM_N, RM_D>,
02320 BSUtilities::Rational<RT_N, RT_D>,
02321 BSUtilities::Rational<RE_N, RE_D>,
02322 BSUtilities::Rational<RTE_N, RTE_D>,
02323 BSUtilities::Rational<RA_N, RA_D>,
02324 BSUtilities::Rational<RLU_N, RLU_D> >,
02325 BT, UL, DU, ST>, SU, DD>
02326 ldexp (const Q<Quantity<
02327 dimension::Dimension<BSUtilities::Rational<RL_N, RL_D>,
02328 BSUtilities::Rational<RM_N, RM_D>,
02329 BSUtilities::Rational<RT_N, RT_D>,
02330 BSUtilities::Rational<RE_N, RE_D>,
02331 BSUtilities::Rational<RTE_N, RTE_D>,
02332 BSUtilities::Rational<RA_N, RA_D>,
02333 BSUtilities::Rational<RLU_N, RLU_D> >,
02334 BT, UL, DU, ST>, SU, DD> &variable, int exponent)
02335 {return Variable<Quantity<
02336 dimension::Dimension<BSUtilities::Rational<RL_N, RL_D>,
02337 BSUtilities::Rational<RM_N, RM_D>,
02338 BSUtilities::Rational<RT_N, RT_D>,
02339 BSUtilities::Rational<RE_N, RE_D>,
02340 BSUtilities::Rational<RTE_N, RTE_D>,
02341 BSUtilities::Rational<RA_N, RA_D>,
02342 BSUtilities::Rational<RLU_N, RLU_D> >,
02343 BT, UL, DU, ST>, SU, DD>
02344 (std::ldexp (variable.value (), exponent));}
02345
02347
02353 template<template<class, class, class> class Q,
02354 template<class, class, class> class Q1, class BT,
02355 long RL_N, long RL_D, long RM_N, long RM_D,
02356 long RT_N, long RT_D, long RE_N, long RE_D,
02357 long RTE_N, long RTE_D, long RA_N, long RA_D,
02358 long RLU_N, long RLU_D,
02359 class UL, class DU, class ST, class SU, class DD1, class DD2>
02360 inline Variable<Quantity<
02361 dimension::Dimension<BSUtilities::Rational<RL_N, RL_D>,
02362 BSUtilities::Rational<RM_N, RM_D>,
02363 BSUtilities::Rational<RT_N, RT_D>,
02364 BSUtilities::Rational<RE_N, RE_D>,
02365 BSUtilities::Rational<RTE_N, RTE_D>,
02366 BSUtilities::Rational<RA_N, RA_D>,
02367 BSUtilities::Rational<RLU_N, RLU_D> >,
02368 BT, UL, DU, ST>, SU, DD1>
02369 fmod (const Q<Quantity<
02370 dimension::Dimension<BSUtilities::Rational<RL_N, RL_D>,
02371 BSUtilities::Rational<RM_N, RM_D>,
02372 BSUtilities::Rational<RT_N, RT_D>,
02373 BSUtilities::Rational<RE_N, RE_D>,
02374 BSUtilities::Rational<RTE_N, RTE_D>,
02375 BSUtilities::Rational<RA_N, RA_D>,
02376 BSUtilities::Rational<RLU_N, RLU_D> >,
02377 BT, UL, DU, ST>, SU, DD1> &quantity1,
02378 const Q1<Quantity<
02379 dimension::Dimension<BSUtilities::Rational<RL_N, RL_D>,
02380 BSUtilities::Rational<RM_N, RM_D>,
02381 BSUtilities::Rational<RT_N, RT_D>,
02382 BSUtilities::Rational<RE_N, RE_D>,
02383 BSUtilities::Rational<RTE_N, RTE_D>,
02384 BSUtilities::Rational<RA_N, RA_D>,
02385 BSUtilities::Rational<RLU_N, RLU_D> >,
02386 BT, UL, DU, ST>, SU, DD2> &quantity2)
02387 {return
02388 Variable<Quantity<
02389 dimension::Dimension<BSUtilities::Rational<RL_N, RL_D>,
02390 BSUtilities::Rational<RM_N, RM_D>,
02391 BSUtilities::Rational<RT_N, RT_D>,
02392 BSUtilities::Rational<RE_N, RE_D>,
02393 BSUtilities::Rational<RTE_N, RTE_D>,
02394 BSUtilities::Rational<RA_N, RA_D>,
02395 BSUtilities::Rational<RLU_N, RLU_D> >,
02396 BT, UL, DU, ST>, SU, DD1>
02397 (std::fmod (quantity1.value (), quantity2.value ()));
02398 }
02399
02401
02407 template<template<class, class, class> class Q,
02408 template<class, class, class> class Q1, class BT,
02409 long RL_N, long RL_D, long RM_N, long RM_D,
02410 long RT_N, long RT_D, long RE_N, long RE_D,
02411 long RTE_N, long RTE_D, long RA_N, long RA_D,
02412 long RLU_N, long RLU_D,
02413 class UL, class DU, class ST, class SU, class SU1,
02414 class DD1, class DD2>
02415 inline Variable<Quantity<
02416 dimension::Dimension<BSUtilities::Rational<RL_N, RL_D>,
02417 BSUtilities::Rational<RM_N, RM_D>,
02418 BSUtilities::Rational<RT_N, RT_D>,
02419 BSUtilities::Rational<RE_N, RE_D>,
02420 BSUtilities::Rational<RTE_N, RTE_D>,
02421 BSUtilities::Rational<RA_N, RA_D>,
02422 BSUtilities::Rational<RLU_N, RLU_D> >,
02423 BT, UL, DU, ST>, SU, DD1>
02424 fmod (const Q<Quantity<
02425 dimension::Dimension<BSUtilities::Rational<RL_N, RL_D>,
02426 BSUtilities::Rational<RM_N, RM_D>,
02427 BSUtilities::Rational<RT_N, RT_D>,
02428 BSUtilities::Rational<RE_N, RE_D>,
02429 BSUtilities::Rational<RTE_N, RTE_D>,
02430 BSUtilities::Rational<RA_N, RA_D>,
02431 BSUtilities::Rational<RLU_N, RLU_D> >,
02432 BT, UL, DU, ST>, SU, DD1> &quantity1,
02433 const Q1<Quantity<
02434 dimension::Dimension<BSUtilities::Rational<RL_N, RL_D>,
02435 BSUtilities::Rational<RM_N, RM_D>,
02436 BSUtilities::Rational<RT_N, RT_D>,
02437 BSUtilities::Rational<RE_N, RE_D>,
02438 BSUtilities::Rational<RTE_N, RTE_D>,
02439 BSUtilities::Rational<RA_N, RA_D>,
02440 BSUtilities::Rational<RLU_N, RLU_D> >,
02441 BT, UL, DU, ST>, SU1, DD2> &quantity2)
02442 {return
02443 Variable<Quantity<
02444 dimension::Dimension<BSUtilities::Rational<RL_N, RL_D>,
02445 BSUtilities::Rational<RM_N, RM_D>,
02446 BSUtilities::Rational<RT_N, RT_D>,
02447 BSUtilities::Rational<RE_N, RE_D>,
02448 BSUtilities::Rational<RTE_N, RTE_D>,
02449 BSUtilities::Rational<RA_N, RA_D>,
02450 BSUtilities::Rational<RLU_N, RLU_D> >,
02451 BT, UL, DU, ST>, SU, DD1>
02452 (Reverse<SU, ST>::VAL
02453 (std::fmod (quantity1.standard_value (),
02454 quantity2.standard_value ())));
02455 }
02456
02458
02463 template <template<class, class, class> class Q, class BT,
02464 long RL_N, long RL_D, long RM_N, long RM_D,
02465 long RT_N, long RT_D, long RE_N, long RE_D,
02466 long RTE_N, long RTE_D, long RA_N, long RA_D,
02467 long RLU_N, long RLU_D, class UL, class DU, class ST, class SU,
02468 class DD1,
02469 template<class, class, class> class Q1, class BT1,
02470 long RL1_N, long RL1_D, long RM1_N, long RM1_D,
02471 long RT1_N, long RT1_D, long RE1_N, long RE1_D,
02472 long RTE1_N, long RTE1_D, long RA1_N, long RA1_D,
02473 long RLU1_N, long RLU1_D, class UL1, class DU1, class SU1,
02474 class DD2>
02475 inline Variable<Quantity<
02476 dimension::Dimension<BSUtilities::Rational<RL_N, RL_D>,
02477 BSUtilities::Rational<RM_N, RM_D>,
02478 BSUtilities::Rational<RT_N, RT_D>,
02479 BSUtilities::Rational<RE_N, RE_D>,
02480 BSUtilities::Rational<RTE_N, RTE_D>,
02481 BSUtilities::Rational<RA_N, RA_D>,
02482 BSUtilities::Rational<RLU_N, RLU_D> >,
02483 BT, UL, DU, ST>, SU, DD1>
02484 fmod (const Q<Quantity<
02485 dimension::Dimension<BSUtilities::Rational<RL_N, RL_D>,
02486 BSUtilities::Rational<RM_N, RM_D>,
02487 BSUtilities::Rational<RT_N, RT_D>,
02488 BSUtilities::Rational<RE_N, RE_D>,
02489 BSUtilities::Rational<RTE_N, RTE_D>,
02490 BSUtilities::Rational<RA_N, RA_D>,
02491 BSUtilities::Rational<RLU_N, RLU_D> >,
02492 BT, UL, DU, ST>, SU, DD1> &quantity1,
02493 const Q1<Quantity<
02494 dimension::Dimension<BSUtilities::Rational<RL1_N, RL1_D>,
02495 BSUtilities::Rational<RM1_N, RM1_D>,
02496 BSUtilities::Rational<RT1_N, RT1_D>,
02497 BSUtilities::Rational<RE1_N, RE1_D>,
02498 BSUtilities::Rational<RTE1_N, RTE1_D>,
02499 BSUtilities::Rational<RA1_N, RA1_D>,
02500 BSUtilities::Rational<RLU1_N, RLU1_D> >,
02501 BT1, UL1, DU1, ST>, SU1, DD2> &quantity2)
02502 {return Variable<Quantity<
02503 dimension::Dimension<BSUtilities::Rational<RL_N, RL_D>,
02504 BSUtilities::Rational<RM_N, RM_D>,
02505 BSUtilities::Rational<RT_N, RT_D>,
02506 BSUtilities::Rational<RE_N, RE_D>,
02507 BSUtilities::Rational<RTE_N, RTE_D>,
02508 BSUtilities::Rational<RA_N, RA_D>,
02509 BSUtilities::Rational<RLU_N, RLU_D> >,
02510 BT, UL, DU, ST>, SU, DD1>
02511 (Reverse<SU, ST>::VAL (std::fmod (quantity1.standard_value (),
02512 Standardize<typename CheckSecondDimension<
02513 Variable<Quantity<
02514 dimension::Dimension<BSUtilities::Rational<RL_N, RL_D>,
02515 BSUtilities::Rational<RM_N, RM_D>,
02516 BSUtilities::Rational<RT_N, RT_D>,
02517 BSUtilities::Rational<RE_N, RE_D>,
02518 BSUtilities::Rational<RTE_N, RTE_D>,
02519 BSUtilities::Rational<RA_N, RA_D>,
02520 BSUtilities::Rational<RLU_N, RLU_D> >,
02521 BT, UL, DU, ST>, SU, DD1>,
02522 Q1<Quantity<
02523 dimension::Dimension<BSUtilities::Rational<RL1_N, RL1_D>,
02524 BSUtilities::Rational<RM1_N, RM1_D>,
02525 BSUtilities::Rational<RT1_N, RT1_D>,
02526 BSUtilities::Rational<RE1_N, RE1_D>,
02527 BSUtilities::Rational<RTE1_N, RTE1_D>,
02528 BSUtilities::Rational<RA1_N, RA1_D>,
02529 BSUtilities::Rational<RLU1_N, RLU1_D> >,
02530 BT1, UL1, DU1, ST>, SU1, DD2> >::RET::Unit, ST>::VAL
02531 (quantity2.value ()))));
02532 }
02533
02535
02538 template<template<class, class> class Q, class BT,
02539 long RL_N, long RL_D, long RM_N, long RM_D,
02540 long RT_N, long RT_D, long RE_N, long RE_D,
02541 long RTE_N, long RTE_D, long RA_N, long RA_D,
02542 long RLU_N, long RLU_D, class UL, class DU, class ST, class SU>
02543 inline Variable<Quantity<
02544 dimension::Dimension<BSUtilities::Rational<RL_N, RL_D>,
02545 BSUtilities::Rational<RM_N, RM_D>,
02546 BSUtilities::Rational<RT_N, RT_D>,
02547 BSUtilities::Rational<RE_N, RE_D>,
02548 BSUtilities::Rational<RTE_N, RTE_D>,
02549 BSUtilities::Rational<RA_N, RA_D>,
02550 BSUtilities::Rational<RLU_N, RLU_D> >,
02551 BT, UL, DU, ST>, SU>
02552 modf (const Q<Quantity<
02553 dimension::Dimension<BSUtilities::Rational<RL_N, RL_D>,
02554 BSUtilities::Rational<RM_N, RM_D>,
02555 BSUtilities::Rational<RT_N, RT_D>,
02556 BSUtilities::Rational<RE_N, RE_D>,
02557 BSUtilities::Rational<RTE_N, RTE_D>,
02558 BSUtilities::Rational<RA_N, RA_D>,
02559 BSUtilities::Rational<RLU_N, RLU_D> >,
02560 BT, UL, DU, ST>, SU> &quantity,
02561 Variable<Quantity<
02562 dimension::Dimension<BSUtilities::Rational<RL_N, RL_D>,
02563 BSUtilities::Rational<RM_N, RM_D>,
02564 BSUtilities::Rational<RT_N, RT_D>,
02565 BSUtilities::Rational<RE_N, RE_D>,
02566 BSUtilities::Rational<RTE_N, RTE_D>,
02567 BSUtilities::Rational<RA_N, RA_D>,
02568 BSUtilities::Rational<RLU_N, RLU_D> >,
02569 BT, UL, DU, ST>, SU> *integral)
02570 {ST i_ptr;
02571 Variable<Quantity<
02572 dimension::Dimension<BSUtilities::Rational<RL_N, RL_D>,
02573 BSUtilities::Rational<RM_N, RM_D>,
02574 BSUtilities::Rational<RT_N, RT_D>,
02575 BSUtilities::Rational<RE_N, RE_D>,
02576 BSUtilities::Rational<RTE_N, RTE_D>,
02577 BSUtilities::Rational<RA_N, RA_D>,
02578 BSUtilities::Rational<RLU_N, RLU_D> >,
02579 BT, UL, DU, ST>, SU>
02580 new_variable (std::modf (quantity.value (), &i_ptr));
02581 Variable<Quantity<
02582 dimension::Dimension<BSUtilities::Rational<RL_N, RL_D>,
02583 BSUtilities::Rational<RM_N, RM_D>,
02584 BSUtilities::Rational<RT_N, RT_D>,
02585 BSUtilities::Rational<RE_N, RE_D>,
02586 BSUtilities::Rational<RTE_N, RTE_D>,
02587 BSUtilities::Rational<RA_N, RA_D>,
02588 BSUtilities::Rational<RLU_N, RLU_D> >,
02589 BT, UL, DU, ST>, SU> int_quantity (i_ptr);
02590 *integral = int_quantity; return new_variable;
02591 }
02592
02594
02598 template<template<class, class> class Q, class BT,
02599 long RL_N, long RL_D, long RM_N, long RM_D,
02600 long RT_N, long RT_D, long RE_N, long RE_D,
02601 long RTE_N, long RTE_D, long RA_N, long RA_D,
02602 long RLU_N, long RLU_D,
02603 class UL, class DU, class ST, class SU, class SU1>
02604 inline Variable<Quantity<
02605 dimension::Dimension<BSUtilities::Rational<RL_N, RL_D>,
02606 BSUtilities::Rational<RM_N, RM_D>,
02607 BSUtilities::Rational<RT_N, RT_D>,
02608 BSUtilities::Rational<RE_N, RE_D>,
02609 BSUtilities::Rational<RTE_N, RTE_D>,
02610 BSUtilities::Rational<RA_N, RA_D>,
02611 BSUtilities::Rational<RLU_N, RLU_D> >,
02612 BT, UL, DU, ST>, SU>
02613 modf (const Q<Quantity<
02614 dimension::Dimension<BSUtilities::Rational<RL_N, RL_D>,
02615 BSUtilities::Rational<RM_N, RM_D>,
02616 BSUtilities::Rational<RT_N, RT_D>,
02617 BSUtilities::Rational<RE_N, RE_D>,
02618 BSUtilities::Rational<RTE_N, RTE_D>,
02619 BSUtilities::Rational<RA_N, RA_D>,
02620 BSUtilities::Rational<RLU_N, RLU_D> >,
02621 BT, UL, DU, ST>, SU> &quantity,
02622 Variable<Quantity<
02623 dimension::Dimension<BSUtilities::Rational<RL_N, RL_D>,
02624 BSUtilities::Rational<RM_N, RM_D>,
02625 BSUtilities::Rational<RT_N, RT_D>,
02626 BSUtilities::Rational<RE_N, RE_D>,
02627 BSUtilities::Rational<RTE_N, RTE_D>,
02628 BSUtilities::Rational<RA_N, RA_D>,
02629 BSUtilities::Rational<RLU_N, RLU_D> >,
02630 BT, UL, DU, ST>, SU1> *integral)
02631 {ST i_ptr;
02632 Variable<Quantity<
02633 dimension::Dimension<BSUtilities::Rational<RL_N, RL_D>,
02634 BSUtilities::Rational<RM_N, RM_D>,
02635 BSUtilities::Rational<RT_N, RT_D>,
02636 BSUtilities::Rational<RE_N, RE_D>,
02637 BSUtilities::Rational<RTE_N, RTE_D>,
02638 BSUtilities::Rational<RA_N, RA_D>,
02639 BSUtilities::Rational<RLU_N, RLU_D> >,
02640 BT, UL, DU, ST>, SU>
02641 new_variable (std::modf (quantity.value (), &i_ptr));
02642 Variable<Quantity<
02643 dimension::Dimension<BSUtilities::Rational<RL_N, RL_D>,
02644 BSUtilities::Rational<RM_N, RM_D>,
02645 BSUtilities::Rational<RT_N, RT_D>,
02646 BSUtilities::Rational<RE_N, RE_D>,
02647 BSUtilities::Rational<RTE_N, RTE_D>,
02648 BSUtilities::Rational<RA_N, RA_D>,
02649 BSUtilities::Rational<RLU_N, RLU_D> >,
02650 BT, UL, DU, ST>, SU1> int_quantity (i_ptr, SU ());
02651 *integral = int_quantity; return new_variable;
02652 }
02653
02655
02659 template<template<class, class> class Q, class BT,
02660 long RL_N, long RL_D, long RM_N, long RM_D,
02661 long RT_N, long RT_D, long RE_N, long RE_D,
02662 long RTE_N, long RTE_D, long RA_N, long RA_D,
02663 long RLU_N, long RLU_D,
02664 class UL, class DU, class ST, class SU, class SU1,
02665 class BT1,
02666 long RL1_N, long RL1_D, long RM1_N, long RM1_D,
02667 long RT1_N, long RT1_D, long RE1_N, long RE1_D,
02668 long RTE1_N, long RTE1_D, long RA1_N, long RA1_D,
02669 long RLU1_N, long RLU1_D, class UL1, class DU1>
02670 inline Variable<Quantity<
02671 dimension::Dimension<BSUtilities::Rational<RL_N, RL_D>,
02672 BSUtilities::Rational<RM_N, RM_D>,
02673 BSUtilities::Rational<RT_N, RT_D>,
02674 BSUtilities::Rational<RE_N, RE_D>,
02675 BSUtilities::Rational<RTE_N, RTE_D>,
02676 BSUtilities::Rational<RA_N, RA_D>,
02677 BSUtilities::Rational<RLU_N, RLU_D> >,
02678 BT, UL, DU, ST>, SU>
02679 modf (const Q<Quantity<
02680 dimension::Dimension<BSUtilities::Rational<RL_N, RL_D>,
02681 BSUtilities::Rational<RM_N, RM_D>,
02682 BSUtilities::Rational<RT_N, RT_D>,
02683 BSUtilities::Rational<RE_N, RE_D>,
02684 BSUtilities::Rational<RTE_N, RTE_D>,
02685 BSUtilities::Rational<RA_N, RA_D>,
02686 BSUtilities::Rational<RLU_N, RLU_D> >,
02687 BT, UL, DU, ST>, SU> &quantity,
02688 Variable<Quantity<
02689 dimension::Dimension<BSUtilities::Rational<RL1_N, RL1_D>,
02690 BSUtilities::Rational<RM1_N, RM1_D>,
02691 BSUtilities::Rational<RT1_N, RT1_D>,
02692 BSUtilities::Rational<RE1_N, RE1_D>,
02693 BSUtilities::Rational<RTE1_N, RTE1_D>,
02694 BSUtilities::Rational<RA1_N, RA1_D>,
02695 BSUtilities::Rational<RLU1_N, RLU1_D> >,
02696 BT1, UL1, DU1, ST>, SU1> *integral)
02697 {ST i_ptr;
02698 typename CheckSecondDimension<Variable<Quantity<
02699 dimension::Dimension<BSUtilities::Rational<RL1_N, RL1_D>,
02700 BSUtilities::Rational<RM1_N, RM1_D>,
02701 BSUtilities::Rational<RT1_N, RT1_D>,
02702 BSUtilities::Rational<RE1_N, RE1_D>,
02703 BSUtilities::Rational<RTE1_N, RTE1_D>,
02704 BSUtilities::Rational<RA1_N, RA1_D>,
02705 BSUtilities::Rational<RLU1_N, RLU1_D> >,
02706 BT1, UL1, DU1, ST>, SU1>,
02707 Variable<Quantity<
02708 dimension::Dimension<BSUtilities::Rational<RL_N, RL_D>,
02709 BSUtilities::Rational<RM_N, RM_D>,
02710 BSUtilities::Rational<RT_N, RT_D>,
02711 BSUtilities::Rational<RE_N, RE_D>,
02712 BSUtilities::Rational<RTE_N, RTE_D>,
02713 BSUtilities::Rational<RA_N, RA_D>,
02714 BSUtilities::Rational<RLU_N, RLU_D> >,
02715 BT, UL, DU, ST>, SU> >::RET
02716 new_variable (Reverse<SU, ST>::VAL
02717 (std::modf (quantity.standard_value (), &i_ptr)));
02718 *integral = Variable<Quantity<
02719 dimension::Dimension<BSUtilities::Rational<RL1_N, RL1_D>,
02720 BSUtilities::Rational<RM1_N, RM1_D>,
02721 BSUtilities::Rational<RT1_N, RT1_D>,
02722 BSUtilities::Rational<RE1_N, RE1_D>,
02723 BSUtilities::Rational<RTE1_N, RTE1_D>,
02724 BSUtilities::Rational<RA1_N, RA1_D>,
02725 BSUtilities::Rational<RLU1_N, RLU1_D> >,
02726 BT1, UL1, DU1, ST>, SU1>
02727 (Reverse<SU1, ST>::VAL (i_ptr));
02728 return new_variable;
02729 }
02730
02731 }
02732
02733 #endif