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
00028 #include "loki/NullType.h"
00029 #include "loki/TypeManip.h"
00030 #include "loki/Typelist.h"
00031
00032
00033 #include "BSUtilities/TemplateTools.h"
00034
00036 namespace dimension {
00037
00039
00040
00041
00042
00044
00046
00048 template<class DL> struct Dimensionality;
00049
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
00084 template<class DL1, class DL2> struct DimensionEquality;
00085
00087
00091 template<class DL1Head, class DL2Head, class DL1Tail, class DL2Tail>
00092 struct DimensionEquality<Loki::Typelist<DL1Head, DL1Tail>,
00093 Loki::Typelist<DL2Head, DL2Tail> >
00094 {
00096
00103 enum {EQ = (BSUtilities::RationalEquality<DL1Head, DL2Head>::RET
00104 && DimensionEquality<DL1Tail, DL2Tail>::EQ) ? 1 : 0};
00105 };
00106
00108
00111 template<class DL1Head, class DL2Head>
00112 struct DimensionEquality<Loki::Typelist<DL1Head, Loki::NullType>,
00113 Loki::Typelist<DL2Head, Loki::NullType> >
00114 {
00116
00119 enum {EQ = BSUtilities::RationalEquality<DL1Head, DL2Head>::RET};
00120 };
00121
00123
00124
00125
00127
00129
00136 template
00137 <typename RL, typename RM, typename RT, typename RE, typename RTE,
00138 typename RA, typename RLU> class Dimension;
00139
00141
00145 template<long RL_N, long RL_D, long RM_N, long RM_D,
00146 long RT_N, long RT_D, long RE_N, long RE_D, long RTE_N, long RTE_D,
00147 long RA_N, long RA_D, long RLU_N, long RLU_D>
00148 class Dimension<BSUtilities::Rational<RL_N, RL_D>,
00149 BSUtilities::Rational<RM_N, RM_D>,
00150 BSUtilities::Rational<RT_N, RT_D>,
00151 BSUtilities::Rational<RE_N, RE_D>,
00152 BSUtilities::Rational<RTE_N, RTE_D>,
00153 BSUtilities::Rational<RA_N, RA_D>,
00154 BSUtilities::Rational<RLU_N, RLU_D> >
00155 {
00156 public:
00158 typedef
00159 Loki::Typelist<BSUtilities::Rational<RL_N, RL_D>,
00160 Loki::Typelist<BSUtilities::Rational<RM_N, RM_D>,
00161 Loki::Typelist<BSUtilities::Rational<RT_N, RT_D>,
00162 Loki::Typelist<BSUtilities::Rational<RE_N, RE_D>,
00163 Loki::Typelist<BSUtilities::Rational<RTE_N, RTE_D>,
00164 Loki::Typelist<BSUtilities::Rational<RA_N, RA_D>,
00165 Loki::Typelist<BSUtilities::Rational<RLU_N, RLU_D>,
00166 Loki::NullType> > > > > > > DimList;
00167
00169 typedef BSUtilities::Rational<RL_N, RL_D> RL;
00171 typedef BSUtilities::Rational<RM_N, RM_D> RM;
00173 typedef BSUtilities::Rational<RT_N, RT_D> RT;
00175 typedef BSUtilities::Rational<RE_N, RE_D> RE;
00177 typedef BSUtilities::Rational<RTE_N, RTE_D> RTE;
00179 typedef BSUtilities::Rational<RA_N, RA_D> RA;
00181 typedef BSUtilities::Rational<RLU_N, RLU_D> RLU;
00182
00184 typedef typename BSUtilities::Rational<RL_N, RL_D>::Canonical canonicalRL;
00186 typedef typename BSUtilities::Rational<RM_N, RM_D>::Canonical canonicalRM;
00188 typedef typename BSUtilities::Rational<RT_N, RT_D>::Canonical canonicalRT;
00190 typedef typename BSUtilities::Rational<RE_N, RE_D>::Canonical canonicalRE;
00192 typedef typename BSUtilities::Rational<RTE_N, RTE_D>::Canonical canonicalRTE;
00194 typedef typename BSUtilities::Rational<RA_N, RA_D>::Canonical canonicalRA;
00196 typedef typename BSUtilities::Rational<RLU_N, RLU_D>::Canonical canonicalRLU;
00197
00199 static long const numRL = BSUtilities::Rational<RL_N, RL_D>::numerator;
00200 static long const numRM = BSUtilities::Rational<RM_N, RM_D>::numerator;
00201 static long const numRT = BSUtilities::Rational<RT_N, RT_D>::numerator;
00202 static long const numRE = BSUtilities::Rational<RE_N, RE_D>::numerator;
00203 static long const numRTE = BSUtilities::Rational<RTE_N, RTE_D>::numerator;
00204 static long const numRA = BSUtilities::Rational<RA_N, RA_D>::numerator;
00205 static long const numRLU = BSUtilities::Rational<RLU_N, RLU_D>::numerator;
00206
00208 static long const canonicalNumRL = BSUtilities::Rational<RL_N, RL_D>::Canonical::numerator;
00209 static long const canonicalNumRM = BSUtilities::Rational<RM_N, RM_D>::Canonical::numerator;
00210 static long const canonicalNumRT = BSUtilities::Rational<RT_N, RT_D>::Canonical::numerator;
00211 static long const canonicalNumRE = BSUtilities::Rational<RE_N, RE_D>::Canonical::numerator;
00212 static long const canonicalNumRTE = BSUtilities::Rational<RTE_N, RTE_D>::Canonical::numerator;
00213 static long const canonicalNumRA = BSUtilities::Rational<RA_N, RA_D>::Canonical::numerator;
00214 static long const canonicalNumRLU = BSUtilities::Rational<RLU_N, RLU_D>::Canonical::numerator;
00215
00217 static long const denomRL = BSUtilities::Rational<RL_N, RL_D>::denominator;
00218 static long const denomRM = BSUtilities::Rational<RM_N, RM_D>::denominator;
00219 static long const denomRT = BSUtilities::Rational<RT_N, RT_D>::denominator;
00220 static long const denomRE = BSUtilities::Rational<RE_N, RE_D>::denominator;
00221 static long const denomRTE = BSUtilities::Rational<RTE_N, RTE_D>::denominator;
00222 static long const denomRA = BSUtilities::Rational<RA_N, RA_D>::denominator;
00223 static long const denomRLU = BSUtilities::Rational<RLU_N, RLU_D>::denominator;
00224
00226 static long const canonicalDenomRL = BSUtilities::Rational<RL_N, RL_D>::Canonical::denominator;
00227 static long const canonicalDenomRM = BSUtilities::Rational<RM_N, RM_D>::Canonical::denominator;
00228 static long const canonicalDenomRT = BSUtilities::Rational<RT_N, RT_D>::Canonical::denominator;
00229 static long const canonicalDenomRE = BSUtilities::Rational<RE_N, RE_D>::Canonical::denominator;
00230 static long const canonicalDenomRTE = BSUtilities::Rational<RTE_N, RTE_D>::Canonical::denominator;
00231 static long const canonicalDenomRA = BSUtilities::Rational<RA_N, RA_D>::Canonical::denominator;
00232 static long const canonicalDenomRLU = BSUtilities::Rational<RLU_N, RLU_D>::Canonical::denominator;
00233
00235
00238 static const bool IsDimensionless
00239 = Dimensionality<DimList>::IsDimensionless;
00240
00242
00244 static bool isDimensionless (void) {return IsDimensionless;}
00245
00247
00251 template<class D1> struct Add;
00252
00254
00258 template<long RL1_N, long RL1_D, long RM1_N, long RM1_D,
00259 long RT1_N, long RT1_D, long RE1_N, long RE1_D,
00260 long RTE1_N, long RTE1_D, long RA1_N, long RA1_D,
00261 long RLU1_N, long RLU1_D>
00262 struct Add<Dimension<BSUtilities::Rational<RL1_N, RL1_D>,
00263 BSUtilities::Rational<RM1_N, RM1_D>,
00264 BSUtilities::Rational<RT1_N, RT1_D>,
00265 BSUtilities::Rational<RE1_N, RE1_D>,
00266 BSUtilities::Rational<RTE1_N, RTE1_D>,
00267 BSUtilities::Rational<RA1_N, RA1_D>,
00268 BSUtilities::Rational<RLU1_N, RLU1_D> > >
00269 {
00270 private:
00272 typedef typename BSUtilities::RationalAdd<
00273 BSUtilities::Rational<RL_N, RL_D>,
00274 BSUtilities::Rational<RL1_N, RL1_D> >::RET A0;
00275
00277 typedef typename BSUtilities::RationalAdd<
00278 BSUtilities::Rational<RM_N, RM_D>,
00279 BSUtilities::Rational<RM1_N, RM1_D> >::RET A1;
00280
00282 typedef typename BSUtilities::RationalAdd<
00283 BSUtilities::Rational<RT_N, RT_D>,
00284 BSUtilities::Rational<RT1_N, RT1_D> >::RET A2;
00285
00287 typedef typename BSUtilities::RationalAdd<
00288 BSUtilities::Rational<RE_N, RE_D>,
00289 BSUtilities::Rational<RE1_N, RE1_D> >::RET A3;
00290
00292 typedef typename BSUtilities::RationalAdd<
00293 BSUtilities::Rational<RTE_N, RTE_D>,
00294 BSUtilities::Rational<RTE1_N, RTE1_D> >::RET A4;
00295
00297 typedef typename BSUtilities::RationalAdd<
00298 BSUtilities::Rational<RA_N, RA_D>,
00299 BSUtilities::Rational<RA1_N, RA1_D> >::RET A5;
00300
00302 typedef typename BSUtilities::RationalAdd<
00303 BSUtilities::Rational<RLU_N, RLU_D>,
00304 BSUtilities::Rational<RLU1_N, RLU1_D> >::RET A6;
00305
00306 public:
00308
00310 typedef Dimension<A0, A1, A2, A3, A4, A5, A6> Res;
00311
00312 };
00313
00315
00319 template<class D1> struct Sub;
00320
00322
00326 template<long RL1_N, long RL1_D, long RM1_N, long RM1_D,
00327 long RT1_N, long RT1_D, long RE1_N, long RE1_D,
00328 long RTE1_N, long RTE1_D, long RA1_N, long RA1_D,
00329 long RLU1_N, long RLU1_D>
00330 struct Sub<Dimension<BSUtilities::Rational<RL1_N, RL1_D>,
00331 BSUtilities::Rational<RM1_N, RM1_D>,
00332 BSUtilities::Rational<RT1_N, RT1_D>,
00333 BSUtilities::Rational<RE1_N, RE1_D>,
00334 BSUtilities::Rational<RTE1_N, RTE1_D>,
00335 BSUtilities::Rational<RA1_N, RA1_D>,
00336 BSUtilities::Rational<RLU1_N, RLU1_D> > >
00337 {
00338 private:
00340 typedef typename BSUtilities::RationalSub<
00341 BSUtilities::Rational<RL_N, RL_D>,
00342 BSUtilities::Rational<RL1_N, RL1_D> >::RET A0;
00343
00345 typedef typename BSUtilities::RationalSub<
00346 BSUtilities::Rational<RM_N, RM_D>,
00347 BSUtilities::Rational<RM1_N, RM1_D> >::RET A1;
00348
00350 typedef typename BSUtilities::RationalSub<
00351 BSUtilities::Rational<RT_N, RT_D>,
00352 BSUtilities::Rational<RT1_N, RT1_D> >::RET A2;
00353
00355 typedef typename BSUtilities::RationalSub<
00356 BSUtilities::Rational<RE_N, RE_D>,
00357 BSUtilities::Rational<RE1_N, RE1_D> >::RET A3;
00358
00360 typedef typename BSUtilities::RationalSub<
00361 BSUtilities::Rational<RTE_N, RTE_D>,
00362 BSUtilities::Rational<RTE1_N, RTE1_D> >::RET A4;
00363
00365 typedef typename BSUtilities::RationalSub<
00366 BSUtilities::Rational<RA_N, RA_D>,
00367 BSUtilities::Rational<RA1_N, RA1_D> >::RET A5;
00368
00370 typedef typename BSUtilities::RationalSub<
00371 BSUtilities::Rational<RLU_N, RLU_D>,
00372 BSUtilities::Rational<RLU1_N, RLU1_D> >::RET A6;
00373
00374 public:
00376
00378 typedef Dimension<A0, A1, A2, A3, A4, A5, A6> Res;
00379 };
00380
00382
00387 template<long N, long D>
00388 struct Mult
00389 {
00390 private:
00392 typedef typename BSUtilities::RationalMult<
00393 BSUtilities::Rational<RL_N, RL_D>,
00394 BSUtilities::Rational<N, D> >::RET A0;
00395
00397 typedef typename BSUtilities::RationalMult<
00398 BSUtilities::Rational<RM_N, RM_D>,
00399 BSUtilities::Rational<N, D> >::RET A1;
00400
00402 typedef typename BSUtilities::RationalMult<
00403 BSUtilities::Rational<RT_N, RT_D>,
00404 BSUtilities::Rational<N, D> >::RET A2;
00405
00407 typedef typename BSUtilities::RationalMult<
00408 BSUtilities::Rational<RE_N, RE_D>,
00409 BSUtilities::Rational<N, D> >::RET A3;
00410
00412 typedef typename BSUtilities::RationalMult<
00413 BSUtilities::Rational<RTE_N, RTE_D>,
00414 BSUtilities::Rational<N, D> >::RET A4;
00415
00417 typedef typename BSUtilities::RationalMult<
00418 BSUtilities::Rational<RA_N, RA_D>,
00419 BSUtilities::Rational<N, D> >::RET A5;
00421 typedef typename BSUtilities::RationalMult<
00422 BSUtilities::Rational<RLU_N, RLU_D>,
00423 BSUtilities::Rational<N, D> >::RET A6;
00424
00425 public:
00427
00429 typedef Dimension<A0, A1, A2, A3, A4, A5, A6> Res;
00430 };
00431
00433
00436 struct Inv
00437 {
00438 private:
00440 typedef typename BSUtilities::RationalNeg<
00441 BSUtilities::Rational<RL_N, RL_D> >::RET A0;
00442
00444 typedef typename BSUtilities::RationalNeg<
00445 BSUtilities::Rational<RM_N, RM_D> >::RET A1;
00446
00448 typedef typename BSUtilities::RationalNeg<
00449 BSUtilities::Rational<RT_N, RT_D> >::RET A2;
00450
00452 typedef typename BSUtilities::RationalNeg<
00453 BSUtilities::Rational<RE_N, RE_D> >::RET A3;
00454
00456 typedef typename BSUtilities::RationalNeg<
00457 BSUtilities::Rational<RTE_N, RTE_D> >::RET A4;
00458
00460 typedef typename BSUtilities::RationalNeg<
00461 BSUtilities::Rational<RA_N, RA_D> >::RET A5;
00462
00464 typedef typename BSUtilities::RationalNeg<
00465 BSUtilities::Rational<RLU_N, RLU_D> >::RET A6;
00466
00467 public:
00469
00471 typedef Dimension<A0, A1, A2, A3, A4, A5, A6> Res;
00472 };
00473
00475
00477 template<typename D1> struct Equal;
00478
00480
00485 template<long RL1_N, long RL1_D, long RM1_N, long RM1_D,
00486 long RT1_N, long RT1_D, long RE1_N, long RE1_D,
00487 long RTE1_N, long RTE1_D, long RA1_N, long RA1_D,
00488 long RLU1_N, long RLU1_D>
00489 struct Equal<Dimension<BSUtilities::Rational<RL1_N, RL1_D>,
00490 BSUtilities::Rational<RM1_N, RM1_D>,
00491 BSUtilities::Rational<RT1_N, RT1_D>,
00492 BSUtilities::Rational<RE1_N, RE1_D>,
00493 BSUtilities::Rational<RTE1_N, RTE1_D>,
00494 BSUtilities::Rational<RA1_N, RA1_D>,
00495 BSUtilities::Rational<RLU1_N, RLU1_D> > >
00496 {
00498
00501 enum {EQ = DimensionEquality<typename
00502 Dimension<BSUtilities::Rational<RL_N, RL_D>,
00503 BSUtilities::Rational<RM_N, RM_D>,
00504 BSUtilities::Rational<RT_N, RT_D>,
00505 BSUtilities::Rational<RE_N, RE_D>,
00506 BSUtilities::Rational<RTE_N, RTE_D>,
00507 BSUtilities::Rational<RA_N, RA_D>,
00508 BSUtilities::Rational<RLU_N, RLU_D> >::DimList,
00509 typename Dimension<BSUtilities::Rational<RL1_N, RL1_D>,
00510 BSUtilities::Rational<RM1_N, RM1_D>,
00511 BSUtilities::Rational<RT1_N, RT1_D>,
00512 BSUtilities::Rational<RE1_N, RE1_D>,
00513 BSUtilities::Rational<RTE1_N, RTE1_D>,
00514 BSUtilities::Rational<RA1_N, RA1_D>,
00515 BSUtilities::Rational<RLU1_N, RLU1_D> >::DimList>::EQ};
00516 };
00517 };
00518 }
00519
00520 #endif