Main Page | Namespace List | Class Hierarchy | Class List | File List | Namespace Members | Class Members | File Members | Related Pages

Variable.h

Go to the documentation of this file.
00001 
00005 /* Copyright (C) 2002 - 2006, Bernd Speiser */
00006 /* This file is part of Quantity.
00007 
00008 Quantity is free software; you can redistribute it and/or
00009 modify it under the terms of the GNU General Public License
00010 as published by the Free Software Foundation; either version 2
00011 of the License, or (at your option) any later version.
00012 
00013 Quantity is distributed in the hope that it will be useful,
00014 but WITHOUT ANY WARRANTY; without even the implied warranty of
00015 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00016 GNU General Public License for more details.
00017   
00018 You should have received a copy of the GNU General Public License
00019 along with this program; if not, write to the Free Software
00020 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
00021 02111-1307, USA.
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 //  Helper classes and structs for compiling error messages
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 //  helper classes and structs for checking features of quantities
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 //  forward declaration
00205 //
00207 
00209 
00212 template<class Q1, class Q2> struct GenerateVariable;
00213 
00215 //
00216 //  the Variable classes
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 // to be added ... dedimensionalizer?
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 // to be added ...
01595         }
01596         else
01597           throw LoadError
01598                  ("error loading variable quantity: incorrect element");
01599     }
01600 
01602 
01606 //    PQ (???) * create (void) {return new Variable;}
01607 // to be implemented
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 /* if no unit symbol string is present in input, assume one or use
01784    storage unit
01785 */
01786       if (start == std::string::npos)
01787       {
01788         std::string assume_unit;
01789 
01790 /* if a unit has been set, use this for conversion of intermediate
01791    (value); else do nothing, since we assume that the value is in 
01792    the storage unit and can be stored directly. 
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 /* if unit symbol string is present in input, use it for conversion
01811    of intermediate (value)
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 /* _Variable_h */

Generated on Mon Feb 12 18:43:57 2007 for Quantity by doxygen 1.3.6