Dimension.h

Go to the documentation of this file.
00001 
00005 /* Copyright (C) 2002 - 2009, 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 _Dimension_h
00025 #define _Dimension_h
00026 
00027 #include <string>
00028 
00029 // Loki includes
00030 #include "loki/NullType.h"
00031 #include "loki/TypeManip.h"
00032 #include "loki/Typelist.h"
00033 #include "loki/NullType.h"
00034 
00035 // BSUtilities includes
00036 #include "BSUtilities/TemplateTools.h"
00037 
00039 namespace dimension {
00040 
00042 //
00043 //  Helper classes and structs for manipulation of dimensions and
00044 //  lists of Rational numbers coding dimensions
00045 //
00047 
00049 
00051 template<class DL> struct Dimensionality;
00052 
00054 
00061 template<class Head, class Tail>
00062   struct Dimensionality<Loki::Typelist<Head, Tail> >
00063   {
00065 
00068     enum {IsDimensionless = 
00069             ((Head::numerator == 0) && 
00070                (Dimensionality<Tail>::IsDimensionless == 1)) ? 1 : 0};
00071   };
00072 
00074 
00077 template<>
00078   struct Dimensionality<Loki::NullType>
00079   {
00081     enum {IsDimensionless = 1};
00082   };
00083 
00085 
00087 template<class DL1, class DL2> struct DimensionEquality;
00088 
00090 
00094 template<class DL1Head, class DL2Head, class DL1Tail, class DL2Tail> 
00095   struct DimensionEquality<Loki::Typelist<DL1Head, DL1Tail>, 
00096                                       Loki::Typelist<DL2Head, DL2Tail> >
00097   {
00099 
00106     enum {EQ = (BSUtilities::RationalEquality<DL1Head, DL2Head>::RET
00107                    && DimensionEquality<DL1Tail, DL2Tail>::EQ) ? 1 : 0};
00108   };
00109 
00111 
00114 template<class DL1Head, class DL2Head> 
00115   struct DimensionEquality<Loki::Typelist<DL1Head, Loki::NullType>, 
00116                                Loki::Typelist<DL2Head, Loki::NullType> >
00117   {
00119 
00122     enum {EQ = BSUtilities::RationalEquality<DL1Head, DL2Head>::RET};
00123   };
00124 
00126 //
00127 //  the Dimension of a quantity
00128 //
00130 
00132 
00139 template 
00140   <typename RL, typename RM, typename RT, typename RE, typename RTE, 
00141                                    typename RA, typename RLU> class Dimension;
00142 
00144 
00148 template<long RL_N, long RL_D, long RM_N, long RM_D, 
00149   long RT_N, long RT_D, long RE_N, long RE_D, long RTE_N, long RTE_D,
00150                            long RA_N, long RA_D, long RLU_N, long RLU_D>
00151   class Dimension<BSUtilities::Rational<RL_N, RL_D>,
00152     BSUtilities::Rational<RM_N, RM_D>, 
00153       BSUtilities::Rational<RT_N, RT_D>,
00154         BSUtilities::Rational<RE_N, RE_D>,
00155           BSUtilities::Rational<RTE_N, RTE_D>,
00156             BSUtilities::Rational<RA_N, RA_D>,
00157                BSUtilities::Rational<RLU_N, RLU_D> >
00158   {
00159     public:
00161       typedef 
00162         Loki::Typelist<BSUtilities::Rational<RL_N, RL_D>,
00163           Loki::Typelist<BSUtilities::Rational<RM_N, RM_D>,
00164             Loki::Typelist<BSUtilities::Rational<RT_N, RT_D>,
00165               Loki::Typelist<BSUtilities::Rational<RE_N, RE_D>,
00166                 Loki::Typelist<BSUtilities::Rational<RTE_N, RTE_D>,
00167                   Loki::Typelist<BSUtilities::Rational<RA_N, RA_D>,
00168                     Loki::Typelist<BSUtilities::Rational<RLU_N, RLU_D>, 
00169                                     Loki::NullType> > > > > > > DimList;
00170 
00172       typedef BSUtilities::Rational<RL_N, RL_D> RL;
00174       typedef BSUtilities::Rational<RM_N, RM_D> RM;
00176       typedef BSUtilities::Rational<RT_N, RT_D> RT;
00178       typedef BSUtilities::Rational<RE_N, RE_D> RE;
00180       typedef BSUtilities::Rational<RTE_N, RTE_D> RTE;
00182       typedef BSUtilities::Rational<RA_N, RA_D> RA;
00184       typedef BSUtilities::Rational<RLU_N, RLU_D> RLU;
00185 
00187       typedef typename BSUtilities::Rational<RL_N, RL_D>::Canonical canonicalRL;
00189       typedef typename BSUtilities::Rational<RM_N, RM_D>::Canonical canonicalRM;
00191       typedef typename BSUtilities::Rational<RT_N, RT_D>::Canonical canonicalRT;
00193       typedef typename BSUtilities::Rational<RE_N, RE_D>::Canonical canonicalRE;
00195       typedef typename BSUtilities::Rational<RTE_N, RTE_D>::Canonical canonicalRTE;
00197       typedef typename BSUtilities::Rational<RA_N, RA_D>::Canonical canonicalRA;
00199       typedef typename BSUtilities::Rational<RLU_N, RLU_D>::Canonical canonicalRLU;
00200 
00202       static long const numRL = BSUtilities::Rational<RL_N, RL_D>::numerator;
00203       static long const numRM = BSUtilities::Rational<RM_N, RM_D>::numerator;
00204       static long const numRT = BSUtilities::Rational<RT_N, RT_D>::numerator;
00205       static long const numRE = BSUtilities::Rational<RE_N, RE_D>::numerator;
00206       static long const numRTE = BSUtilities::Rational<RTE_N, RTE_D>::numerator;
00207       static long const numRA = BSUtilities::Rational<RA_N, RA_D>::numerator;
00208       static long const numRLU = BSUtilities::Rational<RLU_N, RLU_D>::numerator;
00209 
00211       static long const canonicalNumRL =  BSUtilities::Rational<RL_N, RL_D>::Canonical::numerator;
00212       static long const canonicalNumRM = BSUtilities::Rational<RM_N, RM_D>::Canonical::numerator;
00213       static long const canonicalNumRT = BSUtilities::Rational<RT_N, RT_D>::Canonical::numerator;
00214       static long const canonicalNumRE = BSUtilities::Rational<RE_N, RE_D>::Canonical::numerator;
00215       static long const canonicalNumRTE = BSUtilities::Rational<RTE_N, RTE_D>::Canonical::numerator;
00216       static long const canonicalNumRA = BSUtilities::Rational<RA_N, RA_D>::Canonical::numerator;
00217       static long const canonicalNumRLU = BSUtilities::Rational<RLU_N, RLU_D>::Canonical::numerator;
00218 
00220       static long const denomRL = BSUtilities::Rational<RL_N, RL_D>::denominator;
00221       static long const denomRM = BSUtilities::Rational<RM_N, RM_D>::denominator;
00222       static long const denomRT = BSUtilities::Rational<RT_N, RT_D>::denominator;
00223       static long const denomRE = BSUtilities::Rational<RE_N, RE_D>::denominator;
00224       static long const denomRTE = BSUtilities::Rational<RTE_N, RTE_D>::denominator;
00225       static long const denomRA = BSUtilities::Rational<RA_N, RA_D>::denominator;
00226       static long const denomRLU = BSUtilities::Rational<RLU_N, RLU_D>::denominator;
00227 
00229       static long const canonicalDenomRL = BSUtilities::Rational<RL_N, RL_D>::Canonical::denominator;
00230       static long const canonicalDenomRM = BSUtilities::Rational<RM_N, RM_D>::Canonical::denominator;
00231       static long const canonicalDenomRT = BSUtilities::Rational<RT_N, RT_D>::Canonical::denominator;
00232       static long const canonicalDenomRE = BSUtilities::Rational<RE_N, RE_D>::Canonical::denominator;
00233       static long const canonicalDenomRTE = BSUtilities::Rational<RTE_N, RTE_D>::Canonical::denominator;
00234       static long const canonicalDenomRA = BSUtilities::Rational<RA_N, RA_D>::Canonical::denominator;
00235       static long const canonicalDenomRLU = BSUtilities::Rational<RLU_N, RLU_D>::Canonical::denominator;
00236 
00238 
00241       static const bool IsDimensionless 
00242                                = Dimensionality<DimList>::IsDimensionless;
00243 
00245 
00247       static bool isDimensionless (void) {return IsDimensionless;}
00248 
00250 
00254     template<class D1> struct Add;
00255 
00257 
00261     template<long RL1_N, long RL1_D, long RM1_N, long RM1_D, 
00262       long RT1_N, long RT1_D, long RE1_N, long RE1_D, 
00263         long RTE1_N, long RTE1_D, long RA1_N, long RA1_D, 
00264                                                long RLU1_N, long RLU1_D>
00265       struct Add<Dimension<BSUtilities::Rational<RL1_N, RL1_D>, 
00266         BSUtilities::Rational<RM1_N, RM1_D>,
00267           BSUtilities::Rational<RT1_N, RT1_D>, 
00268             BSUtilities::Rational<RE1_N, RE1_D>,
00269               BSUtilities::Rational<RTE1_N, RTE1_D>,
00270                 BSUtilities::Rational<RA1_N, RA1_D>,
00271                                BSUtilities::Rational<RLU1_N, RLU1_D> > >
00272       {
00273         private:
00275           typedef typename BSUtilities::RationalAdd<
00276             BSUtilities::Rational<RL_N, RL_D>, 
00277                           BSUtilities::Rational<RL1_N, RL1_D> >::RET A0;
00278 
00280           typedef typename BSUtilities::RationalAdd<
00281             BSUtilities::Rational<RM_N, RM_D>, 
00282                           BSUtilities::Rational<RM1_N, RM1_D> >::RET A1;
00283 
00285           typedef typename BSUtilities::RationalAdd<
00286             BSUtilities::Rational<RT_N, RT_D>, 
00287                           BSUtilities::Rational<RT1_N, RT1_D> >::RET A2;
00288 
00290           typedef typename BSUtilities::RationalAdd<
00291             BSUtilities::Rational<RE_N, RE_D>, 
00292                           BSUtilities::Rational<RE1_N, RE1_D> >::RET A3;
00293 
00295           typedef typename BSUtilities::RationalAdd<
00296             BSUtilities::Rational<RTE_N, RTE_D>, 
00297                         BSUtilities::Rational<RTE1_N, RTE1_D> >::RET A4;
00298 
00300           typedef typename BSUtilities::RationalAdd<
00301             BSUtilities::Rational<RA_N, RA_D>, 
00302                           BSUtilities::Rational<RA1_N, RA1_D> >::RET A5;
00303 
00305           typedef typename BSUtilities::RationalAdd<
00306             BSUtilities::Rational<RLU_N, RLU_D>, 
00307                         BSUtilities::Rational<RLU1_N, RLU1_D> >::RET A6;
00308 
00309         public:
00311 
00313           typedef Dimension<A0, A1, A2, A3, A4, A5, A6> Res;         
00314 
00315       };
00316 
00318 
00322     template<class D1> struct Sub;
00323 
00325 
00329     template<long RL1_N, long RL1_D, long RM1_N, long RM1_D, 
00330       long RT1_N, long RT1_D, long RE1_N, long RE1_D, 
00331         long RTE1_N, long RTE1_D, long RA1_N, long RA1_D, 
00332                                                long RLU1_N, long RLU1_D>
00333       struct Sub<Dimension<BSUtilities::Rational<RL1_N, RL1_D>,
00334         BSUtilities::Rational<RM1_N, RM1_D>,
00335           BSUtilities::Rational<RT1_N, RT1_D>,
00336             BSUtilities::Rational<RE1_N, RE1_D>,
00337               BSUtilities::Rational<RTE1_N, RTE1_D>,
00338                 BSUtilities::Rational<RA1_N, RA1_D>,
00339                                BSUtilities::Rational<RLU1_N, RLU1_D> > >
00340       {
00341         private:
00343           typedef typename BSUtilities::RationalSub<
00344             BSUtilities::Rational<RL_N, RL_D>, 
00345                           BSUtilities::Rational<RL1_N, RL1_D> >::RET A0;
00346 
00348           typedef typename BSUtilities::RationalSub<
00349             BSUtilities::Rational<RM_N, RM_D>, 
00350                           BSUtilities::Rational<RM1_N, RM1_D> >::RET A1;
00351 
00353           typedef typename BSUtilities::RationalSub<
00354             BSUtilities::Rational<RT_N, RT_D>, 
00355                           BSUtilities::Rational<RT1_N, RT1_D> >::RET A2;
00356 
00358           typedef typename BSUtilities::RationalSub<
00359             BSUtilities::Rational<RE_N, RE_D>, 
00360                           BSUtilities::Rational<RE1_N, RE1_D> >::RET A3;
00361 
00363           typedef typename BSUtilities::RationalSub<
00364             BSUtilities::Rational<RTE_N, RTE_D>, 
00365                         BSUtilities::Rational<RTE1_N, RTE1_D> >::RET A4;
00366 
00368           typedef typename BSUtilities::RationalSub<
00369             BSUtilities::Rational<RA_N, RA_D>, 
00370                           BSUtilities::Rational<RA1_N, RA1_D> >::RET A5;
00371 
00373           typedef typename BSUtilities::RationalSub<
00374             BSUtilities::Rational<RLU_N, RLU_D>, 
00375                         BSUtilities::Rational<RLU1_N, RLU1_D> >::RET A6;
00376 
00377         public:
00379 
00381           typedef Dimension<A0, A1, A2, A3, A4, A5, A6> Res;         
00382     };
00383 
00385 
00390     template<long N, long D>
00391       struct Mult
00392       {
00393         private:
00395           typedef typename BSUtilities::RationalMult<
00396             BSUtilities::Rational<RL_N, RL_D>,
00397                                   BSUtilities::Rational<N, D> >::RET A0;
00398 
00400           typedef typename BSUtilities::RationalMult< 
00401             BSUtilities::Rational<RM_N, RM_D>,
00402                                   BSUtilities::Rational<N, D> >::RET A1;
00403 
00405           typedef typename BSUtilities::RationalMult< 
00406             BSUtilities::Rational<RT_N, RT_D>,
00407                                   BSUtilities::Rational<N, D> >::RET A2;
00408 
00410           typedef typename BSUtilities::RationalMult< 
00411             BSUtilities::Rational<RE_N, RE_D>,
00412                                   BSUtilities::Rational<N, D> >::RET A3;
00413 
00415           typedef typename BSUtilities::RationalMult< 
00416             BSUtilities::Rational<RTE_N, RTE_D>,
00417                                   BSUtilities::Rational<N, D> >::RET A4;
00418 
00420           typedef typename BSUtilities::RationalMult< 
00421             BSUtilities::Rational<RA_N, RA_D>,
00422                                   BSUtilities::Rational<N, D> >::RET A5;
00424           typedef typename BSUtilities::RationalMult< 
00425             BSUtilities::Rational<RLU_N, RLU_D>,
00426                                   BSUtilities::Rational<N, D> >::RET A6;
00427 
00428         public:
00430 
00432           typedef Dimension<A0, A1, A2, A3, A4, A5, A6> Res;         
00433     };
00434 
00436 
00439     struct Inv
00440     {
00441       private:
00443         typedef typename BSUtilities::RationalNeg< 
00444                             BSUtilities::Rational<RL_N, RL_D> >::RET A0;
00445 
00447         typedef typename BSUtilities::RationalNeg< 
00448                             BSUtilities::Rational<RM_N, RM_D> >::RET A1;
00449 
00451         typedef typename BSUtilities::RationalNeg< 
00452                             BSUtilities::Rational<RT_N, RT_D> >::RET A2;
00453 
00455         typedef typename BSUtilities::RationalNeg< 
00456                             BSUtilities::Rational<RE_N, RE_D> >::RET A3;
00457 
00459         typedef typename BSUtilities::RationalNeg< 
00460                           BSUtilities::Rational<RTE_N, RTE_D> >::RET A4;
00461 
00463         typedef typename BSUtilities::RationalNeg< 
00464                             BSUtilities::Rational<RA_N, RA_D> >::RET A5;
00465 
00467         typedef typename BSUtilities::RationalNeg< 
00468                           BSUtilities::Rational<RLU_N, RLU_D> >::RET A6;
00469 
00470       public:
00472 
00474         typedef Dimension<A0, A1, A2, A3, A4, A5, A6> Res;         
00475     };
00476 
00478 
00480 template<typename D1> struct Equal;
00481 
00483 
00488   template<long RL1_N, long RL1_D, long RM1_N, long RM1_D, 
00489       long RT1_N, long RT1_D, long RE1_N, long RE1_D, 
00490         long RTE1_N, long RTE1_D, long RA1_N, long RA1_D, 
00491                                                long RLU1_N, long RLU1_D>
00492       struct Equal<Dimension<BSUtilities::Rational<RL1_N, RL1_D>,
00493         BSUtilities::Rational<RM1_N, RM1_D>,
00494           BSUtilities::Rational<RT1_N, RT1_D>,
00495             BSUtilities::Rational<RE1_N, RE1_D>,
00496               BSUtilities::Rational<RTE1_N, RTE1_D>,
00497                 BSUtilities::Rational<RA1_N, RA1_D>,
00498                                BSUtilities::Rational<RLU1_N, RLU1_D> > >
00499       {
00501 
00504         enum {EQ = DimensionEquality<typename
00505           Dimension<BSUtilities::Rational<RL_N, RL_D>, 
00506             BSUtilities::Rational<RM_N, RM_D>, 
00507               BSUtilities::Rational<RT_N, RT_D>, 
00508                 BSUtilities::Rational<RE_N, RE_D>, 
00509                   BSUtilities::Rational<RTE_N, RTE_D>, 
00510                     BSUtilities::Rational<RA_N, RA_D>, 
00511                       BSUtilities::Rational<RLU_N, RLU_D> >::DimList, 
00512             typename Dimension<BSUtilities::Rational<RL1_N, RL1_D>, 
00513               BSUtilities::Rational<RM1_N, RM1_D>, 
00514                 BSUtilities::Rational<RT1_N, RT1_D>, 
00515                   BSUtilities::Rational<RE1_N, RE1_D>, 
00516                     BSUtilities::Rational<RTE1_N, RTE1_D>, 
00517                       BSUtilities::Rational<RA1_N, RA1_D>, 
00518                     BSUtilities::Rational<RLU1_N, RLU1_D> >::DimList>::EQ};
00519        };
00520   };
00521 }
00522 
00523 #endif /* _Dimension_h */

Generated on Mon Jul 27 15:55:44 2009 for Quantities by  doxygen 1.5.3