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 #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
00042
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
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
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
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