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

Dimension.h

Go to the documentation of this file.
00001 
00005 /* Copyright (C) 2002 - 2005, 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 #include <NullType.h>
00030 #include "TypeManip.h"
00031 #include "Typelist.h"
00032 #include "NullType.h"
00033 
00034 #include "TemplateTools.h"
00035 
00037 namespace dimension {
00038 
00040 //
00041 //  Helper classes and structs for manipulation of dimensions and
00042 //  lists of Rational numbers coding dimensions
00043 //
00045 
00047 
00049 template<class DL> struct Dimensionality;
00051 
00058 template<class Head, class Tail>
00059   struct Dimensionality<Loki::Typelist<Head, Tail> >
00060   {
00062 
00065     enum {IsDimensionless = 
00066             ((Head::numerator == 0) && 
00067                (Dimensionality<Tail>::IsDimensionless == 1)) ? 1 : 0};
00068   };
00069 
00071 
00074 template<>
00075   struct Dimensionality<Loki::NullType>
00076   {
00078     enum {IsDimensionless = 1};
00079   };
00080 
00082 //
00083 //  Dimensions base class for all dimensions
00084 //
00086 
00088 class Dimensions
00089   {
00090     public:
00092 
00095       static const std::string Version (void)
00096         {static const std::string v_string ("Dimensions version 1.1"); 
00097                                                        return v_string;}
00098 
00100 
00103       static const std::string version (void) { return Version ();}
00104 
00105   };
00106 
00108 //
00109 //  the Dimension of a quantity
00110 //
00112 
00114 
00123 template 
00124   <class RL, class RM, class RT, class RE, class RTE, 
00125                                    class RA, class RLU> class Dimension;
00126 
00128 
00131 template<long RL_N, long RL_D, long RM_N, long RM_D, 
00132   long RT_N, long RT_D, long RE_N, long RE_D, long RTE_N, long RTE_D,
00133                            long RA_N, long RA_D, long RLU_N, long RLU_D>
00134   class Dimension<BSUtilities::Rational<RL_N, RL_D>,
00135     BSUtilities::Rational<RM_N, RM_D>, 
00136       BSUtilities::Rational<RT_N, RT_D>,
00137         BSUtilities::Rational<RE_N, RE_D>,
00138           BSUtilities::Rational<RTE_N, RTE_D>,
00139             BSUtilities::Rational<RA_N, RA_D>,
00140                BSUtilities::Rational<RLU_N, RLU_D> > : public Dimensions
00141   {
00142     public:
00144       typedef 
00145         Loki::Typelist<BSUtilities::Rational<RL_N, RL_D>,
00146           Loki::Typelist<BSUtilities::Rational<RM_N, RM_D>,
00147             Loki::Typelist<BSUtilities::Rational<RT_N, RT_D>,
00148               Loki::Typelist<BSUtilities::Rational<RE_N, RE_D>,
00149                 Loki::Typelist<BSUtilities::Rational<RTE_N, RTE_D>,
00150                   Loki::Typelist<BSUtilities::Rational<RA_N, RA_D>,
00151                     Loki::Typelist<BSUtilities::Rational<RLU_N, RLU_D>, 
00152                                     Loki::NullType> > > > > > > DimList;
00153 
00155 
00158       static const bool IsDimensionless 
00159                                = Dimensionality<DimList>::IsDimensionless;
00160 
00162 
00164       static const bool isDimensionless (void) 
00165                                              {return IsDimensionless();}
00166 
00168 
00172     template<class D1> struct Add;
00173 
00175 
00179     template<long RL1_N, long RL1_D, long RM1_N, long RM1_D, 
00180       long RT1_N, long RT1_D, long RE1_N, long RE1_D, 
00181         long RTE1_N, long RTE1_D, long RA1_N, long RA1_D, 
00182                                                long RLU1_N, long RLU1_D>
00183       struct Add<Dimension<BSUtilities::Rational<RL1_N, RL1_D>, 
00184         BSUtilities::Rational<RM1_N, RM1_D>,
00185           BSUtilities::Rational<RT1_N, RT1_D>, 
00186             BSUtilities::Rational<RE1_N, RE1_D>,
00187               BSUtilities::Rational<RTE1_N, RTE1_D>,
00188                 BSUtilities::Rational<RA1_N, RA1_D>,
00189                                BSUtilities::Rational<RLU1_N, RLU1_D> > >
00190       {
00191         private:
00193           typedef typename BSUtilities::RationalAdd<
00194             BSUtilities::Rational<RL_N, RL_D>, 
00195                           BSUtilities::Rational<RL1_N, RL1_D> >::RET A0;
00196 
00198           typedef typename BSUtilities::RationalAdd<
00199             BSUtilities::Rational<RM_N, RM_D>, 
00200                           BSUtilities::Rational<RM1_N, RM1_D> >::RET A1;
00201 
00203           typedef typename BSUtilities::RationalAdd<
00204             BSUtilities::Rational<RT_N, RT_D>, 
00205                           BSUtilities::Rational<RT1_N, RT1_D> >::RET A2;
00206 
00208           typedef typename BSUtilities::RationalAdd<
00209             BSUtilities::Rational<RE_N, RE_D>, 
00210                           BSUtilities::Rational<RE1_N, RE1_D> >::RET A3;
00211 
00213           typedef typename BSUtilities::RationalAdd<
00214             BSUtilities::Rational<RTE_N, RTE_D>, 
00215                         BSUtilities::Rational<RTE1_N, RTE1_D> >::RET A4;
00216 
00218           typedef typename BSUtilities::RationalAdd<
00219             BSUtilities::Rational<RA_N, RA_D>, 
00220                           BSUtilities::Rational<RA1_N, RA1_D> >::RET A5;
00221 
00223           typedef typename BSUtilities::RationalAdd<
00224             BSUtilities::Rational<RLU_N, RLU_D>, 
00225                         BSUtilities::Rational<RLU1_N, RLU1_D> >::RET A6;
00226 
00227         public:
00229 
00231           typedef Dimension<A0, A1, A2, A3, A4, A5, A6> Res;         
00232 
00233       };
00234 
00236 
00240     template<class D1> struct Sub;
00241 
00243 
00247     template<long RL1_N, long RL1_D, long RM1_N, long RM1_D, 
00248       long RT1_N, long RT1_D, long RE1_N, long RE1_D, 
00249         long RTE1_N, long RTE1_D, long RA1_N, long RA1_D, 
00250                                                long RLU1_N, long RLU1_D>
00251       struct Sub<Dimension<BSUtilities::Rational<RL1_N, RL1_D>,
00252         BSUtilities::Rational<RM1_N, RM1_D>,
00253           BSUtilities::Rational<RT1_N, RT1_D>,
00254             BSUtilities::Rational<RE1_N, RE1_D>,
00255               BSUtilities::Rational<RTE1_N, RTE1_D>,
00256                 BSUtilities::Rational<RA1_N, RA1_D>,
00257                                BSUtilities::Rational<RLU1_N, RLU1_D> > >
00258       {
00259         private:
00261           typedef typename BSUtilities::RationalSub<
00262             BSUtilities::Rational<RL_N, RL_D>, 
00263                           BSUtilities::Rational<RL1_N, RL1_D> >::RET A0;
00264 
00266           typedef typename BSUtilities::RationalSub<
00267             BSUtilities::Rational<RM_N, RM_D>, 
00268                           BSUtilities::Rational<RM1_N, RM1_D> >::RET A1;
00269 
00271           typedef typename BSUtilities::RationalSub<
00272             BSUtilities::Rational<RT_N, RT_D>, 
00273                           BSUtilities::Rational<RT1_N, RT1_D> >::RET A2;
00274 
00276           typedef typename BSUtilities::RationalSub<
00277             BSUtilities::Rational<RE_N, RE_D>, 
00278                           BSUtilities::Rational<RE1_N, RE1_D> >::RET A3;
00279 
00281           typedef typename BSUtilities::RationalSub<
00282             BSUtilities::Rational<RTE_N, RTE_D>, 
00283                         BSUtilities::Rational<RTE1_N, RTE1_D> >::RET A4;
00284 
00286           typedef typename BSUtilities::RationalSub<
00287             BSUtilities::Rational<RA_N, RA_D>, 
00288                           BSUtilities::Rational<RA1_N, RA1_D> >::RET A5;
00289 
00291           typedef typename BSUtilities::RationalSub<
00292             BSUtilities::Rational<RLU_N, RLU_D>, 
00293                         BSUtilities::Rational<RLU1_N, RLU1_D> >::RET A6;
00294 
00295         public:
00297 
00299           typedef Dimension<A0, A1, A2, A3, A4, A5, A6> Res;         
00300     };
00301 
00303 
00308     template<long N, long D>
00309       struct Mult
00310       {
00311         private:
00313           typedef typename BSUtilities::RationalMult<
00314             BSUtilities::Rational<RL_N, RL_D>,
00315                                   BSUtilities::Rational<N, D> >::RET A0;
00316 
00318           typedef typename BSUtilities::RationalMult< 
00319             BSUtilities::Rational<RM_N, RM_D>,
00320                                   BSUtilities::Rational<N, D> >::RET A1;
00321 
00323           typedef typename BSUtilities::RationalMult< 
00324             BSUtilities::Rational<RT_N, RT_D>,
00325                                   BSUtilities::Rational<N, D> >::RET A2;
00326 
00328           typedef typename BSUtilities::RationalMult< 
00329             BSUtilities::Rational<RE_N, RE_D>,
00330                                   BSUtilities::Rational<N, D> >::RET A3;
00331 
00333           typedef typename BSUtilities::RationalMult< 
00334             BSUtilities::Rational<RTE_N, RTE_D>,
00335                                   BSUtilities::Rational<N, D> >::RET A4;
00336 
00338           typedef typename BSUtilities::RationalMult< 
00339             BSUtilities::Rational<RA_N, RA_D>,
00340                                   BSUtilities::Rational<N, D> >::RET A5;
00342           typedef typename BSUtilities::RationalMult< 
00343             BSUtilities::Rational<RLU_N, RLU_D>,
00344                                   BSUtilities::Rational<N, D> >::RET A6;
00345 
00346         public:
00348 
00350           typedef Dimension<A0, A1, A2, A3, A4, A5, A6> Res;         
00351     };
00352 
00354 
00357     struct Inv
00358     {
00359       private:
00361         typedef typename BSUtilities::RationalNeg< 
00362                             BSUtilities::Rational<RL_N, RL_D> >::RET A0;
00363 
00365         typedef typename BSUtilities::RationalNeg< 
00366                             BSUtilities::Rational<RM_N, RM_D> >::RET A1;
00367 
00369         typedef typename BSUtilities::RationalNeg< 
00370                             BSUtilities::Rational<RT_N, RT_D> >::RET A2;
00371 
00373         typedef typename BSUtilities::RationalNeg< 
00374                             BSUtilities::Rational<RE_N, RE_D> >::RET A3;
00375 
00377         typedef typename BSUtilities::RationalNeg< 
00378                           BSUtilities::Rational<RTE_N, RTE_D> >::RET A4;
00379 
00381         typedef typename BSUtilities::RationalNeg< 
00382                             BSUtilities::Rational<RA_N, RA_D> >::RET A5;
00383 
00385         typedef typename BSUtilities::RationalNeg< 
00386                           BSUtilities::Rational<RLU_N, RLU_D> >::RET A6;
00387 
00388       public:
00390 
00392         typedef Dimension<A0, A1, A2, A3, A4, A5, A6> Res;         
00393 
00394     };
00395   };
00396 
00398 //
00399 //  Helper class for Manipulation of Dimension<>
00400 //
00402 
00404 
00406 template<class DL1, class DL2> struct DimensionEquality;
00407 
00409 
00413 template<class DL1Head, class DL2Head, class DL1Tail, class DL2Tail> 
00414   struct DimensionEquality<Loki::Typelist<DL1Head, DL1Tail>, 
00415                                       Loki::Typelist<DL2Head, DL2Tail> >
00416   {
00418 
00425     enum {EQ = (BSUtilities::RationalEquality<DL1Head, DL2Head>::RET
00426                    && DimensionEquality<DL1Tail, DL2Tail>::EQ) ? 1 : 0};
00427   };
00428 
00430 
00433 template<class DL1Head, class DL2Head> 
00434   struct DimensionEquality<Loki::Typelist<DL1Head, Loki::NullType>, 
00435                                Loki::Typelist<DL2Head, Loki::NullType> >
00436   {
00438 
00441     enum {EQ = BSUtilities::RationalEquality<DL1Head, DL2Head>::RET};
00442   };
00443 
00445 
00447 template<class D1, class D2> struct Equal;
00448 
00450 
00455 template<class RL1, class RM1, class RT1, class RE1, 
00456   class RTE1, class RA1, class RLU1, 
00457     class RL2, class RM2, class RT2, class RE2,
00458                                       class RTE2, class RA2, class RLU2>
00459   struct 
00460     Equal<Dimension<RL1, RM1, RT1, RE1, RTE1, RA1, RLU1>, 
00461                    Dimension<RL2, RM2, RT2, RE2, RTE2, RA2, RLU2> >
00462   {
00464 
00467     enum {EQ = DimensionEquality<typename 
00468       Dimension<RL1, RM1, RT1, RE1, RTE1, RA1, RLU1>::DimList, 
00469         typename Dimension<RL2, RM2, RT2, RE2, RTE2, RA2, RLU2>
00470                                                         ::DimList>::EQ};
00471   };
00472 }
00473 
00474 #endif /* _Dimension_h */

Generated on Sun Jan 15 14:05:20 2006 for Quantity by doxygen 1.3.6