00001
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef _Dimension_h
00025 #define _Dimension_h
00026
00027 #include <string>
00028
00029
00030 #include "loki/NullType.h"
00031 #include "loki/TypeManip.h"
00032 #include "loki/Typelist.h"
00033 #include "loki/NullType.h"
00034
00035
00036 #include "BSUtilities/TemplateTools.h"
00037
00039 namespace dimension {
00040
00042
00043
00044
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
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